標準Modbus RTU指令 | ||||||||||||||||
寄存器單元(十進制) | 功能碼 | 作用 | 請求及響應格式 | |||||||||||||
線圈寄存器 CoilStatus (00001 - 09999) 1位 讀寫 |
0x01 | 讀線圈 | 指示狀態1 = ON,0 = OFF 示例:讀取0x0001到0x000A單元的開關狀態,現場狀態為全開(即全1) | |||||||||||||
請求: | 設備號 | 功能碼 | 寄存器起始地址 | 寄存器單元長度 | CRC校驗 | |||||||||||
id | 01 | 00 | 00 | 00 | 0A | crcl | crch | |||||||||
響應: | 設備號 | 功能碼 | 字節數 | 數據 | CRC校驗 | |||||||||||
id | 01 | 02 | FF | 03 | crcl | crch | ||||||||||
0x05 | 寫單個線圈 | 十六進制FF 00置狀態為ON,十六進制00 00 置狀態為OFF 示例:將0x00AD單元狀態置為ON/OFF | ||||||||||||||
請求: | 設備號 | 功能碼 | 寄存器起始地址 | 置為ON/OFF | CRC校驗 | |||||||||||
id | 05 | 00 | AC | FF | 00 | crcl | crch | |||||||||
id | 05 | 00 | AC | 00 | 00 | crcl | crch | |||||||||
響應: | 設備號 | 功能碼 | 寄存器起始地址 | 置為ON/OFF | CRC校驗 | |||||||||||
id | 05 | 00 | AC | FF | 00 | crcl | crch | |||||||||
id | 05 | 00 | AC | 00 | 00 | crcl | crch | |||||||||
0x0F | 寫多個線圈 | 示例:從0x0014開始寫入10個狀態值,數據內容為2個字節:十六進制CD 01(二進制 1100 1101 0000 0001) | ||||||||||||||
請求: | 設備號 | 功能碼 | 寄存器起始地址 | 寄存器單元長度 | 字節數 | 數據 | CRC校驗 | |||||||||
id | 0F | 00 | 13 | 00 | 0A | 02 | CD | 01 | crcl | crch | ||||||
響應: | 設備號 | 功能碼 | 寄存器起始地址 | 寄存器單元長度 | CRC校驗 | |||||||||||
id | 0F | 00 | 13 | 00 | 0A | crcl | crch | |||||||||
離散寄存器 InputStatus (10001 - 19999) 1位 只讀 |
0x02 | 讀離散輸入 | 示例:讀取197—218的開關狀態,204-197內容為0xAC(即二進制1010 1100),212-205內容為0xDB(即二進制1101 1011),218-213內容為0x35(即二進制0011 0101) | |||||||||||||
請求: | 設備號 | 功能碼 | 寄存器起始地址 | 寄存器單元長度 | CRC校驗 | |||||||||||
id | 02 | 00 | C4 | 00 | 16 | crcl | crch | |||||||||
響應: | 設備號 | 功能碼 | 字節數 | 數據 | CRC校驗 | |||||||||||
id | 02 | 03 | AC | DB | 35 | crcl | crch | |||||||||
保持寄存器 Holding Register(40001 - 49999) 16位 讀寫 |
0x03 | 讀保持寄存器 | 示例:讀取寄存器108—110的值,108的內容為0x022B(即555),109的內容為0x0000(即0),110的內容為0x0064(即100) | |||||||||||||
請求: | 設備號 | 功能碼 | 寄存器起始地址 | 寄存器單元長度 | CRC校驗 | |||||||||||
id | 03 | 00 | 6B | 00 | 03 | crcl | crch | |||||||||
響應: | 設備號 | 功能碼 | 字節數 | 數據 | CRC校驗 | |||||||||||
id | 03 | 06 | 02 | 2B | 00 | 00 | 00 | 64 | crcl | crch | ||||||
0x06 | 寫單個寄存器 | 示例:將數據0x0003寫入寄存器單元0x0002 | ||||||||||||||
請求: | 設備號 | 功能碼 | 寄存器起始地址 | 數據 | CRC校驗 | |||||||||||
id | 06 | 00 | 01 | 00 | 03 | crcl | crch | |||||||||
響應: | 設備號 | 功能碼 | 寄存器起始地址 | 數據 | CRC校驗 | |||||||||||
id | 06 | 00 | 01 | 00 | 03 | crcl | crch | |||||||||
0x10 | 寫多個寄存器 | 示例:將數據0x000A和0x0102寫入從0x0002開始的兩個寄存器單元 | ||||||||||||||
請求: | 設備號 | 功能碼 | 寄存器起始地址 | 寄存器單元長度 | 字節數 | 數據 | CRC校驗 | |||||||||
id | 10 | 00 | 01 | 00 | 02 | 04 | 00 | 0A | 01 | 02 | crcl | crch | ||||
響應: | 設備號 | 功能碼 | 寄存器起始地址 | 寄存器單元長度 | CRC校驗 | |||||||||||
id | 10 | 00 | 01 | 00 | 02 | crcl | crch | |||||||||
輸入寄存器 Input Register(30001 - 39999) 16位 只讀 |
0x04 | 讀輸入寄存器 | 示例:讀取輸入寄存器0x0009單元的值,現場數據為0x000A | |||||||||||||
請求: | 設備號 | 功能碼 | 寄存器起始地址 | 寄存器單元長度 | CRC校驗 | |||||||||||
id | 04 | 00 | 08 | 00 | 01 | crcl | crch | |||||||||
響應: | 設備號 | 功能碼 | 字節數 | 數據 | CRC校驗 | |||||||||||
id | 04 | 02 | 00 | 0A | crcl | crch | ||||||||||
有人擴展指令(本擴展指令非Modbus RTU標準,僅適用于設備與有人云網絡通訊的規則) | ||||||||||||||||
為什么要做擴展指令 | 由于Modbus RTU協議適用于半雙工的總線協議,只能一問一答,服務器做主機,接入設備做從機,可以實現主機主動采集和控制。 但由于網絡通訊考慮流量、服務器并發量、網絡延遲等原因,無法實現類似在總線中毫秒級的輪詢讀取,而網絡通訊屬于全雙工,能夠同時雙向對話,故擴展指令提出支持從機狀態主動上報的規則。 |
|||||||||||||||
應用場景1 從機主動上報狀態 |
如Modbus協議的環境控制器,服務器做主機10分鐘輪詢采集,但若前端人工主動控制,服務器必須等到下個輪詢才能得知狀態變化。 利用擴展指令可實現人工主動控制,從機主動上報當前的狀態。 注:本協議僅適用于使用有人網絡模塊自主開發的產品,若在RS-485總線中使用,會造成總線混亂。 |
|||||||||||||||
應用場景2 低功耗通訊上報格式 |
如NB-IoT、Lora這類低功耗通訊方式,低功耗模式僅支持主動向服務器上報,上報后斷電斷網休眠,此時服務器無法做主機主動采集數據。 利用擴展指令格式主動上報數據解決上述問題,服務器按照Modbus協議解析,完成后面的數據存儲、報警、推送等功能。 補充:NB-IoT在高功耗模式下也可支持云端主動下發查詢指令。 |
|||||||||||||||
寄存器單元(十進制) | 功能碼 | 作用 | 請求及響應格式 | |||||||||||||
線圈寄存器 CoilStatus (00001 - 09999) 1位 讀寫 |
0x45 | 上報多個線圈 | 示例:從0x0014開始寫入10個狀態值,數據內容為2個字節:十六進制CD 01(二進制 1100 1101 0000 0001) | |||||||||||||
(格式與寫多個線圈相同) | 請求: | 設備號 | 功能碼 | 寄存器起始地址 | 寄存器單元長度 | 字節數 | 數據 | CRC校驗 | ||||||||
id | 45 | 00 | 13 | 00 | 0A | 02 | CD | 01 | crcl | crch | ||||||
響應: | 設備號 | 功能碼 | 寄存器起始地址 | 寄存器單元長度 | CRC校驗 | |||||||||||
id | 45 | 00 | 13 | 00 | 0A | crcl | crch | |||||||||
離散寄存器 InputStatus(10001 - 19999) 1位 只讀 |
0x42 | 上報多個離散寄存器 | (格式與寫多個線圈相同) | |||||||||||||
保持寄存器 Holding Register(40001 - 49999) 16位 讀寫 |
0x46 | 上報多個保持寄存器 | 示例:將數據0x000A和0x0102寫入從0x0002開始的兩個寄存器單元 | |||||||||||||
(格式與寫多個保持寄存器相同) | 請求: | 設備號 | 功能碼 | 寄存器起始地址 | 寄存器單元長度 | 字節數 | 數據 | CRC校驗 | ||||||||
id | 46 | 00 | 01 | 00 | 02 | 04 | 00 | 0A | 01 | 02 | crcl | crch | ||||
響應: | 設備號 | 功能碼 | 寄存器起始地址 | 寄存器單元長度 | CRC校驗 | |||||||||||
id | 46 | 00 | 01 | 00 | 02 | crcl | crch | |||||||||
(暫不支持) 輸入寄存器 Input Register(30001 - 39999) 16位 只讀 |
(暫不支持) 0x44 |
(暫不支持) 上報多個輸入寄存器 |
(暫不支持,格式與寫多個保持寄存器相同) | |||||||||||||
注意和補充 | ||||||||||||||||
協議解釋: 1、數據、地址、長度等默認大端在前,但CRC校驗是小端在前(低字節在前)crcl crch; 2、有人擴展協議僅適用于設備與透傳云的網絡通訊層; |
||||||||||||||||