汪欽臣,方益民
(江南大學(xué)物聯(lián)網(wǎng)工程學(xué)院,江蘇無錫 214122)
工業(yè)以太網(wǎng)作為一種高效的局域網(wǎng)絡(luò)是現(xiàn)代工廠信息化的基礎(chǔ),也是工業(yè)4.0的核心。目前工業(yè)以太網(wǎng)標準種類繁多,大多數(shù)工業(yè)以太網(wǎng)標準需要專用的集成電路實現(xiàn),實現(xiàn)成本較高,如PROFINET、EtherCAT等[1]。Modbus作為一種應(yīng)用于工業(yè)現(xiàn)場總線的通信協(xié)議,具有無版權(quán)要求、易于維護等優(yōu)點被廣泛接受。將UDP協(xié)議作為傳輸層協(xié)議應(yīng)用于Modbus通信[2],減少TCP協(xié)議數(shù)據(jù)傳輸過程中的3次連接握手等不必要的時間開銷,優(yōu)化應(yīng)用層通信程序,提升Modbus通訊的實時性。本文基于Modbus UDP通訊設(shè)計,介紹了一種工業(yè)遠程實時主從通信設(shè)計方案,并對設(shè)計有關(guān)技術(shù)參數(shù)進行了實驗驗證。
Modbus TCP由MBAP報文頭、功能碼和地址/長度/數(shù)據(jù)組成,MBAP報文頭包含有事務(wù)元標識符、協(xié)議標識符、長度、單元標識符[1],與Modbus RTU相比,RTU的地址碼由IP取代,CRC功能由TCP/IP和鏈路層(以太網(wǎng))校驗和機制取代。Modbus UDP相比Modbus TCP缺少對應(yīng)的校驗機制,因此保留了RTU的CRC校驗,Modbus RTU/TCP/UDP報文格式如圖1所示。
圖1 Modbus報文格式
Modbus串行連接時通訊速率一般不超過115.2 kbit/s,按8數(shù)據(jù)位、1停止位發(fā)送長度為256個字節(jié)的報文,每s最多發(fā)送約50幀,且串行連接方式傳輸速率受通訊距離影響較大,因此Modbus RTU不適合實時性要求高的遠距離通訊;以太網(wǎng)連接方式的Modbus TCP通訊速度可運行在100M/1000M等速率下,傳輸速率相比串行方式顯著提高,根據(jù)現(xiàn)場調(diào)試經(jīng)驗:采用Modbus RTU通訊方式的PC主站(Windows系統(tǒng))與工業(yè)現(xiàn)場從站設(shè)備完成一次讀寫最短時間T大概在40~60 ms; 采用Modbus TCP通訊的一次讀寫最短時間T在15~30 ms。當(dāng)網(wǎng)絡(luò)中有n個從站時,主站對各個從站進行輪詢遍歷讀寫控制的時間約為n·T,實時性較差。
Modbus TCP在傳遞數(shù)據(jù)之前會有3次握手來建立連接[1],在數(shù)據(jù)傳遞時有確認、重傳、擁塞控制等復(fù)雜的機制來確保數(shù)據(jù)的可靠穩(wěn)定,因此傳輸效率低,同時還存在占用系統(tǒng)較多的資源,不適合高速數(shù)據(jù)傳輸。UDP協(xié)議是一個無狀態(tài)的傳輸協(xié)議,沒有TCP那些可靠的機制,傳輸速率快,如ProfiNet、Powerlink等工業(yè)實時以太網(wǎng)通訊均基于UDP協(xié)議傳輸數(shù)據(jù)。將UDP作為傳輸層協(xié)議的Modbus UDP用于工業(yè)以太網(wǎng)通訊,有利于通訊實時性的提高,而UDP是一種不可靠傳輸,主要存在報文過長和數(shù)據(jù)集中傳送超過帶寬時容易出現(xiàn)丟包、丟包缺少數(shù)據(jù)重傳等問題,要實現(xiàn)工業(yè)應(yīng)用中穩(wěn)定可靠的傳輸,可以通過應(yīng)用層協(xié)議進行解決。
(1)數(shù)據(jù)長度。以太網(wǎng)數(shù)據(jù)幀的長度不能超過1 500字節(jié),發(fā)送方IP層會將數(shù)據(jù)報進行分片傳輸,Internet上的標準MTU值為576字節(jié),而Modbus TCP的ADU最大長度為256個字節(jié)(包含ADU 249個字節(jié),MBAP長度7個字節(jié)),Modbus UDP的ADU最大長度采用256個字節(jié),不到MTU的一半,Modbus UDP在網(wǎng)絡(luò)傳輸中將不會被分片傳輸,有利于減小數(shù)據(jù)丟包概率,提高通訊的可靠性和穩(wěn)定性。
(2)數(shù)據(jù)集中傳送。Modbus UDP采用嚴格的請求/應(yīng)答模式,上位機通過對各個從站進行輪詢讀寫,數(shù)據(jù)錯時傳輸,因此不存在數(shù)據(jù)集中蜂窩傳輸?shù)那闆r。
(3)丟包重傳。上位機發(fā)送的寫入命令在規(guī)定時間內(nèi)沒有收到從站的上行報文,將對該寫入命令進行重新發(fā)送,防止對從站寫入的數(shù)據(jù)丟失。將TCP協(xié)議中的重傳機制在高運算速度的PC端進行實現(xiàn),簡化通訊協(xié)議,提高通訊速度。
另外,通過主站和從站程序開啟UDP發(fā)送數(shù)據(jù)校驗和功能[3],有助于提高通訊的可靠性。綜上,Modbus UDP可以實現(xiàn)可靠傳輸。
系統(tǒng)以PC作為Modbus主站,主站程序基于VS2013開發(fā)環(huán)境采用C#開發(fā),PC主站在Windows平臺下可以設(shè)計制作出友好的人機交互軟件,同時還有豐富的各類工具軟件和各類函數(shù)庫開發(fā)資源,顯著降低了系統(tǒng)開發(fā)周期和系統(tǒng)維護成本。主站與多個從站通過網(wǎng)絡(luò)連接,主站通過遍歷每一個遠程從站,實現(xiàn)對從站的控制。在工業(yè)遠程控制系統(tǒng)中,主站實時讀取從站的狀態(tài)信息,當(dāng)連續(xù)多次獲取從站數(shù)據(jù)失敗,表明主站同該從站斷開了連接。系統(tǒng)結(jié)構(gòu)圖如圖2所示。
圖2 系統(tǒng)結(jié)構(gòu)圖
Modbus UDP遠程從站主控芯片采用基于Cortex M7內(nèi)核的STM32F767控制器,該處理器采用6級流水線,最高運行頻率為216 MHz,自帶雙精度浮點單元,具有豐富的外設(shè)接口。在STM32F765上自帶以太網(wǎng)模塊,該模塊包括帶有專用DMA控制器的MAC 802.3控制器,通過配置相關(guān)寄存器即可設(shè)置MAC控制器和DMA控制器工作模式和功能[4]。系統(tǒng)選用低功耗的10/100M全雙工通訊LAN8720A作為外部PHY芯片,通過LAN8720A的MII接口與STM32F767控制器的MAC接口連接,實現(xiàn)以太網(wǎng)數(shù)據(jù)鏈路層的數(shù)據(jù)傳輸,如圖3所示。
圖3 從站硬件結(jié)構(gòu)示意圖
Windows是基于消息機制的非實時操作系統(tǒng),不能得到穩(wěn)定的精密定時中斷,通過調(diào)用Windows的Api函數(shù)settimer得到的最小定時中斷時間一般為40~70 ms(由計算機性能和運行狀況決定),要實現(xiàn)定時20 ms以內(nèi)的定時,主要有以下方法:
(1)通過阻塞線程,實現(xiàn)定時。該方法使用一個線程一直占用CPU資源,效率太低,并且定時精度隨系統(tǒng)軟件運行狀況波動較大。
(2)采用多媒體定時器實現(xiàn)ms精度的定時,該方法是由一個獨立的線程通過預(yù)置回調(diào)函數(shù)實現(xiàn)的高精度定時器,可以實現(xiàn)精度為1 ms定時中斷。
本方案選用上述第二種方法,基于VS2013開發(fā)環(huán)境采用C#開發(fā)的WPF應(yīng)用程序作為主站,主站Modbus通訊程序設(shè)計思路如下:
(1)程序使用多媒體定時器作為通訊的基準時鐘,在使用多媒體定時器時需要引用有關(guān)dll。通過設(shè)置多媒體定時器周期調(diào)用時間5 ms,當(dāng)距上一次發(fā)送時間T大于10 ms時,產(chǎn)生超時事件。
(2)創(chuàng)建Modbus UDP發(fā)送線程,采用事件觸發(fā)的方式調(diào)用Modbus UDP發(fā)送命令,當(dāng)對從站有寫入命令,即發(fā)送隊列不為空時,執(zhí)行寫入命令;當(dāng)發(fā)送隊列為空時,執(zhí)行固定的讀取命令,用于獲取設(shè)備的運行數(shù)據(jù)和連接狀態(tài);發(fā)送完成后,計數(shù)器T開始計時。
(3)創(chuàng)建Modbus UDP接收線程,接收到UDP報文后,首先進行CRC校驗,校驗成功后執(zhí)行接收報文數(shù)據(jù)的對應(yīng)操作,對于寫入命令除了發(fā)送上行數(shù)據(jù)幀之外,同時刪除發(fā)送隊列中對應(yīng)的寫命令,產(chǎn)生接收完成事件,觸發(fā)發(fā)送線程執(zhí)行。主站Modbus UDP通訊線程及程序流程圖如圖4所示。
圖4 主站Modbus通訊流程圖
分布式控制系統(tǒng)往往需要執(zhí)行不間斷的設(shè)備狀態(tài)獲取,為了提高通訊效率,可以將需要獲取從站狀態(tài)信息放置在連續(xù)的寄存器上方便一次讀取,提高實時性。
FreeRTOS是一個實時多任務(wù)操作系統(tǒng),包括任務(wù)管理、消息隊列、信號量、時間管理、軟件定時器等功能,具有完全免費、源碼公開、可移植等優(yōu)點,基本滿足較小型嵌入式系統(tǒng)的開發(fā)需要,應(yīng)用十分廣泛[5]。遠程控制從站基于輕量級嵌入式操作系統(tǒng)FreeRTOS開發(fā),縮短嵌入式軟件開發(fā)時間,有效地利用CPU的資源,從而確保程序任務(wù)的實時性和可靠性。Modbus UDP是基于UDP協(xié)議的一種應(yīng)用層協(xié)議,FreeRTOS并不包含UDP協(xié)議和Modbus UDP協(xié)議,因此要在FreeRTOS系統(tǒng)上實現(xiàn)Modbus UDP協(xié)議,首先移值UDP協(xié)議。LwIP協(xié)議棧是一個小型開源的TCP/IP協(xié)議棧[6],同時支持UDP協(xié)議,適用于資源有限的小型平臺,例如嵌入式系統(tǒng)。在FreeRTOS系統(tǒng)上移值LwIP協(xié)議棧,在UDP協(xié)議的基礎(chǔ)上實現(xiàn)Modbus協(xié)議,Modbus UDP移植如圖5所示[7]。
圖5 Modbus UDP移植開發(fā)示意圖
遠程從站作為Modbus UDP客戶端,從站程序需要開啟一個單獨的任務(wù)對UDP端口進行監(jiān)控,任務(wù)優(yōu)先級為2,當(dāng)接收到外部的命令后首先進行CRC校驗,對校驗正確的數(shù)據(jù)幀按照Modbus UDP協(xié)議進行回復(fù),通訊任務(wù)流程圖如圖6所示。
圖6 從站Modbus通訊流程圖
選用處理器Inter i5-7300HQ,主頻為2.5 GHz,內(nèi)存為8 GB的筆記本電腦運行主站控制程序,與一個從站直接相連,主站實時獲取從站100個字數(shù)據(jù),其中第一個字數(shù)據(jù)的值為隨時間變化的三角波函數(shù),主站獲取從站數(shù)據(jù)并顯示,如圖7所示,三角波不失真,證明通訊穩(wěn)定。
圖7 主站運行界面
通過wireshark(V3.0.1)監(jiān)控運行過程中一段時間內(nèi)的數(shù)據(jù)包,如圖8所示,wireshark能夠自動識別通訊協(xié)議為Modbus UDP,監(jiān)控通訊時間為100.950 5 s,共獲取685 133個數(shù)據(jù)包,即每s完成3 393.4次通訊,主站平均讀寫周期為0.294 7 ms。
Modbus UDP除了具備Modbus TCP的易于擴展、方便與企業(yè)EMS等信息化系統(tǒng)連接的優(yōu)點外,還具有更好的實時通訊能力。針對當(dāng)前自動化廠商對分布式遠程控制模塊越來越高的實時性通訊要求,本文設(shè)計一套基于Modbus UDP的實時通信系統(tǒng),主站、從站采用多線程(或多任務(wù))進行開發(fā),優(yōu)化通信流程,以事件的方式觸發(fā)Modbus 報文的發(fā)送和接收,從而提高了通訊效率。實驗結(jié)果表明,PC主站與從站平均通信周期約0.3 ms,較常規(guī)Modbus RTU和Modbus TCP方式有較大提高,能滿足系統(tǒng)響應(yīng)要求較高的工業(yè)應(yīng)用場合。
圖8 數(shù)據(jù)包分析