文献标识码:A
DOI:10.16157/j.issn.0258-7998.179011
中文引用格式:徐一凤,丰大军,张瀚文,等. 基于跨平台的实时数据处理系统的设计[J].电子技术应用,2017,43(9):98-100,105.
英文引用格式:Xu Yifeng,Feng Dajun,Zhang Hanwen,et al. The design of the real-time data processing system based on multi-platform[J].Application of Electronic Technique,2017,43(9):98-100,105.
0 引言
数据采集与监视控制系统(SCADA)是以计算机为基础的生产过程控制与调度自动化系统,可以对现场的运行设备进行监视和控制。虽然SCADA系统从上世纪70年代诞生之初到现在已经经历了几代的发展,其与计算机硬件与操作系统的关系始终比较密切。在Windows上开发的SCADA系统不能运行于UNIX和LINUX操作系统上,反之亦然。在工控安全日益严峻的今天,对能够运行于国产计算机和国产操作系统的自主可控SCADA系统的需求迫在眉睫[1]。本文设计的实时数据处理系统是SCADA系统的核心,采用跨平台的软件架构设计:硬件采用国产飞腾处理器的服务器和台式机(或笔记本),操作系统采用国产中标麒麟,开发工具采用可跨平台的Qt,支持在国产中标麒麟和Windows操作系统上跨平台运行。
1 整体结构
数据采集与监视控制系统按照数据处理流程可分为四个层次:数据采集、实时数据处理、数据通信、数据显示[2],如图1所示。
数据采集子系统是SCADA系统与PLC控制器的接口部分,分为上行、下发两个方向。上行方向通过实现PLC原始数据的获取、协议解析,对现场测控设备的实时运行信息进行采集。下发方向通过实现协议封包和数据输出,对现场测控设备进行调控。数据采集子系统作为SCADA系统的内部数据源,要求常年不间断连续运行,必须具有高度的可靠性、稳定性、扩展性和强大的数据采集能力。
数据处理子系统负责对数据采集子系统采集的数据进行复杂的实时加工和处理,目的是将数据采集子系统的“生数据”加工成“熟数据”,即将采集的数据转化为满足上位机系统需要的、便于使用的数据结构,并且将数据存储到实时数据表和历史数据库中。同时,上位机下发的控制指令也要经过数据处理子系统后才能下发至对应控制器,完成对测控设备的调控。数据处理子系统是SCADA系统的数据核心,同样要求不间断连续运行,必须具有高度的可靠性、实时性、鲁棒性和强大的数据处理能力[3]。
数据通信子系统根据系统配置信息,通过以太网完成系统中各个站点之间的状态监控、组态同步、进程控制、文件维护等工作,实时数据表的站间一致性和历史数据访问也需要借助数据通信子系统的数据传输功能。所有数据通信功能以API方式提供给各个上层应用调用,实现将底层的网络功能和上层应用程序分离。
数据显示子系统通过图形界面的方式将现场设备的运行信息展现给用户。通过图形组态工具提供的图元可以组成系统图、流程图、工艺图、监控图、趋势图、饼图、棒图、报表等各种形式,实现操作员和SCADA系统之间的友好交互。
2 功能及实现
2.1 功能结构
实时数据处理子系统负责对进入数据站的各种数据进行统一管理,将统一处理后的数据写入SCADA系统的各个数据队列,供系统内部的对应模块使用。它的工作方式是事件驱动周期保护方式,实现方式是将Qt提供的消息机制和定时器相结合。采用Qt的实现方式使系统能够跨平台运行。当收到PLC通信驱动模块的通知消息,或收到通信管理模块的通知消息,或到了保护周期还没有被驱动时,实时数据处理子系统开始读取接口队列中的数据,处理各个状态点的数值和状态,并将处理过的数据输出到各个输出内存中[4]。
系统中的数据采用集中收集、全网同步的处理方法,保证系统内部各种数据收集时间一致性。在主历史站上,实时数据处理子系统读取各个数据队列中的数据,根据组态信息,处理系统数据的报警信息和状态变位信息,并将处理结果写入报警数据缓存和数字量状态变位缓存,同时将所有数据的数值和状态写入实时表,如图2所示。在非主历史站(从历史站、操作员站)上,实时数据处理子系统只需要管理本机的实时数据表,如图3所示。
实时数据处理子系统的工作流程如图4所示,数据采集子系统上传的PLC数据经过数据处理模块的处理后,分别产生报警和变位等数据状态,报警点被报警处理模块处理后写入报警队列中,同时写入全记录队列,变位点直接写入全记录队列中。所有上传的数据都要经过实时处理模块,产生其对应的状态,并写入实时数据表中。如果数据点的变化超过了历史数据的死区设定,则写入历史数据队列中。操作员的下发指令除了立即下发到指定控制器外,还要记录到全记录队列中,同时进入实时数据处理,写入实时数据表。
其中时间戳处理模块在校时子系统保证下,为待处理的数据批量打上时标。模拟量处理模块具有工程量程转换、线性/非线性变换、零漂修正算法、数值死区处理等功能,每个功能可以采用模块化设计。数字量处理具备取反功能。操作员指令处理模块包含人工置数、遥调、遥控、在线修改数据点属性等功能。人工置数、遥调、遥控支持对批量指令的处理,例如群控、顺控处理。数据通信子系统对实时数据进行站间的同步处理,使得历史主站和从站及操作员站上的数据和时间都能保证一致,避免系统数据的重复处理,提高系统性能[5]。
2.2 实现方式
实时数据处理子系统接收数据采集子系统采集数据的最快速率为50 ms,为了提高实时数据处理的速度,采用在共享内存中创建多个输入与输出队列的方式。为了保证系统可以跨平台运行,共享内存的实现采用Qt提供的QSharedMemory类。创建的队列如下所示:
(1)采集数据队列
数据采集子系统采集到的PLC控制器的数据写入该队列。
(2)操作数据队列
SCADA的用户操作和状态的更新数据都写入该队列。
(3)报警数据队列
实时数据处理模块逐一处理接口队列中报警点的报警信息,并将报警信息写入报警数据队列。写入该队列中的信息包括:报警发生信息、报警恢复信息、坏点报警。
(4)全记录队列
实时数据处理模块在处理各个输入接口队列中的数据时,将需要记入全记录中的信息写入该队列。
(5)历史数据队列
在历史站主站上,实时数据处理模块在处理采集接口队列中的数据时,对于满足收集条件的历史点的数值和状态写入历史数据队列,该队列将作为历史数据收集模块的输入数据。历史数据的收集条件为:①模拟量变化超过死区;②数字量变化满足定义条件;③数值未变,但状态发生了变化(这里的状态是指任何一个系统定义状态)。
队列的实现方式相同,均采用循环队列的方式,每个队列都存放一个共享内存中。队列的结构如图5所示。
在对队列的的操作过程中共有3种状态,分别为:空状态、正常读写状态和溢出状态,说明如下:
(1)空状态:当队列的读指针等于写指针时,则认为队列为空。例如SCADA系统刚启动时,没有读写时队列为空;或者SCADA系统运行时,数据处理速度快于写入速度,导致队列被读空等情况,如图6所示。
(2)正常读写状态:读指针追着写指针,如图7所示。
(3)溢出状态:写指针写满整个队列,重头开始写,并追上了读指针。
当要写入的新包的长度将要覆盖未处理或处理中的数据包,则队列写入模块将新来的数据包丢弃,对该丢弃事件做报警记录,并在下一次符合写入条件时写入一个全点包。如果要写入数据包的长度需要覆盖多个队列中的数据包,则这多个数据包中只要有一个处于处理状态,就属于这种情况。如果此时数据处理启动,则它连续处理未处理包,直到读指针等于写指针,如图8所示。
3 结论
本文设计实现的实时数据处理系统的工作原理采用Qt的消息机制,当接收到数据采集子系统发送的数据消息后,进行采集数据的处理,当收到操作员指令消息后,进行下发数据的处理。数据的处理采用在共享内存中创建多个队列的方式,使多个进程能够方便快速地对队列中的数据进行读写。Qt的实现方式使系统可以跨平台运行。
参考文献
[1] 陈曦,周峰,郝鑫,等.我国SCADA系统发展现状、挑战与建议[J].工业技术创新,2015(1):103-114.
[2] 宋新航.SCADA系统设计和实现[D].天津:天津大学,2009.
[3] ABBOTT R,GARCIA-MOLINA H.Scheduling real-time transactions:A performance evaluation[J].ACM Transactions on Database Systems,1992,2(3):513-560.
[4] OZDEMIR E,KARACOR M.Mobile phone based SCADA for industrial automation[J].Isa Transactions,2006,45(1):67-75.
[5] 吕炳潮,杨扬,伍民友.实时信息的理论研究及应用[J].计算机工程与设计,2010,31(18):4012-4014,4043.
作者信息:
徐一凤,丰大军,张瀚文,张 湾,赵德政
(华北计算机系统工程研究所,北京100083)