方宗順
(中石化揚子石油化工有限責任公司,江蘇 南京 210048)
過程數據是非常寶貴的信息資源,在生產過程中加以挖掘并廣泛應用于如設備運行監控、故障檢測與遠程智能診斷、質量實時控制、反饋控制等許多過程運行和控制任務場合[1]。隨著企業的設備數量越來越多、信息采集與控制技術的進步、計算機及網絡技術的發展,以及生產過程更加高效、安全的運行要求,使生產過程中的數據量劇增,產生了海量過程數據存儲與實時多任務并發讀取的需求[2]。
過程數據壓縮和重建是過程數據管理的重要組成部分,過程數據壓縮一般要遵守基于逼近誤差和顯著特征的保真度準則,像地震領域的大數據和語音壓縮算法以及傳統的圖像壓縮算法都不能滿足過程數據采集速度和壓縮質量的要求。Hale等[3]闡述了實時數據壓縮的優點,并提出了矩形波串法(box car)和后向斜率法,使人們認識到了過程數據壓縮的重要性。隨后,Bristol提出了旋轉門趨勢(swinging door trending, SDT)算法,Mah等[4]對SDT算法進行了改進,提出了一種分段線性在線趨勢化(piecewise linear on-line trending, PLOT)算法。這幾種算法的本質是進行分段線性插值,將實際信號與壓縮信號之間的局部誤差控制在給定范圍之內。
本文采用基于非關系型的開源的BDB(Berkeley data base),實現對過程數據的分布式存取管理。其突出優點是數據存取算法易實現、執行速度快、支持多操作系統、支持海量數據存儲(數據存儲容量達到256TB)[5]。同時,本文給出SDT壓縮算法的API軟件層代碼實現,采用 Windows 通訊開發平臺(Windows communication foundation, WCF)技術開發分布式數據存取中間件,以此構建了過程數據存儲系統,并應用于某石化企業的計量監控系統,與其他不同類型數據庫存儲系統相比,BDB在過程數據領域有很大優勢。
BDB是一個開源的文件型嵌入式數據庫,通過內嵌在程序中的函數庫完成對數據的增加、修改、刪除操作。它包含5個子系統:存取管理子系統、內存池管理子系統、事務處理子系統、加鎖子系統及日志子系統,結構如圖1所示。由關鍵字及數據構成的Key/Data構成BDB的基本結構單元,數個這樣的結構單元構成數據庫整體[6]。

圖1 BDB數據庫子系統
BDB具有如下突出優點:
1)嵌入式(eebedded)。直接鏈接到應用程序中,對數據庫的操作就是對操作函數的調用。為幾乎所有常見編程語言提供API接口。多個進程,或者同一進程的多個線程可并發操作數據庫[7]。
2)輕便靈活(portable)。不僅可以運行于Windows操作系統下,還可運行于如Linux、UNIX及其他嵌入式實時操作系統之下。
3)可伸縮(scalable)。能夠管理高達256TB規模的數據庫,動態庫文件自身卻非常精簡,支持高并發度。
存儲在BDB中的數據結構簡潔明了,可以保存任意類型的鍵/值對(Key/Value Pair),而且可以為一個鍵保存多個數據。
本文采用BDB存儲生產過程中采集的實時數據及文件、圖像等流數據。訪問BDB流程為:定義數據的結構體,創建數據庫表訪問句柄,通過open函數打開數據庫,根據定義的結構體創建Key/Data對象,調用put函數插入記錄,調用get函數查詢記錄。程序關閉時關閉創建的數據庫句柄。
圖2為基于BDB的數據采集與壓縮存儲、分布式查詢提取的軟件結構框圖。數據通道將采集的設備監控數據送入數據預處理模塊,更新一部分斷面數據到緩存內存區,然后根據SDT算法進行數據壓縮,并將壓縮數據通過數據總線交給數據存儲服務API層,API層將壓縮后的數據存入BDB。歸檔服務會定期識別BDB中的非活動數據并將其轉移到其他設備中[8]。當人機交互軟件請求查詢采樣數據時,基于WCF的中間件服務層會先對BDB中的壓縮數據解壓,然后將數據發送給軟件。

圖2 數據壓縮存取軟件結構圖
一個良好的實時數據庫,必須處理好實時數據的壓縮問題,才能使系統的整體性能達到海量數據存儲的實時性要求。數據壓縮算法流程如圖3所示。

圖3 數據壓縮算法流程
一般的數據壓縮算法都是通過對數據編碼和解碼來進行壓縮和解壓,不同的壓縮算法主要的不同點就在于采用的編碼方式不同。比較常見的是查字典法,字典中包含了許多與實際數據對應的編碼數據,通常情況下實際數據所對應的編碼數據都比原數據占用更小的空間,通過對應關系將實際數據轉化為編碼數據從而達到壓縮的目的[9]。
實時數據庫中,數據瞬時采集量巨大且相似度高,作為線性擬合的一種簡便算法,即旋轉門趨勢(SDT)算法[10-11],具有速度快、易實現、高壓縮、誤差可控等優點,已成為一種專門算法[12]。
SDT算法形象地說就是構建許多高度(有損壓縮的閾值)固定的平行四邊形,用這些四邊形去“覆蓋”數據,當數據超出四邊形的范圍時,歸檔(存儲)數據點。圖4中不斷“膨脹”的平行四邊形就是旋轉門,任意時刻該旋轉門的寬度都為閾值的2倍。每次擴大后,都要判斷是否所有的數據點都能被平行四邊形所覆蓋,若不能完全被覆蓋,則擴張前的所有數據點就需要被歸檔(壓縮)[13]。
本文采用的SDT算法是一種直線趨勢化壓縮算法,其實質是將一組連續的數據點用一條確定了起點和終點的直線替代。該算法需要使用時間間隔量、起點數據和終點數據3個參數, 其中下一段的起點數據與前一段終點數據相同。圖4為其基本原理圖。

圖4 旋轉門壓縮算法原理圖
設ΔE為SDT算法的壓縮閾值,其壓縮原理為:起點t0為上一存儲結束的數據點,將與t0相距ΔE的上下兩點作為軸點,建立一扇有兩個門板的門,只有一個數據時門閉合;隨著數據點的增加,兩個門板會繞著軸點打開,門板的寬度可擴展,門只能朝著打開的方向旋轉;只要兩個門板的內角和小于180°(兩個門板未平行),旋轉操作就可以繼續;一旦門板的內角和大于等于180°,就結束開門的操作,存儲前一點數據,并將該點作為下一壓縮操作的起點。
在圖4中經過旋轉門壓縮后,壓縮段1由t0~t4的直線代替了t0~t4的數據點;壓縮段2由t4~t7的直線代替了t4~t7的數據點。
SDT壓縮算法主要步驟如下:
Step2,計算斜率S1,S2,Sj。
Step3,確定S1new,S2new的值。S1new=max(S1,S1new);S2new=max(S2,S2new)。
Step4,判斷數據是否需要存儲。如果S1new≥S2new,儲存前一刻值數據值D(j-1)與對應時刻T(j-1),否則返回Step3。依次循環,直至達到強制記錄極限(FSRL),結束當前循環,開始新一輪壓縮。
壓縮數據重建是將壓縮數據還原成原始數據。旋轉門壓縮算法屬于有損壓縮,因此解壓縮后的數據與原始數據存在誤差。壓縮設定了閾值ΔE,因此還原誤差不會超過2ΔE。相較壓縮算法,重構還原算法要簡單得多,本質上就是線性插值。設待解壓數據分為n段,D(i)中存放每段的長度,R(i)中存放i個數據點,Z(i)存放還原后的數據,i=1,2,…,n,(n+1)。數據還原算法步驟為:
Step1n=1,i=1;
Step2incr=0.0+[R(i+1)-R(i)]/D(i),k=1;
Step3Z(n)=R(i)+incr× (k-1),k=k+1,n=n+1;
Step4 if (k>D(i)) Then Step5,Else Step3;
Step5i=i+1;
Step6 if (i=n) Then Step2, Else Return。
某石化計量監控系統數據采集存儲需求為:總計30 450個I/O點的數據,I/O點數據存儲時間間隔為5s,24h不間斷存儲,存儲時間1a以上,數據查詢刷新時間小于2s。其中多區域質量流量計230臺,每臺質量流量計采集65個I/O點的數據,多區域罐150個,每個罐采集50個I/O點的數據,多區域PLC控制系統4套,累計采集2 000個I/O點的數據。多區域視頻流采集點50個,存儲時間大于6個月。
按1a時間計算,以上I/O點的數據總量大于8TB,按照常規思路按點存儲,數據的存儲與提取無法滿足實時性需求。本文基于BDB存儲I/O點數據,采用SDT動態數據壓縮及重建算法,結合WCF技術封裝數據的提取中間件,以此構建計量監控系統。圖5為分布式存儲數據結構,區域1~區域m為獨立的前端采集存儲I/O點數據服務器,壓縮數據存儲在BDB。區域1~區域m的獨立的BDB數據與集中存儲服務器的BDB數據實時同步。基于壓縮數據重建API函數,采用WCF技術構建數據提取及適合于業務流的中間件,供計量監控系統軟件客戶端調用。

圖5 計量監控系統分布式存儲結構
數據存儲區域服務器主要實現:
服務1,采集數據并壓縮,按Key/Data配置好數據結構并結合時間戳,存儲到BDB對應的表中;
服務2,實時監控BDB對應表中數據的變化,一旦數據有變化,建立socket監聽端口,執行與集中存儲服務器的連接操作,將變化且未傳的數據存儲到集中存儲服務器的BDB對應表中,并更新上傳標志。
其中服務2采用了多線程的方式,包括1個主線程和2個子線程。主線程主要監聽數據的變化及進行數據同步。子線程1用來偵聽存儲服務器的連接請求,如果有請求就與服務器建立連接;子線程2負責在已建立的連接上將變化的數據交給rep_process_message函數處理。3個線程之間相互獨立運行。具體流程如圖6所示。

圖6 數據同步流程圖
供客戶端及第三方軟件應用的中間件的功能及流程為:基于WCF的異構系統間交互數據,接收外界并行請求,然后執行處理,并且在集中存儲服務器端BDB重建并封裝請求的數據,最終返回外界客戶端顯示。
WCF整合了.NET平臺下與通信服務相關的所有內容,支持多種契約方式與服務運行方式,具有可靠性、統一性、互操作性和兼容性等優點,提供多種類型的消息編碼及多種協議的消息傳遞。地址(address)、綁定(binding)和契約(contract)是WCF的三要素,必須對它們進行指定才能用WCF進行通信[14]。地址指的是WCF的服務器地址,契約則表示雙方要進行交互的內容,綁定則是指雙方以什么樣的方式進行交互。為了能在不同的網絡和環境下實現分布式訪問,WCF支持多種綁定方式[15]。
數據交互中間件主要包括注冊、驗證數據、數據處理及更新反饋功能模塊。注冊模塊實現數據交互系統間的IP、端口號等基本信息及交互信息的管理功能,配置文件、保存設置的信息。驗證數據模塊提供對要操作數據的格式驗證。數據處理模塊主要工作是對請求方的格式進行驗證、解析,并將請求轉發到提供方,調取數據重建API函數從BDB提取數據,并封裝成指定數據結構,同時將處理后的消息通過平臺反饋給請求者。更新反饋模塊實現了更改配置信息通知等功能,并定期給注冊到該平臺的關聯系統轉發系統配置文件。圖7為數據交互實現流程。

圖7 數據交互實現流程
編寫并發存儲、并發讀取和邊存儲邊讀取的測試程序,對BDB和SQL server數據庫進行比較,整理測試結果,見表1。結果表明,采用BDB速度較快,且數據量越大效果越明顯。

表1 數據存取時間對比
采用SDT算法,基于BDB壓縮存儲及數據重建,對采集的I/O點數據存取性能指標進行計算,得到的計算結果見表2。表中數據1樣本為罐信息7 500個I/O點的數據,數據2樣本為質量流量計采集的14 950個I/O點數據,數據3樣本為PLC系統2 000個I/O點的數據。結果表明,在對實際過程數據進行處理時,使用SDT算法可以明顯地減少數據占用的空間,降低現場總線網絡出現阻塞的可能性,提高控制監控系統的性能、數據存取的效率及實時性。顯著缺點是數據為有損重建。

表2 I/O點過程數據壓縮性能結果
本文將BDB與SDT算法結合,達到了提高數據存取效率、減少數據占用空間的目的。結合WCF技術,構建的分布式數據存取系統[16]解決了大型實時數據存儲提取實時性不高的問題,已應用于某石化企業的過程數據SCADA系統。因本文的SDT算法為有損數據壓縮重建,難以滿足計量數據的一致性要求,下一步將對數據壓縮的無損算法及異構系統服務緩存機制加強研究。