Modbus TCP/IP直觀上看它還是Modbus協議,這個沒錯,Modbus TCP/IP是Modbus協議的變體,將Modbus協議運行在了TCP/IP網絡上,連接端口是502,不需要校驗和計算,因為數據校驗在低層進行了;還有幾種協議Modbus over TCP,Modbus over TCP/IP還有Modbus RTU/IP,這三種也是Modbus的變體,但是和Modbus TCP/IP協議最大的區別就是帶有了Modbus RTU的檢驗和。
目前也有很多人在研究Modbus UDP/IP,這和Modbus TCP/IP最大的區別在于可以提高實時性和通信效率。因為UDP是無連接協議,比TCP節約了大量網絡時間,但是可靠性和安全性不能保證。

下面昌暉儀表通過一段報文來解讀Modbus TCP/IP,從OSI七層模型物理層到應用層。

上圖我們可以清晰看到Modbus TCP/IP使用了OSI的物理層,數據鏈路層,網絡層,傳輸層以及應用層。
1、物理層
Frame物理層的數據幀概況,線路307個字節,實際捕獲307個字節

◆物理介質:以太網卡
◆傳輸介質:雙絞線,同軸電纜,光纖
◆封裝類型:Ethernet(1)
◆物理接口:RJ45
◆幀編號:1176
◆幀長度:307字節
2、數據鏈路層
Ethernet II協議,以太網幀頭信息(14個字節)

網卡MAC地址:
◆目的MAC:00:15:5d:07:b4:0a
◆源MAC:a8:74:1d:c7:16:5d
◆類型:IPv4
3、網絡層
IP協議IP包頭信息(20個字節)

◆版本:IPv4
◆協議類型:TCP
◆源IP地址:172.18.32.32
◆目的IP地址:172.18.31.72
4、傳輸層:
TCP協議數據段的頭信息(20個字節)

◆源端口:502
◆目的端口:57298
◆序列號:4197
◆確認號:241
◆PDU長度:253
5、應用層
MBAP,Modbus應用層的信息(253個字節)

◆MBAP:(7個字節)
◆MABP 由四部分構成:
◆事務識別號:9522
◆協議識別號:0
◆長度:247
◆設備識別號:255
詳細說明如下:

關于設備識別號,對于Modbus TCP/IP協議該項默認255,但是如果該協議為Modbus Plus或者Modbus RTU等串口協議,通過串口服務器等轉換設備轉換后變為了Modbus RTU over TCP,則該項為Modbus串口從站的設備地址。

Modbus:(246個字節)
在應用層Modbus的響應報文:
◆第一個字節:功能碼
◆第二個字節:后面的長度
◆第三個字節:請求數據的第一個寄存器的值。上圖即顯示的40001-40024的值;由上圖也能看出40003的當前值為38.86
綜上內容一條完整modbus TCP/IP報文的構成如下:

①以太網頭(14字節)
◆目的MAC地址(6字節)
◆源MAC地址(6字節)
◆類型(2字節)0x0800為IPv4
②IP包頭(20字節)

③數據段(20字節)

后面即為Modbus TCP/IP部分信息;
④Modbus TCP/IP數據結構
Modbus TCP/IP為CS架構,Client不斷的像Server發出請求,Server端被動響應提供數據或者被寫入。讀寫的數據結構和Modbus RTU是一樣的,常見的如下四種:

根據以上四種數據類型,可以引申出常見的8個功能碼:
FC1:讀取線圈的狀態
FC5:單個寫入線圈
FC2:讀取開關量輸入的狀態
FC15:連續寫入一組線圈
FC3:讀取保持寄存器的值
FC6:單個寫保持寄存器
FC4:讀取模擬量輸入寄存器的值
FC16:連續寫保持寄存器
但是實際上Modbus協議的功能碼遠不止如下8個;比如FC20和FC21就是對文件記錄的操作,其中FC20是讀取文件記錄,FC21是對文件進行寫操作。
6、Modbus TCP/IP Client/Server模型

Modbus TCP/IP工作過程
①客戶端在網絡上發出消息請求,將任務進行初始化
②請求信息被服務端接收到
③服務端發送一個響應消息
④客戶端確認收到服務端的響應信息
7、Modbus TCP/IP和Modbus RTU ADU的區別
Modbus RTU ADU:

Modbus TCP/IP ADU:

其中兩點區別:
①Modbus TCP/IP ADU沒有了CRC校驗
②Modbus TCP/IP ADU從站地址(1個字節)變為了MBAP Header(七個字節)
最后給大家附上Modbus錯誤代碼
錯誤代碼【01】
說明:非法功能。對于服務器(或從站)來說,詢問中接收到的功能碼是不可允許的操作,可能是因為功能碼僅適用于新設備而被選單元中不可實現同時,還指出服務器(或從站)在錯誤狀態中處理這種請求,例如:它是未配置的,且要求返回寄存器值。
錯誤代碼【02】
說明:非法數據地址。對于服務器(或從站)來說,詢問中接收的數據地址是不可允許的地址,特別是參考號和傳輸長度的組合是無效的。對于帶有100個寄存器的控制器來說,偏移量96和長度4的請求會成功,而偏移量96和長度5的請求將產生異常碼02。
錯誤代碼【03】
說明:非法數據值。對于服務器(或從站)來說,詢問中包括的值是不可允許的值。該值指示了組合請求剩余結構中的故障。例如:隱含長度是不正確的。modbus協議不知道任何特殊寄存器的任何特殊值的重要意義,寄存器中被提交存儲的數據項有一個應用程序期望之外的值。
錯誤代碼【04】
說明:從站設備故障。當服務器(或從站)正在設法執行請求的操作時,產生不可重新獲得的差錯。
錯誤代碼【05】
說明:確認。與編程命令一起使用,服務器(或從站)已經接受請求,并且正在處理這個請求,但是需要長持續時間進行這些操作,返回這個響應防止在客戶機(或主站)中發生超時錯誤,客戶機(或主機)可以繼續發送輪詢程序完成報文來確認是否完成處理。
錯誤代碼【06】
說明:從屬設備忙。與編程命令一起使用。服務器(或從站)正在處理長持續時間的程序命令。張服務器(或從站)空閑時,用戶(或主站)應該稍后重新傳輸報文。
錯誤代碼【08】
說明:存儲奇偶差錯。與功能碼20和21以及參考類型6一起使用,指示擴展文件區不能通過一致性校驗。服務器(或從站)設法讀取記錄文件,但是在存儲器中發現一個奇偶校驗錯誤。客戶機(或主方)可以重新發送請求,但可以在服務器(或從站)設備上要求服務。
錯誤代碼【10】
說明:不可用網關路徑。與網關一起使用,指示網關不能為處理請求分配輸入端口至輸出端口的內部通信路徑。通常意味著網關是錯誤配置的或過載的。
錯誤代碼【11】
說明:網關目標設備響應失敗。與網關一起使用,指示沒有從目標設備中獲得響應。通常意味著設備未在網絡中。
作者:曹俊義
相關閱讀
◆深入了解Modbus TCP協議
◆走進工業以太網協議Modbus TCP