柳 青
(北京電子科技職業學院, 北京 100176)
隨著工業物聯網、制造智能化進程的推進,嵌入式設備之間能夠實現簡單、 可靠的通信成為自動化領域的實際需要。 Modbus/TCP 將Modbus 協議嵌入到TCP 協議的應用層,由于其具有開放的、標準的協議格式,廣泛應用于工業通信。 而TCP/IP 協議結構龐大,嵌入式系統的存儲計算資源有限,因此研究Modbus/TCP 在嵌入式系統上的設計方法很有必要。
渠薇等設計了基于W5500 的Modbus/TCP 服務器[1],這種方案需要采用專用的協議芯片完成TCP/IP 協議解析,不僅使電路設計復雜,而且受限于外圍芯片與處理器的通信帶寬,會影響系統的整體性能。劉大千等提出了一種μC / OS 實時操作系統、LWIP 輕型協議棧和MODBUS協議相結合的方法[2],這種方案需要對操作系統和協議棧進行移植,軟件代碼量較大,對系統的維護升級提出很大挑戰。 綜合以上研究,設計了一種直接運行于微處理器上的,精簡的Modbus/TCP 協議棧,避免了設計專用電路和代碼移植的工作,同時能夠改善通信的實時性能。
Modbus/TCP 協議底層以TCP/IP 協議為基礎,在桌面系統中,該協議由操作系統提供的套接字接口來實現,但是在嵌入式系統中,芯片驅動只包含最底層的以太網接收、發送數據的功能, 所以需要構建TCP/IP協議。 另外,由于以太網數據包中必須包含硬件MAC 地址,所以需要實現ARP 協議[3]。
設計的協議棧整體流程如圖1 所示, 處理器不斷從網卡讀取數據包, 然后判斷該數據包是ARP 數據還是IP 數據,如果是ARP 數據,則對該數據包進行地址解析;如果是IP 數據包,進一步判斷是否是TCP 數據包,最后判斷是不是Modbus 協議數據,如果全部成立則進行Modbus 協議解析。

圖1 Modbus/TCP 協議棧流程
TCP 協議是面向連接的協議,在數據通信之前,必須要建立連接,否則通信的雙方不能交換數據;在通信結束之前也必須關閉連接,以便節省系統資源,并且保證下次通信連接能夠正確建立。 建立連接的過程稱為 “三次握手”,關閉連接的過程稱為“四次揮手”[4]。通過判斷TCP 協議中的控制字字段來判斷該報文是請求連接報文還是關閉連接報文。
在TCP 協議解析中,會對SYN 標志位和FIN 標志位依次進行判斷。如果數據包的SYN 位為1,則表示該數據包為請求連接數據包,協議棧將返回ACK 應答包,通知客戶端本機已經準備好接收數據, 客戶端收到收到應答包后則通信連接完全建立,可以開始數據交換。 如果FIN標志位為1,則表示該數據包為關閉連接數據包,協議棧等待發送緩沖區為空時,返回ACK 應答包,通知服務器可以斷開連接,服務器收到應打包后,斷開連接,數據交換終止。 TCP 協議解析代碼如下所示:


Modbus/TCP 是以標準modbus 作為用戶層協議,modbus 協議報文格式如下[5]:

首先計算寄存器的其實地址,由于Modbus 的數據順序與內存存儲順序相反,因此地址的計算需要移位操作,然后用同樣的方法計算寄存器數量。 根據寄存器地址和數量可以計算出數據塊在內存中的存儲地址以及長度,將內存數據復制到數據包中,作為返回數據。最后再將實際讀取的數據長度更新到協議中的長度字段中, 作為數據包長度返回到客戶端。 第106 個數據包和第107 個數據包是一對Moubus/TCP 請求應答數據,可以看出從請求到應答的時間間隔僅有132μs, 說明該協議棧具有一定的實時性。
客戶端第一次向服務器請求連接或者數據的時候,客戶端只知道服務器的IP 地址,并不知道客戶端的網卡設備硬件地址, 因此主機需要將詢問硬件地址的報文廣播到網絡上,具有匹配的IP 地址的服務器會將自己的網卡地址添加到返回數據包中發送回客戶端, 客戶端就得到了對應服務器的網卡地址, 這個協議稱為地址解析協議(arp),地址解析協議的數據類型字段為0x0608,當程序檢查出數據包具有該種類型是, 則跳轉至地址解析函數中。 地址解析協議源碼如下:

首先判斷該數據包的Message Type 字段是不是類型1,類型1 代表該數據包為地址請求操作,進而判斷該數據包的目的IP 地址是否與本地IP 地址一致, 如果一致則說明該數據包即為請求本地IP 的網卡地址,本地機需要對該數據包進行相應。此時協議棧需要組裝響應報文,將報文的Messege Type 字段設置為類型2, 表示返回數據包為ARP 響應包;之后將源IP 和源MAC 地址均設置為本地地址,目標地址則利用請求包中的源地址。
為了驗證所設計的modbus/TCP 協議棧的正確性,搭建了如圖2 所示的通信實驗平臺。 其中嵌入式板卡以xilinx 的zynq-7020 為 處 理器, 其上運行了設計的協議棧,IP 設置為192.168.1.9。筆記本電腦上運行測試程序,IP 設置為192.168.1.1, 并采用Wireshark 軟件進行抓包,抓取的數據包如圖3 所示。
從圖3 中可以看出, 第101 個數據包為計算機發出的ARP 請求包, 詢問IP 地址為192.168.1.9 的主機的MAC 地址, 第102 個數據包是板卡返回的ARP 應答包,報告了板卡的地址信息。 第103 個數據包為計算機發出的TCP 建立連接請求, 第104 個數據包為板卡返回的請求應當, 第105 個數據包為計算機對應答的確認, 至此TCP 連接建立完成。 從第105 個數據包開始,計算機和板卡開始利用Modbus/TCP 協議進行數據交互。

圖2 Modbus/TCP 通信實驗平臺

圖3 Wireshark 抓包數據
通過詳細分析TCP/IP 協議和Modbus 協議規范,并在此基礎上設計了Modbus/TCP 協議棧,實現了ARP 地址解析協議,最后將設計的協議棧代碼在xilinx 微處理器上運行,與計算機進行通信實驗。 實驗表明,協議棧能夠與計算機進行數據交換,應答時間小于1ms,實時性較好。