图1 组态软件的层次结构
Fig.1 Hiberarchy of configuration software
最底层是与现场控制站相连的I/O驱动程序接口模块,它主要完成上层软件与现场控制站之间的数据信号的转换和缓存。I/O驱动程序之上的中间层是实时数据库控制模块,实现实时数据、历史数据、设备数据等数据之间的关联和控制,并对图形显示模块、实时趋势模块和报警模块进行通信控制。最上层是关系型数据库控制模块。主要完成用户对数据库提出的各种操作查询请求,根据要求定期对数据库进行维护管理和备份,包括实时数据记录库、登录库和其它的事件、操作、故障记录库,并通过它实现报表生成、历史曲线的显示等功能。
实时数据库是组态软件的核心,实时数据库能够及时准确地获取现场数据是整个工业控制系统正常工作的基本前提。实时数据库管理系统是事务调度中心,数据采集事务、图形显示事务、报警事务、历史存盘事务等都由实时数据库系统中的事务调度系统完成,从而达到监控的实时性、正确性和一致性。
设计实时数据库系统时,考虑到时空矛盾,应该优先考虑系统的效率。实时数据库是组态软件的核心,应该根据组态软件对不同类型的数据所要求的响应速度以及数据量的大小来制定数据的存储策略。为此,我们采用传统的数据库系统、文件管理系统和内存缓冲区三者相结合的方法,利用多种存储介质来构建组态软件的实时数据库。
(1)对于需要长期保存的非共享数据(如采样值的数模转换系数、控制组态值等)采用文件管理系统直接存取。
(2)对于数据量大而工控软件无特殊要求的共享数据(如操作者纪录等),将其存放在外存数据库中。外存数据库采用Microsoft SQL Server数据库,由实时数据库提供的接口函数对它进行操作。
(3)对于每个采样周期都要更新的数据。这样,通过使用外存数据库(Microsoft SQL Server数据库)、文管系统和内存数据库(实时数据库),既保证了数据的共享性、独立性、安全性、完整性,又节约了内存,保证了系统的响应速度。
我们采用面向对象编程(OOP)技术,将实时数据库定义为类的形式。各功能模块通过对实时数据库的接口函数调用实现与实时数据库的关联,现将实时数据库类的各操作函数定义为几个操作模块,如图2所示。
现将图2中各模块说明如下:
(1)初始化模块:实时数据库是以数据链表的方式存放在内存中,在系统运行之初,按照用户组织好的数据库动态生成实时数据库类,并根据组态数据库域的内容给相应的实时数据库类对象赋值,从而完成初始化工作。同时建立SQL历史数据库和实时数据库各数据对象对应的对象名索引,从而提高访问数据的速度。
(2)基本操作模块:提供对数据对象的基本操作,如对数据对象的查找操作,通过数据对象名或ID取得数据对象的其他属性,或通过名称取得数据对象的ID等等。
(3)数据采集模块:实时数据库中的每个数据对象都对应于工业现场的某种实时量,并与现场状态保持一致。数据采集模块负责对指定设备进行读操作,将现场设备值写入内存缓冲区。
(4)读写数据模块:根据实时数据库类对象的属性调用相应的读写方法,实现对数据对象的读写操作。
(5)计算模块:完成实时数据库的计算功能,并触发相应事件。
(6)显示链接模块:主要完成动态显示、实时趋势功能,使图形、实时数据报表、实时曲线图的显示与现场数据的变化保持一致。
(7)数据存储模块:按照实时数据库类对象的属性决定记录方式,并触发相应方法将需要保存的数据存入SQL Server数据库中。
(8)报警模块:读取数据对象的报警上下限,以及存储报警信息。
(9)事故处理模块:进行事故判断、报警、防止事故扩大对有关设备的操作,保存事故前的操作记录及现场参数值。
工业控制中的数据包括组态参数、实时数据、中间数据和控制数据。组态参数作为联系开发系统和运行系统的纽带描述工程信息。实时数据反映工业现场设备的运行情况,可以分为模拟量、数字量和逻辑量三种。中间数据则是对组态参数、实时数据进行加工得到的数据。控制数据则涉及用户对组态软件的操作,用于控制和监测组态软件运行。对于对实时性要求较高、反映工业现场设备的运行情况的各种实时数据。
经过抽象归纳,我们定义了一个统一的实时数据模型,通过利用类的继承、派生、重载等特性可以提高程序质量,实现实时数据库各功能模块间的高内聚、低耦合。它的基本属性如下:
int iIndex; //实时数据对象的序号
CString sName; //名称
CString sDesciption; //描述
int varType; //数据类型
int varPopedom; //访问权限
int varStorage; //存储类型
int varSafety; //安全级别
RTData vaiInit; //初始值
RTData vaiMax; //原始最大值
RTData vaiMin; //原始最小值
SYSTEMTIME curTime; //本次采集时间
RTData curValue; //本次运行值
SYSTEMTIME preTime; //上次采集时间
RTData preValue; //上次运行值
unsigned int uCollectTime; //采样周期,以毫秒为单位
bool isSave; //是否存盘
bool isAlarm; //是否报警
实时数据使用联合存储,从而可以满足不同类型的数据对象的要求,联合的定义如下:
typedef union tagRealTimeData
{
int iValue;
long lValue;
float fValue;
double dValue;
CString sValue;
}
RTData;
实时数据库变量以红黑树的形式存储,并保存在动态链接库的全局内存中,分配时使用的是Windows的全局内存分配函数:
HGLOBALGlobalAlloc(UNIT uFlags DWORD dwBytes)。
为了提高系统的实时性能,我们利用动态连接库(DLL)建立系统运行时的实时数据库,将实时数据库存储于动态连接库所拥有的全局内存中,然后通过该动态连接库提供的接口函数来实现对数据库的读写以及查询和管理等功能,如图3所示。
图3 实时数据库中的动态链接技术
Fig.3 Dynamic-Link Library technology of real-time database
实时数据库接口由一组用户自定义函数组成,利用这些接口函数,数据采集模块和其它各功能模块无须绕道运行程序即可直接访问实时数据库。这样系统不仅具有全面的开放性和二次开发功能,而且实时性也大大高于DDE方式。
实时数据库接口是系统提供给用户的一个开放的接口规范,它允许用户利用该接口直接访问实时数据库,这就为用户开发输入输出接口驱动程序以及用户算法模块提供了方便快捷的途径。
前面已经提过,实时数据库建立在动态链接库的全局内存中,通过提供一组自定义函数来实现对实时数据库的访问。组态软件运行系统负责启动该动态链接库,这样其他应用程序就可以通过接口函数对实时数据库进行操作了,下表列出了实时数据库的部分接口函数。
由于用户可以利用系统提供的接口函数实现与实时数据库的数据交换,因此针对不同的工业现场设备只需开发不同的驱动程序即可。从这点上讲,该实时数据库是与设备无关的,具有很强的通用性和开放性。
实时数据库的规划设计是组态软件设计的核心,它直接关系到组态软件的实时性、可靠性和稳定性,因此对实时数据库的设计要求精简、紧凑、可靠。采用传统的数据库系统、文件管理系统和内存缓冲区三者相结合的方法,利用多种存储介质来构建实时数据库系统,从而满足组态软件对实时性的要求。将面向对象的编程思想引入实时数据库的设计中,运用平衡二叉树数据结构存储实时数据,能够大大提高数据的访问速度;用XML来描述组态参数,方便用户描述和交换数据。利用动态链接库来建立组态软件运行实时数据库,通过提供一组接口函数来实现对实时数据库的访问,使实时数据库系统可以与设备无关,从而具有全面的开放性和很强的通用性。
参考文献:
[1] 郑奕,乐嘉锦.以数据库为核心——工控组态软件的设计与实现[J].兰州大学学报,1999,35(8).
[2] 阚宏进,刘希远,李翠玲.基于VC++的组态软件实时数据库系统的设计[J].甘肃工业大学学报,
2001,27(4):74-74.
[3] 陈冬梅,陈辉,尚前明.基于C/S的轮机模拟器监控软件的开发[J].微计算机信息,2006,2(1):148-148.
[4] 马国华.监控组态软件及其应用[M].北京:清华大学出版社,2001.
[5] 王亚青,陈青,刘畅生.组态软件设计与开发[M].西安:西安电子科技大学出版社,2003.
联系客服