由發送設備將 Modbus 報文構造爲帶有已知起始和結束標記的幀。這使設備能夠在報文的開始接收新幀,而且知道什麼時候報文結束。不完整的報文必須可以被檢測到而錯誤標誌必須做爲結果被設置。在 RTU 模式,報文幀由時長至少爲 3.5 個字符時間的空閒間隔區分。在後續的部分,這個時間區間被稱做 t3.5。
spa
整個報文幀必須以連續的字符流發送。若是兩個字符之間的空閒間隔大於 1.5 個字符時間,則報文幀被認爲不完整應該被接收節點丟棄。 blog
一、讀線圈寄存器01Hci
1) 描述:io
讀MODBUS從機線圈寄存器當前狀態。table
2) 查詢:class
例如從機地址爲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代替。im
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 |
二、讀離散輸入寄存器 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 |
三、讀保持寄存器 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 |
四、讀輸入寄存器 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 |
五、寫單個線圈寄存器 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 |
六、寫單個保持寄存器 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 |
七、寫多個線圈寄存器 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 |
八、寫多個保持寄存器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 |