林俊,林敏,胡華威
(1.江蘇西電南自智能電力設(shè)備有限公司,江蘇南京211102;2.南京國(guó)電南自電網(wǎng)自動(dòng)化有限公司,江蘇南京211100)
在智能變電站中,狀態(tài)監(jiān)測(cè)的綜合監(jiān)測(cè)單元采用IEC61850標(biāo)準(zhǔn)與站端系統(tǒng)通信,站端監(jiān)測(cè)系統(tǒng)收集各單元匯總的監(jiān)測(cè)信息,將其存入監(jiān)測(cè)數(shù)據(jù)庫(kù)中,所有這些數(shù)據(jù)有些是連續(xù)變化的,有些是離散變化的,變化快慢各異,數(shù)據(jù)庫(kù)需要適應(yīng)這些數(shù)據(jù)存儲(chǔ)的要求,并通過(guò)人機(jī)界面將處理過(guò)的數(shù)據(jù)集中顯示,供設(shè)備檢修人員使用;另一方面需要將數(shù)據(jù)對(duì)遠(yuǎn)方集中監(jiān)測(cè)主站發(fā)布。一般的商用數(shù)據(jù)庫(kù)多是磁盤(pán)存儲(chǔ),其數(shù)據(jù)需要按照一定的交換策略被調(diào)至內(nèi)存緩沖區(qū)后才能被存取,在執(zhí)行時(shí)受到磁盤(pán)I/O的束縛,事務(wù)的響應(yīng)時(shí)間受等待延遲、查找延遲等限制,因此在系統(tǒng)中需設(shè)計(jì)實(shí)時(shí)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)常駐內(nèi)存,消除了事務(wù)處理的I/O瓶頸問(wèn)題,提高了系統(tǒng)的性能和吞吐量,滿足實(shí)時(shí)響應(yīng)的要求[1]。
實(shí)時(shí)數(shù)據(jù)庫(kù)是指數(shù)據(jù)和事務(wù)都具有定時(shí)特性或確定的定時(shí)限制的數(shù)據(jù)庫(kù)系統(tǒng),其正確性不僅依賴于邏輯結(jié)果,而且依賴于邏輯結(jié)果產(chǎn)生的時(shí)間,即系統(tǒng)寧可接受在時(shí)間限度內(nèi)的不準(zhǔn)確的數(shù)據(jù),也不接受超過(guò)時(shí)間限制的準(zhǔn)確的數(shù)據(jù)。所以數(shù)據(jù)庫(kù)一方面要求很強(qiáng)的時(shí)效性,即必須在一定的時(shí)間內(nèi)完成數(shù)據(jù)的傳輸和預(yù)處理,另一方面要求很強(qiáng)的可靠性和吞吐性能,即使在流量很大時(shí),也不能丟失數(shù)據(jù)。通常實(shí)時(shí)數(shù)據(jù)庫(kù)應(yīng)滿足下列功能需求[2]:(1)實(shí)時(shí)數(shù)據(jù)處理的高速度和高精度,以保證整個(gè)系統(tǒng)的穩(wěn)定運(yùn)行;(2)歷史數(shù)據(jù)存儲(chǔ)和壓縮,使系統(tǒng)能夠存儲(chǔ)足夠的信息,以備查詢、分析;(3)應(yīng)用程序開(kāi)發(fā)接口,保證系統(tǒng)的開(kāi)發(fā)和可擴(kuò)展性;(4)方便、直觀的圖形化組態(tài)工具,便于客戶的操作和監(jiān)視。
為保證實(shí)時(shí)數(shù)據(jù)庫(kù)的運(yùn)行效率,該系統(tǒng)按地址直接訪問(wèn)的方式建立實(shí)時(shí)數(shù)據(jù)庫(kù),即通過(guò)共享內(nèi)存數(shù)據(jù)完成數(shù)據(jù)的存儲(chǔ),這是最快的可用進(jìn)程間通信(IPC)形式。在共享內(nèi)存中構(gòu)建按地址指針直接訪問(wèn)數(shù)據(jù)的實(shí)時(shí)數(shù)據(jù)庫(kù),以滿足通信的實(shí)時(shí)性和可靠性的需求。另外實(shí)時(shí)數(shù)據(jù)庫(kù)需要將數(shù)據(jù)定時(shí)存入歷史數(shù)據(jù)庫(kù)中以備查詢和其他接口使用,歷史庫(kù)利用商業(yè)數(shù)據(jù)庫(kù)MySql通用、靈活等諸多優(yōu)點(diǎn)定義和保存所需數(shù)據(jù)[3]。因此實(shí)時(shí)數(shù)據(jù)處理進(jìn)程中建立了兩級(jí)數(shù)據(jù)存儲(chǔ)機(jī)制:(1)內(nèi)存數(shù)據(jù)庫(kù),保證查詢的實(shí)時(shí)、快速性,但是數(shù)據(jù)量有限;(2)使用磁盤(pán)的歷史數(shù)據(jù)庫(kù),將經(jīng)過(guò)壓縮的數(shù)據(jù)存入歷史數(shù)據(jù)庫(kù)中,保證數(shù)據(jù)掉電不丟失,且易于查詢和綜合分析。
由于采用IEC61850標(biāo)準(zhǔn)通信,為適應(yīng)數(shù)據(jù)結(jié)構(gòu),內(nèi)存數(shù)據(jù)庫(kù)采用面向?qū)ο蟮姆绞綐?gòu)造,根據(jù)IEC61850提供的變電站配置描述語(yǔ)言SCL形成的XML格式的模型文件,為每個(gè)XML元素創(chuàng)建對(duì)應(yīng)的對(duì)象,由于模型文件采用樹(shù)狀結(jié)構(gòu)編排,因此所有解析后的對(duì)象也形成樹(shù)形結(jié)構(gòu),所有數(shù)據(jù)都保存在樹(shù)的節(jié)點(diǎn)中,所有的訪問(wèn)均是針對(duì)該樹(shù)狀結(jié)構(gòu)[4]。該內(nèi)存數(shù)據(jù)庫(kù)采用多叉樹(shù)的方式構(gòu)建,首先,分析模型文件,得到第1個(gè)元素及其子元素,并為該元素及其子元素分別創(chuàng)建對(duì)象p和q1,……,qn,其中,n是子元素的個(gè)數(shù);其次,構(gòu)建多叉樹(shù),分別將q1,……,qn設(shè)置為p的孩子;最后,對(duì)于已將創(chuàng)建對(duì)象的元素,記其對(duì)象為p,分析模型文件,得到該元素的子元素,并為其創(chuàng)建對(duì)象,不妨仍記為q1,……,qn,重復(fù)第二步,直到文檔中所有的元素都創(chuàng)建了對(duì)應(yīng)的對(duì)象,構(gòu)造結(jié)束[5]。構(gòu)造出的多叉樹(shù)結(jié)構(gòu)如圖1所示。
系統(tǒng)初始化時(shí),實(shí)時(shí)數(shù)據(jù)處理進(jìn)程將根據(jù)IEC61850的模型文件構(gòu)建內(nèi)存數(shù)據(jù)庫(kù),同時(shí)將數(shù)據(jù)結(jié)構(gòu)信息通知數(shù)據(jù)緩存模塊,緩存模塊為實(shí)時(shí)數(shù)據(jù)庫(kù)模塊和歷史數(shù)據(jù)模塊,分別開(kāi)辟數(shù)據(jù)緩存池,通過(guò)通信接口接收各數(shù)據(jù)點(diǎn)的信息,并將信息同時(shí)填入對(duì)應(yīng)的數(shù)據(jù)緩存結(jié)構(gòu)中。實(shí)時(shí)數(shù)據(jù)緩存池根據(jù)共享內(nèi)存數(shù)據(jù)庫(kù)提供的操作指針,直接將數(shù)據(jù)放入內(nèi)存庫(kù)中,提供給在線運(yùn)行模塊使用;歷史數(shù)據(jù)緩存池接收數(shù)據(jù)后首先經(jīng)壓縮模塊,產(chǎn)生實(shí)時(shí)數(shù)據(jù)送往歷史數(shù)據(jù)處理模塊做二次緩存,待緩存數(shù)據(jù)窗填滿或到達(dá)自動(dòng)轉(zhuǎn)存時(shí)間后發(fā)送至歷史數(shù)據(jù)庫(kù)。整個(gè)實(shí)時(shí)數(shù)據(jù)系統(tǒng)的數(shù)據(jù)存儲(chǔ)過(guò)程如下圖2所示。
圖1 多叉樹(shù)結(jié)構(gòu)
圖2 數(shù)據(jù)存儲(chǔ)過(guò)程
在系統(tǒng)運(yùn)行時(shí),同時(shí)要進(jìn)行數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)讀寫(xiě)和查詢、事件報(bào)警、歷史數(shù)據(jù)存盤(pán)等操作,因此需建立并發(fā)控制機(jī)制,以滿足實(shí)時(shí)性要求[6]。
系統(tǒng)定義了多叉樹(shù)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu):
每種類型的節(jié)點(diǎn)都單獨(dú)定義了數(shù)據(jù)結(jié)構(gòu),如M_Object為數(shù)據(jù)對(duì)象節(jié)點(diǎn)等,在每個(gè)節(jié)點(diǎn)實(shí)例中都分配了一個(gè)ID號(hào),作為該類型數(shù)據(jù)節(jié)點(diǎn)數(shù)組的下標(biāo),ID號(hào)根據(jù)哈希算法獲得,是每個(gè)節(jié)點(diǎn)的唯一標(biāo)示,理想的哈希表采用特定的哈希函數(shù)能夠在記錄的存儲(chǔ)位置與其關(guān)鍵值之間建立確定的對(duì)應(yīng)關(guān)系,使每個(gè)關(guān)鍵字和結(jié)構(gòu)中唯一的存儲(chǔ)位置相對(duì)應(yīng),因此通過(guò)這個(gè)ID可以不需要比較便直接取得查找的數(shù)據(jù),使用該ID建立起來(lái)的索引能夠提高數(shù)據(jù)庫(kù)的訪問(wèn)速度。
由于內(nèi)存庫(kù)采用面向?qū)ο蟮乃枷霕?gòu)建,每種類型節(jié)點(diǎn)都是一張獨(dú)立的表,表間的關(guān)聯(lián)關(guān)系采用父、子指針的方式創(chuàng)建,而非關(guān)系型數(shù)據(jù)庫(kù)的外鍵關(guān)聯(lián)。
在實(shí)時(shí)數(shù)據(jù)處理進(jìn)程中提供一組接口函數(shù)實(shí)現(xiàn)對(duì)實(shí)時(shí)數(shù)據(jù)庫(kù)的讀寫(xiě)、查詢和管理等工作。常用接口如表1所示。除了定義常用的讀取、查詢等操作接口外,數(shù)據(jù)庫(kù)提供高效的消息通知機(jī)制,以便快速將數(shù)據(jù)變化發(fā)布給系統(tǒng)各進(jìn)程使用。需要消息通知的進(jìn)程,如告警信息進(jìn)程,將感興趣的數(shù)據(jù)點(diǎn)在實(shí)時(shí)數(shù)據(jù)庫(kù)中進(jìn)行注冊(cè),并給出通知的觸發(fā)選項(xiàng),如“數(shù)據(jù)變化”、“品質(zhì)變化”等,被注冊(cè)過(guò)的數(shù)據(jù)點(diǎn),當(dāng)發(fā)生上述改變時(shí),即刻調(diào)用通知接口,將信息發(fā)送給需要的各進(jìn)程,這些接口均由數(shù)據(jù)處理模塊完成[7]。
歷史數(shù)據(jù)處理時(shí)首先需要經(jīng)過(guò)數(shù)據(jù)壓縮,對(duì)于開(kāi)關(guān)類型數(shù)據(jù)采用變化保存的方式壓縮,壓縮模塊在處理開(kāi)關(guān)量時(shí)將其與歷史數(shù)據(jù)處理模塊中緩存的最后一個(gè)點(diǎn)數(shù)據(jù)進(jìn)行比較,若相同則不保存狀態(tài),只更新最后一點(diǎn)收到的時(shí)間,若不同則產(chǎn)生一條新的緩存數(shù)據(jù)。對(duì)于模擬量數(shù)據(jù)采用旋轉(zhuǎn)門(mén)壓縮算法,首先在數(shù)據(jù)庫(kù)中為每個(gè)數(shù)據(jù)點(diǎn)設(shè)置默認(rèn)的壓縮因子,將收到的數(shù)據(jù)點(diǎn)與緩存數(shù)據(jù)中前一個(gè)被保留的構(gòu)成壓縮偏移覆蓋區(qū)域,若區(qū)域中沒(méi)有任何點(diǎn)落在區(qū)域以外,則無(wú)需保存任何數(shù)據(jù),若區(qū)域中有任何一點(diǎn)未被覆蓋,則將新收到的數(shù)據(jù)點(diǎn)的前一點(diǎn)保存入緩存,之后以該保存點(diǎn)為起點(diǎn),繼續(xù)接收數(shù)據(jù),并重復(fù)該算法。所謂的壓縮覆蓋區(qū)域?qū)嶋H上是平行四邊形,起點(diǎn)為前一個(gè)被保存的點(diǎn),終點(diǎn)是新收到的數(shù)據(jù)點(diǎn),其垂直邊長(zhǎng)為壓縮因子的2倍,并以數(shù)據(jù)點(diǎn)為中點(diǎn);使用壓縮算法可以大幅減少數(shù)據(jù)存儲(chǔ)量,保證歷史數(shù)據(jù)庫(kù)能夠長(zhǎng)期運(yùn)行[8]。
歷史數(shù)據(jù)寫(xiě)入采用2級(jí)寫(xiě)入控制,即(1)歷史數(shù)據(jù)模塊中為每種數(shù)據(jù)類型開(kāi)辟兩個(gè)緩存窗口,當(dāng)一個(gè)窗口填滿時(shí),自動(dòng)將窗口數(shù)據(jù)一次性寫(xiě)入歷史庫(kù),同時(shí)清空該窗口,新收到的數(shù)據(jù)填入另一緩存窗口中;(2)歷史數(shù)據(jù)庫(kù)根據(jù)系統(tǒng)設(shè)置,定時(shí)交替讀取2個(gè)緩存窗口,同時(shí)清空被讀取的窗口,新收到的數(shù)據(jù)填入另一緩存窗口中。通過(guò)該方法可以減少磁盤(pán)的讀寫(xiě)次數(shù),加快寫(xiě)入效率。
表1 數(shù)據(jù)庫(kù)接口
針對(duì)數(shù)據(jù)并發(fā)控制,實(shí)時(shí)數(shù)據(jù)庫(kù)提供了數(shù)據(jù)對(duì)象加/解鎖機(jī)制,具有操作權(quán)限的進(jìn)程在使用數(shù)據(jù)庫(kù)時(shí)首先執(zhí)行LOCK操作鎖定指定的對(duì)象,從而獨(dú)占該資源,并在完成后執(zhí)行UNLOCK操作解鎖,釋放對(duì)應(yīng)的資源。如果該操作進(jìn)程退出或出現(xiàn)異常,未能按指定時(shí)間解鎖資源,則實(shí)時(shí)庫(kù)將自動(dòng)釋放該資源,以避免數(shù)據(jù)死鎖,保證系統(tǒng)的穩(wěn)定性。
文中分析了狀態(tài)監(jiān)測(cè)系統(tǒng)中實(shí)時(shí)數(shù)據(jù)庫(kù)的需求,根據(jù)IEC61850標(biāo)準(zhǔn)要求構(gòu)建了實(shí)時(shí)內(nèi)存數(shù)據(jù)庫(kù),并設(shè)計(jì)了數(shù)據(jù)庫(kù)的操作模塊,給出了數(shù)據(jù)庫(kù)各功能模塊的實(shí)現(xiàn)方式。通過(guò)該方法開(kāi)發(fā)的數(shù)據(jù)庫(kù)已用于監(jiān)測(cè)系統(tǒng)軟件中,提高了系統(tǒng)的實(shí)時(shí)性和可靠性,能夠適應(yīng)智能變電站應(yīng)用的需求。
[1] 傅蕾,胡敏強(qiáng).變電站監(jiān)控軟件系統(tǒng)中內(nèi)存數(shù)據(jù)庫(kù)的研究[J].電力自動(dòng)化設(shè)備,2002,22(10):67-70.
[2] 周釗.基于實(shí)時(shí)數(shù)據(jù)庫(kù)的歷史數(shù)據(jù)處理技術(shù)研究[D].北京:華北電力大學(xué),2008.
[3] 談蘇偉.電網(wǎng)調(diào)度自動(dòng)化前置子系統(tǒng)實(shí)時(shí)數(shù)據(jù)庫(kù)的設(shè)計(jì)和實(shí)現(xiàn)[J].電力自動(dòng)化設(shè)備,2009,29(7):130-133.
[4] 董越,孫宏斌,吳文傳,等.EMS中公共信息模型導(dǎo)入/導(dǎo)出技術(shù)[J].電力系統(tǒng)自動(dòng)化,2002,26(3):10-14.
[5] 黃建才.基于IEC61850的內(nèi)存數(shù)據(jù)庫(kù)的組織[J].福建電腦,2007(6):101-102.
[6] 劉浩,萬(wàn)昆.基于動(dòng)態(tài)鏈接庫(kù)DLL的實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)研究與開(kāi)發(fā)[J].東北電力學(xué)院學(xué)報(bào),2005,25(1):36-39.
[7] 金舒,戴宏斌,賈志敏.面向?qū)ο蟮母咝阅軐?shí)時(shí)數(shù)據(jù)庫(kù)ChRDB[J].電力自動(dòng)化設(shè)備,2009,29(12):88-93.
[8] 陸會(huì)明,周釗,廖常斌.基于實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)的歷史數(shù)據(jù)處理[J].電力自動(dòng)化設(shè)備,2009,29(3):127-131.