劉祿恒
摘 要:數(shù)據(jù)采集系統(tǒng)一直是工控系統(tǒng)的核心要件。論述一種基于Modbus協(xié)議、Fins協(xié)議和IEC104協(xié)議的通用多協(xié)議數(shù)據(jù)采集系統(tǒng),該系統(tǒng)根據(jù)不同協(xié)議的特點將數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理,支持?jǐn)?shù)據(jù)實時訂閱、冗余處理和統(tǒng)一發(fā)布。應(yīng)用結(jié)果表明,該系統(tǒng)是一個實時性強(qiáng)、易擴(kuò)展、易維護(hù)的高效穩(wěn)定的數(shù)據(jù)采集系統(tǒng)。
關(guān)鍵詞:多協(xié)議;數(shù)據(jù)采集;標(biāo)準(zhǔn)化處理;框架
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:2095-1302(2015)06-00-02
0 引 言
數(shù)據(jù)采集,是指從傳感器和其它待測設(shè)備等模擬和數(shù)字被測單元中采集信號,再由計算機(jī)進(jìn)行存儲、處理、顯示或打印的過程。數(shù)據(jù)采集過程往往表現(xiàn)出“數(shù)據(jù)量大”、“數(shù)據(jù)增長速度快”、“數(shù)據(jù)冗余”、“設(shè)備通信協(xié)議不統(tǒng)一”等特點,這往往會導(dǎo)致采集系統(tǒng)無法適應(yīng)不斷增長的處理需求,系統(tǒng)擴(kuò)展性能低,難以維護(hù)[1]。本文論述了一種基于Modbus協(xié)議、Fins協(xié)議和IEC104協(xié)議的多協(xié)議數(shù)據(jù)采集系統(tǒng),該系統(tǒng)根據(jù)不同協(xié)議的特點將數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理,支持?jǐn)?shù)據(jù)訂閱、冗余處理和統(tǒng)一發(fā)布。
1 系統(tǒng)總體結(jié)構(gòu)
1.1 系統(tǒng)層次結(jié)構(gòu)
系統(tǒng)總體結(jié)構(gòu)如圖1所示,系統(tǒng)主要由采集框架層,緩存判重層和數(shù)據(jù)管理層三部分組成,其中采集框架層包含輪詢框架和主動上傳框架,不同協(xié)議可根據(jù)協(xié)議的特性來選擇相應(yīng)框架,比如Modbus和Fins協(xié)議都沒有定義主動上傳的功能所以采用輪詢框架,而IEC104中有主動上傳的功能則采用主動上傳框架。緩存判重層可以將不同協(xié)議間的數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理,減少數(shù)據(jù)冗余和數(shù)據(jù)發(fā)布時的負(fù)載。數(shù)據(jù)管理層是將采集上來的數(shù)據(jù)統(tǒng)一管理,然后再分發(fā)給各個訂閱者。訂閱者可以是數(shù)據(jù)庫或者顯示界面,數(shù)據(jù)管理層可以直接存儲到數(shù)據(jù)庫,也可通過共享內(nèi)存或者套接字存儲到數(shù)據(jù)庫或者顯示到界面上。如果是顯示到界面上,增加訂閱的功能便可減少顯示界面查詢數(shù)據(jù)庫的延遲,提高采集系統(tǒng)的實時性。
1.2 系統(tǒng)線程模型
系統(tǒng)總體表現(xiàn)為一個進(jìn)程,不同協(xié)議的數(shù)據(jù)采集工作在不同的線程里。輪詢框架下的每個協(xié)議有兩個線程,主動上傳框架下的協(xié)議采用一個線程。數(shù)據(jù)管理模塊中等待訂閱的工作為一個線程,數(shù)據(jù)的發(fā)布為一個線程。
圖1 系統(tǒng)總體結(jié)構(gòu)圖
2 關(guān)鍵技術(shù)
2.1 輪詢框架的實現(xiàn)
輪詢框架的核心為兩個線程和兩個鏈表,線程分為主線程和工作線程,主線程主要維護(hù)兩個定時器,工作線程進(jìn)行實際采集和設(shè)備重新連接的工作。主線程的兩個定時器分別對應(yīng)工作線程的兩個鏈表,兩個鏈表分別為數(shù)據(jù)采集設(shè)備鏈表和重新連接的設(shè)備鏈表。
輪詢框架分為兩個線程,可以隔離定時器和實際的采集或重連工作,減少彼此之間的影響。網(wǎng)絡(luò)通訊有很多不確定的因素,在一個設(shè)備上的采集延遲可能會影響到其他設(shè)備上的數(shù)據(jù)采集。將定時器和實際工作設(shè)備兩者隔離就能保證各設(shè)備上一定次數(shù)的信息采集,確保系統(tǒng)正常穩(wěn)定的運行。
2.2 主動上傳框架的實現(xiàn)
主動上傳框架采用Reactor編程模式,對各socket描述符進(jìn)行監(jiān)聽,有數(shù)據(jù)到來就對協(xié)議進(jìn)行解析,回調(diào)提前注冊好的信息處理函數(shù),取出數(shù)據(jù)。如果設(shè)備發(fā)生故障則關(guān)閉socket描述符,啟動重新連接設(shè)備的定時器,定期進(jìn)行設(shè)備重連。
IEC104協(xié)議本身規(guī)定了4個定時器,包括為連接建立超時進(jìn)行重連的定時器t0(30秒)、發(fā)送或測試APDU的超時定時器t1(15秒)、無數(shù)據(jù)報文時確認(rèn)的超時定時器t2(10秒,t2
2.3 不同協(xié)議數(shù)據(jù)的標(biāo)準(zhǔn)化處理
由于不同協(xié)議間模擬點的數(shù)據(jù)信息表示可能不一致,比如Modbus和Fins協(xié)議模擬點的數(shù)據(jù)信息選用uint16_t來表示,而IEC104協(xié)議選用float來表示,所以系統(tǒng)統(tǒng)一定義了一個數(shù)據(jù)結(jié)構(gòu)--struct Data,不同協(xié)議下模擬點的信息統(tǒng)一用std::unique_ptr
2.4 緩存判重去冗余
系統(tǒng)總體用一棵紅黑樹來緩存最近一次采集的所有協(xié)議下所有設(shè)備的數(shù)據(jù)信息,這樣每次進(jìn)行發(fā)布的都是所有設(shè)備下有數(shù)據(jù)變化了的點信息,大大減少了數(shù)據(jù)冗余和發(fā)布時的負(fù)載,明顯提高了系統(tǒng)性能。另外有了緩存模塊,設(shè)備信息的顯示界面可以不需要讀取設(shè)備列表上的配置文件,而從網(wǎng)絡(luò)上直接獲取設(shè)備列表。
2.5 數(shù)據(jù)管理統(tǒng)一發(fā)布
數(shù)據(jù)管理模塊參考了muduo的日志庫[3],線程模型在前端線程收集數(shù)據(jù),數(shù)據(jù)信息到達(dá)一定大小或者數(shù)據(jù)發(fā)布定時器超時之后將數(shù)據(jù)傳給背景線程,由背景線程來統(tǒng)一發(fā)布給訂閱者,比如數(shù)據(jù)庫和顯示界面等。這樣可以在不影響數(shù)據(jù)采集效率的前提下,提高數(shù)據(jù)發(fā)布效率,免除系統(tǒng)在發(fā)布上的等待。另外系統(tǒng)采用Reactor + one loop per thread 編程模式等待來自網(wǎng)絡(luò)的訂閱并實施數(shù)據(jù)信息在網(wǎng)絡(luò)上的發(fā)布。傳統(tǒng)的采集系統(tǒng)都是先將數(shù)據(jù)存到數(shù)據(jù)庫中,然后工控系統(tǒng)其他組件再從數(shù)據(jù)庫中讀取數(shù)據(jù),這樣往往會造成很大的延時,所以支持訂閱和統(tǒng)一發(fā)布的采集系統(tǒng)對工控系統(tǒng)的實時性大有裨益。
采集系統(tǒng)采用如圖2所示的協(xié)議格式來進(jìn)行統(tǒng)一的數(shù)據(jù)發(fā)布。報文最開始用3個字節(jié)的“HEI”來對報文定界,其后是4個字節(jié)的報文長度,方便接收方對報文進(jìn)行處理。然后是設(shè)備個數(shù)及設(shè)備上的具體點信息。
圖2 數(shù)據(jù)發(fā)布的協(xié)議
由于數(shù)據(jù)標(biāo)準(zhǔn)化的處理,數(shù)據(jù)發(fā)布在協(xié)議上也做了一些妥協(xié),多了一個字節(jié)的標(biāo)識來判斷設(shè)備上是否包含模擬點。設(shè)備信息如圖3所示。
圖3 設(shè)備信息內(nèi)容
3 運行結(jié)果及分析
為了對系統(tǒng)做性能上的評測,編寫Modbus協(xié)議和IEC104協(xié)議設(shè)備端的仿真程序,模擬這兩個協(xié)議下多個設(shè)備上的多種點信息,多個不同的模擬點分別模擬正弦曲線(如圖4),二次函數(shù)曲線,指數(shù)曲線,對數(shù)曲線,平方根曲線等的變化,不同的數(shù)字點只需要模擬一系列隨機(jī)0/1值的變化即可。
圖4 設(shè)備上的模擬點數(shù)據(jù)按正弦曲線變化
采集系統(tǒng)會根據(jù)協(xié)議的特點實時將數(shù)據(jù)采集上來,然后統(tǒng)一發(fā)布。數(shù)據(jù)顯示的界面如圖5所示,圖中顯示的是IEC104協(xié)議下設(shè)備0的數(shù)據(jù)信息,該設(shè)備下模擬點號16 385的值為12 198.6,數(shù)字點號1的值為0。
圖5 數(shù)據(jù)顯示界面
在界面上選擇不同的協(xié)議并選擇協(xié)議下各相應(yīng)設(shè)備上不同點的信息,將數(shù)據(jù)與設(shè)備仿真端的數(shù)據(jù)對比,發(fā)現(xiàn)程序運行無誤。
設(shè)備的仿真端程序總共模擬了50個設(shè)備的變化,系統(tǒng)均能實時準(zhǔn)確的將各協(xié)議下各設(shè)備的各個點信息采集上來,說明了該系統(tǒng)性能的高效性。
采集系統(tǒng)在采集框架層完成之后才增加的對FINS協(xié)議的支持,說明了系統(tǒng)容易擴(kuò)展,容易維護(hù)的特性。而采集系統(tǒng)支持?jǐn)?shù)據(jù)實時訂閱、冗余處理和統(tǒng)一發(fā)布,說明了系統(tǒng)是一個實時性能可靠的數(shù)據(jù)采集系統(tǒng)。
4 結(jié) 語
本文論述了一種基于Modbus協(xié)議、Fins協(xié)議和IEC104協(xié)議的通用多協(xié)議數(shù)據(jù)采集系統(tǒng), 該系統(tǒng)根據(jù)不同協(xié)議的特點將數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理,支持?jǐn)?shù)據(jù)實時訂閱、數(shù)據(jù)冗余處理和統(tǒng)一發(fā)布。實驗結(jié)果表明,該系統(tǒng)是一個易擴(kuò)展,易維護(hù)的實時性強(qiáng)的高效穩(wěn)定的數(shù)據(jù)采集系統(tǒng)。
參考文獻(xiàn)
[1]彭新一,黃競斌,黃志煒 .“一種面向大規(guī)模分布式數(shù)據(jù)采集的標(biāo)準(zhǔn)化方法” [C]. Proceedings of 2010 The 3rd,International Conference on Computational Intelligence and Industrial Application,2010(7).
[2] Telecontrol equipment and systems Part 5-104: Transmission protocols Network access for IEC 60870-5-101 using standard transport profiles[S]. IEC 60870-5-104:2000, IDT
[3]陳碩.《Linux多線程服務(wù)端編程》[M].北京:電子工業(yè)出版社,2013。
[4] Modbus Application Protocol Specification V1.1b, Modbus-IDA. http://www.Modbus-IDA.org
[5]鞠陽,張惠剛.IEC60870-5-104遠(yuǎn)動規(guī)約的設(shè)計及其應(yīng)用[J].繼電器,2006,34(17):55-58.
[6] FINS communications. http://paginas.fe.up.pt/~pfs/recursos/plcs/omron/cs1/eth_manual/sec5.pdf