上一篇我們聊了Modbus最常用的四個讀取數據的功能碼,它們分別是:
● 01(讀線圈): 讀取設備內部用于控制輸出的開關狀態,比如燈亮不亮。
● 02(讀離散輸入):讀取設備接收到的外部開關信號,比如按鈕是否被按下。
● 03(讀保持寄存器): 讀取設備內部的配置參數或設定值,比如設定溫度或目標轉速。
● 04(讀輸入寄存器):讀取設備的實時測量數據或動態運行狀態。
今天我們一起來看看寫入數據的功能碼。畢竟工控嘛,只能看不能控可不行,對吧?
Modbus功能碼人話版
功能碼05 - 寫單個線圈
(Write Single Coil)
有時也被稱為強制單線圈(Force Single Coil),但還是“寫單個線圈”這個說法更好理解。
還記得功能碼01是用來讀取開關量的嗎?那功能碼05就是用來改變這個開關量狀態的。
這就好比你對智能家居下達指令:"把客廳的燈打開!"或者"把空調關掉!"
● 寫入值 = 0xFF00 表示開(ON)
● 寫入值 = 0x0000 表示關(OFF)
以上兩個值是Modbus協議推薦的值。為什么不是直接用1和0呢?這是為了提高數據傳輸的可靠性,用相差較大的特殊數值來確保指令的準確性。
實際使用中,設備支持的寫入值應以說明書為準。
功能碼06 - 寫單個保持寄存器
(Write Single Register)
還記得功能碼03可以讀取保持寄存器的值嗎?功能碼06就是用來修改這些值的。請注意,修改的一般是設備參數或設定值。
例如:
● 把空調的目標溫度從25度改成26度
● 把傳送帶的目標速度從50轉/分鐘改成60轉/分鐘
它就像是一個"設定按鈕",每次只能調整一個參數。
功能碼15 - 寫多個線圈
(Write Multiple Coils)
功能碼05每次只能控制一個開關,而Modbus協議是請求-響應這種一問一答式的協議,當需要控制多個狀態時,多次一問一答很低效。
功能碼15則可以一次性控制多個開關。
想象一下這個場景:
你要回家了,想一次性關掉公司所有的燈。與其一個個關(用功能碼05發送多次),不如用功能碼15一次性發送"全部關閉"的指令,既快速又高效。
而且,功能碼15支持混合狀態設置,說人話就是,同一條報文中,可以靈活設置多個開關量的不同狀態,不一定非要全部開啟或全部關閉。
例如,1、3、5號燈開,2、4、6號燈關。這樣的控制方式功能碼15同樣支持。
功能碼16 - 寫多個保持寄存器
(Write Multiple Registers)
同樣的道理,功能碼16是功能碼06的"批量版本"。它能一次性修改多個參數值。
舉個例子:空調系統需要同時設置:
● 目標溫度
● 風速大小
● 運行模式
● 定時時間
用功能碼16就能一次性搞定,不用發送四次功能碼06的寫入命令。
極簡總結
Modbus協議的功能碼可以按照讀取和寫入兩大類分類:
01~04都是用于讀取數據:
● 01 讀取開關量
● 02 讀取外部開關信號
● 03 讀取設備設定參數
● 04 讀取實時測量數據
05,06,15,16用于寫入數據:
● 05 寫單個開關量
● 15 寫多個開關量
● 06 寫單個設定值
● 16 寫多個設定值
看到這里你或許會有疑問,為什么介紹完05和06直接就跳到15和16了?07~14這些功能碼呢?16之后還有沒有了?
共0條 [查看全部] 網友評論