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