刘红霞,徐 磊
(南京工业大学 电子与信息工程学院,南京 211816)
组态软件是用于数据采集与过程控制的专用软件[1],在工业控制领域中有着重要的作用。实时数据库系统作为组态软件的核心,它保存着系统运行时产生的动态数据和系统正常运行所需的各种信息[2]。这些信息对管理层及时分析设备运行状况、了解生产现场的实施情况、实现上层信息系统与地层控制系统的集成以及故障诊断都具有重要的意义。
国外对实时数据库系统的研究起步较早,代表产品有美国ASPEN-tech的Infoplus和OSI公司的PI等。目前国外实时数据库产品占据了大部分的国内市场份额,但对于大部分中小型企业,他们无力承担高额的费用。虽然国内一些实时数据库产品在价格上有一定优势,但在数据处理能力及速度、系统稳定性存在一些不足。因此研发具有自主知识产权的实时数据库系统具有重要意义,实时数据库系统的设计与结构的开发也显得尤为重要。
本文结合作者的工程实践,介绍了组态软件实时数据库系统及其特征,阐述了实时数据库设计开发过程中的关键技术,在此基础上提出了一套切实可行的实时数据库设计方案,并进行了性能的验证。
实时数据库系统(RTDBMS)是传统数据库系统(DBMS)与实时处理技术在功能特性上的完善和无缝集成[3]。实时数据库系统是指其事务和数据具有定时特性或显示的定时限制的数据库系统。系统的正确性不仅依赖于逻辑结果,还依赖于逻辑结果产生的时间[4]。与传统的数据库管理系统一切为了保证结果的绝对性相反,实时数据库系统将实时性看得比结果的准确性还要重要,经常会通过折中和权衡数据的完全性、准确性、一致性来求得数据的及时性。
实时数据库系统作为组态软件的核心,为组态软件的上层管理模块、历史数据库模块等提供数据的实时管理功能。实时数据库结构设计上的好坏直接影响到组态软件开发的成败。
实时数据库系统是整个组态软件系统的核心部分,其它子系统围绕实时数据库系统运行。它在底层设备和上层管理系统之间起到数据采集和数据处理的作用。
本文将实时数据库系统分为3个子系统,分别是用于实现数据库配置工作的开发系统、用于运行环境的运行系统和实现数据采集管理的数据采集服务器。实时数据库系统结构如图1所示。
开发系统实现实时数据库系统的配置工作,是系统运行的前提。组态后会生成组态数据库文件,该数据库文件记录了数据结构的信息,如系统变量点的数量、变量点的数据类型、画面程序等,供实时数据库运行系统的初始化模块读取。
图1 实时数据库系统结构图Fig.1 Real-time database system structure
运行系统用于现场监控,实时反映现场的生产状况。运行系统作为实时数据库系统的核心,实时地进行数据管理,运行系统以内存数据库为中心,其它子模块协同工作,实现系统的管理。
数据采集服务器是实时数据库系统与底层控制设备进行直接交互的接口,主要由设备驱动管理、数据采集线程管理、本地缓冲区管理和数据同步管理4个子系统组成。数据采集服务器将采集的数据更新至实时数据库,实时数据库负责将报警、画面显示、历史数据存储等消息及时通知相应的子系统处理。
各子系统采取一定的方式进行通信,共同协作完成系统功能。开发系统和运行系统以组态数据库文件为基础进行通信,实现由配置到运行的过程;数据采集服务器和运行系统之间通过数据同步线程和内存数据库的交互实现数据的同步更新。
开发系统由图形用户接口模块、功能管理模块、内存管理模块、核心功能管理模块、导入导出模块以及组态数据库文件组成。
数据是所有数据库系统的基本组成单位。实时数据库中的数据一共存在八种变量类型:IO离散型变量、IO整型变量、IO模拟型变量、IO字符串变量、内存离散型变量、内存整型变量、内存模拟型变量和内存字符串变量。本系统采用面向对象的设计思想,采用4种数据结构来表示上述8种数据类型,并且使用类中的一个成员变量来区分是IO变量还是内存变量。
组态数据库文件用于保存实时数据库系统的变量信息,本系统采用顺序文件结构来存储数据变量,并将数据库文件分为:头文件、记录块和结束标记。同时系统采用位置记录缓冲区来避免在删除变量时产生大量的磁盘读写操作。索引结构和基本数据缓冲区能够快速定位变量,进行赋值等操作。同时采用了变量的删除保护策略,防止因为变量被错误地删除而使系统产生不可预计的错误。技术人员除了可以采用标准的图形用户接口来进行变量的配置,还可以使用Excel的方式对系统变量进行组态,方便快捷。
运行系统以开发系统为前提,根据组态数据库文件进行系统的初始化工作。运行系统作为组态软件的核心部分,负责数据的实施管理,包括事务的处理、并发控制、事件管理、历史数据的存储等,运行系统结构如图2所示。
图2 运行系统结构图Fig.2 Running system structure
为了提高数据处理效率,运行系统采用内存数据库实现事务的实时处理,大大减少了系统对磁盘的操作。内存数据库的结构直接决定了实时数据库的效率、稳定性和灵活性。为了满足实时特性,当子系统向实时数据库提交事务时,数据库系统必须要能快速定位到相应变量。数组结构适合实现快速定位,但是数组结构必须要求连续的内存空间来存储数据。当系统存在大量变量点时,大容量的连续内存很难得到满足。而且系统中的八种变量类型所需要的内存空间不同,如果统一分配,将造成内存的浪费。解决以上问题,本文采用索引结构和二级缓存技术实现数据的快速定位,索引结构和二级缓存技术原理如图3所示。
图3 索引结构和二级缓存技术原理图Fig.3 Two caching techniques and index structure
索引结构采用数组结构实现,根据唯一的变量名,可以定位出内存数据库中相应的数据单元。一级缓冲区中存储各个数据项的基本信息和附加信息指针。基本信息是从不同数据类型提取的统一信息,包括变量的名字、类型及数据值等。附加信息是一个数据指针,指向二级缓冲区,存放不同变量除基本信息外的剩余信息。二级缓冲区中每个记录单元所需要的内存空间较大,可以单独在堆上进行内存空间的分配。索引结构和二级缓存技术能够充分利用内存资源,进行快速定位,以便于对事务的请求进行快速响应。
一个优秀的实时数据库系统,需要快速反应各种事务的请求,并及时处理。在实时数据库系统中,事务指对一个数据对象进行的一系列的读和写的操作。实时事务的调度一般是基于事务的优先级策略,事务的优先级策略大致可分为静态优先级策略和动态优先级策略。静态优先级策略是指在系统运行之前已经确定事务的优先级,而动态优先级策略则是在运行时根据相关参数来确定事务的优先级。本系统采用静态优先级调度策略,避免因为动态优先级的调整所带来的系统开销,从而提高运行系统实时特性。系统采用单调比率算法对事务的优先级进行计算。
组态软件中多个子系统都会与实时数据库运行系统进行交互,如果允许子系统间的串行操作,则会极大地降低系统的工作效率,因此系统采用乐观并发控制协议实现实时数据库的事务管理。
为了满足运行系统对实时性的要求,采用GetTickCount函数来进行定时的数据采集,该函数返回系统开机以来所经过的毫秒数。通过该函数以及多线程的方式可以最大限度地提高数据采集的精度。
实时数据库数据采集服务器主要通过设备驱动程序与现场设备进行实时通信,以完成系统对数据的采集功能。自动化系统中,现场的设备主要有PLC、DCS、板卡等,这些设备支持不同的通信协议,这就需要数据采集服务器能够有效地管理设备以及高效地采集数据。本系统中的数据采集服务器能够对不同通信协议以及不同接入方式的设备进行统一的管理,其结构如图4所示。
图4 数据采集服务器结构图Fig.4 Data collection server structure
各个采集线程负责通过调用硬件的驱动程序和硬件进行实时交互,将从设备采集到的数据统一送入本地缓冲区,本地缓冲区以链表形式维护数据。最后通过数据更新线程将数据和实时数据库进行数据同步。
为了对不同类型的设备统一管理,将设备进行抽象化,建立统一的数据模型。数据模型CDevice结
构如下:
class CDevice
{
public:
WORD devid;//设备的 ID 号
Char deviceName[32];//设备名称
Char logicName[32];//设备的逻辑名称
Char address[32];//设备寄存器地址
Char information[64];//设备描述
DEVADDR devAddr;//设备地址
short status;//设备的状态
WORD statusid;//状态 id 号
short enable;//使能控制
bool useModem;//是否使用调制解调器
char szPhoneNum[16];//拨号号码
bool statusChange;//状态是否改变
UINT timerCount;//通讯出现故障时,尝试重建连接的次数
UINT retryInterval;//通讯出现故障时,重建连接的时间间隔
}
由于硬件设备的种类繁多,在不同场合,需要使用的驱动程序也各有不同,因此需要对驱动程序进行统一的管理[5]。本文采用统一驱动接口模型的方式,遵循COM规范,用C++进行开发,对驱动程序接口进行抽象,制订驱动程序的接口规范,并以DLL的形式进行封装[6]。
数据采集服务器采用多线程的方式,将数据采集分散在各个线程中完成,保证数据采集的相互独立性。
内存数据库是实现实时数据库运行系统的核心,它使系统能够从内存中存取相关的数据,避免大量的硬盘操作,从而提高了效率。本文对内存数据库和关系型数据库的存取效率进行了比较。关系数据库采用Access数据库,向关系型数据库插入500及1000条记录,向内存数据库中插入1000及5000条记录,记录时间并进行对比,结果如表1所示。
表1 内存数据库和关系数据库测试数据Tab.1 Memory and relational databases test data
对比可以看出,内存数据库在存取数据的效率上远高于关系型数据库。采用内存数据库为核心的实时数据库系统能够很好地满足组态软件对实时性的需求。
实时数据库系统中采用了二级缓存技术,高效地利用了系统中内存碎片,大大减小了内存的开销。为了验证二级缓存技术在内存需求上的改进,系统初始化了2万个变量点,离散型、整数型、浮点型和字符串型各5000点,分别使用普通一级缓存结构和二级缓存结构,在内存需求方面进行对比,对比如表2所示。
表2 内存开销对比Tab.2 Comparison of memory usage
从上述对比可以看出,二级缓存技术大大减少了内存的开销。
数据处理在实时数据库系统中是最常见的操作。本文采用高效的索引结构能够快速定位变量,并通过二级缓存技术对变量进行各种操作。为了验证其性能,在20000点的实际工程中,对分布在不同位置的20个不同类型的变量点进行5000次的循环写入操作,测试结果如表3所示。
表3 数据处理测试Tab.3 Data processing test
从以上测试数据可以看出,10万次的数据写入仅需要3094 ms,即实时数据库平均每秒可以完成32000多次数据的索引以及写入操作,其性能完全能够满足软实时特性的需求。
以某省农村商业银行机房环境监控系统为例,展示实时数据库系统的应用情况。该监控系统主要完成商业银行机房环境的监控,以实时数据库为核心,通过数据采集服务器来完成D86、AC86、UPS以及智能空调等设备的数据采集以及控制。系统同时利用ModbusTCP驱动程序将全市各地ATM取款机的通信数据实时地展示出来,供机房工作人员分析及查看。监控系统会将产生的报警及时地通过短信、电话等方式告知工作人员,方便工作人员及时处理,减少不必要的经济损失。环境监控系统的结构如图5所示。
图5 环境监控系统结构图Fig.5 Environmental monitoring system structure
该系统为工作人员提供了准确的现场数据,精美的图形界面,并提供多种方式来查询历史数据,这些历史数据为故障的分析和数据挖掘提供了依据。该系统的成功应用,验证了本文提出的实时数据库系统的设计具有现实的可行性。
本文通过对中小企业的需求分析,结合组态软件的特点,提出了组态软件实时数据库系统设计方案,采用组件化的思想将系统分为开发系统、运行系统和数据采集服务器,并详细介绍了各个子系统的设计以及实现,并对系统性能进行了验证,最后列举实际案例证实方案的可行性。
本文提出的实时数据库系统已经广泛应用于各类中小企业,成功应用于楼宇、化工、生工等多类不同的监控系统,为企业创造了一定的经济效益。
[1] 冯彦.针对高速数据采集和设备控制的组态软件[D].上海:上海交通大学,2006.
[2] 宋清昆,孙元娜,王学伟,等.组态软件实时数据库系统设计[J].自动化技术与应用,2008,2(1):55-57.
[3] 张亮.基于MES的生产实绩回报系统研究[D].天津:河北工业大学,2005.
[4] 叶建位.大型实时数据库关键技术及系统构架[D].杭州:浙江大学,2005.
[5] 张勇旭,李力雄,康盛.通用组态软件驱动程序的设计与开发[J].南京:工业控制计算机 2009,22(9):1-3,6.
[6] 孙鑫,余安萍.VC++深入详解[M].北京:电子工业出版社,2006:435-480,701-731.