Modbus RTU協議解析

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

如下圖

Modbus RTU協議解析

功能碼: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

如下圖

Modbus RTU協議解析

功能碼: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

如下圖:

Modbus RTU協議解析

功能碼: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

如下圖:

Modbus RTU協議解析

功能碼: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

如下圖

Modbus RTU協議解析

功能碼: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

如下圖

Modbus RTU協議解析

功能碼: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

如下圖

Modbus RTU協議解析

功能碼: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

如下圖

Modbus RTU協議解析


分享到:


相關文章: