APP下载

基于IEC61970的CIM 模型数据库的设计与实现

2013-08-03刘吉财苏豪飞

山东工业技术 2013年15期
关键词:定义对象监控

刘吉财 苏豪飞

(1.重庆邮电大学,中国 重庆400065;2.河南煤化集团 鹤煤公司热电厂,河南 鹤壁458000)

0 引言

随着通信、计算机等技术的慢慢融入,电力系统的更新和发展已经是越来愈快,这就对支撑电力系统软件应用的数据平台部分提出了更高的要求:由于电力系统不断发展,需要的数据量越来越庞大,数据间的关系也更加的复杂,因此数据平台应该能够支持高数量级的数据管理和关系建模;由于IEC 61970 标准里定义的CIM 是基于面向对象思想的,因此数据平台要能够反映出面向对象的特点;要能够实现数据共享和交换; 由于IEC 61970 系列标准还在不断的改进,CIM 模型也在不断的扩展,就要求数据库要易于扩充和维护。

1 总体结构

通过上文对功能需求的分析及数据库的选择,将模块实现需要的工作总结为五部分,如图1 所示:

图1 模块的整体设计

功能的大致流程如下:

(1)在服务器端系统将数据加载到FastDB,系统后台实时的将封装好的数据更新到FastDB 内;

(2)操作人员选择需要实时监控的表,同时在服务器端人机交互界面通过只读的方式将监控数据显示出来;

(3)系统定期将FastDB 中的数据同步到MySQL 中;

(4)用户在客户端通过HSDA 实现访问FastDB 内的实时数据;

(5) 用户在客户端通过GDA 或TSDA 实现访问存储在MySQL 内的历史数据。

1.1 系统设计功能

(1)CIM 模型映射: 根据IEC61970 标准将CIM 以表的形式映射到数据库中;

(2)数据持久化: 根据获得数据类型,对应存入不同的表中;

(3)历史数据查询: 根据查询需求提取数据;

(4)人机交互界面: 数据库操作权限、数据管理。

1.1.1 CIM 模型在MySQL 中的 映射

对象的每个属性可以匹配成对应二维表中的一列或者多列。不是所有的属性都要映射, 在应用中不需要的部分就不用存储到数据库中。 命名规则中参考CIM 的规则,将数据库表名和类名匹配,字段名和类的属性名相对。 对象所使用的属性通常继承自其他类的属性,表中可以包含对象中没有用到的列属性,但需要在建立表结构的时候给其设定缺省值,特别是实现表间关系的那些列。 根据实际需要考虑在表里建立一些CIM 类没有明确定义的属性, 例如建立CIM 版本信息的字段等。

1.1.2 主键

主键的存在就代表着表结构的完整性,表的记录必须地得有唯一区分的字段,主键主要是用于和其他表的外键关联。 主键本身在业务逻辑上不体现,不具有实际意义,这点与FastDB 是一致的并且也能保证以后数据库更改的方便。因此我们定义了一个唯一无符号整数的主键来标识CIM 中每个类的实例对象。 并且该主键首先被定义在最顶端的“PowerSystemResource”表中,字段名为“PK_PowerSystemResource”。

1.1.3 命名转换

为了和CIM 模型保持一致, 数据库实体或表的命名取决于实体的使用。 表的命名采用其对应的CIM 类名。 在我们建立CIM 数据库中,一个类名就对应一个表名。而当两个实体具有双向关联关系时,引进一个新的实体来表征它们之间的关系。例如为了反映类“Class”和量测对象“measurement” 之间的关系, 引进一个新的表, 被命名为“ClassMeasurement”。 当引进的实体是为了反映自身之间的关联关系时, 表被命名为 “baseClassNamebaseClassName”。 例如, 为了反映“PowerSystemResource”自身间的关系,引进的表名为“PowerSystemResource PowerSystemResource”。 主 键 名 为 “PK_baseClassName”, 外 键 为“FK_foreignbaseClassName”。 这样的设计也是为了体现CIM 类之间多对多的关联关系,同时减少了外键的数量,有利于提高数据库的访问效率。

1.1.4 继承关系

在继承树的顶层对象的所有属性为全部的子对象所拥有,每个子对象是父对象的特例。 设计的CIM 数据库为了减少各个表之间耦合而又体现CIM 的这种继承特征,对父类和子类各建一张表,还需建立一个附加的属性表,这个表名为“Class”,用以连接这些集合。它有一个主键“PK_Class”以及字段“TableName”和“ParentTableName”,这样继承关系得以实现。同时在各个包含继承关系的各个表中定义一个主键“PK_PowerSystemResource”来连接这种关系。 这种方法最大的好处就是它能够很好的适应面向对象的特性,它能够很好的支持多态,对于对象可能有的每个角色,只需要在相应的表中保存记录。 修改超类和添加新的子类也非常容易,因为只需要修改或添加一张表。

1.1.5 一对多的关系

CIM 规范中有许多的一对多的关系。 对于一对多,在CIM 数据库实施的时候可以方便的利用外键进行映射,通过在多方定义一个外键指向单方来表示出这种一对多关系。 例如在量测类“Measurement”和量 测值 类“MeasureValue”之 间,往 往 一 个“Measurement”包 含 几 个“MeasureValue”,因此通过在“MeasureValue”表中定义一个外键“FK_Measurement”指向“Measurement”表的“PK_ Measurement”来连接这种关系。

1.2 数据持久化

使用open()函数打开FastDB,getTables()函数可以获取FastDB 内所有表的内容。 声明一个描述表的指针dbTableDescriptor*desc 指向获得的所有表的内容则可以将表所有数据取出。 在将数据从FastDB 取出后使用mysql_query()将数据插入到MySQL 相应的表中,相关函数:bool dbDatabase::open (char_t const* dbName, char_t const* fileName=NULL,time_t waitLockTimeoutMsec=INFINITE,time_t commitDelaySec=0。

其中fileName 为数据库所在路径,waitLockTimeoutMsec 为自定义锁释放延迟时间,commitDelaySec 为自定义事务延迟提交时间。 如果文件名参数省略, 则通过数据库名称加一个后缀“.fdb" 来创建一个文件。dbTableDescriptor*getTables(){return tables;}函数返回dbTableDescriptor*tables;表示一个所有表的列表mysql_query(MYSQL*mysql,const char*q);其中mysql 为程序一开始声明的一个句柄, 第二个参数为程序要执行的SQL 语句。

1.3 服务器端历史数据查询

使用mysql_real_connect()打开数据库,mysql_list_tables()可以获取所有表名并让一个数据集指针指向返回的结果,mysql_fetch_row ()来获得每个表的表名并全部存入结果集的数组中,按下标读取此数组则可获取表名。 mysql_store_result()获取指定表数据组成的结果集,最后由mysql_fetch_row()函数获取表中数据,相关函数:mysql_real_connect (MYSQL *mysql, const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned long clientflag); 其中参数分别对应句柄,主机名,用户名,密码,数据库名,端口,套接字或命名管道,风格。

1.4 人机交互

检验用户名与密码正确后连接到数据库。 错误则弹出警告框。 正确连接到数据库后, 可以根据表名调出表中数据以及备份和删除数据。

2 系统实时监控功能

(1)CIM 模型映射:根据IEC61970 标准将CIM 以表的形式映射到数据库中;

(2)数据监控:选择想要监控的表;

(3)实时监控:监控所选表的实时数据;

(4)人机界面:监控项的选择等。

2.1 CIM 模型在FastDB 中的映射

使用宏TYPE_DESCRIRTOR(field_list)来描述C++类或者结构体,其参数为一个类的字段描述符列表。所有数据库中使用的类都要定义类型描述符。除了定义类型描述符外,还需要使用宏REGISTER(name)在C++类和数据库表之间建立一个映像,该宏构造一个与类相连的表的描述符。 每个表只能在一个数据库中使用,如果一个应用中使用了多个数据库,需要用REGISTER_IN(name,database)宏将表注册到一个具体的数据库中。

2.2 数据表监控

使用open()函数连接数据库后使用getName()函数将库中所有的表名依次提取出来, 此时可以选取想要实时监控的表。 相关函数:getName(){ return name; }此函数返回表的名字;

2.3 数据实时监控

根据所选择的表,使用findTableByName()找到和所选表名相匹配。 匹配后使用getFirstField()获得表中所有字段,lastRow 表示表中最后一条记录,记录的获取采用表的偏移量加上字段的偏移量dbsOffs。系统间隔5 秒读取一次表内最后一条记录相关函数: TableDescriptor*dbDatabase::findTableByName(char const* name),函数参数为指向一个字符串的字符指针,如果找到传入字符串所相同的数据库表的名字则返回一个指向这个表的结构指针。

[1]辛耀中.新世纪电网调度自动化技术发展趋势[J].电网技术,2001,25(12):1-10.

[2]韩韬.遵循IEC 61970 标准的EMS 数据库研究——基于CIM 和面向对象技术的数据库浏览系统[D].国电自动化研究,2005.

猜你喜欢

定义对象监控
The Great Barrier Reef shows coral comeback
基于无人机的监控系统设计
晒晒全国优秀县委书记拟推荐对象
攻略对象的心思好难猜
成功的定义
区间对象族的可镇定性分析
个性签名
科学训练监控新趋势——适时监控
修辞学的重大定义
山的定义