ModbusTCP協(xié)議報(bào)文解析
報(bào)文格式
交互(通信)標(biāo)識(shí):2個(gè)字節(jié) 為此次通信事務(wù)處理標(biāo)識(shí)符,一般每次通信之后將被要求加1以區(qū)別不同的通信數(shù)據(jù)報(bào)文。
協(xié)議標(biāo)識(shí):2個(gè)字節(jié) 表示該條指令遵循ModbusTCP協(xié)議,一般都為00 00
報(bào)文長(zhǎng)度:2個(gè)字節(jié) 表示后面數(shù)據(jù)的長(zhǎng)度,有幾個(gè)字節(jié),高字節(jié)在前
(前六位Modbus/TCP協(xié)議不同功能碼通用)
設(shè)備標(biāo)識(shí) :1個(gè)字節(jié) 設(shè)備地址,這個(gè)可以用于局域網(wǎng)里面的具體的地址,如果目標(biāo)機(jī)器有固定ip,這個(gè)就不起作用,直接上寫(xiě)成 00
功能碼:1個(gè)字節(jié) 功能碼在modbus協(xié)議用于表示信息幀的功能
數(shù)據(jù):N個(gè)字節(jié) 后面數(shù)據(jù)根據(jù)不同功能碼不同。
modbus 常用功能代碼
十進(jìn)制 | 功能 | 數(shù)據(jù)類(lèi)型 |
---|---|---|
01 | 讀取 多個(gè)線圈 | 位 |
02 | 讀取 多個(gè)離散量輸入量 | 位 |
03 | 讀取 多個(gè)保持寄存器 | 16進(jìn)制整型 |
04 | 讀取 多個(gè)輸入寄存器 | 16進(jìn)制整型 |
05 | 寫(xiě)入 單個(gè)線圈 | 位 |
06 | 寫(xiě)入 單個(gè)寄存器 | 16進(jìn)制整型 |
15 | 寫(xiě)入 多個(gè)線圈 | 位 |
16 | 寫(xiě)入 多個(gè)寄存器 | 16進(jìn)制整型 |
功能碼詳解
01 讀取多個(gè)線圈示例報(bào)文:
請(qǐng)求:00 01 00 00 00 06 FF 01 00 01 00 10
第1,2位 00 01
交互標(biāo)識(shí)
第3,4位 00 00
協(xié)議標(biāo)識(shí)
第5,6位 00 06
后面報(bào)文長(zhǎng)度 有6位
第7位 FF 設(shè)備地址,發(fā)送什么,響應(yīng)什么
第8位 01 功能碼
第9,10位00 01
起始地址
第11,12位 00 10
查詢線圈長(zhǎng)度,查詢16位線圈
響應(yīng):00 01 00 00 00 05 FF 01 02 0A 02
前四位和7,8位同請(qǐng)求發(fā)送的報(bào)文
第5,6位是后面報(bào)文長(zhǎng)度
第9位是后面數(shù)據(jù)位的長(zhǎng)度,
第10位開(kāi)始是數(shù)據(jù)位。
01查詢線圈,每一個(gè)16進(jìn)制數(shù)據(jù)表示8位線圈
第10位0A --> 0000 1010 第二位是1,第四位是1
02 讀取多個(gè)離散量輸入同01
03 讀取 多個(gè)保持寄存器寄存器讀取與線圈的區(qū)別,響應(yīng)數(shù)據(jù),寄存器數(shù)據(jù)每?jī)蓚(gè)字節(jié)表示1位,一次請(qǐng)求不能超過(guò)127個(gè)地址
示例報(bào)文:
請(qǐng)求:00 01 00 00 00 06 01 03 00 05 00 02
第1,2位 00 01
交互標(biāo)識(shí)
第3,4位 00 00
協(xié)議標(biāo)識(shí)
第5,6位 00 06
后面報(bào)文長(zhǎng)度 有6位
第7位 01
設(shè)備地址,發(fā)送什么,響應(yīng)什么
第8位 03
功能碼
第9,10位00 05
起始地址
第11,12位 00 02
查詢寄存器長(zhǎng)度,查詢2個(gè)寄存器
響應(yīng):00 01 00 00 00 07 01 03 04 00 22 00 00
前四位(00 01 00 00
)和7,8位(01 03
)同請(qǐng)求發(fā)送的報(bào)文
第5,6位 00 07
是后面報(bào)文長(zhǎng)度
第9位 04 是后面數(shù)據(jù)位的長(zhǎng)度
第10-13位 數(shù)據(jù)位(00 22 00 00
)
同03
05 (05H)寫(xiě)入 單個(gè)線圈請(qǐng)求:00 01 00 00 00 06 FF 05 00 01 FF 00
第9,10位 00 01
寫(xiě)入線圈的地址
第11,12位 寫(xiě)入的數(shù)據(jù)值 FF 00 表示置ON/1狀態(tài) 00 00 表示置OFF/0狀態(tài)
響應(yīng):00 01 00 00 00 06 FF 05 00 01 FF 00
請(qǐng)求:00 01 00 00 00 06 FF 0F 00 05 00 0A 02 CD 01
第9,10位 00 05
寫(xiě)入的起始地址
第11,12位 00 0A
寫(xiě)入線圈數(shù)量
第13位 02
數(shù)據(jù)字節(jié)數(shù)量
第14位之后是數(shù)據(jù) 低字節(jié)在前
CD 01 —> 1100 1101 0000 0001
位 | 0C | 0B | 0A | 09 | 08 | 07 | 06 | 05 |
值 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
位 | 14 | 13 | 12 | 11 | 10 | 0F | 0E | 0D |
值 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
請(qǐng)求:00 05 00 00 00 06 FF 06 00 05 00 23
向地址為5的寄存器寫(xiě)入35。
第9,10位 00 05寫(xiě)入的起始地址
第11,12位 00 0A寫(xiě)入寄存器的值
響應(yīng):00 05 00 00 00 06 FF 06 00 05 00 23
請(qǐng)求:00 06 00 00 00 0B FF 10 00 02 00 02 04 00 21 00 2A
從地址2開(kāi)始寫(xiě)入兩個(gè)寄存器,2寄存器寫(xiě)入33,3寄存器寫(xiě)入42
第9,10位 00 02寫(xiě)入的起始地址
第11,12位 00 02寫(xiě)入寄存器的數(shù)量
第13位 04 后面數(shù)據(jù)的字節(jié)
第14-17位 數(shù)據(jù)
響應(yīng):00 06 00 00 00 06 FF 10 00 02 00 02
從地址2開(kāi)始寫(xiě)入兩個(gè)寄存器,2寄存器寫(xiě)入33,3寄存器寫(xiě)入42
第9,10位 00 02
寫(xiě)入的起始地址
第11,12位 00 02
寫(xiě)入寄存器的數(shù)量
第13位 04 后面數(shù)據(jù)的字節(jié)
第14-17位 數(shù)據(jù)
響應(yīng):00 06 00 00 0 0 06 FF 10 00 02 00 02
當(dāng)發(fā)生通訊異常時(shí),響應(yīng)前7位仍然為modbus正常協(xié)議格式,第八位響應(yīng)功能碼(請(qǐng)求功能碼+0x80),第九位異常碼。
異常數(shù)據(jù)即包含異常碼的數(shù)據(jù):
目前使用的異常碼是:01,02,03和04。
- 響應(yīng)功能碼 = 請(qǐng)求功能碼 + 0x80
- 響應(yīng)報(bào)文提供異常碼顯示出錯(cuò)原因。
常見(jiàn)異常碼含義:
異常碼 | 名稱(chēng) | 含義 |
---|---|---|
01 | 非法功能 | 對(duì)于服務(wù)器(或從站)來(lái)說(shuō),詢問(wèn)中接收到的功能碼是不可允許的操作,可能是因?yàn)楣δ艽a僅適用于新設(shè)備而被選單元中不可實(shí)現(xiàn)同時(shí),還指出服務(wù)器(或從站)在錯(cuò)誤狀態(tài)中處理這種請(qǐng)求,例如:它是未配置的,且要求返回寄存器值。 |
02 | 地址非法 | 對(duì)于服務(wù)器(或從站)來(lái)說(shuō),詢問(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。 |
03 | 數(shù)據(jù)非法 | 對(duì)于服務(wù)器(或從站)來(lái)說(shuō),詢問(wèn)中包括的值是不可允許的值。該值指示了組合請(qǐng)求剩余結(jié)構(gòu)中的故障。例如:隱含長(zhǎng)度是不正確的。modbus協(xié)議不知道任何特殊寄存器的任何特殊值的重要意義,寄存器中被提交存儲(chǔ)的數(shù)據(jù)項(xiàng)有一個(gè)應(yīng)用程序期望之外的值。 |
04 | 從站設(shè)備故障 | 當(dāng)服務(wù)器(或從站)正在設(shè)法執(zhí)行請(qǐng)求的操作時(shí),產(chǎn)生不可重新獲得的差錯(cuò)。 |
float 按IEEE-754標(biāo)準(zhǔn)協(xié)議存儲(chǔ)
C#中浮點(diǎn)數(shù)的二進(jìn)制格式遵循IEEE754標(biāo)準(zhǔn)
IEEE-754格式標(biāo)準(zhǔn):一個(gè)浮點(diǎn)數(shù)有2部分組成:底數(shù)m和指數(shù)e
IEEE-754
Modbus協(xié)議定義的寄存器地址是5位十進(jìn)制地址,即:
線圈(DO)地址:00001~09999
觸點(diǎn)(DI)地址:10001~19999
輸入寄存器(AI)地址:30001~39999
輸出寄存器(AO)地址:40001~49999
0x代表線圈(DO)類(lèi)地址,1x代表觸點(diǎn)(DI)類(lèi)地址、 3x代表輸入寄存器(AI)類(lèi)地址、4x代表輸出寄存器(AO)類(lèi)地址。
在實(shí)際編程中,前綴的區(qū)分作用(有功能碼進(jìn)行區(qū)分),所以只需說(shuō)明后4位數(shù),而且需轉(zhuǎn)換為4位十六進(jìn)制地址。
Modbus 數(shù)據(jù)地址格式是從0開(kāi)始,寄存器地址對(duì)應(yīng)報(bào)文中地址關(guān)系,x0001
對(duì)應(yīng)00 00
,示例40003
對(duì)應(yīng) 00 02
地址
以上根據(jù)開(kāi)發(fā)時(shí)查的資料和網(wǎng)上資料整理一些的有用信息,方便開(kāi)發(fā)查詢