Modbus是一種串行通信協議,是Modicon公司(現在的施耐德電氣Schneider Electric)於1979年為使用可編程邏輯控制器(PLC)通信而發表。Modbus已經成為工業領域通信協議的業界標準(De facto),並且現在是工業電子設備之間常用的連接方式。大多數Modbus設備通信通過串口EIA-485物理層進行。
對於串行連接,存在兩個變種,它們在數值數據表示不同和協議細節上略有不同。Modbus RTU是一種緊湊的,採用二進制表示數據的方式,Modbus ASCII是一種人類可讀的,冗長的表示方式。這兩個變種都使用串行通信(serial communication)方式。RTU格式後續的命令/數據帶有循環冗餘校驗的校驗和,而ASCII格式採用縱向冗餘校驗的校驗和。被配置為RTU變種的節點不會和設置為ASCII變種的節點通信,反之亦然。
功能碼:01 02 03 04 05 06 15 16
功能碼:01 讀取線圈狀態
讀取 從站為1 起始地址為0 數量為10
主站發送報文: 01 01 00 00 00 0a bc 0d
01:從站地址 Type:Byte
01:功能碼; Type:Byte
00 00 :讀取從站的起始地址;Type:Word (主站訪問實際起始地址=報文地址+1)
00 0a : 讀取總共的線圈個數,10個;Type:Word
bc 0d: CRC校驗;Type:Word
從站返回報文: 01 01 02 07 00 bb cc
01:從站地址 Type:Byte
01:功能碼 Type:Byte
02:返回字節個數(每讀8個BIT線圈為一個字節BYTE) Type:Byte
07 00 :返回線圈狀態,讀取10個線圈狀態,用兩個字節存儲(00000111,00000000) Type:Byte
bb cc:發送CRC校驗碼 Type:Word
如下圖
功能碼:02 讀取輸入狀態
讀取 從站為1 起始地址為10 數量為10
主站發送報文: 01 02 00 09 00 0a 28 0f
01:從站地址 Type:Byte
02:功能碼; Type:Byte
00 00 :讀取從站的起始地址;Type:Word (主站訪問實際起始地址=報文地址+1)
00 0a : 讀取總共的輸入個數,10個;Type:Word
28 0f: CRC校驗;Type:Word
從站返回報文: 01 02 02 00 00 b9 b8
01:從站地址 Type:Byte
02:功能碼 Type:Byte
02:返回字節個數(每讀8個BIT線圈為一個字節BYTE) Type:Byte
00 00 :返回線圈狀態,讀取10個線圈狀態,用兩個字節存儲(00000000,00000000) Type:Byte
b9 b8:發送CRC校驗碼 Type:Word
如下圖
功能碼:03 讀取保持型寄存器
讀取 從站為1 起始地址為10 數量為10
主站發送報文: 01 03 00 09 00 0a 15 cf
01:從站地址 Type:Byte
03:功能碼; Type:Byte
00 09 :讀取從站的起始地址;Type:Word (主站訪問實際起始地址=報文地址+1)
00 0a : 讀取總共的輸入個數,10個;Type:Word
15 cf: CRC校驗;Type:Word
從站返回報文: 01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a3 67
01:從站地址 Type:Byte
03:功能碼 Type:Byte
14:返回字節個數(每讀1個寄存器為二個字節BYTE) Type:Byte
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 一個寄存器用兩個字節存儲,讀取10個寄存器 為20個字節 Type:Byte
b9 b8:發送CRC校驗碼 Type:Word
如下圖:
功能碼:04 讀取輸入寄存器
讀取 從站為1 起始地址為10 數量為10
主站發送報文: 01 04 00 09 00 0a a0 0f
01:從站地址 Type:Byte
04:功能碼; Type:Byte
00 09 :讀取從站的起始地址;Type:Word (主站訪問實際起始地址=報文地址+1)
00 0a : 讀取總共的輸入個數,10個;Type:Word
a0 0f: CRC校驗;Type:Word
從站返回報文: 01 04 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 95 81
01:從站地址 Type:Byte
04:功能碼 Type:Byte
14:返回字節個數(每讀1個寄存器為二個字節BYTE) Type:Byte
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 一個寄存器用兩個字節存儲,讀取10個寄存器 為20個字節 Type:Byte
發送CRC校驗碼:95 81Type:Word
如下圖:
功能碼:15 寫多個線圈寄存器
讀取 從站為1 起始地址為0 數量為10
主站發送報文: 01 0f 00 00 00 0a 02 1e 00 ec 98
01:從站地址 Type:Byte
0f:功能碼; Type:Byte
00 00 :讀取從站的起始地址;Type:Word (主站訪問實際起始地址=報文地址+1)
00 0a : 寫入總共的線圈個數,10個;Type:Word
02:總字節數(8個線圈佔用一個字節,多餘的再佔用一個)Type:Byte
1e 00 :寫入數據的值(01111000 00000000)Type:Byte
ec 98: CRC校驗;Type:Word
從站返回報文: 01 0f 14 00 00 00 00 0a d5 cc
01:從站地址 Type:Byte
0f:功能碼 Type:Byte
00 00:返回起始地址 Type:Word
00 0a :返回讀取寄存器個數 Type:Word
d5 cc : 發送CRC校驗碼 Type:Word
如下圖
功能碼:16 寫多個保持型寄存器
讀取 從站為1 起始地址為0 數量為4
主站發送報文: 01 10 00 00 00 04 08 01 00 01 01 00 01 00 00 1a 67
01:從站地址 Type:Byte
10:功能碼; Type:Byte
00 00 :讀取從站的起始地址;Type:Word (主站訪問實際起始地址=報文地址+1)
00 04 : 寫入總共的寄存器數,4個;Type:Word
08:總字節數(1個保持型佔用二個字節,) Type:Byte
01 00 01 01 00 01 00 00 :寫入數據的值 Type:Byte
1a 67: CRC校驗;Type:Word
從站返回報文: 01 10 00 00 00 04 c1 ca
01:從站地址 Type:Byte
10:功能碼 Type:Byte
00 00:返回起始地址 Type:Word
00 04 :返回讀取寄存器個數 Type:Word
c1 ca 發送CRC校驗碼 Type:Word
如下圖
功能碼:05 單個線圈
讀取 從站為1 起始地址為0
主站發送報文: 01 05 00 00 00 00 cd ca
01:從站地址 Type:Byte
05:功能碼; Type:Byte
00 00 :寫入從站的起始地址;Type:Word (主站訪問實際起始地址=報文地址+1)
00 00 : 寫入的數據值,高位 低位;
cd ca: CRC校驗;Type:Word
從站返回報文: 01 05 00 00 00 00 cd ca
01:從站地址 Type:Byte
05:功能碼 Type:Byte
00 00 :返回寫入從站的起始地址;Type:Word (主站訪問實際起始地址=報文地址+1)
00 00 : 返回寫入的數據值,高位 低位;
cd ca: CRC校驗;Type:Word
如下圖
功能碼:06 單個寄存器
讀取 從站為1 起始地址為0
主站發送報文: 01 06 00 01 00 00 d8 0a
01:從站地址 Type:Byte
06:功能碼; Type:Byte
00 00 :寫入從站的起始地址;Type:Word (主站訪問實際起始地址=報文地址+1)
00 00 : 寫入的數據值,高位 低位;
cd ca: CRC校驗;Type:Word
從站返回報文: 01 06 00 01 00 00 d8 0a
01:從站地址 Type:Byte
06:功能碼 Type:Byte
00 00 :返回寫入從站的起始地址;Type:Word (主站訪問實際起始地址=報文地址+1)
00 00 : 返回寫入的數據值,高位 低位;
cd ca: CRC校驗;Type:Word
如下圖
閱讀更多 停車ZA楓林晚 的文章