崔 麗,王占國,吳 奕
1(中國科學(xué)院大學(xué),北京 100049)2(中國科學(xué)院 沈陽計算技術(shù)研究所,沈陽 110168)
隨著現(xiàn)代經(jīng)濟的高速發(fā)展,電力需求持續(xù)增加,電網(wǎng)的規(guī)模在不斷擴大,電網(wǎng)形態(tài)也在逐漸變化[1].目前電力系統(tǒng)已經(jīng)不可否認的發(fā)展成世界上最復(fù)雜的人造工業(yè)網(wǎng)絡(luò)之一,大電網(wǎng)安全問題已經(jīng)成為人們關(guān)注的熱點問題.保障電網(wǎng)經(jīng)濟、穩(wěn)定、安全的運行是電力行業(yè)工作者一直以來追求的宗旨.周孝信院士于2011年在國家電網(wǎng)報上提出了三代電網(wǎng)理論[2],將電網(wǎng)和電力系統(tǒng)的發(fā)展分為三個階段,即第一代小型電網(wǎng),第二代大型互聯(lián)電網(wǎng),以及第三代智能電網(wǎng).關(guān)于電網(wǎng)的發(fā)展水平世界各國是有差異的,但總的來說,是處于第二代大型互聯(lián)電網(wǎng)過渡到第三代智能電網(wǎng)的階段.電網(wǎng)的穩(wěn)定、安全、高校運行離不開電網(wǎng)模型數(shù)據(jù)和運行數(shù)據(jù)的支撐.應(yīng)用系統(tǒng)之間的信息共享和應(yīng)用集成逐漸成為迫切需要解決的問題.
電力系統(tǒng)的不斷發(fā)展和自動化技術(shù)的提高,使電網(wǎng)調(diào)度自動化系統(tǒng)得到廣泛的應(yīng)用.出現(xiàn)了變電站自動化系統(tǒng)、電網(wǎng)能量管理系統(tǒng)(EMS)等各種自動化系統(tǒng),涉及電力行業(yè)的各個環(huán)節(jié).這些系統(tǒng)通常由不同的廠家提供,可能采用不同的開發(fā)平臺、數(shù)據(jù)庫技術(shù)和應(yīng)用接口,應(yīng)用間的信息共享成本很高,不能很好的實現(xiàn)系統(tǒng)之間的互聯(lián)互通.對此,美國電力科學(xué)研究院(EPRI)啟動了CCAPI項目[3],主要目標就是推動由不同廠商開發(fā)的EMS應(yīng)用之間,獨立開發(fā)的完整EMS系統(tǒng)之間,以及EMS系統(tǒng)與有關(guān)電力系統(tǒng)運行的其他系統(tǒng)之間的集成,并為數(shù)據(jù)交換提供方便.目前電力系統(tǒng)中對于CIM/XML的研究和解析技術(shù)已比較成熟,但對于CIM/E,在研究的過程中發(fā)現(xiàn)很少有針對CIM/E解析的研究介紹,缺乏對CIM/E的解析過程的詳細說明,所以本文在研究CIM/E結(jié)構(gòu)的基礎(chǔ)上,提出了一種CIM/E文件的解析方案并詳細介紹了具體的解析過程,彌補該部分的空白,為實際的應(yīng)用提供一定的參考和指導(dǎo)價值.
美國電力科學(xué)研究院(EPRI)于1993年啟動了“控制中心應(yīng)用接口”(Control Center Application Program Interface,CCAPI)研究項目(RP-3654-1),EPRI CCAPI項目的主要目標是:減少向EMS中增加新應(yīng)用所需要的費用和時間;保護對EMS中正在有效工作的現(xiàn)有應(yīng)用的投資.隨著各種組件軟件技術(shù)的出現(xiàn),1999年開始確立了基于組件軟件的相對穩(wěn)定的CCAPI解決方案.
基于EPRI CCAPI項目的工作,國際電工委員會57技術(shù)委員會與EPRI緊密合作,啟動IEC EMS-AIP項目[4],制定了IEC 61970系列標準,該系列標準定義了能量管理系統(tǒng)的應(yīng)用程序接口(EMS-API),包括導(dǎo)則和總體要求、術(shù)語表、公共信息模型(CIM)[5]、組件接口規(guī)范(CIS)和組件接口規(guī)范映射5大部分內(nèi)容.該協(xié)議提出為現(xiàn)有的應(yīng)用系統(tǒng)提供一個基于公共信息模型、公共體系結(jié)構(gòu)和組件技術(shù)的系統(tǒng)集成框架.各個EMS應(yīng)用內(nèi)部可以有各自的信息描述方式,但是只要在應(yīng)用程序接口語義級上基于公共的信息模型,不同廠商開發(fā)的應(yīng)用程序或不同系統(tǒng)的應(yīng)用間就可以以同樣的方式訪問公共數(shù)據(jù),實現(xiàn)應(yīng)用間的相互操作和插件兼容.通過定義應(yīng)用編程接口(API),使這些應(yīng)用或系統(tǒng)可以訪問公共數(shù)據(jù)或進行信息交換,而不依賴于信息的內(nèi)部表述形式.公共信息模型(CIM)規(guī)定了此信息交換內(nèi)容的語義.組件接口規(guī)范(CIS)規(guī)定的消息交換的內(nèi)容.
IEC 61970系列標準主要包括公共信息模型 (CIM)和組件接口規(guī)范 (CIS)兩方面內(nèi)容,其中CIM是整個協(xié)議的核心.公共信息模型 (CIM)是一個抽象模型,它描述電力企業(yè)的所有主要對象,用對象類和屬性及他們之間的關(guān)系來表示電力系統(tǒng)資源.通過定義一種基于CIM的公共語言 (即語法和語義),使得應(yīng)用或系統(tǒng)能夠不依賴于信息的內(nèi)部表示而訪問公共數(shù)據(jù)和交換信息來實現(xiàn)系統(tǒng)間的集成.CIM中描述的對象類本質(zhì)上是抽象的,可以用于各種應(yīng)用.CIM的使用遠遠超出了它在EMS中應(yīng)用的范圍.應(yīng)當把本標準理解為一種能夠在任何一個領(lǐng)域?qū)嵭屑傻墓ぞ?只要該領(lǐng)域需要一種公共電力系統(tǒng)模型,使得應(yīng)用和系統(tǒng)之間能夠?qū)崿F(xiàn)互操作和插入兼容性,而與任何具體實現(xiàn)無關(guān).
由于完整的CIM的規(guī)模較大,所以將包含在CIM中的對象類分成了幾個邏輯包,每個邏輯包代表整個電力系統(tǒng)模型的某個部分.CIM規(guī)范使用統(tǒng)一建模語言(UML)表達方法,它將CIM定義成一組包.CIM中的每一個包包含一個或多個類圖,用圖形方式展示該包中的所有類及它們的關(guān)系.然后根據(jù)類的屬性及與其它類的關(guān)系,用文字形式定義各個類.IEC 61970-301內(nèi)容包括核心包、域包、發(fā)電包、發(fā)電動態(tài)包、負荷模型包、量測包、停運包、生產(chǎn)包、保護包、拓撲包和電線包.每一個CIM包的類圖展示了該包中的所有的類及它們的關(guān)系.在與其它包中的類存在關(guān)系時,這些類也展示出來,而且標以表明其所屬的包的符號.CIM 301部分的包圖如圖1所示.
通過CIM提出的電力系統(tǒng)信息交換標準可以實現(xiàn)不同系統(tǒng)間的互聯(lián)互通.但CIM模型是個抽象模型,它沒有定義模型數(shù)據(jù)庫的規(guī)范和數(shù)據(jù)交換格式,在具體的工程應(yīng)用中,對CIM模型的實現(xiàn)方式需要有明確、可行的規(guī)定.XML語言解決了這個問題,CIM以XML語言為載體,使用CIM RDF模式作為元模型框架,并采用一個RDF語法的子集作為描述規(guī)則,描述電網(wǎng)靜態(tài)數(shù)據(jù)模型,構(gòu)建電力系統(tǒng)信息模型的XML文檔[6].
圖1 IEC61970-301包結(jié)構(gòu)
根據(jù)IEC 61970 501標準所描述的CIM RDF模式,一個EMS電力系統(tǒng)模型能被轉(zhuǎn)換導(dǎo)出為一個對應(yīng)的CIM XML文檔,CIM RDF模式提供了CIM XML文檔所使用的資源描述格式,最終的CIM XML模型文件能夠被解析,將其中的信息導(dǎo)入到另一個外部系統(tǒng).目前基于CIM/XML的數(shù)據(jù)導(dǎo)入導(dǎo)出是不同系統(tǒng)和軟件間進行數(shù)據(jù)交換和信息共享的主要方式.
為了提高電力系統(tǒng)模型數(shù)據(jù)的描述效率和大量數(shù)據(jù)的在線交換的效率,出現(xiàn)了電力系統(tǒng)數(shù)據(jù)模型描述語言E[7],E來源于3個英文單詞的首字母:easy(簡單)、efficiency(高效)、electric-power(電力).E 語言有XML的基本特點以和優(yōu)點,使用它的特殊符號和描述語法,能實現(xiàn)電力系統(tǒng)中各種數(shù)據(jù)模型的高效描述,效率比XML高很多,而且更符合人類的表述習(xí)慣[8].
E語言使用幾個英文半角符號位于文件每行開頭的第1個與或第2個字符組合,表示不同的特定含義,比如:<,>,@,#,/等符號,E語言有三種數(shù)據(jù)描述方式:衡表式,單列式和多列式.E語言出了基本功能,還有擴展功能,可以用于表示類屬性的類型、單位、限值等.CIM/E文件的文件名格式為,區(qū)域_日期_時間.CIME,比如,馳宏站_20170330_141315.CIME.CIM/E文件按照E格式規(guī)范對電網(wǎng)物理模型的相關(guān)設(shè)備類屬性進行組織.為了使電網(wǎng)調(diào)度自動化系統(tǒng)的運行要求得到滿足,應(yīng)對電網(wǎng)物理連接模型進行描述,包含區(qū)域、負荷、間隔、廠站、變壓器、基準電壓、母線段等各類對象,對各類對象包含的屬性項有相關(guān)的要求.
XML文檔的解析[9]主要有兩種方式:DOM和SAX.DOM是由W3C制定的一套編寫XML分析器的標準接口規(guī)范,SAX是XML_DEV郵件列表中的成員根據(jù)應(yīng)用的需求自發(fā)的定義的對XML文檔進行操作的一套接口規(guī)范.這兩種接口規(guī)范各有長短,互有側(cè)重,都有著廣泛的應(yīng)用.應(yīng)用程序并不是直接對XML文檔進行操作的,先由XML分析器對XML文檔進行分析,而后,應(yīng)用程序通過XML分析器所提供的DOM接口或SAX接口對分析結(jié)果進行操作,從而間接的實現(xiàn)了對XML文檔的訪問,DOM和SAX在應(yīng)用程序開發(fā)過程中的作用,如圖2所示.
圖2 DOM和SAX在應(yīng)用程序中的作用
文檔對象模型(DOM)的全稱為Document Object Model.DOM就是一個標準的對象化的接口規(guī)范,與具體語言和平臺無關(guān).在程序中,基于DOM的XML分析器首先將一個XML文檔轉(zhuǎn)換成一個DOM樹(對象模型的集合)放在內(nèi)存中,然后應(yīng)用程序以通過對該對象模型的操作而實現(xiàn)對XML文檔中數(shù)據(jù)的操作.利用DOM接口的解析機制被稱作隨機訪問機制,因為通過DOM接口,應(yīng)用程序可以在任何時候訪問XML文檔中的任何數(shù)據(jù),這種隨機訪問方式對于應(yīng)用程序來說是非常靈活的.
要進一步加深對監(jiān)督對象的了解。中央紀委要求各級紀委要全面掌握“森林”情況,正確處理好“森林”和“樹木”的關(guān)系。但當前恰恰缺乏的是“森林”信息來源,了解監(jiān)督對象情況大多是從人事、稽核等相關(guān)部門間接獲得,缺少動態(tài)化、實時的監(jiān)督數(shù)據(jù)支撐,特別在用人監(jiān)督方面,由于缺乏對其社會關(guān)系、思想變化、家庭生活等情況的及時掌握,難以有效發(fā)現(xiàn)和杜絕少數(shù)干部“帶病”上崗現(xiàn)象的發(fā)生。
XML實際上是一種分層的結(jié)構(gòu),DOM使用樹模型來描述XML文檔信息非常有效,DOM接口提供通過分層對象模型的方式來訪問XML文檔中的信息,根據(jù)XML文檔的結(jié)構(gòu),分層對象模型形成一顆節(jié)點樹的形式.解析形成的DOM樹是存儲在內(nèi)存中的,當XML文檔比較復(fù)雜龐大時,DOM解析器對內(nèi)存的要求就比較高.圖3描述了DOM解析器解析XML文檔形成內(nèi)存中的節(jié)點樹的過程.DOM首先將文檔加載進內(nèi)存里,然后再內(nèi)存中構(gòu)造出一個與文檔對應(yīng)的一棵樹,樹上的每個節(jié)點都是一個對象(Node類型),放在內(nèi)存里,訪問是隨機的.
圖3 DOM解析器功能
XML簡單應(yīng)用程序接口(SAX),全稱為Simple APIs for XML.支持DOM的解析器是W3C的官方標準,而支持SAX的解析器是事實上的工業(yè)標準.SAX不同于DOM,SAX不必將整個XML文檔事先加載到內(nèi)存當中,它快速讀寫XML數(shù)據(jù),是一種基于事件驅(qū)動的順序的訪問模式,不能重新訪問已經(jīng)分析過的內(nèi)容.對XML文檔進行分析的時候,會觸發(fā)一系列的事件,并激發(fā)相應(yīng)的事先定義好的事件處理回調(diào)函數(shù),應(yīng)用程序通過事件函數(shù)從而實現(xiàn)對XML文檔的處理和訪問.SAX只做了一些簡單的工作,應(yīng)用程序要自己去做大部分的工作,SAX適用于只需要訪問不要更改的XML文檔數(shù)據(jù)的應(yīng)用程序.文檔的讀入過程就對應(yīng)著SAX解析器的解析過程,圖4描述了SAX解析器解析XML文檔的過程.
圖4 SAX解析器功能
XML文檔解析器實際上就是一段程序代碼,同樣CIM/E文檔的解析器在本文中也是一段Java程序代碼,它讀入一個CIM/E文件并分析其結(jié)構(gòu),在分析文檔的同時,采用基于事件的方法在內(nèi)存中構(gòu)造出一個對應(yīng)的自定的文檔類型對象,該文檔類型實現(xiàn)了W3C標準中的Document接口.然后程序可以對該文檔對象進行操作,將文檔中的元素的不同信息分別提取出來存儲到集合(ArrayList類型)中元素(TableEClass類型)的不同數(shù)據(jù)結(jié)構(gòu)中.
其中TableEClass類型是構(gòu)造出的一個數(shù)據(jù)結(jié)構(gòu),用來存放從CIM/E文件解析出的元素數(shù)據(jù)內(nèi)容,該類包含 tableName、columnNames、columnTypes、columnUnits、columnLimitValues、rowsData等屬性,分別存儲CIME文件中對應(yīng)的的類名、屬性名,與橫表式CIM/E文件中對應(yīng)的屬性類型、屬性單位、屬性限值和數(shù)據(jù)行的內(nèi)容.上述集合對象封裝了CIM/E文檔中的數(shù)據(jù)信息,有了該集合對象之后,就可以在該對象的基礎(chǔ)上進行數(shù)據(jù)的入庫等操作,為后續(xù)的應(yīng)用做好準備,List集合中的每個元素(TableE類型)對應(yīng)于數(shù)據(jù)庫中的一張表,并包含了表中的數(shù)據(jù).
本解析方案根據(jù)CIM/E文件結(jié)構(gòu)特點,在W3C提供的DOM接口和SAX接口的基礎(chǔ)上,針對CIM/E文件解析定義了一系列的節(jié)點類型等數(shù)據(jù)結(jié)構(gòu),文件中一個類對應(yīng)為一個元素,將類起始符合類結(jié)束符中間的內(nèi)容設(shè)置為該元素的內(nèi)容,在封裝數(shù)據(jù)的時候在具體分析取出.該解析方案主要分為基于事件的文檔對象的構(gòu)建與操作文檔進行數(shù)據(jù)的封裝兩個功能,涉及到的主要類和方法如圖5所示.
圖5 解析方案中的部分主要類和方法
首先定義MainParseEFile類Document documentBuildRead (String pathStr)方法,通過CIM/E文件名來構(gòu)建一個與之對應(yīng)的自定義文檔對象Document.該方法的實現(xiàn)依賴于TheEDomSAXReader類型對象的documentBuildRead()方法,該類有個XMLReader類型的引用,該引用指向的對象的void parse(InputSource input)方法完成底層的文件的具體分析操作.
TheEDomXMLReader類實現(xiàn)了XMLReader接口,而XMLReader接口的作用就是用于使用回調(diào)讀取XML文檔,所以定義了TheEDomSAXContentHandler類并在類中提供了各種回調(diào)函數(shù).parse()方法根據(jù)CIM/E文件中的標識符號分析到文件的不同位置時會調(diào)用處理器類中定義的各種回調(diào)方法.這些回調(diào)方法在處理過程中借助于棧類型成員變量的進棧、出棧、取棧頂元素操作來實現(xiàn)自定義文檔對象的構(gòu)建.
最后在TheEDomSAXReader類型對象的documentBuildRead()方法中通過處理器類型引用的getThe-Document()方法返回自定義的文檔對象,如圖6所示.
圖6 documentBuildRead()方法的片段代碼
MainParseEFile 類中的 List<TableEClass>documentOperate(Document document)方法實現(xiàn)了將由documentBuildRead()方法得到的文檔對象中的信息存儲到集合變量list中的操作.該方法首先取出文檔對象下的所有子元素,遍歷每個元素,生成一個TableEClass對象,將元素名對應(yīng)的類名設(shè)置為對象的tableName屬性值,并將該對象添加到ArrayList<TableEClass>類型變量中,同時,根據(jù)元素內(nèi)容的的首行初始符號判斷元素的類型(即元素所屬CIM/E文件的結(jié)構(gòu)類型,是單列式、多列式、還是橫標式),針對不同的文件結(jié)構(gòu)使用不同的解析方法將元素內(nèi)容填充到TableEClass對象中的不同屬性上.
比如橫表式文件的解析,使用void parseHorizontalTableType(TableEClass classTable,String[]contentLines)方法.遍歷元素內(nèi)容的各行,將屬性引導(dǎo)符@引導(dǎo)的元素內(nèi)容第一行的各個屬性,設(shè)置到TableEClass對象的columnNames屬性上,針對其余的內(nèi)容行,若是以類型引導(dǎo)符“%”開頭,則將該行的各個類型保存到TableEClass對象的columnTypes屬性上;若是以量綱引導(dǎo)符“$”開頭,則將該行的各個單位保存到TableEClass對象的columnUnits屬性上;若是以限值引導(dǎo)符“:”開頭,則將該行的各個限值保存到TableEClass對象的columnLimitValues屬性上;若是以數(shù)據(jù)引導(dǎo)符“#”開頭,則將該行的各個數(shù)據(jù)追加到TableEClass對象的rowsData集合屬性中.
documentOperate()遍歷完文檔中的每個子元素后,在方法的最后返回已填充數(shù)據(jù)的ArrayList<TableEClass>類型的對象,之后應(yīng)用程序即可在該對象基礎(chǔ)上進行數(shù)據(jù)入庫等操作.
下面以一個變電站的電網(wǎng)模型文件為例(CIM/E文件)進行解析方案的實驗驗證,如圖7所示是導(dǎo)出的電網(wǎng)模型文件(CIM/E文件)的模擬片段.
圖7 CIM/E文件片段
XML文檔對象模型有根節(jié)點(Document)和根元素節(jié)點root,但電網(wǎng)模型文件CIM/E文件對應(yīng)的文檔模型是沒有根元素節(jié)點的,Document節(jié)點下就是各個并列的子元素.若將CIM/E文件導(dǎo)入關(guān)系型數(shù)據(jù)庫中,文件中的類名如ControlArea、BaseVoltage、Substation等應(yīng)該作為表存在,類中的屬性作為表的字段、數(shù)據(jù)作為表中記錄的相應(yīng)字段值.
圖8和圖9是該CIM/E文件應(yīng)用該解析方案過程中在內(nèi)存中形成的自定義文檔對象和對應(yīng)的存儲數(shù)據(jù)的ArrayList集合對象.
得到ArrayList形式的信息后,就可以對這個信息進行操作和處理了,比如將其存儲到關(guān)系型數(shù)據(jù)庫[10].使用的是Java進行數(shù)據(jù)庫操作,Java提供的單純的使用sql語句方式進行編程的機制,即JDBC(Java Database Connectivity)技術(shù).使用純的Java代碼來去實現(xiàn)對應(yīng)的數(shù)據(jù)庫的編程,寫相應(yīng)的SQL語句,調(diào)用相應(yīng)的語句把SQL代碼進行執(zhí)行,把語句發(fā)送到數(shù)據(jù)庫端,讓數(shù)據(jù)庫端去執(zhí)行SQL代碼.比如執(zhí)行一條插入語句,數(shù)據(jù)庫中就具備了插入進去的內(nèi)容.實際的大型應(yīng)用中后端一般會使用框架,比如Hibernate、MyBatis等.在程序中取得數(shù)據(jù)庫的連接,調(diào)用建表的方法,并填充字段的值,形成數(shù)據(jù)表結(jié)構(gòu)和數(shù)據(jù).如圖10所示為形成的ControlArea表結(jié)構(gòu)數(shù)據(jù).
圖8 構(gòu)建的自定義Document文檔
圖9 存儲數(shù)據(jù)的ArrayList集合對象
本文首先介紹了公共信息模型(CIM)和兩種電網(wǎng)模型交換標準,然后分析了XML文件解析的方法及電網(wǎng)模型文件CIM/E的文件結(jié)構(gòu),之后描述了一種解析CIM/E文件方法的具體過程及將解析的數(shù)據(jù)入庫,并通過電網(wǎng)模型數(shù)據(jù)文件CIM/E進行了驗證,該解析方法對電力系統(tǒng)中模型數(shù)據(jù)的解析具有一定的指導(dǎo)和參考意義,可以在此方案的基礎(chǔ)上完善各種擴展形式的文件的解析、設(shè)計數(shù)據(jù)結(jié)構(gòu),提高解析效率等工作.
圖10 ControlArea表結(jié)構(gòu)數(shù)據(jù)
2 周孝信.第三代電網(wǎng)技術(shù)正在向我們走來.國家電網(wǎng)報,2011-05-05(005).
3 王民昆.電力系統(tǒng)CIM模型描述及數(shù)據(jù)交換實現(xiàn)的研究[碩士學(xué)位論文].成都:四川大學(xué),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 information model (CIM)base.Revision 3,2004.
6 謝淑菁.基于CIM的電力系統(tǒng)模型拼接的研究和設(shè)計[碩士學(xué)位論文].濟南:山東大學(xué),2010.
7 辛耀中,陶洪鑄,李毅松,等.電力系統(tǒng)數(shù)據(jù)模型描述語言E.電力系統(tǒng)自動化,2006,30(10):48–51,92.[doi:10.3321/j.issn:1000-1026.2006.10.010]
8 米為民,辛耀中,蔣國棟,等.電網(wǎng)模型交換標準CIM/E和CIM/XML的比對分析.電網(wǎng)技術(shù),2013,37(4):936–941.
9 劉芳,肖鐵軍.XML應(yīng)用的基石:XML解析技術(shù).計算機工程與設(shè)計,2005,26(10):2823–2824,2839.[doi:10.3969/j.issn.1000-7024.2005.10.083]
10 朱曉娟.基于關(guān)系的XML數(shù)據(jù)存儲技術(shù)研究.計算機與現(xiàn)代化,2009,(12):51–54.