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