modbus-tcp協議講解
MODBUS功能碼簡介
程式碼 |
中文名稱 |
位操作/字操作 |
運算元量 |
01h |
讀線圈狀態 |
位操作 |
單個或多個 |
02h |
讀離散輸入狀態(只能讀到0或1) |
位操作 |
單個或多個 |
03h |
讀保持暫存器(保持暫存器可以通過06h功能寫入) |
字操作 |
單個或多個 |
04h |
讀輸入暫存器(輸入暫存器只能讀取,不能通過06h功能寫入) |
字操作 |
單個或多個 |
05h |
寫單個線圈(線圈表示用來控制輸出IO控制) |
位操作 |
單個 |
06h |
寫單個保持暫存器 |
字操作 |
單個 |
0Fh |
寫多個線圈 |
位操作 |
多個 |
10h |
寫多個保持暫存器 |
字操作 |
多個 |
Modbus TCP介紹
示例-通過03功能碼讀暫存器(從暫存器00開始,讀取兩個值,讀到01暫存器結束)
客戶端傳送 01 02 00 00 00 06 01 03 00 00 00 02
01 02 00 00 00 06 (固定報文頭)
- 01 02: 客戶端發出的檢驗資訊, server端會將這兩個位元組內容複製到迴應的報文第一二位.一般我們會將第一二位進行不停遞加,然後根據伺服器返回的相應內容, 來驗證伺服器迴應資訊的時效性
- 00 00: 表示tcp/ip 的協議的modbus的協議
- 00 06: 表示客戶端傳送的後面帶了多少位元組.
01 03 00 00 00 02(使用者資料)
- 01: 表示裝置地址
- 03: 表示讀保持暫存器功能碼
- 00 00: 表示客戶端讀取的暫存器起始地址
- 00 02: 表示讀取的暫存器值個數(由於為02,所以會讀出暫存器00h和01h的值)
返回值如下圖所示:
伺服器返回值 01 02 00 00 00 07 01 03 04 04 7B 00 FF
- 01 02: 伺服器迴應的檢驗資訊
- 00 00: 表示tcp/ip 的協議的modbus的協議
- 00 07: 表示伺服器傳送的後面帶了多少位元組.
- 01: 表示裝置地址
- 03: 表示功能碼
- 04: 表示後面傳送的暫存器00的位元組長度
- 04 7B: 表示暫存器00的值
- 00 FF: 表示暫存器01的值
示例-06功能碼寫單個暫存器(向暫存器03地址裡寫值)
客戶端傳送 01 02 00 00 00 06 01 06 00 03 00 FF
01 02 00 00 00 06 (固定報文頭)
- 01 02: 客戶端發出的檢驗資訊
- 00 00: 表示tcp/ip 的協議的modbus的協議
- 00 06: 表示客戶端傳送的後面帶了多少位元組.
01 06 00 03 00 FF (使用者資料)
- 01: 表示裝置地址
- 06: 表示寫單個保持暫存器功能碼
- 00 FF: 表示寫入暫存器03h的值為0xFF
返回值如下圖所示:
伺服器返回 01 02 00 00 00 06 01 06 00 03 00 FF
後面的06 00 03 00 FF:表示客戶端使用06功能碼成功向暫存器03h分別寫入了0xFF值
示例-10功能碼寫多個暫存器(向暫存器03~06地址裡寫不同值)
客戶端傳送 01 02 00 00 00 10 01 10 00 03 00 04 08 FF FF 00 0A 00 0F 00 06
01 02 00 00 00 10 (固定報文頭)
- 01 02: 客戶端發出的檢驗資訊
- 00 00: 表示tcp/ip 的協議的modbus的協議
- 00 10: 表示客戶端傳送的後面帶了多少位元組.
01 10 00 03 00 04 08 FF FF 00 0A 00 0F 00 06 (使用者資料)
- 01: 表示裝置地址
- 10: 表示寫多個保持暫存器功能碼
- 00 03: 表示客戶端寫入的暫存器起始地址
- 00 04: 表示寫入的暫存器值個數(由於為04,所以會寫入暫存器03h~06h的值)
- 08: 表示後面寫入的位元組個數
- FF FF: 表示寫入暫存器03h的值
- 00 0A: 表示寫入暫存器04h的值
- 00 0F: 表示寫入暫存器05h的值
- 00 06: 表示寫入暫存器06h的值
返回值如下圖所示:
伺服器返回 01 02 00 00 00 06 01 10 00 03 00 04
後面的10 00 03 00 04:表示客戶端使用10功能碼成功向暫存器03h~06h分別寫入了值
部分參考內容:https://blog.csdn.net/mikasoi/article/details/8178