林俊,林敏,胡華威
(1.江蘇西電南自智能電力設備有限公司,江蘇南京211102;2.南京國電南自電網自動化有限公司,江蘇南京211100)
在智能變電站中,狀態監測的綜合監測單元采用IEC61850標準與站端系統通信,站端監測系統收集各單元匯總的監測信息,將其存入監測數據庫中,所有這些數據有些是連續變化的,有些是離散變化的,變化快慢各異,數據庫需要適應這些數據存儲的要求,并通過人機界面將處理過的數據集中顯示,供設備檢修人員使用;另一方面需要將數據對遠方集中監測主站發布。一般的商用數據庫多是磁盤存儲,其數據需要按照一定的交換策略被調至內存緩沖區后才能被存取,在執行時受到磁盤I/O的束縛,事務的響應時間受等待延遲、查找延遲等限制,因此在系統中需設計實時數據庫,數據庫常駐內存,消除了事務處理的I/O瓶頸問題,提高了系統的性能和吞吐量,滿足實時響應的要求[1]。
實時數據庫是指數據和事務都具有定時特性或確定的定時限制的數據庫系統,其正確性不僅依賴于邏輯結果,而且依賴于邏輯結果產生的時間,即系統寧可接受在時間限度內的不準確的數據,也不接受超過時間限制的準確的數據。所以數據庫一方面要求很強的時效性,即必須在一定的時間內完成數據的傳輸和預處理,另一方面要求很強的可靠性和吞吐性能,即使在流量很大時,也不能丟失數據。通常實時數據庫應滿足下列功能需求[2]:(1)實時數據處理的高速度和高精度,以保證整個系統的穩定運行;(2)歷史數據存儲和壓縮,使系統能夠存儲足夠的信息,以備查詢、分析;(3)應用程序開發接口,保證系統的開發和可擴展性;(4)方便、直觀的圖形化組態工具,便于客戶的操作和監視。
為保證實時數據庫的運行效率,該系統按地址直接訪問的方式建立實時數據庫,即通過共享內存數據完成數據的存儲,這是最快的可用進程間通信(IPC)形式。在共享內存中構建按地址指針直接訪問數據的實時數據庫,以滿足通信的實時性和可靠性的需求。另外實時數據庫需要將數據定時存入歷史數據庫中以備查詢和其他接口使用,歷史庫利用商業數據庫MySql通用、靈活等諸多優點定義和保存所需數據[3]。因此實時數據處理進程中建立了兩級數據存儲機制:(1)內存數據庫,保證查詢的實時、快速性,但是數據量有限;(2)使用磁盤的歷史數據庫,將經過壓縮的數據存入歷史數據庫中,保證數據掉電不丟失,且易于查詢和綜合分析。
由于采用IEC61850標準通信,為適應數據結構,內存數據庫采用面向對象的方式構造,根據IEC61850提供的變電站配置描述語言SCL形成的XML格式的模型文件,為每個XML元素創建對應的對象,由于模型文件采用樹狀結構編排,因此所有解析后的對象也形成樹形結構,所有數據都保存在樹的節點中,所有的訪問均是針對該樹狀結構[4]。該內存數據庫采用多叉樹的方式構建,首先,分析模型文件,得到第1個元素及其子元素,并為該元素及其子元素分別創建對象p和q1,……,qn,其中,n是子元素的個數;其次,構建多叉樹,分別將q1,……,qn設置為p的孩子;最后,對于已將創建對象的元素,記其對象為p,分析模型文件,得到該元素的子元素,并為其創建對象,不妨仍記為q1,……,qn,重復第二步,直到文檔中所有的元素都創建了對應的對象,構造結束[5]。構造出的多叉樹結構如圖1所示。
系統初始化時,實時數據處理進程將根據IEC61850的模型文件構建內存數據庫,同時將數據結構信息通知數據緩存模塊,緩存模塊為實時數據庫模塊和歷史數據模塊,分別開辟數據緩存池,通過通信接口接收各數據點的信息,并將信息同時填入對應的數據緩存結構中。實時數據緩存池根據共享內存數據庫提供的操作指針,直接將數據放入內存庫中,提供給在線運行模塊使用;歷史數據緩存池接收數據后首先經壓縮模塊,產生實時數據送往歷史數據處理模塊做二次緩存,待緩存數據窗填滿或到達自動轉存時間后發送至歷史數據庫。整個實時數據系統的數據存儲過程如下圖2所示。

圖1 多叉樹結構

圖2 數據存儲過程
在系統運行時,同時要進行數據采集、數據處理、數據讀寫和查詢、事件報警、歷史數據存盤等操作,因此需建立并發控制機制,以滿足實時性要求[6]。
系統定義了多叉樹節點的數據結構:


每種類型的節點都單獨定義了數據結構,如M_Object為數據對象節點等,在每個節點實例中都分配了一個ID號,作為該類型數據節點數組的下標,ID號根據哈希算法獲得,是每個節點的唯一標示,理想的哈希表采用特定的哈希函數能夠在記錄的存儲位置與其關鍵值之間建立確定的對應關系,使每個關鍵字和結構中唯一的存儲位置相對應,因此通過這個ID可以不需要比較便直接取得查找的數據,使用該ID建立起來的索引能夠提高數據庫的訪問速度。
由于內存庫采用面向對象的思想構建,每種類型節點都是一張獨立的表,表間的關聯關系采用父、子指針的方式創建,而非關系型數據庫的外鍵關聯。
在實時數據處理進程中提供一組接口函數實現對實時數據庫的讀寫、查詢和管理等工作。常用接口如表1所示。除了定義常用的讀取、查詢等操作接口外,數據庫提供高效的消息通知機制,以便快速將數據變化發布給系統各進程使用。需要消息通知的進程,如告警信息進程,將感興趣的數據點在實時數據庫中進行注冊,并給出通知的觸發選項,如“數據變化”、“品質變化”等,被注冊過的數據點,當發生上述改變時,即刻調用通知接口,將信息發送給需要的各進程,這些接口均由數據處理模塊完成[7]。
歷史數據處理時首先需要經過數據壓縮,對于開關類型數據采用變化保存的方式壓縮,壓縮模塊在處理開關量時將其與歷史數據處理模塊中緩存的最后一個點數據進行比較,若相同則不保存狀態,只更新最后一點收到的時間,若不同則產生一條新的緩存數據。對于模擬量數據采用旋轉門壓縮算法,首先在數據庫中為每個數據點設置默認的壓縮因子,將收到的數據點與緩存數據中前一個被保留的構成壓縮偏移覆蓋區域,若區域中沒有任何點落在區域以外,則無需保存任何數據,若區域中有任何一點未被覆蓋,則將新收到的數據點的前一點保存入緩存,之后以該保存點為起點,繼續接收數據,并重復該算法。所謂的壓縮覆蓋區域實際上是平行四邊形,起點為前一個被保存的點,終點是新收到的數據點,其垂直邊長為壓縮因子的2倍,并以數據點為中點;使用壓縮算法可以大幅減少數據存儲量,保證歷史數據庫能夠長期運行[8]。
歷史數據寫入采用2級寫入控制,即(1)歷史數據模塊中為每種數據類型開辟兩個緩存窗口,當一個窗口填滿時,自動將窗口數據一次性寫入歷史庫,同時清空該窗口,新收到的數據填入另一緩存窗口中;(2)歷史數據庫根據系統設置,定時交替讀取2個緩存窗口,同時清空被讀取的窗口,新收到的數據填入另一緩存窗口中。通過該方法可以減少磁盤的讀寫次數,加快寫入效率。

表1 數據庫接口
針對數據并發控制,實時數據庫提供了數據對象加/解鎖機制,具有操作權限的進程在使用數據庫時首先執行LOCK操作鎖定指定的對象,從而獨占該資源,并在完成后執行UNLOCK操作解鎖,釋放對應的資源。如果該操作進程退出或出現異常,未能按指定時間解鎖資源,則實時庫將自動釋放該資源,以避免數據死鎖,保證系統的穩定性。
文中分析了狀態監測系統中實時數據庫的需求,根據IEC61850標準要求構建了實時內存數據庫,并設計了數據庫的操作模塊,給出了數據庫各功能模塊的實現方式。通過該方法開發的數據庫已用于監測系統軟件中,提高了系統的實時性和可靠性,能夠適應智能變電站應用的需求。
[1] 傅蕾,胡敏強.變電站監控軟件系統中內存數據庫的研究[J].電力自動化設備,2002,22(10):67-70.
[2] 周釗.基于實時數據庫的歷史數據處理技術研究[D].北京:華北電力大學,2008.
[3] 談蘇偉.電網調度自動化前置子系統實時數據庫的設計和實現[J].電力自動化設備,2009,29(7):130-133.
[4] 董越,孫宏斌,吳文傳,等.EMS中公共信息模型導入/導出技術[J].電力系統自動化,2002,26(3):10-14.
[5] 黃建才.基于IEC61850的內存數據庫的組織[J].福建電腦,2007(6):101-102.
[6] 劉浩,萬昆.基于動態鏈接庫DLL的實時數據庫系統研究與開發[J].東北電力學院學報,2005,25(1):36-39.
[7] 金舒,戴宏斌,賈志敏.面向對象的高性能實時數據庫ChRDB[J].電力自動化設備,2009,29(12):88-93.
[8] 陸會明,周釗,廖常斌.基于實時數據庫系統的歷史數據處理[J].電力自動化設備,2009,29(3):127-131.