通訊協(xié)議001——Modbus報(bào)文協(xié)議分析

Modbus協(xié)議存在用于串口、以太網(wǎng)、專用網(wǎng)絡(luò)的版本。各版本的Modbus通信協(xié)議在數(shù)據(jù)模型和功能調(diào)用上都是相同的,只有封裝方式和一些細(xì)節(jié)有所不同的。本文對(duì)Modbus RTU報(bào)文協(xié)議進(jìn)行分析。
Modbus數(shù)據(jù)幀格式如下:

1)從站地址:地址范圍1-247,響應(yīng)報(bào)文中的從站地址保持與請(qǐng)求報(bào)文的從站地址一致。
2)功能代碼:表示不同的功能。正常響應(yīng)報(bào)文中的功能代碼保持與請(qǐng)求報(bào)文的功能代碼一致,異常響應(yīng)報(bào)文的功能代碼=請(qǐng)求報(bào)文的功能代碼 + 80H。常見功能代碼如下:

3)數(shù)據(jù):請(qǐng)求報(bào)文中的數(shù)據(jù)格式根據(jù)功能代碼而定,響應(yīng)報(bào)文中的數(shù)據(jù)為返回的數(shù)據(jù)或錯(cuò)誤碼。
4)校驗(yàn)碼:2個(gè)字節(jié),用于校驗(yàn)數(shù)據(jù),RTU采用CRC校驗(yàn)碼。
?
下文采用Modbus Poll、Modbus Slave軟件(登錄網(wǎng)信智匯wangxinzhihui.com下載)對(duì)常見功能的報(bào)文進(jìn)行分析。
?1) 功能碼01H:讀讀線圈(01寄存器)。
ModbusPoll讀取01從站地址為00的線圈開始10個(gè)線圈狀態(tài)。

報(bào)文分析如下:

其中響應(yīng)報(bào)文返回的數(shù)據(jù)字節(jié)1、字節(jié)2組成的0201H,對(duì)應(yīng)的二進(jìn)制為1000000001。
?
2) 功能碼05H:寫單個(gè)線圈(01寄存器)
ModbusPoll設(shè)置01從站地址為01的線圈為ON。

報(bào)文分析如下:

其中:
???????? 線圈地址:01,高低字節(jié)分別為00、01
???????? 通斷標(biāo)志:ON對(duì)應(yīng)高低位FF00,OFF對(duì)應(yīng)0000
???????? 正常響應(yīng)報(bào)文與請(qǐng)求報(bào)文一致。
?
3)功能碼0FH:寫多個(gè)線圈(01寄存器)
ModbusPoll設(shè)置01從站地址為00的線圈開始10個(gè)線圈的狀態(tài)。

報(bào)文分析如下:

其中線圈通斷為多個(gè)線圈通斷狀態(tài)按Bit組合而成的數(shù)據(jù)。如0D? 02 組合成020DH,對(duì)應(yīng)二進(jìn)制為1000001101,每個(gè)bit對(duì)應(yīng)線圈的狀態(tài)。
?
4)功能碼02H:讀輸入線圈(02寄存器)
ModbusPoll讀取01從站地址為00的輸入線圈開始10個(gè)線圈狀態(tài)。

報(bào)文分析如下:

其中響應(yīng)報(bào)文返回的數(shù)據(jù)字節(jié)1、字節(jié)2組成的0004H,對(duì)應(yīng)的二進(jìn)制為0000000100。
?
4)功能碼03H:讀保持寄存器(03寄存器)
以下為ModbusPoll讀取01從站地址為02的保持寄存器,開始2個(gè)字,組成1個(gè)浮點(diǎn)數(shù)。

報(bào)文分析如下:

5)功能碼06H:寫單個(gè)保持寄存器(03寄存器)
以下為ModbusPoll寫01從站地址為02的保持寄存器,寫入數(shù)據(jù)為23。

報(bào)文分析如下:

其中
????????寫入數(shù)據(jù)0017H,為數(shù)據(jù)23
????????響應(yīng)報(bào)文同請(qǐng)求報(bào)文
?
6)功能碼10H:寫多個(gè)保持寄存器(03寄存器)
以下為ModbusPoll往01從站保持寄存器02地址寫入數(shù)據(jù)120.34,34.768。

報(bào)文分析如下:

7)功能碼04H:讀輸入寄存器(04寄存器)
以下為ModbusPoll讀取01從站輸入寄存器00開始4個(gè)字,組成2個(gè)浮點(diǎn)數(shù)。

報(bào)文分析如下:
