2. 中国科学院 沈阳计算技术研究所, 沈阳 110168
2. Shenyang Institute of Computing Technology, Chinese Academy of Sciences, Shenyang 110168, China
随着现代经济的高速发展, 电力需求持续增加, 电网的规模在不断扩大, 电网形态也在逐渐变化[1]. 目前电力系统已经不可否认的发展成世界上最复杂的人造工业网络之一, 大电网安全问题已经成为人们关注的热点问题. 保障电网经济、稳定、安全的运行是电力行业工作者一直以来追求的宗旨. 周孝信院士于2011年在国家电网报上提出了三代电网理论[2], 将电网和电力系统的发展分为三个阶段, 即第一代小型电网, 第二代大型互联电网, 以及第三代智能电网. 关于电网的发展水平世界各国是有差异的, 但总的来说, 是处于第二代大型互联电网过渡到第三代智能电网的阶段. 电网的稳定、安全、高校运行离不开电网模型数据和运行数据的支撑. 应用系统之间的信息共享和应用集成逐渐成为迫切需要解决的问题.
电力系统的不断发展和自动化技术的提高, 使电网调度自动化系统得到广泛的应用. 出现了变电站自动化系统、电网能量管理系统(EMS)等各种自动化系统, 涉及电力行业的各个环节. 这些系统通常由不同的厂家提供, 可能采用不同的开发平台、数据库技术和应用接口, 应用间的信息共享成本很高, 不能很好的实现系统之间的互联互通. 对此, 美国电力科学研究院(EPRI)启动了CCAPI项目[3], 主要目标就是推动由不同厂商开发的EMS应用之间, 独立开发的完整EMS系统之间, 以及EMS系统与有关电力系统运行的其他系统之间的集成, 并为数据交换提供方便. 目前电力系统中对于CIM/XML的研究和解析技术已比较成熟, 但对于CIM/E, 在研究的过程中发现很少有针对CIM/E解析的研究介绍, 缺乏对CIM/E的解析过程的详细说明, 所以本文在研究CIM/E结构的基础上, 提出了一种CIM/E文件的解析方案并详细介绍了具体的解析过程, 弥补该部分的空白, 为实际的应用提供一定的参考和指导价值.
1 公共信息模型(CIM) 1.1 IEC 61970简介美国电力科学研究院(EPRI)于1993年启动了“控制中心应用接口”(Control Center Application Program Interface, CCAPI)研究项目(RP-3654-1), EPRI CCAPI项目的主要目标是: 减少向EMS中增加新应用所需要的费用和时间; 保护对EMS中正在有效工作的现有应用的投资. 随着各种组件软件技术的出现, 1999年开始确立了基于组件软件的相对稳定的CCAPI解决方案.
基于EPRI CCAPI项目的工作, 国际电工委员会57技术委员会与EPRI紧密合作, 启动IEC EMS-AIP项目[4], 制定了IEC 61970系列标准, 该系列标准定义了能量管理系统的应用程序接口(EMS-API), 包括导则和总体要求、术语表、公共信息模型(CIM)[5]、组件接口规范(CIS)和组件接口规范映射5大部分内容. 该协议提出为现有的应用系统提供一个基于公共信息模型、公共体系结构和组件技术的系统集成框架. 各个EMS应用内部可以有各自的信息描述方式, 但是只要在应用程序接口语义级上基于公共的信息模型, 不同厂商开发的应用程序或不同系统的应用间就可以以同样的方式访问公共数据, 实现应用间的相互操作和插件兼容. 通过定义应用编程接口(API), 使这些应用或系统可以访问公共数据或进行信息交换, 而不依赖于信息的内部表述形式. 公共信息模型(CIM)规定了此信息交换内容的语义. 组件接口规范(CIS)规定的消息交换的内容.
1.2 公共信息模型(CIM)IEC 61970系列标准主要包括公共信息模型 (CIM) 和组件接口规范 (CIS) 两方面内容, 其中CIM是整个协议的核心. 公共信息模型 (CIM) 是一个抽象模型, 它描述电力企业的所有主要对象, 用对象类和属性及他们之间的关系来表示电力系统资源. 通过定义一种基于CIM的公共语言 (即语法和语义), 使得应用或系统能够不依赖于信息的内部表示而访问公共数据和交换信息来实现系统间的集成. CIM中描述的对象类本质上是抽象的, 可以用于各种应用. CIM的使用远远超出了它在EMS中应用的范围. 应当把本标准理解为一种能够在任何一个领域实行集成的工具, 只要该领域需要一种公共电力系统模型, 使得应用和系统之间能够实现互操作和插入兼容性, 而与任何具体实现无关.
由于完整的CIM的规模较大, 所以将包含在CIM中的对象类分成了几个逻辑包, 每个逻辑包代表整个电力系统模型的某个部分. CIM规范使用统一建模语言(UML)表达方法, 它将CIM定义成一组包. CIM中的每一个包包含一个或多个类图, 用图形方式展示该包中的所有类及它们的关系. 然后根据类的属性及与其它类的关系, 用文字形式定义各个类. IEC 61970-301内容包括核心包、域包、发电包、发电动态包、负荷模型包、量测包、停运包、生产包、保护包、拓扑包和电线包. 每一个CIM包的类图展示了该包中的所有的类及它们的关系. 在与其它包中的类存在关系时, 这些类也展示出来, 而且标以表明其所属的包的符号. CIM 301部分的包图如图1所示.
2 电网模型交换标准 2.1 CIM/XML通过CIM提出的电力系统信息交换标准可以实现不同系统间的互联互通. 但CIM模型是个抽象模型, 它没有定义模型数据库的规范和数据交换格式, 在具体的工程应用中, 对CIM模型的实现方式需要有明确、可行的规定. XML语言解决了这个问题, CIM以XML语言为载体, 使用CIM RDF模式作为元模型框架, 并采用一个RDF语法的子集作为描述规则, 描述电网静态数据模型, 构建电力系统信息模型的XML文档[6].
根据IEC 61970 501标准所描述的CIM RDF模式, 一个EMS电力系统模型能被转换导出为一个对应的CIM XML文档, CIM RDF模式提供了CIM XML文档所使用的资源描述格式, 最终的CIM XML模型文件能够被解析, 将其中的信息导入到另一个外部系统. 目前基于CIM/XML的数据导入导出是不同系统和软件间进行数据交换和信息共享的主要方式.
2.2 CIM/E为了提高电力系统模型数据的描述效率和大量数据的在线交换的效率, 出现了电力系统数据模型描述语言E[7], E来源于3个英文单词的首字母: easy(简单)、efficiency(高效)、electric-power(电力). E语言有XML的基本特点以和优点, 使用它的特殊符号和描述语法, 能实现电力系统中各种数据模型的高效描述, 效率比XML高很多, 而且更符合人类的表述习惯[8].
E语言使用几个英文半角符号位于文件每行开头的第1个与或第2个字符组合, 表示不同的特定含义, 比如: <, >, @, #, /等符号, E语言有三种数据描述方式: 衡表式, 单列式和多列式. E语言出了基本功能, 还有扩展功能, 可以用于表示类属性的类型、单位、限值等. CIM/E文件的文件名格式为, 区域_日期_时间. CIME, 比如, 驰宏站_20170330_141315.CIME. CIM/E文件按照E格式规范对电网物理模型的相关设备类属性进行组织. 为了使电网调度自动化系统的运行要求得到满足, 应对电网物理连接模型进行描述, 包含区域、负荷、间隔、厂站、变压器、基准电压、母线段等各类对象, 对各类对象包含的属性项有相关的要求.
3 CIM/E文件解析 3.1 XML文档解析分析XML文档的解析[9]主要有两种方式: DOM和SAX. DOM是由W3C制定的一套编写XML分析器的标准接口规范, SAX是XML_DEV邮件列表中的成员根据应用的需求自发的定义的对XML文档进行操作的一套接口规范. 这两种接口规范各有长短, 互有侧重, 都有着广泛的应用. 应用程序并不是直接对XML文档进行操作的, 先由XML分析器对XML文档进行分析, 而后, 应用程序通过XML分析器所提供的DOM接口或SAX接口对分析结果进行操作, 从而间接的实现了对XML文档的访问, DOM和SAX在应用程序开发过程中的作用, 如图2所示.
文档对象模型(DOM)的全称为Document Object Model. DOM就是一个标准的对象化的接口规范, 与具体语言和平台无关. 在程序中, 基于DOM的XML分析器首先将一个XML文档转换成一个DOM树(对象模型的集合)放在内存中, 然后应用程序以通过对该对象模型的操作而实现对XML文档中数据的操作. 利用DOM接口的解析机制被称作随机访问机制, 因为通过DOM接口, 应用程序可以在任何时候访问XML文档中的任何数据, 这种随机访问方式对于应用程序来说是非常灵活的.
XML实际上是一种分层的结构, DOM使用树模型来描述XML文档信息非常有效, DOM接口提供通过分层对象模型的方式来访问XML文档中的信息, 根据XML文档的结构, 分层对象模型形成一颗节点树的形式. 解析形成的DOM树是存储在内存中的, 当XML文档比较复杂庞大时, DOM解析器对内存的要求就比较高. 图3描述了DOM解析器解析XML文档形成内存中的节点树的过程. DOM首先将文档加载进内存里, 然后再内存中构造出一个与文档对应的一棵树, 树上的每个节点都是一个对象(Node类型), 放在内存里, 访问是随机的.
XML简单应用程序接口(SAX), 全称为Simple APIs for XML. 支持DOM的解析器是W3C的官方标准, 而支持SAX的解析器是事实上的工业标准. SAX不同于DOM, SAX不必将整个XML文档事先加载到内存当中, 它快速读写XML数据, 是一种基于事件驱动的顺序的访问模式, 不能重新访问已经分析过的内容. 对XML文档进行分析的时候, 会触发一系列的事件, 并激发相应的事先定义好的事件处理回调函数, 应用程序通过事件函数从而实现对XML文档的处理和访问. SAX只做了一些简单的工作, 应用程序要自己去做大部分的工作, SAX适用于只需要访问不要更改的XML文档数据的应用程序. 文档的读入过程就对应着SAX解析器的解析过程, 图4描述了SAX解析器解析XML文档的过程.
3.2 CIM/E文件解析方案
XML文档解析器实际上就是一段程序代码, 同样CIM/E文档的解析器在本文中也是一段Java程序代码, 它读入一个CIM/E文件并分析其结构, 在分析文档的同时, 采用基于事件的方法在内存中构造出一个对应的自定的文档类型对象, 该文档类型实现了W3C标准中的Document接口. 然后程序可以对该文档对象进行操作, 将文档中的元素的不同信息分别提取出来存储到集合(ArrayList类型)中元素(TableEClass类型)的不同数据结构中.
其中TableEClass类型是构造出的一个数据结构, 用来存放从CIM/E文件解析出的元素数据内容, 该类包含tableName、columnNames、columnTypes、columnUnits、columnLimitValues、rowsData等属性, 分别存储CIM\E文件中对应的的类名、属性名, 与横表式CIM/E文件中对应的属性类型、属性单位、属性限值和数据行的内容. 上述集合对象封装了CIM/E文档中的数据信息, 有了该集合对象之后, 就可以在该对象的基础上进行数据的入库等操作, 为后续的应用做好准备, List集合中的每个元素(TableE类型)对应于数据库中的一张表, 并包含了表中的数据.
本解析方案根据CIM/E文件结构特点, 在W3C提供的DOM接口和SAX接口的基础上, 针对CIM/E文件解析定义了一系列的节点类型等数据结构, 文件中一个类对应为一个元素, 将类起始符合类结束符中间的内容设置为该元素的内容, 在封装数据的时候在具体分析取出. 该解析方案主要分为基于事件的文档对象的构建与操作文档进行数据的封装两个功能, 涉及到的主要类和方法如图5所示.
3.2.1 基于事件的文档对象的构建过程
首先定义MainParseEFile类Document documentBuildRead (String pathStr)方法, 通过CIM/E文件名来构建一个与之对应的自定义文档对象Document. 该方法的实现依赖于TheEDomSAXReader类型对象的documentBuildRead()方法, 该类有个XMLReader类型的引用, 该引用指向的对象的void parse(InputSource input)方法完成底层的文件的具体分析操作.
TheEDomXMLReader类实现了XMLReader接口, 而XMLReader接口的作用就是用于使用回调读取XML文档, 所以定义了TheEDomSAXContentHandler类并在类中提供了各种回调函数. parse()方法根据CIM/E文件中的标识符号分析到文件的不同位置时会调用处理器类中定义的各种回调方法. 这些回调方法在处理过程中借助于栈类型成员变量的进栈、出栈、取栈顶元素操作来实现自定义文档对象的构建.
最后在TheEDomSAXReader类型对象的documentBuildRead()方法中通过处理器类型引用的getTheDocument()方法返回自定义的文档对象, 如图6所示.
3.2.2 操作文档进行数据封装
MainParseEFile类中的List<TableEClass>documentOperate(Document document)方法实现了将由documentBuildRead()方法得到的文档对象中的信息存储到集合变量list中的操作. 该方法首先取出文档对象下的所有子元素, 遍历每个元素, 生成一个TableEClass对象, 将元素名对应的类名设置为对象的tableName属性值, 并将该对象添加到ArrayList<TableEClass>类型变量中, 同时, 根据元素内容的的首行初始符号判断元素的类型(即元素所属CIM/E文件的结构类型, 是单列式、多列式、还是横标式), 针对不同的文件结构使用不同的解析方法将元素内容填充到TableEClass对象中的不同属性上.
比如横表式文件的解析, 使用void parseHorizontalTableType(TableEClass classTable, String[] contentLines)方法. 遍历元素内容的各行, 将属性引导符@引导的元素内容第一行的各个属性, 设置到TableEClass对象的columnNames属性上, 针对其余的内容行, 若是以类型引导符“%”开头, 则将该行的各个类型保存到TableEClass对象的columnTypes属性上; 若是以量纲引导符“$”开头, 则将该行的各个单位保存到TableEClass对象的columnUnits属性上; 若是以限值引导符“:”开头, 则将该行的各个限值保存到TableEClass对象的columnLimitValues属性上; 若是以数据引导符“#”开头, 则将该行的各个数据追加到TableEClass对象的rowsData集合属性中.
documentOperate()遍历完文档中的每个子元素后, 在方法的最后返回已填充数据的ArrayList<TableEClass>类型的对象, 之后应用程序即可在该对象基础上进行数据入库等操作.
4 实例解析测试下面以一个变电站的电网模型文件为例(CIM/E文件)进行解析方案的实验验证, 如图7所示是导出的电网模型文件(CIM/E文件)的模拟片段.
XML文档对象模型有根节点(Document)和根元素节点root, 但电网模型文件CIM/E文件对应的文档模型是没有根元素节点的, Document节点下就是各个并列的子元素. 若将CIM/E文件导入关系型数据库中, 文件中的类名如ControlArea、BaseVoltage、Substation等应该作为表存在, 类中的属性作为表的字段、数据作为表中记录的相应字段值.
图8和图9是该CIM/E文件应用该解析方案过程中在内存中形成的自定义文档对象和对应的存储数据的ArrayList集合对象.
得到ArrayList形式的信息后, 就可以对这个信息进行操作和处理了, 比如将其存储到关系型数据库[10]. 使用的是Java进行数据库操作, Java提供的单纯的使用sql语句方式进行编程的机制, 即JDBC(Java Database Connectivity)技术. 使用纯的Java代码来去实现对应的数据库的编程, 写相应的SQL语句, 调用相应的语句把SQL代码进行执行, 把语句发送到数据库端, 让数据库端去执行SQL代码. 比如执行一条插入语句, 数据库中就具备了插入进去的内容. 实际的大型应用中后端一般会使用框架, 比如Hibernate、MyBatis等. 在程序中取得数据库的连接, 调用建表的方法, 并填充字段的值, 形成数据表结构和数据. 如图10所示为形成的ControlArea表结构数据.
5 结束语
本文首先介绍了公共信息模型(CIM)和两种电网模型交换标准, 然后分析了XML文件解析的方法及电网模型文件CIM/E的文件结构, 之后描述了一种解析CIM/E文件方法的具体过程及将解析的数据入库, 并通过电网模型数据文件CIM/E进行了验证, 该解析方法对电力系统中模型数据的解析具有一定的指导和参考意义, 可以在此方案的基础上完善各种扩展形式的文件的解析、设计数据结构, 提高解析效率等工作.
[1] |
辛耀中. 新世纪电网调度自动化技术发展趋势. 电网技术, 2001, 25(12): 1-10. DOI:10.3321/j.issn:1000-3673.2001.12.001 |
[2] |
周孝信. 第三代电网技术正在向我们走来. 国家电网报, 2011-05-05(005).
|
[3] |
王民昆. 电力系统CIM模型描述及数据交换实现的研究[硕士学位论文]. 成都: 四川大学, 2004.
|
[4] |
Draft IEC61970 Energy management system application program interface (EMS-API)-Part I: Guidelines and general requirements. Revision 5, 2002.
|
[5] |
Draft IEC61970 Energy management system application program interface (EMS-API)-Part 301: Common infor-mation model (CIM) base. Revision 3, 2004.
|
[6] |
谢淑菁. 基于CIM的电力系统模型拼接的研究和设计[硕士学位论文]. 济南: 山东大学, 2010.
|
[7] |
辛耀中, 陶洪铸, 李毅松, 等. 电力系统数据模型描述语言E. 电力系统自动化, 2006, 30(10): 48-51, 92. DOI:10.3321/j.issn:1000-1026.2006.10.010 |
[8] |
米为民, 辛耀中, 蒋国栋, 等. 电网模型交换标准CIM/E和CIM/XML的比对分析. 电网技术, 2013, 37(4): 936-941. |
[9] |
刘芳, 肖铁军. XML应用的基石: XML解析技术. 计算机工程与设计, 2005, 26(10): 2823-2824, 2839. DOI:10.3969/j.issn.1000-7024.2005.10.083 |
[10] |
朱晓娟. 基于关系的XML数据存储技术研究. 计算机与现代化, 2009(12): 51-54. |