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