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

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