文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.180960
中文引用格式: 鐘洋洋,王毅璇,王皓,等. 跨平臺SCADA的歷史數據收集與存儲設計[J].電子技術應用,2018,44(12):111-114.
英文引用格式: Zhong Yangyang,Wang Yixuan,Wang Hao,et al. Historical data collection and storage design of cross-platform SCADA[J]. Application of Electronic Technique,2018,44(12):111-114.
0 引言
隨著現代化工業的不斷發展,生產企業的規模越來越大,對生產過程中的安全性和穩定性要求越來越高。因此,需要對整個生產過程進行監控。將分散使用的儀器、儀表、控制器等集中起來管理,于是就產生了數據采集與監視控制系統,又稱工業組態軟件(Supervisory Control And Data Acquisition,SCADA)。跨平臺SCADA的著重點在于系統在不同的操作系統平臺之間進行移植,都能夠穩定正常地運行。
組態軟件是用于數據采集與過程控制的專用軟件[1],是位于自動控制系統監控層一級的軟件平臺和開發環境中,一般由數據采集與控制信息發送、歷史數據記錄與趨勢顯示、報警記錄及事件處理、報表生成和打印等部分組成。其中,歷史數據的收集和存儲是工業組態軟件不可或缺的一部分,用于記錄SCADA系統中各個控制器數據及狀態值,為控制系統的故障診斷與數據分析等提供數據依據。它主要服務于設備性能的維護、故障原因的診斷以及工藝流程的改進。
理論上,歷史數據是系統定時從實時數據庫中采樣,保存到歷史數據庫中的數據,用戶需要時可隨時從歷史數據庫中訪問歷史數據[2]。歷史數據存儲具有歷史數據量龐大、歷史數據存儲的格式相對簡單固定以及數據保存的時間間隔相差很大等特點[3-4]。
目前,組態軟件實時數據庫系統的一些主流產品一般都提供歷史數據收集和存儲功能,能夠較長時間地保存、備份現場生產運行的過程數據。但是由于工業生產現場的采集點多、采集種類多樣以及采集時間周期較短,因而要保存的歷史數據量非常大。就客觀而言,如果將這些數據直接存儲,不僅會占用大量的系統存儲空間,而且會降低數據庫中數據的實時性,使數據的傳輸、查詢變得困難。因此需要改良目前歷史數據的收集和存儲方式,不僅可以節省磁盤開銷,同時也保證對歷史數據訪問的快捷性[5]。
本文研究著重點在于如何將大量的實時數據有效地存入本地SQLite數據庫中,采用關鍵幀和變更集的兩種方式進行數據收集,在數據的質量和存量方面找到平衡點,優化現有的歷史數據收集存儲方式。在Qt開發平臺上編寫程序,并且在Windows和Linux操作系統平臺上進行實際驗證。
1 總體設計
設計整體分為歷史數據收集設計和歷史數據存儲設計。歷史數據收集主要負責從國產可編程邏輯控制器(Programmable Logic Controller,PLC)中采集到數據并存入內存塊中。歷史數據存儲主要負責將內存塊中的數據經過一定處理加工后存入本地SQLite數據庫中,以便日后查詢所需。總體設計框圖如圖1所示。
本設計采用的數據庫是SQLite數據庫。SQLite是微型關系型嵌入式數據庫,可獨立運行且無需安裝和配置,運行速度塊,內存占用小,API易用性強,支持大部分SQL-92標準,支持事物的ACID特性(持久性、隔離性、一致性和原子性),并且使用一個數據庫文件來存儲整個數據庫,同一個數據庫文件可以在不同應用平臺上使用,代碼完全開源[6]。
2 歷史數據收集設計
歷史數據收集部分是上位機監控軟件(SCADA)所具有功能的一部分,是位于上位機軟件與國產PLC接口部分的上行方向,實現對PLC原始數據的獲取、協議解析,然后將數據存入內存塊中。其中,采用的數據收集方法是對死區限值壓縮算法的優化,衍生出關鍵幀和變更集兩種數據記錄方式。
2.1 系統設計
歷史數據收集子系統與PLC設備的數據通信方式采用有線方式,使用100 Mb/s(含)以上的以太網通過國產控制器實現對現場測控設備實時運行信息的采集,將實時協議數據解析后存儲在內存塊中,再提交給上位機數據處理子系統處理。
歷史數據收集子系統作為上位機監控軟件的內部數據源提供者,要求常年不間斷運行,實時獲取PLC設備運行數據,所以必須具有高度的可靠性、穩定性和擴展性,同時依據工業生產狀況,也要具有強大的數據采集能力,其大致流程如圖2所示。
功能說明如下:
(1)數據采集:通常采集工業生產運行設備的模擬量輸入、數字量輸入、脈沖量;如有需要也可以采集模擬量輸出值和數字量輸出值。且同時支持多個控制器、大數據量的采集。采集的數據僅僅是數值,沒有狀態和時間戳。采用定時機制采集數據,最小請求周期可設置為100 ms(或其整數倍)~1 s(由控制器傳輸量的多少決定)。
(2)協議解析:采用庫方式支持各種通信協議的解析,例如自有協議、Modbus協議、OPC協議等[7],每種協議或者規約采用獨立的庫,實現設計要求中的擴展性需求。
(3)變更數據轉發:解析后的采集數據臨時被放置于數據緩沖區,一旦數據緩沖區中的數據發生了變化,即達到存儲數組的最大下標值,則將變更的數據集提交給數據存儲子系統,由數據存儲子系統進一步對數據進行加工處理,加入狀態和時間戳[8]等操作。
(4)診斷統計:診斷功能是指周期性檢測控制器的主從狀態(PLC有主從冗余模式:存在兩個CPU模塊,主CPU運行時,副CPU進行備份),采集數據和下發指令僅面向主控制器。另外診斷功能還負責與任務管理進程通信,告知其當前進程的運行狀態;監察對應的通信接口工作狀態,在發生故障時發出報警。統計功能指通信過程的調試記錄、通信速率、傳輸字節數等附加功能。
2.2 數據記錄
2.2.1 收集算法
收集子系統采用的算法原型是死區限值壓縮算法,在其基礎上進行優化設計。
死區限值壓縮算法的原理是通過判斷當前值偏離最后一個記錄的范圍是否大于死區限值,來決定是否記錄此數據。如果大于死區限值,則記錄該數據并以此數據為新的起點進行死區限制壓縮[9]。算法圖如圖3所示。
設算法的門限值是T,起點A的值為V,那么點A的死區范圍為區間(V-T,V+T)。點A之后的點值只要沒有超出死區范圍就直接放棄,直到F超出死區范圍,成為新的起點[10]。
死區限值壓縮算法雖然能夠得到不錯的壓縮率,但是屬于有損壓縮,在工業生產中,如果長期缺少某一點的數據信息是不合適的,不利于后期分析問題。所以為了確保穩定記錄工業設備運行時的數據,在數據收集算法設計上,對死區限值壓縮算法進行優化,在保持原有算法思想不變的基礎上,增加獲取關鍵幀的數據收集方式,定時收集全部采集點的數據信息,形成關鍵幀和變更集兩種數據收集方式。
2.2.2 收集方式
在數據收集子系統中,為了保證數據的準確性,同時確保收集的數據量也不至于過大,系統采用兩種數據收集方式:關鍵幀和變更集。兩種方式在系統運行時,同時進行操作,互不干擾。
(1)關鍵幀:操作員可以設定一定時間間隔(一般是15 min),系統會每隔該時間值對所有要求收集的點信息全部記錄一遍。
(2)變更集:系統內會自動識別每一時刻采集點信息的數據值是否存在變化(系統設計時,將數據變化的閾值默認設計為0)。數據如果存在變化,系統會將該點信息記錄在內存緩沖區中;反之,系統將不會收集該點此時間點的信息數據值,即系統只會收集此時間點變化的采集點信息數據值。
關鍵幀的優勢在于保證采集點信息的完整性,不會存在長時間缺失某一點信息的情況。同時,變更集的優勢在于優化存儲采集點信息的數據量。兩種方式共同作用,優勢互補,提高歷史數據收集效率,將收集的數據量控制在合適的范圍內。
在Qt開發平臺上,采用設計原理,編寫程序將兩種方式結合在一起,具體流程圖如圖4所示。
3 歷史數據存儲設計
歷史數據存儲子系統負責對數據收集子系統收集的數據進行實時的處理和存儲,目的是將數據收集子系統的“生數據”加工成“熟數據”,即轉化為滿足上位機系統真正需要的數據結構,并且將數據存儲到歷史庫中,便于以后查詢。
3.1 工作方式
當接收到數據收集子系統的轉發模塊發送來的消息通知后,系統會對數據進行處理和存儲操作,大致流程如圖5所示。
關鍵模塊說明:
(1)時間戳處理:在校時子系統保證下,為待處理的數據批量打上時標,標明該批數據采集的時刻,為后來操作提供幫助。
(2)模擬量處理:具備工程量程轉換、線性/非線性變換、零漂修正算法、數值死區處理等功能,每個功能可以采用模塊化設計。
(3)數字量處理:具備取反功能。
(4)報警處理:檢查收集的數據是否存在異常,如有異常即報警提示工作人員。
3.2 關鍵環節
歷史數據存儲系統的關鍵環節分為實時數據存儲至內存緩沖區中和數據從內存緩沖區中轉存至本地SQLite數據庫兩部分。
(1)第一部分
當收集子系統運行并有數據到來時,數據存儲子系統會自動識別并在本地磁盤固定位置新建數據庫文件。數據庫文件是以此刻設備時間值為起始,以數據庫文件記錄結束時間值為終止的方式進行命名。在存儲系統運行時,一般是以10 min的時間跨度來新建一個數據庫文件。如果數據記錄時間跨度不等于10 min,系統會以當時結束時間值來替換新建該數據庫文件時的結束時間值。文件命名形式例如RECORD_20180130014305_20180130014510。數據庫文件新建完成后,并不會立刻寫入數據,而是等到有內存切換的情況,才進行寫入操作。
同時,系統開辟兩個內存緩沖區memA和memB,用于臨時存儲從收集子系統到來的數據。為了使該子系統存儲和轉存能夠不停地進行,故生成兩塊內存區域:當memA存滿時,系統就會自動切換到memB繼續進行存儲,而memA就會進行數據轉存至本地數據文件的過程。對于單個點信息數據,系統采用結構體數組的形式進行存儲,數組的下標是根據當前時間值經過一定數學變化來確定的,部分代碼如下所示:
pst=(tsmp/(m_isMsec ?1 :1000) )/m_secCount ;
index=(tsmp/(m_isMsec?1:1000) ) %m_secCount ;
該結構體數組就是位于當前內存塊的空間中,系統會設定數組的大小,當數組下標值達到設定值后,系統就會發送信號,觸發響應函數,自動切換到另一塊內存緩沖區中。
(2)第二部分
當存在一塊內存空間存滿后,系統會自動切換內存塊,并利用Qt的信號和槽機制對存滿的內存塊進行轉存至數據庫操作,對另一個內存塊會繼續進行數據收集操作。實現的部分代碼如下所示:
if(mem== memA)
{
mem= memB;
}
else
{
mem= memB;
}
cleanCache(mem);
m_pst.position = 0;
m_pst.index = 0;
對于當前進行數據轉存至數據庫操作的內存塊,因為其中存在模擬量和數字量數據,所以系統會進行轉存哈希表、區分數據和存入數據庫等處理,最后形成完整的數據文件,存在本地磁盤中。
數據庫中存在兩種數據文件表:模擬量和數字量,對兩種數據分別進行存儲,利于后期對數據庫查詢操作。
4 結束語
本文主要介紹關于歷史數據收集和存儲設計的思想、關鍵方法以及實現。編寫的數據收集和存儲系統在基于Windows和Linux操作平臺的實際運行中對國產PLC的數據采集和存儲操作都能正常穩定進行,性能指標都達到設計要求。
參考文獻
[1] 嵇月強.工業歷史數據庫的研究[D].杭州:浙江大學,2007.
[2] 徐國風.實時數據庫關鍵技術研究[D].西安:西安建筑科技大學,2006.
[3] 江勇,王文海,張龍旗.組態軟件中歷史數據存儲與查詢的一種新方法[J].江南大學學報(自然科學版),2005,4(6):579-583.
[4] 張云.組態軟件中的歷史數據處理過程[J].福建電腦,2010(9):81-82.
[5] 任寶強.監控組態軟件實時數據庫系統的設計與實現[D].保定:華北電力大學,2009.
[6] 張欣.嵌入式數據庫在嵌入式設備中的研究和應用[D].成都:電子科技大學,2012.
[7] 陳騫,劍強,汪鐳,等.關于OPC UA的歷史數據獲取[J].微型電腦應用,2010,26(2):35-37.
[8] 王凌峰,吳海鑫,陳彥彪,等.工控組態軟件中數據處理的設計和實現[J].微計算機信息,2000,16(2):33-35.
[9] 陳騫.基于工業實時數據的壓縮算法研究[J].科協論壇,2009(9):106-108.
[10] 金陳武.基于WoT的傳感器數據管理技術[D].北京:北京郵電大學,2014.
作者信息:
鐘洋洋,王毅璇,王 皓,傅一帆
(華北計算機系統工程研究所,北京100083)