ModbusTCP的數據幀可分爲兩部分:MBAP+PDU。html
在 TCP/IP 上使用一種專用報文頭識別 MODBUS 應用數據單元。將這種報文頭稱爲 MBAP 報文頭(MODBUS 協議報文頭)。這種報文頭提供一些與串行鏈路上使用的 MODBUS RTU 應用數據單元比較的差異 :
服務器
原文連接:https://www.cnblogs.com/ioufev/articles/10830028.htmlspa
MBAP的長度爲7個字節,組成以下:.net
事務處理標識 | 協議標識 | 長度 | 單元標識符 |
---|---|---|---|
2字節 | 2字節 | 2字節 | 1字節 |
內容 | 解釋 |
---|---|
事務處理標識 | 能夠理解爲報文的序列號,通常每次通訊以後就要加1以區別不一樣的通訊數據報文。 |
協議標識符 | 00 00表示ModbusTCP協議。 |
長度 | 表示接下來的數據長度,單位爲字節。 |
單元標識符 | 能夠理解爲設備地址。 |
PDU由功能碼+數據組成。功能碼爲1字節,數據長度不定,由具體功能決定。設計
功能碼3d
Modbus的操做對象有四種:線圈、離散輸入、輸入寄存器、保持寄存器。htm
對象 | 含義 |
---|---|
線圈 | PLC的輸出位,開關量,在Modbus中可讀可寫 |
離散量 | PLC的輸入位,開關量,在Modbus中只讀 |
輸入寄存器 | PLC中只能從模擬量輸入端改變的寄存器,在Modbus中只讀 |
保持寄存器 | PLC中用於輸出模擬量信號的寄存器,在Modbus中可讀可寫 |
根據對象的不一樣,經常使用的Modbus的功能碼有:對象
功能碼 | 含義 |
---|---|
0x01 | 讀線圈 |
0x05 | 寫單個線圈 |
0x0F | 寫多個線圈 |
0x02 | 讀離散量輸入 |
0x04 | 讀輸入寄存器 |
0x03 | 讀保持寄存器 |
0x06 | 寫單個保持寄存器 |
0x10 | 寫多個保持寄存器 |
0x01:讀線圈blog
在從站中讀1~2000個連續線圈狀態,ON=1,OFF=0事務
0x05:寫單個線圈
將從站中的一個輸出寫成ON或OFF,0xFF00請求輸出爲ON,0x000請求輸出爲OFF
0x0F:寫多個線圈
將一個從站中的一個線圈序列的每一個線圈都強制爲ON或OFF,數據域中置1的位請求相應輸出位ON,置0的位請求響應輸出爲OFF
0x02:讀離散量輸入
從一個從站中讀1~2000個連續的離散量輸入狀態
0x04:讀輸入寄存器
從一個遠程設備中讀1~2000個連續輸入寄存器
0x03:讀保持寄存器
從遠程設備中讀保持寄存器連續塊的內容
0x06:寫單個保持寄存器
在一個遠程設備中寫一個保持寄存器
0x10:寫多個保持寄存器
在一個遠程設備中寫連續寄存器塊(1~123個寄存器)
ModBusTcp與串行鏈路Modbus的數據域是一致的,具體數據域能夠參考串行Modbus。這裏給出幾個ModbusTcp的鏈路解析說明,輔助新人分析報文。
原文連接:https://blog.csdn.net/mikasoi/article/details/81782159
一、數據請求
97 76 00 00 00 06 04 04 00 7D 00 7D |
||||
|
示例 |
長度 |
說明 |
備註 |
Map報文頭 |
0x97 |
1 |
事務處理標識符Hi |
客戶機發起,服務器複製,用於事務處理配對 |
0x96 |
1 |
事務處理標識符Lo |
||
0x0000 |
2 |
協議標識符號 |
客戶機發起,服務器複製 Modbus協議 = 0. |
|
0x0006 |
2 |
長度 |
從本字節下一個到最後
|
|
0x04 |
1 |
單元標識符 |
客戶機發起,服務器複製 串口鏈路或其餘總線上遠程終端標識 |
|
功能碼 |
0x04 |
1 |
功能碼,讀寄存器 |
參考標準modbus協議 |
數據 |
0x007D |
2 |
起始地址 |
|
0x 007D |
2 |
寄存器數量 |
|
|
校驗 |
|
二、數據請求回覆
97 76 00 00 00 FD 04 04 FA AB 9E 41 18 7A E1 3F 94 7A E1 3F 94 0A 3D 3F 97 51 EC 3F 98 CC CD C0 6C 33 33 C0 E3 CC CD C0 EC EB 85 41 F1 D7 0A 41 E9 47 AE 41 ED EB 85 41 F1 19 9A 43 D0 E6 66 43 C9 4C CD 43 CF EB 85 41 F3 66 66 42 0F CC CD 41 C2 E6 66 44 0A 1E B8 41 FB A3 D7 42 0C CC CD 41 BC C0 00 44 0A B8 52 41 F6 5C 29 42 0F 47 AE 41 D1 C6 66 44 0A 00 00 00 00 C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F 05 16 00 00 04 11 00 00 05 16 00 00 04 11 00 00 05 16 00 00 04 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 0A 00 0A 00 0A 00 04 00 04 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0F |
||||
|
示例 |
長度 |
說明 |
備註 |
Map報文頭 |
0x97 |
1 |
事務處理標識符Hi |
客戶機發起,服務器複製,用於事務處理配對 |
0x96 |
1 |
事務處理標識符Lo |
||
0x0000 |
2 |
協議標識符號 |
客戶機發起,服務器複製 Modbus協議 = 0. |
|
0x00FD |
2 |
長度 |
從本字節下一個到最後
|
|
0x04 |
1 |
單元標識符 |
客戶機發起,服務器複製 串口鏈路或其餘總線上遠程終端標識 |
|
功能碼 |
0x04 |
1 |
功能碼,讀寄存器 |
參考標準modbus協議 |
數據 |
0x FA |
1 |
字節個數 |
|
0x---- |
|
數據 |
||
校驗 |
|
三、寫多個寄存器
97 79 00 00 00 09 04 10 00 00 00 01 02 00 01 |
||||
|
示例 |
長度 |
說明 |
備註 |
Map報文頭 |
0x97 |
1 |
事務處理標識符Hi |
客戶機發起,服務器複製,用於事務處理配對 |
0x79 |
1 |
事務處理標識符Lo |
||
0x0000 |
2 |
協議標識符號 |
客戶機發起,服務器複製 Modbus協議 = 0. |
|
0x0009 |
2 |
長度 |
從本字節下一個到最後
|
|
0x04 |
1 |
單元標識符 |
客戶機發起,服務器複製 串口鏈路或其餘總線上遠程終端標識 |
|
功能碼 |
0x10 |
1 |
功能碼,讀寄存器 |
參考標準modbus協議 |
數據 |
0x0000 |
2 |
起始地址 |
|
0x 0001 |
2 |
寫寄存器數量 |
|
|
0x 02 |
1 |
寫字節的個數 |
|
|
00 01 |
2 |
目標值 |
|
|
校驗 |
|
四、寫多個寄存器響應
97 79 00 00 00 06 04 10 00 00 00 01 |
||||
|
示例 |
長度 |
說明 |
備註 |
Map報文頭 |
0x97 |
1 |
事務處理標識符Hi |
客戶機發起,服務器複製,用於事務處理配對 |
0x79 |
1 |
事務處理標識符Lo |
||
0x0000 |
2 |
協議標識符號 |
客戶機發起,服務器複製 Modbus協議 = 0. |
|
0x0006 |
2 |
長度 |
從本字節下一個到最後
|
|
0x04 |
1 |
單元標識符 |
客戶機發起,服務器複製 串口鏈路或其餘總線上遠程終端標識 |
|
功能碼 |
0x10 |
1 |
功能碼,讀寄存器 |
參考標準modbus協議 |
數據 |
0x0000 |
2 |
起始地址 |
|
0x 0001 |
2 |
寄存器個數 |
|
|
校驗 |