一、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 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/3582.html
標籤:嵌入式
上一篇:單片機提高ADC精度總結
下一篇:SRAM電路作業原理
