1.实时数据库概述
在引入实时数据库概念之前,先介绍一下数据对象。在先进控制软件设计中定义的数据不同于传统意义的数据或变量,它不只包含了变量的数值特征,还将与数据相关的其它属性(如数据的状态、报警限值等)以及对数据的操作方法(如存盘处理、报警处理等)封装在一起,作为一个整体,以对象的形式提供服务。这种把数值、属性和方法定义成一体的数据称为数据对象。在设计中,用数据对象来表述系统中的实时数据,用对象变量代替传统意义的值变量。用数据库技术管理的所有数据对象的集合称为实时数据库,实时数据库提供管理、刷新、查询数据对象等操作。
实时数据库与普通商用数据库不同,实时数据库的主要目标是使尽量多的事务在规定的时间要求内完成,而不是公平地分配系统以使所有的事务都得到执行。它有以下几个特点:
1)时间约束实时数据库系统的主要特征是在数据对象和事务上施加了时间约束。对数据的时间约束,就是在数据库的普通一致性要求以外,又规定了时态一致性要求。在实时系统中,具有时间约束的数据主要来自于外部的动态数据,如由传感器采集的现场数据,和由这些数据导出的数据。因此,可将数据的时间约束分为两类,即数据的绝对一致性和数据的相对一致性。数据的绝对一致性是指实时数据库中的数据应与外部数据(又称为环境数据)相一致,即要求数据库中的数据能及时地反映外部环境的状态。例如,在化工过程控制系统中,要求数据库中记录的塔的温度、压力等信息,与塔的实际的温度、压力等参数保持一致。这种一致性的破坏有时可能会导致灾难性的后果。在实时系统中,常常需要从一组数据项导出另外的数据,例如,根据系统的电流、电压导出系统的功率。此时往往要求用来导出新数据的一组数据在时间上应尽量接近,这就形成了实时数据库系统中数据的相对一致性概念。
2)事务调度
传统数据库系统中,事务调度的目标是提高系统对事务的吞吐率,但实时数据库系统则要求能使尽量多的事务在其期限内完成。因此,实时事务的调度与传统数据库系统中的事务调度是有差别的。大多数的实时事务调度策略都是围绕事务的优先级进行的。
3)实时数据库的实时数据存储管理
实时数据库主要承担系统所有实时数据的存储和管理,为相关的功能提供快速、正确的实时信息,因此,对实时数据库来说,其实时性是第一位的,考虑到这一点,实时数据库在系统运行过程中,应占用空间小,并常驻内存,以保证数据库读取速度快,存取灵活,易于各功能模块之间的数据共享。
实时数据库的数据共享采用内存文件映射来实现。 对于那些实时性要求不高的非共享数据和共享数据,如采样值的转换系数等可以放在外存储空间。因此,在实时数据库设计时,要妥善处理时间和存储空间之间的矛盾,以保证先进控制系统的实时性。
2 实时数据库的分析与设计
首先从功能角度分析实时数据库的设计。
1)实时数据库系统的功能分析:
现场数据采集:实时数据库提供了与典型数据源的接口,读写通讯设备寄存器的现场值,送到开辟的内存缓冲区。
预处理机制:可以直接在实时数据库中对原始数据进行处理,如数据转化。滚动存储机制:实时数据库的各数据对象以链表形式存放在内存中,故数据库的容量相对容固定,当新的数据产生时,自动更新数据对象的现场值属性。
自动更新机制:当实时数据库中的数据对象现场值属性改变时,自动启动线程,更新显示画面的数据
显示,如需存盘,存入 Access 数据库中,实现实时监控。
触发和定时机制:提供丰富的触发和定时机制,供各类数据处理、先进控制和优化算法使用,以保证数据的实时性、有效性、一致性。补偿机制:当不能保证连续运行时(如系统备份),需要提供相应的补偿机制,以保证数据不会丢失。
数据检索机制:可以以类似于关系型数据库的方式检索实时数据库中的数据对象,取得所需的数据对象属性或操作。
态汇总机制:实时数据库提供了报警状态、操作事件等信息的动态汇总功能。
2)实时数据库事务调度分析
在先进控制软件系统投入运行后,同时要进行与 DCS 数据采集、数据处理、图形显示刷新、历史数据存盘、紧急事件报警或越位报警等等,所有的这些事务,都要并行处理,如等待时间太长,无法满足实时性的要求。这样就要求我们实现一种并行编程,在只有一个 CPU 的机器上,也就是要将该 CPU 时间按照一定的优先准则分配给各个事件,定期处理某一事件而不会在某一事件处理过长,在 32 位 WINOOWs98或 WINOOWsNT4.0 下,用多线程的编程技术来实现这种并行编程,实时调度各事务。
3)实时数据库的设计
以面向对象编程(OOP)的设计技术,将实时数据库定义为类的形式。如图 2 所示,将实时数据库类定义的与各图形显示模块、历史数据存盘模块等相联系的接口函数划分为几个模块加以说明:
实时数据库初始化模块:该模块主要是根据先进控制所需要的数据创建各数据对象,以链表作为存储方式,并建立各数据对象对应的对象名索引,以提高访问数据对象的访问速度,同时建立 Access 历史数据库。
基本操作模块:提供数据对象的基本操作,如通过数据对象名或 ID 取得数据对象的其他属性或通过名称取得数据对象的 ID 等等。
读写数据操作模块:提供数据对象的读写数据操作,将存放在数据缓冲区的现场值写入实时数据库的数据对象的现场值属性中去,读取数据对象中的当前值。
3通讯设备读写操作模块:管理通讯设备,读取设备的当前工作状态,对指定的设备进行操作。
窗口操作模块:读取用户窗口的名称,对指定的用户窗口进行操作,读取用户窗口的当前状态。
报警操作模块:存储报警信息,读取数据对象的报警限值。
存盘操作模块:在 Access 数据库中存储需要存盘的数据。
3.实时数据库的实现
实时数据库中的数据对象类的定义:数据对象分为模拟量、开关量、字符串三个类型,下面重点介绍模拟量类的定义,并给出部分VC++代码,其他类的定义与此类似,在此不做介绍。
//模拟量的类定义:
class AnalogType : public CObject
{
public:
AnalogType();
virtual ~AnalogType();
private:
//基本属性操作参数
CString ObjectName; //对象名
float ObjectInivalue; //初始值
float ObjectMinvalue; //最小值
float ObjectMaxvalue; //最大值
CString ObjectUnit; //对象的工程单位
int ObjectPointN; //小数位数
//存盘操作参数
BOOL IsSave; //是否存盘
int SaveTime; //存盘时间
//报警操作参数
BOOL IsAlarm //是否报警
int AlarmPriority; //优先级
float LowLowvalue; //低低报警
float Lowvalue; //低报警
float HeighHeighvalue; //高高报警
float Heighvalue; //高报警
float LowDevvalue; //低偏差报警值
float HeighDevvalue; //高偏差报警值
int FieldvalueInt; //现场的实时整型值
float FieldvalueFloat; //现场的实时模拟值
//定义数据操作
public:
//定义属性的输入接口提供初始化操作
void SetObjectName(CString name) {ObjectName=name; }