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