在现代化的工业生产现场,产生了大量的生产数据和控制数据,使得嵌入式环境下的数据管理成为工业控制系统中的重要部分,这就要求监控软件必须具备强大的数据处理能力,为人们提供实时、可靠的数据,以反映现场运行的状况,以便进行相应的控制操作。
嵌入式环境中数据的正确性不仅依赖于数据的逻辑结果,而且依赖于逻辑结果产生的时间。如何有效管理这些大量的、时效性强且有严格时序的数据,如何使之以高可靠性、高实时性和大吞吐量的方式进行处理是开发嵌入式系统必须解决的首要问题。
1 实时数据的处理过程
在监控系统中,需要对大量的实时数据进行处理,处理过程包括:现场数据的实时采集;对实时数据进行处理和存储;对结果进行分析、判断和报警;对历史数据的处理等。
将所有的实时数据集中进行处理,建立实时数据库,是嵌入式系统的一个中心环节。实时数据库中的很大一部分数据是从生产和测量现场实时采集到的数据,因此及时准确地采集数据是整个控制系统正常工作的基本前提。另外还有一些计算数据、控制数据和管理数据。
实时数据处理是在监控系统中对实时数据库中变量的值进行的操作。包括对数据的显示,存储,报警,管理,提供控制参数等,同时它还可以根据需要把有关信息以事件的方式发送给系统的其它部分,以便触发相关事件,进行实时处理。
历史数据处理是对定时存储到历史数据库中的数据进行处理,主要操作包括对原始数据的汇总、查询,可以以曲线、报表等形式将数据形象地显示出来。嵌入式设备存储容量有限,系统中的大量数据将通过通信接口定期送入远程关系数据库中保存。
在嵌入式系统中,实时数据库从本质上说不是一个真正意义上的数据库系统,只是一个由应用程序管理的内存缓冲区,有时又称为“内存数据库”,是一个供多个实时任务共同使用的共享数据区,是嵌入在监控软件中、与应用程序不可分割的部分,主要完成数据的存、取操作,不具有独立性。一个完整的嵌入式实时数据库系统除了内存数据库外,还应包括历史数据库、数据库管理等。因此在构建嵌入式实时数据库时,应考虑系统的实时性、开销大小、系统性能、可靠性,以及如何高效地利用嵌入式系统的有限资源、提高数据的存取速度、进行数据保护、数据交换、算法的优化、事务的优先级分派、事务调度等。
2 嵌入式组态软件中的实时数据库的开发
随着DCS的发展,利用组态软件来支持工业应用软件的开发,随着Linux在嵌入式技术领域应用的不断推广和深入,许多工控软件都基于Linux开发。从结构上看,基于Linux的嵌入式图形化组态软件(LEGCS:Linux-based Embedded Graphic Configuration Software)由系统开发环境和系统运行环境两部分组成。系统开发境是作为一个平台开发工具运行在PC机上,主要完成画面绘制、指定组态的具体对象和内容、完成设备属性设定、设定控制策略、I/O管理等操作来对控制现场进行全面的描述与设置,所有设定的结果保存到实时数据库中,供系统运行时使用。保存到实时数据库中的信息主要包括:现场数据、开关量、仪表值、实时时钟、设备属性等。运行环境实际就是工业控制应用软件,运行在嵌入式设备上,实时采集现场数据存入实时数据库,读取其中的数据并进行解析,在目标机上显示组态内容,实现设备的组态控制和仿真。维系组态环境与运行环境的纽带是实时数据库。
数据库生成模块运行在开发环境,主要完成如全局变量、内存变量的数据定义,设置变量处理方式等,全局变量直接与工业现场设备状态(如反应容器压力、阀门开关状态等)相关,这些数据在运行环境中由I/O 驱动模块按组态要求实时采集;内存变量是组态软件中用到的中间变量。实时数据生成模块将组态信息存放到实时数据库中。在运行环境,由实时数据库运行模块执行数据采集,响应用户控制请求,维护图形界面与实时数据库、被控对象之间的数据流动。运行环境中的实时曲线显示和趋势模块定时从实时数据库中获取数据,数据存储模块将实时数据库中的数据存储在磁盘上作为历史数据。
3 LEGCS系统中实时数据库的的设计
3.1 实时数据库的结构设计
实时数据按其性质可分为模拟量、开关量、数字量、字符串等多种,根据现场数据类型和系统所用到的系统常量和中间变量,在LEGCS中定义了八种变量类型:内存离散型、I/O离散型、内存整数型、I/O整数型、内存实数型、I/O实数型、内存字符串型、I/O字符串型,其中内存变量类型用于创建系统常量和中间变量,I/O变量类型用于处理现场采集的数据。对各种类型的变量来说,均有其取值范围:离散型变量只能取0和1,整型变量与一般程序设计语言中的有符号长整型变量类似,用于表示带符号的整型数据。实型变量用于表示浮点数据。字符串变量用于记录一些特定含义的字符串。每类变量一一对应于一类实时数据,它以结构的形式来管理,变量的数据结构RTVariant定义如下。
域名作用类型长度
VariantName变量名string50
VariantType变量类型string30
VariantDesc变量描述string50
ChangeLmd变量变化灵敏度,变化幅度大于该值才被记录float
InitValue软件开始运行时非离散型变量的初始值float
InitBoolValue软件开始运行时离散型变量的初始值int1
MinValue变量在实时数据库的最小值float
MaxValue变量在实时数据库的最大值float
InitMinValue变量所对应的设备的数值的下限float
InitMaxValue变量所对应的设备的数值的上限float
DeviceNameI/O类型的变量对应的设备名称string50
RegisterI/O类型的变量对应的设备寄存器string50
DataType该变量的数据类型,为上述8种类型之一string20
ReadWriteI/O变量的读写特性,只读、只写或读写string10
TimeScan读写外部设备的时间频率float
RunMode获取变量值的模式:仿真方式、直接采集string50
SoftMode定义仿真获取数据时是否随机产生string50
FltValue变量的当前值float
3.2 实时数据库生成模块设计
实时数据库生成模块运行在组态开发环境,为了方便对应用程序中的数据管理,将所有的实时变量用单向链表定形式来实现管理,用以完成对数据库的操作,链表定义如下:
typedef struct ClsRTVariantSet//实时数据库结构定义
{ int count; //链表中所有实时数据变量的个数
Position currentpos; //标记链表中的当前元素所处的位置
RTVariant * head; //指向链表的第一个元素,类型为RTVariant
RTVariant * current; //标记链表中的当前元素
}RTVariantSet;
再定义一组与该链表相关的操作来实现数据的管理,如数据的初始化、插入数据、更新、获取、设置实时数据库对象的值等操作,操作原型定义如下:
Status InitRTVariantSet(RTVariantSet* mlist, char* mstrFileName,
char* mstrFilter, int mintFiltered); //链表的初始化
void FreeRTVariantSet(RTVariantSet* mlist); //清空链表
void InsertRTVariantList(Position p, RTVariant* mObjItem, RTVariantSet* mlist);//插入数据对象
Status UpdateRTValue(RTVariantSet* mlist,char* FldNameAndValue);//更新数据
float GetRTValueByName(RTVariantSet* mlist,char* FldName);//获取变量的值
Status SetRTValueByName(RTVariantSet* mlist,char* FldName,float mfltValue);
// 设置变量的值
3.3.实时数据库运行模块的设计
实时数据库运行模块运行在仿真环境或者嵌入式设备上,主要完成实时数据的采集以及实时数据的分析处理,依据功能的不同编写不同的处理函数。如实时曲线分析(RealCurve)就是用于观察外部变量或表达式的值随时间变化的趋势的一个模块。实时曲线的X轴代表时间、Y轴代表变量值,运行时曲线可以自动卷动,以快速反映变量随时间的变化。在设计实时曲线时主要用到如下的变量属性:
域名作用类型
FltValue变量的当前值float
Count显示数据的个数int
FltModel实时曲线中设定的参照曲线的数值,一维数组,在开发环境中设置float*
FltRealValue当前值之前的时间段的实际值数组float*
FltRealValue是一个一维数组,其中存放了实时曲线实际显示的数值,存放的数据是自动卷动的,当由外部设备采集到一个当前时刻的数值后,存放在数组中的采集时间最老的一个数据将被丢弃,而加入当前新采集到的数据,数组中有效数据的总数保持不变。实时趋势曲线就是根据这个的数据结构来滚动显示的。
4 小结
嵌入式应用系统的运行要处理大量的实时数据,这就要求开发嵌入式应用系统的组态软件具有处理大量实时数据的功能。实时数据库模块分为开发环境和运行环境分别设计,在组态开发环境中完成实时数据库结构、数据来源、数据连接、数据类型及相关的各种参数的定义,生成目标实时数据库,然后在系统运行环境中,将从外部设备采集来的实时数据送入实时数据库,读取目标实时数据库中的数据进行解析,自动完成显示、报警、存盘等操作,同时把有关信息发送给系统的其它部分,以便触发相关事件,进行实时处理。