
什么是Modbus功能碼?
簡單來說,功能碼是Modbus協議的核心指令集,用來告訴從站設備(Slave)具體執行什么操作。它們通常由一字節(8位)表示,范圍為0x01(1)到0x7F(127),其中常用的功能碼集中在0x01到0x10之間。功能碼分類清晰,既適用于讀(Read)操作,也支持寫(Write)操作。
為了讓這部分更直觀,我們先來看下面的功能碼表:

0x01到0x04:數據讀取功能碼
這四個功能碼主要用于讀取不同類型的數據,適用于從設備中獲取傳感器狀態、寄存器數據等。
◆0x01-讀線圈狀態
描述:讀取數字量輸出(DO)接點的狀態,即線圈的通電和斷電狀態。線圈是二進制值開關型數據(例如繼電器狀態:開/關)。主設備發送查詢幀,指定要讀取的線圈地址范圍,從站返回對應狀態數組。
案例場景: 若你需要查看PLC控制中的特定燈泡是否點亮,就可使用這個功能碼讀取燈的線圈狀態。
◆0x02-離散輸入
描述:讀取數字量輸入(DI)接點的狀態(與功能碼0x01類似,但讀取的是DI接點)。與線圈類似,但“離散輸入”是只讀的狀態數據,常用于讀取傳感器的開關信號。
◆0x03-讀保持寄存器
描述:這是Modbus中最常用的功能碼之一,用于讀取存儲在保持寄存器里的模擬量(例如溫度值、電表讀數)。支持16位無符號整數。
案例場景: 你可以用此功能碼讀取現場溫度傳感器的實時溫度數據。
◆0x04-讀輸入寄存器
與0x03相似,但用于只讀寄存器(例如設備自帶的計量數據或傳感器固定參數)。
0x05到0x10:數據寫入功能碼
與讀取功能碼對應,這部分功能碼用于向從設備發送指令,進行數據寫入或修改。
◆0x05-寫單個線圈
這個功能碼允許主設備改變某個線圈的狀態(開/關)。常見于控制場景,比如啟動一個電機或關掉一個燈。
◆0x06-寫單個寄存器
用來修改特定寄存器的值。例如將一個控制閥開度設為50%。
◆0x0F-寫多個線圈
支持對多個連續線圈一次性進行改寫,可通過減少幀通信次數提升效率。
案例場景: 批量控制多個電機同時啟動或停止。
◆0x10-寫多個寄存器
這是寫操作中最高效的功能碼之一,支持一次性向多個寄存器寫入數據。適用于復雜場景,例如配置設備的多個工作參數。
Modbus功能碼的應用案例
假設需要采集一個設備中溫度傳感器和壓力變送器數據,并同時控制若干個伺服電機的運行:
1、可以用0x03讀取溫控模塊的加熱溫度,用0x04讀取壓力變送器數據。
2、再通過0x05控制電機線圈的啟動,用0x10一次性配置多個寄存器的速度及運行參數。
通過合理選擇Modbus功能碼,可以大幅提升設備的通信效率和控制性能。
Modbus功能碼選擇的注意事項
1、兼容性檢查:某些設備并不支持完整的功能碼,需要查閱設備手冊。
2、通信效率:用批量操作(如0x0F和0x10)替代單一操作(如0x05和0x06)可以減少通信次數,提升運行速度。
3、錯誤處理:當設備無法執行功能碼指令時,將返回異常代碼,需要在程序中妥善處理以防止中斷。
從0x01到0x10的Modbus功能碼幾乎涵蓋了讀寫操作的所有基礎場景。對每個Modbus功能碼及其適用場景的熟練掌握,是高效構建工業通信系統的基礎。它不僅提高了設備間的交互效率,還能讓故障排查和診斷更加快捷。