刘 群,杨建旭,童 旸
(南瑞集团公司 安徽南瑞继远电网技术有限公司,安徽 合肥 230088)
面向变电站智能辅助系统的实时数据库设计
刘 群,杨建旭,童 旸
(南瑞集团公司 安徽南瑞继远电网技术有限公司,安徽 合肥 230088)
基于关系型数据库系统在实时应用中的缺陷, 开发了一种面向变电站智能辅助系统的轻量级实时数据库。介绍了基于C语言开发的实时数据库设计方案和设计架构,分析了变电站智能辅助系统中实时数据的特征, 利用面向对象技术建立了变电站智能辅助系统实时数据库的结构模型。采用基于共享内存的数据存储技术, 提出了数据下装流程、搜索算法、商用库数据处理以及接口实现方法。实现了集成系统实时数据的存储和管理。
变电站智能辅助系统;实时数据库;共享内存;接口设计
实时数据库(Real Time Database,RTDB)是数据库与实时系统相结合的一种新型数据库,对软件核心进行实时监控,通常是在动态环境下使用, 用于监控现实世界对象的状态和所关注事件的发生[1-3]。实时数据库管理维护实时数据以及与实时数据有关的信息,与传统的数据库相比,主要在调度机制和事务管理方面有较大的区别[4-8]。实时数据库的数据和事务均有显式的时间限制,系统的正确性不仅依赖于事务的逻辑结果,而且依赖于该逻辑结果所产生的时间[9-10]。
变电站智能辅助系统是通过对变电站内安全警卫、火灾报警、环境监控、照明、视频监控等设备的信息共享、应用功能集成、操作及告警联动,为变电站运维及集中监控提供支撑的系统[11-12]。由于变电站自动化系统的实时性要求较高,应用活动的完成具有严格的时限,要求在某时刻或某有限时间内把从远程测控终端采集来的遥测、遥信和电量数据,按彼此间的关联存取和处理,这些数据的有效时间是短暂的,过时则失效。例如, 一个具有5 000个变量的变电站,数据平均每2 s刷新一次,每秒钟便会产生2 500个数据。于是,每秒钟有2 500 行数据需要插入到数据库中以实现完整的数据存储,常规的关系型数据库如Oracle、SQL Server的事务处理率有限,在管理实时数据方面存在着严重的不足[13]。而实时数据库基于共享内存的数据管理方式,节约了存储空间,同时可以大幅缩短数据采集时间,为面向智能化的实时数据应用系统和管理分析系统提供保障[14-15]。
为满足变电站智能辅助系统的高速数据访问要求,设计实现了一个基于共享内存的实时数据库,具备良好的数据模型、访问调度和并发控制机制,以支持不同类型的事务,大幅缩短了变电站智能系统的数据采集时间,同时提供了基于优先级的数据访问和较强的数据处理能力。
变电站智能辅助系统中要测控的数据很多,只有对这些数据进行分类,并定义它们的数据结构,才能在软件中实现数据的管理。变电站智能辅助系统主要任务是完成遥测、遥信、遥调、遥控, 根据这4个主要功能和变电站的实际应用情况,可以将变电站监控系统中的数据分为:遥信量、遥测量、遥控量、遥调量,除此之外, 系统还要记录一些SOE 事件和多状态量。但是实时数据库系统比较关心的是随时间变化的数据,即遥测量和遥信量。实时数据库负责这些数据的管理存放,在与外部系统的典型交互的过程中,如图1所示,监控客户端通过数据输出接口取得实时的数据,不同的外部数据源通过数据输入接口输入实时数据,数据管理模块则负责管理实时数据,为监控客户端提供统一的数据源视图,实现实时数据的高速访问及数据存储策略,以提高系统的响应速度和处理能力。
图1 实时数据库与外部系统交互模型
1.1 数据下装
原始的数据模型都储存于商用库,实时库中的数据模型从商用库中下装,下装后即可为其他进程提供数据访问服务,实时数据库实体仅在服务端分布。商用库的表名表和字段表包含下装类型,决定表和字段是否下装到实时库。独立的下装程序根据下装类型筛选,从商用数据库获取数据,生成共享内存中的实时数据表。下装过程如图2所示:①调用商用库的接口,获得需要下装到实时库的表号(表号按照不同应用服务分配表号区间,预留一定的表号区间可以用于扩展业务需求,规则如下:系统信息表区间为10 000~10 999,其中表名表为10 000,字段表为10 001;告警表区间为11 000~11 999;日志表区间为12 000~12 999;视频应用表区间为13 000~13 999;环境应用表区间为14 000~14 999;消防应用表区间为15 000~15 999;安防应用表区为16 000~16 999);②查询返回结果;③根据查询返回结果,建立表信息的列表;④调用商用库接口获得各表的最大记录数;⑤通过遍历表信息,获得表的字段信息,其中字段信息包括字段序号,字段类型,字段长度,字段名称,字段的偏移量和字段描述等;⑥建立信息头结构体和字段信息数组,根据表的最大记录个数、信息头长度,计算出共享内存的空间大小;⑦创建共享内存段。根据表号,查询对应的表,获取所有记录数据,按记录号递增排序;⑧解析Json串,将记录数据存入二维数组,再将记录数据写入共享内存数据区。遍历表信息列表,重复之前步骤,建立所有实时库表的共享内存;⑨下装程序结束。
图2 数据下装流程图
1.2 数据存储管理
传统的磁盘数据库的操作基于磁盘存取,而磁盘存储时间延时及其不确定性对实时任务有很大的影响。数据存储管理模块主要为解决上述问题主要负责变量对象的生成、删除、访问以及数据内容的更新。实时数据库的数据存储管理是以共享内存为存储介质,每张表对应一个共享内存段。按照每张表建立一个共享内存,共享内存标识由表号(Linux系统下,以表号作为标识;Windows系统下,以前缀加上表号作为共享内存名称)决定。
实时数据在共享内存中的存储形式如下:表中所有记录的长度一致,数据在共享内存中的存储是以记录单位。检索时首先根据记录号搜索记录的起始地址,再根据字段号来计算偏移量,最终获取数据。记录的长度由该表的所有字段长度总和决定。表中各个字段的类型和长度通过建表管理工具设置。共享内存文件如表1所示,每张表的共享内存文件分为信息头、字段信息和数据区3个部分。信息头内容见ShareHeadInfo结构体。字段信息区为FieldInfo_st结构体数组。数据区则是把记录内容按照顺序连续存储在共享内存中,每条记录的长度相同。记录号为4 Byte整数,按大小递增排序。
表1 共享内存文件
1.3 搜索算法
实时数据库实现对数据的存取操作和其他处理, 保证数据库状态最新, 数据值时间一致;事务管理模块管理实施事务的产生, 执行和结束, 首先要解决实时调度问题, 实时调度最主要的目标是满足事务的截止时间, 搜索算法需要在最大程度上满足事务的时间限制, 同时保证数据的逻辑一致性和时序一致性。
1.3.1 表搜索
每张表对应一个共享内存,内存号就是表号。因此,通过表号可以直接访问相应共享内存。
1.3.2 记录搜索
根据记录号可以采用二分查找算法在数据区搜索,获得对应记录的偏移量。代码如下
/*
* 记录搜索
*param[in] sharePos共享内存起始地址
*param[in] recNo查找的记录号
*param[in] headInfo共享内存信息头
* eturnint 偏移量
*/
int RecSearch(char *sharePos/*共享内存起始地址*/,int RecNo/*查找的记录号*/,ShareHeadInfo *headInfo/*共享内存信息头*/)
{
int recCnt = headInfo->iRecCnt;
int RecHeadAddr=headInfo->iRecHeadAddr;
int RecordLength=headInfo->iRecordLength;
int recNoLength = sizeof(int);
int low = 0;
int high = recCnt - 1;
int middle = 0;
int pos = 0;
unsigned int flag = 0;
int* value = NULL;
while(low <= high)
{
middle = (high - low)/2 + low;
pos = RecHeadAddr + (RecordLength+recNoLength)*middle;
value = (int*)(sharePos + pos);
if(*value == RecNo)
{
printf(" find middle = %d,pos = %d ",middle,pos);
memcpy(flag,pos+recNoLength,4);
if(flag == 0x5555AAAA)
{
return -2;∥记录已删除
}
else
{
return pos+recNoLength;
}
}
else if(*value > RecNo)
high = middle - 1;
else
low = middle + 1;
}
/*没找到*/
printf(" no find ");
return -1;
}
根据偏移量,获取字段数据,以字符串数据为例:
if(field_info[fieldNo].iType == DATATYPE_STRING)
char *str = sharePos + recPos /*RecSearch()函数返回的记录偏移量*/
+(field_info[fieldNo]).iPos/*字段偏移量*/;
1.3.3 关心数据索引
接口程序中可各自建立关心数据索引,将常用的数据地址记录下来。如果可以在共享内存的地址直接获得数据,每次检索数据时,先搜索该索引。
1.4 商用库数据处理
商用数据库中的记录发生增删或修改操作时,可同时调用实时库接口,对对应的记录进行操作。商用数据库修改记录是根据所修改记录的表号和记录号,搜索记录位置,再根据字段号获得对应字段的共享内存地址,然后清除现有字段内容,最后重新写入修改后的字段内容。商用库删除记录实例如表2所示,是根据所修改记录的表号和记录号,搜索记录位置,再清除现有记录内容,最后将记录内容数据置为0x5555AAAA,表示该记录内容已失效。
表2 商用库删除记录实例
商用数据库增加记录是在添加记录时,记录号在最大记录号原有的基础上加1。只要记录个数未超过最大记录个数,实时库则已经预留了数据空间。判断当前记录数添加新纪录后是否超出最大记录数,若超出则返回错误提示,建议实时数据库重新下装(商用库进行大量删除操作时,实时库保留了原记录的空间,且当前未更改记录数。因此,商用数据库认为总记录个数未超过上限,但实时数据库有可能认为超过上限。此时,实时数据库应该重新下装);根据当前记录数,计算新记录写入的首地址;写入4 Byte记录号;按照字段长度,依次写入字段数据。若商用库的表结构发生修改,则实时数据库需要重新下装。
1.5 接口设计
实时数据库的接口程序设计为动态链接库,由需要操作实时数据库的程序加载调用。进程间相互独立,通过接口直接访问共享内存,操作实时库。主要的读写接口由实时库实例初始化,获得所有表的表号,获得指定表的记录数,获取指定表的表结构,读实时数据库,写实时数据库,删除表记录,追加记录,获取指定记录和获取字段类型。
为满足系统内不同计算机间的实时库访问,设计了网络实时库接口,通过Socket通信。其通信过程如图3所示,接口与本地接口类似, 但是主要通过独立的进程实现接口服务。
图3 计算机间通信过程
实时数据库是变电站智能辅助系统的重要组成部分。基于实时数据库的理论基础,从数据下装, 数据存储管理,商用库数据处理以及数据访问接口等几个方面对其进行了研究, 设计了变电站自动化系统的实时数据库, 实现了高速数据的访问和存储, 并且为各功能模块以及系统的开发者提供了一个访问数据库的统一接口, 为系统的开发者提供了便利。
[1] 李文兢,陈文定,曾明.面向智能建筑集成系统的轻量级实时数据库设计[J].智能建筑行业应用,2006(10):124-126.
[2] 陈文定,李文兢,胥布工.面向智能建筑集成管理系统的轻量级实时数据库设计[J].楼宇自动化,2007,10(4):12-14.
[3] 刘铭.工业实时数据库设计研究[D].西安:西安交通大学,2003.
[4] Aranha R F M,Ganti V,Narayanan S,et al.Implementation of a real-time database system[J].Information System,1996,21(1):55-74.
[5] 钱笑宇,张彦武.工业实时数据库的研究和设计[J].计算机工程,2015,41(2):98-100.
[6] Zhou L,Rundensteiner E A,Shin K G.Schema evolution of an object -oriented realtime database system for manufacturing automation[J].IEEE Transactions on Data and Knowledge Engineering,1997,79(6):956-977.
[7] 严哲南,赵风光.一种适合硬件实现的高效算术编码[J].通信学报,2000(21):86-90.
[8] 聂书志.实时数据库的设计思想与实现技术[J].经济与社会发展,2006,4(11):153-155.
[9] 拓广忠,慕群.实时数据库原理及其压缩分析技术[J].华北电力技术,2004,6(6):17-20.
[10] 刘云生.实时数据库系统(RTDBS)及其特征[J].华中理工大学学报,1994(6):66-70.
[11] 苏和.智能变电站辅助系统的设计与实现[D].北京:华北电力大学,2012.
[12] 孔详雯.500 kV无人值守智能变电站辅助控制系统研究[D].郑州:郑州大学,2014.
[13] 赖明江,耿英三,张国钢,等.变电站自动化系统中实时数据库的研究[J].继电器,2016,34(2):66-69.
[14] 吴文传,张伯明,许春晖.调度自动化系统实时数据库模型的研究与实现[J].电网技术,2001,25(9):28-32.
[15] 白树忠,南新志.变电站综合自动化实时数据库管理系统的研究与开发[J].电力系统及其自动化学报,2002,14(3):43-46.
Design of Real Time Database for Substation Intelligent Auxiliary Systems
LIU Qun1,YANG Jianxu2,TONG Yang3
(Anhui Nari Jiyuan Electric Power System Tech Co., Ltd, Nari Group Corporation, Hefei 230088, China)
A lightweight real time database (RTDB) for substation intelligent auxiliary system is put forward. The design project and structure of RTDB based on C language are introduced, and then the characteristics of real-time database in the substation intelligent auxiliary system are analyzed. The structure model of real-time database in the substation intelligent auxiliary system is established with the object oriented technology. The data storage technology based on the shared memory is used. The data downloading process and search algorithm are introduced, while a method for data processing of commercial database and interface is proposed. Storage and management of real time data in integrating system are realized.
substation intelligent auxiliary system; RTDB; shared memory; interface design
2016- 09- 14
刘群(1963-),男,高级工程师。研究方向:自动化。杨建旭 (1983-),男,本科。研究方向:软件研发。童旸 (1991-),男,硕士研究生。研究方向:软件研发。
10.16180/j.cnki.issn1007-7820.2017.07.034
TP311.1
A
1007-7820(2017)07-124-04