文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.179019
中文引用格式: 王毅璇,豐大軍,王皓,等. 跨平臺的上位機監(jiān)控系統(tǒng)中數(shù)據(jù)通信的實現(xiàn)[J].電子技術(shù)應(yīng)用,2017,43(10):94-98.
英文引用格式: Wang Yixuan,F(xiàn)eng Dajun,Wang Hao,et al. Implementation of data communicationin cross-platform supervisory control and data acquisition system[J].Application of Electronic Technique,2017,43(10):94-98.
0 引言
目前國產(chǎn)PLC上位機監(jiān)控軟件廠家有西門子、施耐德、歐姆龍、三菱、橫河、臺達等,各類軟件均有各自的優(yōu)勢,在國內(nèi)PLC市場占有較大的份額。然而針對不同系統(tǒng)平臺和開發(fā)軟件所開發(fā)出的上位機監(jiān)控系統(tǒng)之間兼容性較差,不能實現(xiàn)跨平臺的數(shù)據(jù)通信。這是由于系統(tǒng)平臺和開發(fā)軟件之間的耦合性較強造成的。
在上位機監(jiān)控軟件系統(tǒng)的最底層(即網(wǎng)絡(luò)層),通信子系統(tǒng)負責與控制器間的數(shù)據(jù)通信以及操作員站之間的數(shù)據(jù)同步。通信子系統(tǒng)根據(jù)上位機監(jiān)控軟件系統(tǒng)中配置子系統(tǒng)提供的系統(tǒng)構(gòu)成信息,通過以太網(wǎng)完成系統(tǒng)中各個站點之間的狀態(tài)監(jiān)控、組態(tài)同步、進程控制、文件維護等工作。而不同的PLC上位機監(jiān)控系統(tǒng)中配置子系統(tǒng)提供的系統(tǒng)構(gòu)成信息卻因系統(tǒng)平臺和開發(fā)軟件的不同而不同。
數(shù)據(jù)通信子系統(tǒng)接管上位機監(jiān)控軟件系統(tǒng)內(nèi)部上層應(yīng)用軟件需要的所有數(shù)據(jù)通信和文件傳輸,并能夠以消息方式通知上層應(yīng)用軟件。如果系統(tǒng)的構(gòu)成信息有差異,則會導(dǎo)致上位機之間傳輸數(shù)據(jù)的紊亂。
對此,文獻[1]、[2]均通過在不同上位機軟件之間建立公共的Modbus協(xié)議來實現(xiàn)上位機之間通信數(shù)據(jù)的兼容。雖然Modbus在上位機通信當中使用較多,但中間需將數(shù)據(jù)轉(zhuǎn)換成公共“可識別”的數(shù)據(jù),降低了通信效率。文獻[3]則是在不同的上位機之間建立以太網(wǎng),把每個上位機系統(tǒng)當作自己的下層系統(tǒng),從而實現(xiàn)數(shù)據(jù)的兼容轉(zhuǎn)換和傳輸。此種方法對以太網(wǎng)的傳輸效率和系統(tǒng)架構(gòu)要求較高,不易實現(xiàn)。文獻[4]是在每個上位機監(jiān)控系統(tǒng)中加裝GPRS通信模塊來實現(xiàn)快平臺的通信。GPRS由于其傳輸距離和本身可靠性的限制,在跨平臺的通信中較少應(yīng)用。文獻[5]提出使用第三方監(jiān)控軟件作為公共數(shù)據(jù)轉(zhuǎn)換平臺,這種方法和文獻[2]的方法類似,對第三方的系統(tǒng)要求較高且網(wǎng)絡(luò)架構(gòu)較為復(fù)雜。
本文采用面向?qū)ο笤O(shè)計的方法實現(xiàn)跨平臺開發(fā)的上位機監(jiān)控軟件系統(tǒng)中的數(shù)據(jù)通信子系統(tǒng)。首先對數(shù)據(jù)通信子系統(tǒng)進行了功能分析,然后進行了整體設(shè)計,并對子系統(tǒng)進行化整為零的模塊拆分,最后對各模塊的實現(xiàn)方式、方法提出參考方案,并進行較為詳細的闡述。
1 系統(tǒng)功能分析
數(shù)據(jù)通信子系統(tǒng)需要完成監(jiān)控軟件系統(tǒng)中上層應(yīng)用軟件需要的所有數(shù)據(jù)通信和文件傳輸,并能夠以消息方式通知上層應(yīng)用軟件。數(shù)據(jù)通信內(nèi)容包括站間狀態(tài)數(shù)據(jù)包、實時數(shù)據(jù)表數(shù)據(jù)包、歷史數(shù)據(jù)數(shù)據(jù)包、命令包、請求包等所有需要網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)包,文件傳輸包含組態(tài)文件、配置文件、日志文件等所有需要網(wǎng)絡(luò)傳輸和同步的文件。
數(shù)據(jù)通信子系統(tǒng)通過進程控制命令包方式,對其他站的進程進行帶參數(shù)啟動、定時啟動、定時停止、監(jiān)視等操控,通過站點控制命令包方式,對其他操作員站進行啟動在線、定時啟動在線、定時停止在線等操控。支持一對一和一對多的點對點通信,根據(jù)需要,分別提供可靠的TCP傳輸方式和非連接的UDP傳輸方式。TCP方式用于大數(shù)據(jù)塊的復(fù)制和同步,UDP用于少量數(shù)據(jù)的傳輸。原則是周期性數(shù)據(jù)用UDP,事件性的數(shù)據(jù)用TCP。支持優(yōu)先級控制,不同的優(yōu)先級數(shù)據(jù)包發(fā)送時按照高優(yōu)先級先發(fā)送原則進行處理,保證重要數(shù)據(jù)優(yōu)先發(fā)送。當數(shù)據(jù)包很大時,需分包處理,并自行控制以太網(wǎng)的網(wǎng)絡(luò)負荷。以太網(wǎng)網(wǎng)絡(luò)負荷最高不超過20%,以10%以下為佳。
2 系統(tǒng)總體設(shè)計
如圖1所示,數(shù)據(jù)通信子系統(tǒng)總體劃分為3個模塊:數(shù)據(jù)交互模塊、網(wǎng)絡(luò)操作模塊和網(wǎng)絡(luò)通信模塊。數(shù)據(jù)交互模塊管理數(shù)據(jù)的發(fā)送和接收,負責完成站與站之間TCP/UDP數(shù)據(jù)和文件的傳送,發(fā)送隊列管理和接收數(shù)據(jù),并通知進程;網(wǎng)絡(luò)通信模塊用于上位機監(jiān)控軟件站間各應(yīng)用程序與傳送數(shù)據(jù)時的網(wǎng)絡(luò)通信接口,主要是發(fā)送接口函數(shù)、接收接口函數(shù);網(wǎng)絡(luò)操作模塊主要完成提供遠程登陸、獲取網(wǎng)絡(luò)地址、指定站狀態(tài)功能,該模塊主要提供兩個接口函數(shù),分別是獲取指定站的網(wǎng)絡(luò)連接狀態(tài)和獲取網(wǎng)絡(luò)地址。由于數(shù)據(jù)通信子系統(tǒng)同時支持Windows平臺和Linux平臺,為了解決平臺差異性和實現(xiàn)系統(tǒng)的低耦合性,網(wǎng)絡(luò)操作模塊和網(wǎng)絡(luò)通信模塊均采用動態(tài)鏈接庫形式實現(xiàn)。
當應(yīng)用程序有數(shù)據(jù)、文件或者命令要發(fā)送到目的站時,先調(diào)用網(wǎng)絡(luò)操作動態(tài)庫中的相關(guān)函數(shù),打通路徑;再調(diào)用網(wǎng)絡(luò)通信動態(tài)庫的相關(guān)函數(shù)將數(shù)據(jù)按照優(yōu)先級放到不同的隊列中。數(shù)據(jù)交互模塊按照優(yōu)先級算法查詢各個隊列,將各個隊列的數(shù)據(jù)發(fā)送到目的地址;當數(shù)據(jù)通信收到來自上位機監(jiān)控系統(tǒng)的網(wǎng)絡(luò)數(shù)據(jù)時,先辨別是哪一類,如果是輸出型模擬量、輸出型數(shù)字量等數(shù)據(jù),則將數(shù)據(jù)放到接口輸入隊列;如果是命令,則即刻通知目標應(yīng)用程序;如果是給應(yīng)用程序的內(nèi)存數(shù)據(jù),則將數(shù)據(jù)放到接收內(nèi)存隊列,并馬上通知上層應(yīng)用程序來接收處理。校時數(shù)據(jù)由歷史站主站周期發(fā)送給全網(wǎng),其他站被動接收數(shù)據(jù)并修改自身的時鐘與歷史站主站保持一致。
當上位機監(jiān)控軟件系統(tǒng)出現(xiàn)錯誤時,數(shù)據(jù)交互模塊會調(diào)用整個系統(tǒng)錯誤管理程序提供的接口函數(shù)顯示錯誤提示。發(fā)送和接收錯誤信息一律記入日志文件。為了保證整個系統(tǒng)的安全性,如果發(fā)生數(shù)據(jù)包太多、超過處理能力時,則依據(jù)數(shù)據(jù)包中的重要性信息丟棄一部分不重要的數(shù)據(jù),但用于操作PLC的數(shù)字量信息包永遠不被丟棄。
3 數(shù)據(jù)交互模塊
該模塊主要接管上位機監(jiān)控軟件系統(tǒng)與計算機之間數(shù)據(jù)的交互工作,包括命令、內(nèi)存、文件的傳送。對TCP/UDP通信的發(fā)送和接收端口進行管理,進行點對點的通信。
接收到內(nèi)存數(shù)據(jù)后,判斷數(shù)據(jù)類型再做處理:需要寫到共享內(nèi)存隊列的,發(fā)送消息通知實時數(shù)據(jù)處理進程,包括操作數(shù)據(jù)包;如果是操作包,并且本機是歷史站的主站,則加上時間標簽放到操作數(shù)據(jù)隊列,通知實時數(shù)據(jù)處理模塊處理數(shù)據(jù),另外還要將這個操作包放到數(shù)字量、模擬量輸出隊列,等待PLC驅(qū)動模塊處理,并調(diào)用數(shù)據(jù)通信模塊將其分發(fā)到其他機器上;需要寫到共享內(nèi)存的數(shù)據(jù),不需要通知應(yīng)用程序;其他內(nèi)存數(shù)據(jù),送到后,先放到一個緩存,并通知對方接收數(shù)據(jù);對于消息和命令,傳送至目標后直接發(fā)送到應(yīng)用程序。接收到命令后先放到程序內(nèi)部緩存,然后直接用消息通知給應(yīng)用程序。
文件傳輸直接采用Linux/Windows平臺的文件拷貝命令或者文件序列化的方法。超過一定大小的文件需要先進行文件壓縮,然后再發(fā)送壓縮后的文件,并由目標機在其本地解壓縮。為防止變更集數(shù)據(jù)丟失,對重要數(shù)據(jù)傳輸采用TCP方式。全網(wǎng)傳送使用UDP組播或廣播方式。管理遠程登錄連接,文件傳送完畢要關(guān)閉連接,但為了防止反復(fù)的打開和關(guān)閉連接,使用超時機制,超時時間到才關(guān)閉連接。連接信息放在共享內(nèi)存中。傳送以字節(jié)為單位進行,不修改數(shù)據(jù)包原來的數(shù)據(jù)精度。對于PC間內(nèi)存同步數(shù)據(jù),采用UDP傳送,數(shù)據(jù)包有可能丟失,但是同步數(shù)據(jù)每秒同步,下一秒的數(shù)據(jù)到來可以彌補丟失數(shù)據(jù)[6-8]。
4 網(wǎng)絡(luò)通信模塊
提供本機進程間的消息通信機制,調(diào)用公共函數(shù)可以在進程間任意發(fā)消息通知。該模塊提供發(fā)送通知、發(fā)送文件、發(fā)送內(nèi)存、發(fā)送操作數(shù)據(jù)表、通知目標任務(wù)接收數(shù)據(jù)、接收數(shù)據(jù)的接口函數(shù)。如果數(shù)據(jù)發(fā)送失敗,采用消息方式通知調(diào)用任務(wù)(此功能在數(shù)據(jù)交互模塊中)。UDP數(shù)據(jù)包分為大包、中包和小包。TCP數(shù)據(jù)包沒有這些限制。數(shù)據(jù)通信與上位機監(jiān)控軟件系統(tǒng)其他應(yīng)用程序的接口包括3種:消息、內(nèi)存和動態(tài)庫[9-12]。
4.1 本地消息實現(xiàn)
鑒于上位機監(jiān)控軟件系統(tǒng)既要運行在Linux下又要運行在Windows下,但是兩個操作系統(tǒng)對消息的定義不同,所以采用Qt的本地Socket技術(shù)封裝上位機監(jiān)控軟件自己的消息機制,實現(xiàn)進程間的消息通信,其對外接口形式采用近似Windows的消息方式。
本地消息通知分兩種,一種是傳遞消息值及消息參數(shù),另一種是傳遞消息值及一小塊內(nèi)存數(shù)據(jù)。實現(xiàn)時采用QlocalSocket類,封裝上述兩個函數(shù)并提供類對象,上位機監(jiān)控軟件系統(tǒng)的所有進程都可以加載網(wǎng)絡(luò)通信動態(tài)庫,即可具備本地進程間的消息通知功能。發(fā)送通知的進程調(diào)用類對象的發(fā)送命令的函數(shù)發(fā)送通知,接收通知的進程只需定義本地接收通知的信號及對應(yīng)信號處理函數(shù)即槽函數(shù),即可收到并處理通知。通知傳送處理流程如圖2所示。
4.2 機器間的消息實現(xiàn)
機器間的消息通知亦采用Qt的Socket技術(shù)封裝上位機監(jiān)控軟件自己的消息機制,實現(xiàn)不同機器進程間的消息通知。機器間消息通知亦分兩種,一種是傳遞消息值及消息參數(shù),另一種是傳遞消息值及一小塊內(nèi)存數(shù)據(jù)。實現(xiàn)時采用QUdpSocket類,封裝上述兩個函數(shù)并提供類對象,上位機監(jiān)控軟件系統(tǒng)的所有進程都可以加載網(wǎng)絡(luò)通信動態(tài)庫,即可具備機器間進程的消息通知功能。發(fā)送通知的進程調(diào)用類對象的發(fā)送命令的函數(shù)發(fā)送通知,接收通知的進程只需定義遠程接收信號及對應(yīng)槽函數(shù),即可收到并處理通知。通知傳送處理流程如圖2所示。
4.3 機器間文件的發(fā)送實現(xiàn)
因為上位機監(jiān)控軟件系統(tǒng)既要運行在Linux下又要運行在Windows下,所以機器間的文件傳送采用操作系統(tǒng)自身的遠程文件拷貝功能,需要根據(jù)操作系統(tǒng)的不同,采用不同的實現(xiàn)機制。在Windows平臺下,在上位機監(jiān)控軟件系統(tǒng)安裝配置時,就創(chuàng)建上位機監(jiān)控軟件專用的管理員賬戶,此賬戶所有計算機都一樣,利用系統(tǒng)默認的CS、DS等默認共享,如同操作本機文件一樣在各臺機器之間拷貝文件。在Linux平臺下,在上位機監(jiān)控軟件系統(tǒng)中設(shè)置相同的root用戶密碼,并在系統(tǒng)啟動時,利用腳本打通各個機器之間的訪問路徑,然后如同操作本機文件一樣在各臺機器之間拷貝文件[13]。
4.4 機器間內(nèi)存同步實現(xiàn)
機器間的共享內(nèi)存同步,采用Qt的QUdpSocket技術(shù)封裝,實現(xiàn)不同機器間共享內(nèi)存數(shù)據(jù)的同步。實現(xiàn)時采用QUdpSocket類,封裝上述函數(shù)并提供類對象,上位機監(jiān)控軟件系統(tǒng)的所有進程都可以加載網(wǎng)絡(luò)通信動態(tài)庫,即可具備機器間共享內(nèi)存的同步功能。需要同步共享內(nèi)存的進程調(diào)用類對象的發(fā)送內(nèi)存接口函數(shù)發(fā)送內(nèi)存數(shù)據(jù),函數(shù)根據(jù)數(shù)據(jù)區(qū)的大小,在最短的時間內(nèi)分包發(fā)送數(shù)據(jù),并且每個分包中都帶有此數(shù)據(jù)包內(nèi)數(shù)據(jù)相對于原始共享內(nèi)存頭部的偏移地址及分包的大小。接收發(fā)送內(nèi)存通知的進程只需定義發(fā)送內(nèi)存通知信號及對應(yīng)信號處理函數(shù)(即槽函數(shù))就能收到并處理內(nèi)存數(shù)據(jù),收到的內(nèi)存數(shù)據(jù)根據(jù)偏移地址和大小,可以直接覆蓋本機的共享內(nèi)存中對應(yīng)部分的數(shù)據(jù),實現(xiàn)內(nèi)存的同步[14]。
4.5 機器間發(fā)送操作數(shù)據(jù)包實現(xiàn)
機器間發(fā)送操作數(shù)據(jù)包,采用Qt的QUdpSocket技術(shù)封裝并提供類對象,可以實現(xiàn)不同機器間操作數(shù)據(jù)包的發(fā)送。待發(fā)送操作數(shù)據(jù)包的進程調(diào)用類對象的發(fā)送操作數(shù)據(jù)接口函數(shù)來發(fā)送操作數(shù)據(jù)包。網(wǎng)絡(luò)上接收計算機上的進程只需定義接收操作數(shù)據(jù)的信號及該信號對應(yīng)的信號處理函數(shù)即槽函數(shù),即可收到并處理操作數(shù)據(jù)包。模擬量的畫面下發(fā)操作的數(shù)據(jù)包和數(shù)字量的置數(shù)操作的數(shù)據(jù)包采用不同的結(jié)構(gòu)[15-16]。
其中包類型可以用于讓通信模塊識別來決定放到輸入接口隊列還是輸出接口隊列,數(shù)字量操作隊列有兩種:即畫面數(shù)字量操作包類型和非畫面數(shù)字量操作包類型,非畫面數(shù)字量操作包類型指的是人工置數(shù)數(shù)字量點。畫面操作包需要為之做輸出型數(shù)字量清零處理,非畫面操作包不能清零。這兩個數(shù)據(jù)包由操作員所在的操作員站寫入,但是時間標簽由歷史站主站打包數(shù)據(jù)時寫入,過程如圖3所示。
5 結(jié)論
本文主要介紹了基于國產(chǎn)PLC、支持跨平臺的上位機監(jiān)控軟件系統(tǒng)中數(shù)據(jù)通信的實現(xiàn)方法。在實驗中對系統(tǒng)進行模塊拆分,并應(yīng)用對每個模塊提出的新方法,實現(xiàn)了跨平臺的上位機數(shù)據(jù)通信。在對系統(tǒng)進行的長時段高負荷的運行驗證中,整個通信網(wǎng)絡(luò)表現(xiàn)出較強的穩(wěn)定性、實時性和可靠性。
參考文獻
[1] 王雪艷.基于PLC和工控機的監(jiān)控系統(tǒng)設(shè)計[J].煤炭技術(shù),2012,31(1):63-64.
[2] 韓令斗,趙亮,張栗,等.基于PLC重鋪機組遠程監(jiān)控系統(tǒng)的設(shè)計和實現(xiàn)[J].物聯(lián)網(wǎng)技術(shù),2017,7(2):92-94.
[3] 高雪蓮,張國平,林光源,等.基于以太網(wǎng)的智能庫房監(jiān)控系統(tǒng)上位機設(shè)計[J].電氣自動化,2017,7(2):92-94.
[4] 蔡桂龍,劉海燕,李勇.GPRS網(wǎng)絡(luò)通信與配變遠程監(jiān)控系統(tǒng)[J].電力需求側(cè)管理,2017(1):92-94,112.
[5] 張濤,陳志軍.第三方軟件與監(jiān)控系統(tǒng)遠程數(shù)據(jù)交互的應(yīng)用[J].自動化儀表,2005,7(5):52-55.
[6] 徐忠.地鐵綜合監(jiān)控系統(tǒng)中的數(shù)據(jù)交互共享方案研究[J].信息安全與技術(shù),2012(3):79-81.
[7] 廖備水.流域梯級電站多監(jiān)控系統(tǒng)數(shù)據(jù)交互模型的研究[D].西安:西安理工大學(xué),2003.
[8] 蔣俊俊.基于信息智能聯(lián)盟的監(jiān)控實時數(shù)據(jù)交互研究[D].南昌:華東交通大學(xué),2015.
[9] 趙丹丹.無人駕駛智能車遠程監(jiān)控系統(tǒng)[D].西安:西安工業(yè)大學(xué),2014.
[10] 任???基于無線網(wǎng)絡(luò)通信的視頻監(jiān)控系統(tǒng)終端數(shù)據(jù)業(yè)務(wù)軟件設(shè)計[D].杭州:浙江大學(xué),2013.
[11] 王志曉.內(nèi)網(wǎng)中網(wǎng)絡(luò)通信行為監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[D].西安:西安電子科技大學(xué),2008.
[12] 方曉楠.基于網(wǎng)絡(luò)通信的JRU遠程監(jiān)控系統(tǒng)[D].北京:北京郵電大學(xué),2014.
[13] 李潮,員天佑.基于Modbus協(xié)議的監(jiān)控系統(tǒng)網(wǎng)絡(luò)通信的實現(xiàn)[J].微計算機信息,2010,26(34):58-59.
[14] 毛建一,陳淵睿,伍堂順.基于Modbus協(xié)議的電能監(jiān)控系統(tǒng)網(wǎng)絡(luò)通信的實現(xiàn)[J].工業(yè)控制計算機,2008,1(4):78-79.
[15] 榮建軍.基于ACE架構(gòu)的網(wǎng)站信息監(jiān)控系統(tǒng)[D].成都:電子科技大學(xué),2008.
[16] 許倫輝,鄺先驗.網(wǎng)絡(luò)通信與數(shù)據(jù)庫技術(shù)在交通監(jiān)控系統(tǒng)中的應(yīng)用研究[J].計算機與現(xiàn)代化,2005,1(12):35-38.
作者信息:
王毅璇,豐大軍,王 皓,張曉莉
(華北計算機系統(tǒng)工程研究所,北京100083)