Modbus TCP/IP直觀上看它還是Modbus協(xié)議,這個(gè)沒(méi)錯(cuò),Modbus TCP/IP是Modbus協(xié)議的變體,將Modbus協(xié)議運(yùn)行在了TCP/IP網(wǎng)絡(luò)上,連接端口是502,不需要校驗(yàn)和計(jì)算,因?yàn)閿?shù)據(jù)校驗(yàn)在低層進(jìn)行了;還有幾種協(xié)議Modbus over TCP,Modbus over TCP/IP還有Modbus RTU/IP,這三種也是Modbus的變體,但是和Modbus TCP/IP協(xié)議最大的區(qū)別就是帶有了Modbus RTU的檢驗(yàn)和。
目前也有很多人在研究Modbus UDP/IP,這和Modbus TCP/IP最大的區(qū)別在于可以提高實(shí)時(shí)性和通信效率。因?yàn)閁DP是無(wú)連接協(xié)議,比TCP節(jié)約了大量網(wǎng)絡(luò)時(shí)間,但是可靠性和安全性不能保證。

下面昌暉儀表通過(guò)一段報(bào)文來(lái)解讀Modbus TCP/IP,從OSI七層模型物理層到應(yīng)用層。

上圖我們可以清晰看到Modbus TCP/IP使用了OSI的物理層,數(shù)據(jù)鏈路層,網(wǎng)絡(luò)層,傳輸層以及應(yīng)用層。
1、物理層
Frame物理層的數(shù)據(jù)幀概況,線(xiàn)路307個(gè)字節(jié),實(shí)際捕獲307個(gè)字節(jié)

◆物理介質(zhì):以太網(wǎng)卡
◆傳輸介質(zhì):雙絞線(xiàn),同軸電纜,光纖
◆封裝類(lèi)型:Ethernet(1)
◆物理接口:RJ45
◆幀編號(hào):1176
◆幀長(zhǎng)度:307字節(jié)
2、數(shù)據(jù)鏈路層
Ethernet II協(xié)議,以太網(wǎng)幀頭信息(14個(gè)字節(jié))

網(wǎng)卡MAC地址:
◆目的MAC:00:15:5d:07:b4:0a
◆源MAC:a8:74:1d:c7:16:5d
◆類(lèi)型:IPv4
3、網(wǎng)絡(luò)層
IP協(xié)議IP包頭信息(20個(gè)字節(jié))

◆版本:IPv4
◆協(xié)議類(lèi)型:TCP
◆源IP地址:172.18.32.32
◆目的IP地址:172.18.31.72
4、傳輸層:
TCP協(xié)議數(shù)據(jù)段的頭信息(20個(gè)字節(jié))

◆源端口:502
◆目的端口:57298
◆序列號(hào):4197
◆確認(rèn)號(hào):241
◆PDU長(zhǎng)度:253
5、應(yīng)用層
MBAP,Modbus應(yīng)用層的信息(253個(gè)字節(jié))

◆MBAP:(7個(gè)字節(jié))
◆MABP 由四部分構(gòu)成:
◆事務(wù)識(shí)別號(hào):9522
◆協(xié)議識(shí)別號(hào):0
◆長(zhǎng)度:247
◆設(shè)備識(shí)別號(hào):255
詳細(xì)說(shuō)明如下:

關(guān)于設(shè)備識(shí)別號(hào),對(duì)于Modbus TCP/IP協(xié)議該項(xiàng)默認(rèn)255,但是如果該協(xié)議為Modbus Plus或者M(jìn)odbus RTU等串口協(xié)議,通過(guò)串口服務(wù)器等轉(zhuǎn)換設(shè)備轉(zhuǎn)換后變?yōu)榱薓odbus RTU over TCP,則該項(xiàng)為Modbus串口從站的設(shè)備地址。

Modbus:(246個(gè)字節(jié))
在應(yīng)用層Modbus的響應(yīng)報(bào)文:
◆第一個(gè)字節(jié):功能碼
◆第二個(gè)字節(jié):后面的長(zhǎng)度
◆第三個(gè)字節(jié):請(qǐng)求數(shù)據(jù)的第一個(gè)寄存器的值。上圖即顯示的40001-40024的值;由上圖也能看出40003的當(dāng)前值為38.86
綜上內(nèi)容一條完整modbus TCP/IP報(bào)文的構(gòu)成如下:

①以太網(wǎng)頭(14字節(jié))
◆目的MAC地址(6字節(jié))
◆源MAC地址(6字節(jié))
◆類(lèi)型(2字節(jié))0x0800為IPv4
②IP包頭(20字節(jié))

③數(shù)據(jù)段(20字節(jié))

后面即為Modbus TCP/IP部分信息;
④Modbus TCP/IP數(shù)據(jù)結(jié)構(gòu)
Modbus TCP/IP為CS架構(gòu),Client不斷的像Server發(fā)出請(qǐng)求,Server端被動(dòng)響應(yīng)提供數(shù)據(jù)或者被寫(xiě)入。讀寫(xiě)的數(shù)據(jù)結(jié)構(gòu)和Modbus RTU是一樣的,常見(jiàn)的如下四種:

根據(jù)以上四種數(shù)據(jù)類(lèi)型,可以引申出常見(jiàn)的8個(gè)功能碼:
FC1:讀取線(xiàn)圈的狀態(tài)
FC5:?jiǎn)蝹€(gè)寫(xiě)入線(xiàn)圈
FC2:讀取開(kāi)關(guān)量輸入的狀態(tài)
FC15:連續(xù)寫(xiě)入一組線(xiàn)圈
FC3:讀取保持寄存器的值
FC6:?jiǎn)蝹€(gè)寫(xiě)保持寄存器
FC4:讀取模擬量輸入寄存器的值
FC16:連續(xù)寫(xiě)保持寄存器
但是實(shí)際上Modbus協(xié)議的功能碼遠(yuǎn)不止如下8個(gè);比如FC20和FC21就是對(duì)文件記錄的操作,其中FC20是讀取文件記錄,F(xiàn)C21是對(duì)文件進(jìn)行寫(xiě)操作。
6、Modbus TCP/IP Client/Server模型

Modbus TCP/IP工作過(guò)程
①客戶(hù)端在網(wǎng)絡(luò)上發(fā)出消息請(qǐng)求,將任務(wù)進(jìn)行初始化
②請(qǐng)求信息被服務(wù)端接收到
③服務(wù)端發(fā)送一個(gè)響應(yīng)消息
④客戶(hù)端確認(rèn)收到服務(wù)端的響應(yīng)信息
7、Modbus TCP/IP和Modbus RTU ADU的區(qū)別
Modbus RTU ADU:

Modbus TCP/IP ADU:

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