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