Modbus協議
Modbus RTU
引用
https://blog.csdn.net/m0_74762280/article/details/129052728
地址碼
0為廣播;主站不占與地址;串口模式地址位:0-247;248-255為保留地址
功能碼
| 寄存器種類 | 寄存器地址 | 讀寫狀態 | 位操作字操作 | 適用功能碼 |
|---|---|---|---|---|
| 線圈寄存器 | 00001-09999 | 讀/寫 | 位 | 01H(讀線圈寄存器)05H(寫單個線圈寄存器)0FH(寫多個線圈寄存器) |
| 離散輸入寄存器 | 10001-19999 | 只讀 | 位 | 02H |
| 保持寄存器 | 40001-49999 | 讀/寫 | 字 | 03H(讀保持寄存器)06H(寫單個保持寄存器) 10H(寫多個保持寄存器) |
| 輸入寄存器 | 30001-39999 | 只讀 | 字 | 04H |
| 報告slave ID | 11H | |||
| 錯誤檢測 | 80H | |||
| 異步事件報告 | 14H |
每種功能碼的舉例
報文舉例
線圈寄存器
寫單個線圈、多個線圈的功能碼是不一樣的;讀單個線圈、多個線圈的指令是一樣的
寫單個線圈寄存器
寫線圈的發送和返回報文都是一樣的
Send:FF 05 00 01 FF 00 C8 24
Rece:FF 05 00 01 FF 00 C8 24
解析發送報文
| 序號 | 報文 | 描述 |
|---|---|---|
| 0 | FF | 地址位;0為廣播,串口模式地址位:0-255 |
| 1 | 05 | 功能碼; |
| 2-3 | 00 01 | 起始線圈的地址; 對應的實際地址:00002 |
| 4-5 | FF 00 | |
| 6-7 | C8 24 | CRC校驗;循環冗余校驗 |
解析接收報文
| 序號 | 報文 | 描述 |
|---|---|---|
| 0 | FF | 地址位;0為廣播,串口模式地址位:0-255 |
| 1 | 05 | 功能碼; |
| 2-3 | 00 01 | 起始線圈的地址; 對應的實際地址:00002 |
| 4-5 | FF 00 | |
| 6-7 | C8 24 | CRC校驗;循環冗余校驗 |
讀保持寄存器
寫單個寄存器、多個寄存器的功能碼是不一樣的;讀單個寄存器、多個寄存器的指令是一樣的
Send:FF 03 00 10 00 0D 90 14
Rece:FF 03 1A 00 00 01 00 01 00 00 00 F2 03 00 00 F8 2A 00 00 38 CD FF FF 70 17 00 00 XX XX
解析發送報文
| 序號 | 報文 | 描述 |
|---|---|---|
| 0 | FF | 地址位;0為廣播,串口模式地址位:0-255 |
| 1 | 03 | 功能碼; |
| 2-3 | 00 01 | 起始寄存器的地址; 對應的實際地址:40002 |
| 4-5 | 00 0D | 要讀取的寄存器的數量 |
| 6-7 | 90 14 | CRC校驗;循環冗余校驗 |
解析接收報文
| 序號 | 報文 | 描述 |
|---|---|---|
| 0 | FF | 地址位;0為廣播,串口模式地址位:0-255 |
| 1 | 03 | 功能碼; |
| 2 | 1A | 被讀取的Data的字節數(因為一個寄存器是兩個字節,0D×2=1A) |
| 3-26 | ... | Data;個數跟上面的數相同 |
| 27-28 | CC 94 | CRC校驗;循環冗余校驗 |
寫多個保持寄存器
Send:FF 10 02 00 00 01 02 20 00 CC 94
Rece:FF 10 02 00 00 01 15 AF
解析發送報文
| 序號 | 報文 | 描述 |
|---|---|---|
| 0 | FF | 地址位;0為廣播,串口模式地址位:0-255 |
| 1 | 10 | 功能碼; |
| 2-3 | 02 00 | 起始寄存器的地址; 對應的實際地址:40513(40001+200H) |
| 4-5 | 00 01 | 要寫入的寄存器的數量(因為一個寄存器是兩個字節,01×2=02) |
| 6 | 02 | 要寫入的Data的字節數 |
| 7-8 | 02 00 | Data |
| 9-10 | CC 94 | CRC校驗;循環冗余校驗 |
解析接受報文
| 序號 | 報文 | 描述 |
|---|---|---|
| 0 | FF | 地址位;0為廣播,串口模式地址位:0-255 |
| 1 | 10 | 功能碼; |
| 2-3 | 02 00 | 起始寄存器的地址; |
| 4-5 | 02 00 | Data |
| 6-7 | CC 94 | CRC校驗;循環冗余校驗 |
Modbus TCP
Modbus TCP報文的格式主要包括TCP/IP頭部和Modbus應用數據兩部分。TCP/IP頭部用于在網絡層傳輸數據,確保數據包能夠準確到達目標主機和端口,而Modbus應用數據則包含了Modbus協議特定的指令和數據。
Modbus TCP報文的Modbus應用數據部分(除去TCP/IP頭部)一般結構如下:
MBAP(Modbus Application Protocol Header)頭:
Transaction Identifier (TransID):4字節,用于識別請求與響應的關聯性,客戶端在發出請求時生成,服務器會在響應中復用這個ID。
Protocol Identifier (ProtoID):2字節,常設置為00 00,代表Modbus協議。
Length:2字節,表示緊隨其后的PDU(Protocol Data Unit)的長度(以字節計)。
Unit Identifier (UnitID):1字節,類似于Modbus RTU中的設備地址,用于指定接收報文的設備。
PDU(Protocol Data Unit):
- 功能碼(Function Code):1字節,定義了Modbus操作的類型,如讀取線圈、寄存器等。
- 數據區(Data Field):長度可變,根據功能碼的不同,包含相應的信息,比如寄存器地址、寄存器數量、讀取或寫入的數據等。
舉例說明:
一個Modbus TCP報文請求讀取保持寄存器的實例可能如下所示(十六進制表示,已省略IP和TCP頭部):
請求報文:
00 00 00 00 00 06 01 03 00 00 00 01
解析請求報文
| 報文 | 描述 |
|---|---|
| 00 00 00 00 | TransID |
| 00 00 | ProtoID |
| 00 06 | Length(表示PDU長度為6字節) |
| 01 | UnitID |
| 03 | Function Code(讀取保持寄存器) |
| 00 00 00 01 | Data Field(表示從地址0開始讀取1個保持寄存器) |
響應報文:
00 00 00 00 00 0A 01 03 02 04 00 01 FF 00
解析請求報文
| 報文 | 描述 |
|---|---|
| 00 00 00 00 | TransID |
| 00 00 | ProtoID |
| 00 0A | Length(表示PDU長度為10字節) |
| 01 | UnitID |
| 03 | Function Code (讀取保持寄存器) |
| 02 04 00 01 FF 00 | Data Field(表示返回了2個寄存器的數據,每個寄存器占用2字節,這里是地址0的寄存器值為0x0001,下一個寄存器值為0xFF00) |
請注意,上述例子簡化了網絡傳輸過程中的實際報文結構,真實的Modbus TCP報文會嵌套在TCP/IP報文內部,在網絡上傳輸時還會帶有源IP地址、目標IP地址、源端口號、目標端口號等TCP/IP頭部信息。

浙公網安備 33010602011771號