1 引言
现代工业的特点要求全过程的实时监控,高速的实时数据处理、长期的历史数据存储以及生产信息的集成与共享。要满足上述对生产数据的处理要求仅靠大量采用集散控制系统(DCS)和关系数据库技术并不能完全解决问题。DCS数据存储能力有限,同时企业中异构的DCS无法进行有效的数据共享。而关系数据库数据处理速度低,无法对生产过程数据进行及时高效的存储。
为了解决上述问题,实时数据库作为一个关键的支撑技术引入工业控制系统。在生产设备运行过程中,实时数据库系统实时采集设备的运行数据,随时掌握装置的运行情况,并通过对生产过程的关键数据的实时监控分析,对出现的问题即时进行处理,使生产的运行状态保持平稳。实时数据库还是是连接工业生产控制系统与企业上层管理系统的桥梁,企业可以通过实时数据库系统提供的数据平台,为经营决策、计划调度、先进过程控制,质量监控等分系统提供同一的数据平台。
2 实时数据库系统概念和特点
实时数据库系统(RTDBS)就是其事务和数据都可以有定时特性或显式的定时限制的数据库系统。系统的正确性不仅依赖于逻辑结果,而且还依赖于逻辑结果产生的时间。对于实时数据库系统,数据的一致性和执行的周期性是重要的目标,由于在实时系统中经常以固定的时间周期收集被控系统的实时数据,相应的控制系统也必须周期性地处理数据和作出响应;由于传统的关系型数据库在一些时限要求严格的场合不能满足实时系统对数据实时性的要求,而内存直接寻址是一种具有高速的数据访问方式,在技术上采用内存数据库是解决这一问题的理想解决方案。
整个实时数据库系统方案的设计分为驻内和留外两个部分,驻内部分即为内存数据库,是实时数据库的主体,存储形式可采用顺序结构,B树结构或多目录搜索哈希技术(散列技术)。内存数据库定时进行事务处理,对超过一定时间的数据从内存中清除,写到外存数据库中。外存数据库即磁盘数据库或历史数据库,用于历史记录分析,报表生成答应或相关决策等等。本系统历史数据库采用的是Microsoft公司的数据库产品SQLServer。
3 关键技术研究和实现
3.1数据的实时采集
在工业控制系统中,数据采集程序的实时性和稳定性对于整个工控系统的性能起着至关重要的作用。Windos提供的定时器TImer远达不到要求,必须使用精度更高的定时器来取代。
Windows系统下的多媒体定时器API函数timeSetevent和timeKillEvent就能很好的满足实时性的要求。该多媒体定时器工作在自己的线程内,且它的线程优先级(threadprioritylevel)设定为THREAD_PRIORITY_TIME_CRITICAL,这比绝大部分的线程优先权数值都高,相比工作在用户界面线程内的Timer定时器来说,它不受消息机制的影响,能够达到很高的定时精度。它的最高定时精度能够达到1ms,能够满足较高实时性的要求。
3.2内存数据库技术
内存数据库指数据库常驻内存及事务的数据存取只涉及内存。内存数据库是支持实时事务的一种最佳技术,其本质特征是其“主拷贝”或“工作版本”常驻内存,活动事务只与实时内存数据库的内存拷贝交互,显然,它需要较大的内存量。内存数据库可以简记为MMDB。MMDB的“工作版本”常驻内存,在任何一个事务执行过程中没有内外存间数据I/O。这为系统较准确估算和安排事务的运行时间、实现事务的定时限制打下了基础,从而满足外部事务应用对响应时间和事务吞吐率的需求。
3.2.1利用内存映射文件共享内存
共享内存是实时数据库核心技术之一。所谓内存映射文件,即在内存中申请一块内存空间,将一个文件与这块空间相联系,再进行内存映射,这样,操作文件就有和操作内存一样的效率,几个进程可以通过操作该映射文件,实现进程间在内存一级的高速数据交互。当采用内存映射文件方式时,Windows对于再次使用该文件的进程不在创建新的映射文件对象而共享前一段内存映射对象,并将该对象映射成两个地址空间,这种机制不仅有效地利用了内存,同时也实现了数据的共享。要在Windows2000下实现内存读写一级的数据通信效率,唯一的办法就是使用内存映射文件。内存映射文件使用方法如下:
(1)创建或打开文件内核对象
创建或打开一个文件内核对象,总要调用CreateFileCreateFile函数:
如果CREATEFILE函数成功地创建或打开指定的文件,便返回一个文件内存对象地句柄,否则返回INVALID_HANDLE_VALUE。
(2)创建一个文件映射内核对象。
调用CreateFile函数,可将文件映像的物理存储器位置告诉操作系统。这时,必须告诉系统,文件映射对象需要多少物理存储器。若进行这项操作,可以调用CreateFileMapping函数:HANDLECreateFileMapping(HANDLEhFile,PSECURITY_ATTRIBUTESpsa,DWORDfdwProtect,DWORDdwMaximumSizeHigh,DWORDdwMaximumSizeLow,PCTSTRpszName)。系统创建文件映射对象,并将用于标识该对象的句柄返回该调用线程。如果系统无法创建文件映射对象,便返回一个NULL句柄值。
如果内存映射共享文件只是为了进程间互相传送信息,而完全没有要将其设置为磁盘文件的情况下,可以直接在内存中定义一个空间来进行数据交互。方法很简单:在调用CreateFileMapping函数时,设置(HANDLE)0xFFFFFFFF作为hFile参数。这样就告诉系统不映射Windows磁盘上的内容,而只是要Windows把内存中一区域看成文件。
(3)将文件数据映射到进程地地址空间。
当创建一个文件映射对象后,仍必须让系统为文件数据保留一个地址空间区域,并将文件数据作为映射到该区域的物理存储器进行提交。可通过MapViewOfFile函数来进行这项操作:PVOIDMapViewOfFile(HANDLEhFileMappingObject,DWORDdwDesireAddress,DWORDdwFileOffsetHigh,DOWRDdwFileOffsetLow,SIZE_TdwNumberOfBytesToMap);当一个文件视图映射到进程的地址空间中时,必须规定两件事。首先,必须告诉系统数据文件中哪个字节该作为视图中的第一个字节来映射。可用dwFileOffsetHigh和dwFileOffsetLow参数来进行这项操作。其次,必须告诉系统,数据文件有多少字节需要映射到地址空间。可使用dwNumberOfBytesToMap参数来设定。
(4)从进程的地址空间中撤销文件数据的映像。
当不需要保留映射到你的进程地址空间区域中的文件数据时,可通过调用下面的函数来释放:
BOOLUnmapViewOfFile(PVOIDpvBaseAddress)。
(5)关闭文件映射对象和文件对象。
若要关闭文件映射对象和文件对象,只需要两次调用CloseHandle函数。
3.2.2内存数据库的存储
由于数据库存放在内存中,不再像普通数据库那样作为大量磁盘文件的集合,而是内存中可直接寻址的数据。内存直接寻址,是目前访问速度最快的存储设备,从而能够满足高度实时性的要求。从工业以太网得到的实时数据,经过应用程序处理后,将其引入内存数据库中。根据工控自动化系统的特点,在工控自动化系统中,对实时数据库操作最多的是根据工位名等进行的精确查询、更新,如每秒钟可能有成千上万个工位需要更新其实时数据记录。所以,散列技术将是工控系统中内存数据库存取算法的首选。
构造散列函数需要考虑计算散列函数所需要的时间(包括硬件指令的因素),过于复杂的散列函数将影响系统的实时性。构造散列函数的方法很多,常用的有直接定址法、平方取中法、折叠法、保留余数法。其中保留余数法是一种最简单、也最常用的构造散列函数的方法,它不仅可以对关键字直接取模,也可以在折叠、平方取中等运算后取模。另外,关键字的选择将影响散列函数的均匀性,尽可能使关键字经过散列函数得到一个随机的地址,以便使一组关键字的散列地址均匀分布在整个地址区间中,从而减少冲突。构造散列函数需要考虑一下两个问题:(1)如何构造使节点“分布均匀”;(2)一旦发生冲突,用什么方法解决。综上考虑,我们采用双重散列技术。首先双重散列所产生的探测序列能够查找整个散列表,但选取的辅助散列函数g(k)必须与M互素。其次,双重散列可以产生Θ(m2)种探测序列,使得处理碰撞时,选取空位置更加随机,选取合理的辅助散列函数将使得散列表很少产生堆积。如果M是素数,且h(k)=kmodM,则我们可以设g(k)=1+(kmod(M-1));但由于M-1是偶数,因而命名g(k)=1+(kmod(M-2))将更好。这就提示我们选择M使得M和M-2好像1021和1019这样的“孪生素数”。
3.2.3实时事务调度
实时数据库是应用系统的数据处理中心,系统各个部分均以实时数据库作为公共区进行数据交换,实现各个部分协调动作。系统运行后,实时数据库要同时进行下位机的数据采集、数据处理、图形显示刷新、历史数据存盘、事件报警、现场控制等事务。其调度模型如图1所示,所有事务都要进行并行处理。
实时事务调度是一个较复杂的算法问题,考虑到时间限制,其调度策略可分为三类:①优先级调度算法;②时间片轮算法;③多级反馈队列调度算法。而实时事务调度一般都是围绕事务的优先级进行的,在只有一个CPU的机器上,将CPU时间按照一定的优先级分配给各个事务,定期处理某一事务而不会使某一事务处理时间过长,可用多线程编程技术来实现这种并行控制,实时调度各类事务。本系统就采用优先级调度算法,其优先权分配策略采用最大密度事务付给最高优先权。本系统中除了控制事务和数据采集事务对实时性要求比较高外,其他数据处理类型事务的紧迫性和定时性要求相对较低,因此,本系统对不同类型的事务分配不同的优先权,以最大限度地提高系统的性能。
3.3多线程编程技术的引入
在工控系统中,实时数据库系统要实现现场数据的实时更新,能够根据现场数据进行安全监控,对现场的数据根据用户的设置时间间隔进行保存,对发生事故的监控点进行事故追忆等,这些功能若全部由一个线程来完成,会因资源冲突等问题而影响处理效率。为此,我们采用了多线程编程技术。整个系统由通信线程、报警处理线程、写历史数据库线程、图形显示线程、实时曲线显示线程和主界面线程等。
撰写多线程程序的一个最具挑战性的问题就是:如何让一个线程和另一个线程合作。这引出了一个非常重要的问题:同步。所谓同步是指进程、线程间相互通信时避免破坏各自数据的能力。在本系统中,我们引入了“读者-写者”模型,在该模型中,有多个读者和多个写者,以内存数据库为临界资源进行同步访问。其中通信线程、写历史数据库线程为“写者”线程,报警处理线程、图形显示线程、实时曲线显示线程为“读者”线程。“读者-写者”模型的读写操作限制如下所示:①写-写互斥:不能有两个写者同时进行写操作;②读-写互斥:不能同时有一个线程在读,而另一个线程在写;③读-读允许:可以有一个或多个读者在读[7]。这样,整个系统通过各个线程之间的相互协调来工作,可以避免因循环检测而浪费系统效率,比较好地解决了各线程访问内存数据库之间的同步问题。
4 结束语
实时数据库是数据库技术的一个分支,在工业控制过程中,其开放的体系结构和高效的数据存储模式,使得它对生产过程信息的集成发挥着重要的作用,有着及其广泛的应用前景。本文介绍了在工业控制系统中实时数据库的功能、特点和事务,在此基础上通过对多媒体定时器、内存数据库技术、多线程及其同步技术等关键技术的分析和研究,给出了实时数据库系统的具体实现方法。系统经实际运行,证明该实时数据库运行安全、可靠、稳定性强,取得了令人满意的效果。