一、Modbus RTU數據幀說明 由發送設備將 Modbus 報文構造為帶有已知起始和結束標記的幀。這使設備可以在報文的開始接收新幀,並且知道何時報文結束。不完整的報文必須能夠被檢測到而錯誤標誌必須作為結果被設置。在 RTU 模式,報文幀由時長至少為 3.5 個字元時間的空閑間隔區分。在後續的部分 ...
一、Modbus RTU數據幀說明
由發送設備將 Modbus 報文構造為帶有已知起始和結束標記的幀。這使設備可以在報文的開始接收新幀,並且知道何時報文結束。不完整的報文必須能夠被檢測到而錯誤標誌必須作為結果被設置。在 RTU 模式,報文幀由時長至少為 3.5 個字元時間的空閑間隔區分。在後續的部分,這個時間區間被稱作 t3.5。
整個報文幀必須以連續的字元流發送。如果兩個字元之間的空閑間隔大於 1.5 個字元時間,則報文幀被認為不完整應該被接收節點丟棄。
二、MODBUS指令說明
1、讀線圈寄存器01H
1) 描述:
讀MODBUS從機線圈寄存器當前狀態。
2) 查詢:
例如從機地址為0x11,線圈寄存器的起始地址為0x0013,結束地址為0x0037。該次查詢總共訪問(0x0037-0x0013 + 1)37個線圈寄存器。
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 01 |
寄存器起始地址高位元組(1個位元組) | 00 |
寄存器起始地址低位元組(1個位元組) | 13 |
寄存器數量高位元組(1個位元組) | 00 |
寄存器數量低位元組(1個位元組) | 25 |
CRC校驗高位元組(1個位元組) | 0E |
CRC校驗低位元組(1個位元組) | 84 |
3) 響應
響應負載中的各線圈狀態與數據內容每位相對應。1代表ON,0代表OFF。若返回的線圈數不為8的倍數,則在最後數據位元組未尾使用0代替。
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 01 |
返回位元組數(1個位元組) | 05 |
數據1(線圈0x001A - 線圈0x0013)(1個位元組) | CD |
數據2(線圈0x0022 - 線圈0x001B)(1個位元組) | 6B |
數據3(線圈0x002A - 線圈0x0023)(1個位元組) | B2 |
數據4(線圈0x0032 - 線圈0x002B)(1個位元組) | 0E |
數據5(線圈0x0037 - 線圈0x0033)(1個位元組) | 1B |
CRC校驗高位元組(1個位元組) | 45 |
CRC校驗低位元組(1個位元組) | E6 |
線圈0x0013到線圈0x001A的狀態為0xCD,二進位值為11001101,該位元組的最高位元組為線圈0x001A,最低位元組為線圈0x0013。線圈0x001A到線圈0x0013的狀態分別為ON-ON-OFF-OFF-ON-ON-OFF-ON。
0x001A | 0x0019 | 0x0018 | 0x0017 | 0x0016 | 0x0015 | 0x0014 | 0x0013 |
ON | ON | OFF | OFF | ON | ON | OFF | ON |
最後一個數據位元組中,線圈0x0033到線圈0x0037狀態為0x1B(二進位00011011),線圈0x0037是左數第4位,線圈0x0033為該位元組的最低位元組,線圈0x0037至線圈0x0033的狀態分別為ON-ON-OFF-ON-ON,剩餘3位使用0填充。
0x003A | 0x0039 | 0x0038 | 0x0037 | 0x0036 | 0x0035 | 0x0034 | 0x0033 |
填充 | 填充 | 填充 | ON | ON | OFF | ON | ON |
2、讀離散輸入寄存器 02H
1) 說明
讀離散輸入寄存器狀態。
2) 查詢
從機地址為0x11。離散輸入寄存器的起始地址為0x00C4,結束寄存器地址為0x00D9。總共訪問(0x00D9-0x00C4+1)22個離散輸入寄存器。
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 02 |
寄存器地址高位元組(1個位元組) | 00 |
寄存器地址低位元組(1個位元組) | C4 |
寄存器數量高位元組(1個位元組) | 00 |
寄存器數量低位元組(1個位元組) | 16 |
CRC校驗高位元組(1個位元組) | BA |
CRC校驗低位元組(1個位元組) | A9 |
3) 響應
響應各離散輸入寄存器狀態,分別對應數據區中的每位值,1 代表ON;0 代表OFF。第一個數據位元組的LSB(最低位元組)為查詢的定址地址,其他輸入口按順序在該位元組中由低位元組向高位元組排列,直到填充滿8位。下一個位元組中的8個輸入位也是從低位元組到高位元組排列。若返回的輸入位數不是8的倍數,則在最後的數據位元組中的剩餘位至該位元組的最高位使用0填充。
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 02 |
返回位元組數(1個位元組) | 03 |
數據1(0x00CB - 0x00C4)(1個位元組) | AC |
數據1(0x00D3 - 0x00CC)(1個位元組) | DB |
數據1(0x00D9 - 0x00D4)(1個位元組) | 35 |
CRC校驗高位元組(1個位元組) | 20 |
CRC校驗低位元組(1個位元組) | 18 |
離散輸入寄存器0x00D4到0x00D9的狀態為0x35 (二進位00110101)。輸入寄存器0x00D9為左數第3位,輸入寄存器0x00D4為最低位,輸入寄存器0x00D9到0x00D4的狀態分別為ON-ON-OFF-ON-OFF-ON。0x00DB寄存器和0x00DA寄存器被0填充。
0x00CB | 0x00CA | 0x00C9 | 0x00C8 | 0x00C7 | 0x00C6 | 0x00C5 | 0x00C4 |
0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 |
0x00D3 | 0x00D2 | 0x00D1 | 0x00D0 | 0x00CF | 0x00CE | 0x00CD | 0x00CC |
1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
0x00DB | 0x00DA | 0x00D9 | 0x00D8 | 0x00D7 | 0x00D6 | 0x00D5 | 0x00D4 |
填充 | 填充 | 1 | 1 | 0 | 1 | 0 | 1 |
3、讀保持寄存器 03H
1) 說明
讀保持寄存器。可讀取單個或多個保持寄存器。
2) 查詢
從機地址為0x11。保持寄存器的起始地址為0x006B,結束地址為0x006D。該次查詢總共訪問(0x006D-0x006B+1)3個保持寄存器。
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 03 |
寄存器地址高位元組(1個位元組) | 00 |
寄存器地址低位元組(1個位元組) | 6B |
寄存器數量高位元組(1個位元組) | 00 |
寄存器數量低位元組(1個位元組) | 03 |
CRC高位元組(1個位元組) | 76 |
CRC低位元組(1個位元組) | 87 |
3) 響應
保持寄存器的長度為2個位元組。對於單個保持寄存器而言,寄存器高位元組數據先被傳輸,低位元組數據後被傳輸。保持寄存器之間,低地址寄存器先被傳輸,高地址寄存器後被傳輸。
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 03 |
位元組數(1個位元組) | 06 |
數據1高位元組(0x006B)(1個位元組) | 00 |
數據1低位元組(0x006B)(1個位元組) | 6B |
數據2高位元組(0x006C)(1個位元組) | 00 |
數據2低位元組(0x006C)(1個位元組) | 13 |
數據3高位元組(0x006D)(1個位元組) | 00 |
數據3低位元組(0x006D)(1個位元組) | 00 |
CRC高位元組(1個位元組) | 38 |
CRC低位元組(1個位元組) | B9 |
0x006B 高位元組 |
0x006B 低位元組 |
0x006C 高位元組 |
0x006C 低位元組 |
0x006D 高位元組 |
0x006D 低位元組 |
00 | 6B | 00 | 13 | 00 | 00 |
4、讀輸入寄存器 04H
1) 說明
讀輸入寄存器命令。該命令支持單個寄存器訪問也支持多個寄存器訪問。
2) 查詢
從機地址為0x11。輸入寄存器的起始地址為0x0008,寄存器的結束地址為0x0009。本次訪問訪問2個讀入寄存器。
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 04 |
寄存器起始地址高位元組(1個位元組) | 00 |
寄存器起始地址低位元組(1個位元組) | 08 |
寄存器數量高位元組(1個位元組) | 00 |
寄存器數量低位元組(1個位元組) | 02 |
CRC高位元組(1個位元組) | F2 |
CRC低位元組(1個位元組) | 99 |
3) 響應
輸入寄存器長度為2個位元組。對於單個輸入寄存器而言,寄存器高位元組數據先被傳輸,低位元組數據後被傳輸。輸入寄存器之間,低地址寄存器先被傳輸,高地址寄存器後被傳輸。
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 04 |
位元組數(1個位元組) | 04 |
數據1高位元組(0x0008)(1個位元組) | 00 |
數據1低位元組(0x0008)(1個位元組) | 0A |
數據2高位元組(0x0009)(1個位元組) | 00 |
數據2低位元組(0x0009)(1個位元組) | 0B |
CRC高位元組(1個位元組) | 8B |
CRC低位元組(1個位元組) | 80 |
0x0008 高位元組 |
0x0008 低位元組 |
0x0009 高位元組 |
0x0009 低位元組 |
0x00 | 0x0A | 0x00 | 0x0B |
5、寫單個線圈寄存器 05H
1) 說明
寫單個線圈寄存器。0xFF00值請求線圈處於ON狀態,0x0000值請求線圈處於OFF狀態。0x05指令設置單個線圈的狀態,0x15指令可以設置多個線圈的狀態,兩個指令雖然都設定線圈的ON/OFF狀態,但是ON/OFF的表達方式卻不同。
2) 查詢
從機地址為0x11,線圈寄存器的地址為0x00AC。使0x00AC線圈處於ON狀態,即數據內容為0xFF00。
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 05 |
寄存器地址高位元組(1個位元組) | 00 |
寄存器地址低位元組(1個位元組) | AC |
數據1高位元組(1個位元組) | FF |
數據1低位元組(1個位元組) | 00 |
CRC校驗高位元組(1個位元組) | 4E |
CRC校驗低位元組(1個位元組) | 8B |
3) 響應
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 05 |
寄存器地址高位元組(1個位元組) | 00 |
寄存器地址低位元組(1個位元組) | AC |
寄存器1高位元組(1個位元組) | FF |
寄存器1低位元組(1個位元組) | 00 |
CRC校驗高位元組(1個位元組) | 4E |
CRC校驗低位元組(1個位元組) | 8B |
6、寫單個保持寄存器 06H
1) 說明
寫保持寄存器。註意0x06指令只能操作單個保持寄存器,0x16指令可以設置單個或多個保持寄存器。
2) 查詢
從機地址為0x11。保持寄存器地址為0x0001。寄存器內容為0x0003。
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 06 |
寄存器地址高位元組(1個位元組) | 00 |
寄存器地址低位元組(1個位元組) | 01 |
數據1高位元組(1個位元組) | 00 |
數據1低位元組(1個位元組) | 01 |
CRC校驗高位元組(1個位元組) | 9A |
CRC校驗低位元組(1個位元組) | 9B |
3) 響應
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 06 |
寄存器地址高位元組(1個位元組) | 00 |
寄存器地址低位元組(1個位元組) | 01 |
寄存器數量高位元組(1個位元組) | 00 |
寄存器數量低位元組(1個位元組) | 01 |
CRC校驗高位元組(1個位元組) | 1B |
CRC校驗低位元組(1個位元組) | 5A |
7、寫多個線圈寄存器 0FH
1) 說明
寫多個線圈寄存器。若數據區的某位值為“1”表示被請求的相應線圈狀態為ON,若某位值為“0”,則為狀態為OFF。
2) 查詢
從機地址為0x11,線圈寄存器的起始地址為0x0013,線圈寄存器的結束地址為0x001C。總共訪問(0x001C-0x0013+1)10個寄存器。寄存器內容如下表所示。
0x001A | 0x0019 | 0x0018 | 0x0017 | 0x0016 | 0x0015 | 0x0014 | 0x0013 |
1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
0x0022 | 0x0021 | 0x0020 | 0x001F | 0x001E | 0x001D | 0x001C | 0x001B |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
傳輸的第一個位元組0xCD對應線圈為0x0013到0x001A,LSB(最低位)對應線圈0x0013,傳輸第二個位元組為 0x01,對應的線圈為0x001B到0x001C,LSB對應線圈0x001C,其餘未使用位使用0填充。
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 0F |
寄存器地址高位元組(1個位元組) | 00 |
寄存器地址低位元組(1個位元組) | 13 |
寄存器數量高位元組(1個位元組) | 00 |
寄存器數量低位元組(1個位元組) | 0A |
位元組數(1個位元組) | 02 |
數據1(0x0013 - 0x001A)(1個位元組) | CD |
數據2(0x001B - 0x001C)(1個位元組) | 01 |
CRC校驗高位元組(1個位元組) | BF |
CRC校驗低位元組(1個位元組) | 0B |
3) 響應
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 0F |
寄存器地址高位元組(1個位元組) | 00 |
寄存器地址低位元組(1個位元組) | 13 |
寄存器數量高位元組(1個位元組) | 00 |
寄存器數量低位元組(1個位元組) | 0A |
位元組數(1個位元組) | 02 |
CRC校驗高位元組(1個位元組) | 99 |
CRC校驗低位元組(1個位元組) | 1B |
8、寫多個保持寄存器10H
1) 說明
寫多個保持寄存器。
2) 查詢
從機地址為0x11。保持寄存器的起始地址為0x0001,寄存器的結束地址為0x0002。總共訪問(0x0002-0x0001+1)2個寄存器。保持寄存器0x0001的內容為0x000A,保持寄存器0x0002的內容為0x0102。
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 10 |
寄存器起始地址高位元組(1個位元組) | 00 |
寄存器起始地址低位元組(1個位元組) | 01 |
寄存器數量高位元組(1個位元組) | 00 |
寄存器數量低位元組(1個位元組) | 02 |
位元組數(1個位元組) | 04 |
數據1高位元組(1個位元組) | 00 |
數據1低位元組(1個位元組) | 0A |
數據2高位元組(1個位元組) | 01 |
數據2低位元組(1個位元組) | 02 |
CRC校驗高位元組(1個位元組) | C6 |
CRC校驗低位元組(1個位元組) | F0 |
地址 |
0x0001 高位元組 |
0x0001 低位元組 |
0x0002 高位元組 |
0x0002 低位元組 |
數值 | 0x00 | 0x0A | 0x01 | 0x02 |
3) 響應
Hex | |
從機地址(1個位元組) | 11 |
功能碼(1個位元組) | 10 |
寄存器起始地址高位元組(1個位元組) | 00 |
寄存器起始地址低位元組(1個位元組) | 01 |
寄存器數量高位元組(1個位元組) | 00 |
寄存器數量低位元組(1個位元組) | 02 |
CRC校驗高位元組(1個位元組) | 12 |
CRC校驗低位元組(1個位元組) | 98 |