← 所有文章

Modbus寫入功能05 06 0F 10的選用與回讀

· 站長

用十點線圈與三個寄存器的離線封包,教你選05、06、0F、10,確認位元排列、長度、正常回覆及寫入逾時後的回讀。

從一個設定值選擇正確功能

要寫入Modbus設備,先確定目標是線圈還是Holding Register,再決定單點或連續多點功能。畫面上的開關不一定對應Coil,也可能是寄存器某個位元;畫面上的溫度設定也不代表可把小數直接塞進一個十六位欄位。先取得設備的位址、權限、資料型別、倍率與允許範圍,才能選功能。

功能碼十六進位 目標 請求數量 正常回覆重點
05 單一Coil 一點 回送位址及FF00或0000
06 單一Holding Register 一個word 回送位址與寫入值
0F 連續Coils 1至1968點 起始位址與點數
10 連續Holding Registers 1至123個word 起始位址與word數

表中是標準封包上限,設備可能只支援其中幾種,或允許更小的數量。本文的10表示十六進位0x10,也就是十進位16;不要與十進位10混用。所有封包均是自訂離線PDU,不含RTU站號與CRC,也不含TCP MBAP,不可直接當完整訊框發送。

本篇練習以隔離測試資料區為對象。先保存原值,再訂出成功、逾時及復原的判定,避免把設定值、清零命令與實體輸出混在同一套重試規則。測試區的用途必須由實際設備文件確認,不能看位址空白就自行認定可寫。

單點與多點線圈怎麼編碼

功能05的ON編碼是FF 00,OFF是00 00;不是以00 01表示ON。自訂PDU位址0020h的一點開啟請求為05 00 20 FF 00,正常回覆回送同樣五個位元組。回覆內容正確仍需核對交易身分,避免把本機回音或前一筆晚到資料當成新成功。

功能0F把連續線圈以位元打包。第一個位址對應第一資料位元組的最低有效位,後續依序向高位放置,超過八點才進下一位元組。最後一個位元組未使用的高位填零。它一次指定一段連續點,不是任意位址和值的清單。

自訂十點寫入 內容 核對方法
起始PDU位址 0030h 對照設備零基準欄位
依位址順序十點 1 0 1 1 0 0 0 1 1 0 前八點反向寫成二進位10001101
資料位元組 8D 01 第九點是第二byte的bit0
Byte Count 02 十點除八向上取整
正常回覆 0F 00 30 00 0A 回送起點及十點數量

完整教學PDU為0F 00 30 00 0A 02 8D 01。若回讀第一點不對,先看最低位對應起始位址的規則;若前八點都對而第九點錯,查第二個位元組和點數。不要只改顯示順序把錯誤藏起來。多點寫入會影響範圍內所有點,某些點要保留時必須另行規劃,不能用零代表略過。

三個寄存器的寫入與回讀練習

自訂三個可讀寫測試寄存器0020h、0021h、0022h,全部為無號十六位整數,目標依序100、200、300。因位址連續且權限一致,使用功能10寫三個word。資料量是六個位元組,每個word先高byte再低byte;十進位300轉成012Ch,資料便是01 2C。

階段 離線PDU 應確認
寫入請求 10 00 20 00 03 06 00 64 00 C8 01 2C 三word和六byte一致
正常回覆 10 00 20 00 03 只有起點與數量,沒有三個值
讀回請求 03 00 20 00 03 同一資料區與同一範圍
預期讀回 03 06 00 64 00 C8 01 2C 解碼後100、200、300

若只有0021h要設200,可用06 00 21 00 C8;正常PDU回送相同內容。若0021h實際是保留區,就不能為了省交易,把0020h與0022h包成三word一起寫。對跨兩word的數值還要確認寄存器排列與一次寫入規則,標準的每word高byte先傳不等於所有Float32都有相同word順序。

先用紙上表格逐欄比對請求數量、Byte Count及資料長度,再對允許的測試區操作。完成後應同時保存正常回覆、讀回原始值、轉換後工程值與時間戳。不能只看軟體跳出綠色成功字樣,就略過位址差一碼的可能性。

結果不確定時如何收尾

若寫入逾時,只能確定未在期限內收到有效回覆;請求可能未送達,也可能已執行而回覆遺失。此時把交易標成結果待確認,先按設備允許方式讀回或查完成狀態。對開始動作、清零或累加命令,不可用無限重送來求一個正常回覆。即使設定同值看似可重複,設備也可能有寫入副作用。

寄存器讀回與目標相同,證明的是該次讀取所得內容符合目標。它不證明加熱器已到溫、馬達已停止,也不保證設定已存入斷電保持記憶體。把通訊回覆、設定回讀、設備完成狀態分成三個條件,依實際功能選擇需要哪些條件才能顯示完成。

現象 先查 避免的誤判
回覆例外01 功能支援與模式 把不支援當線路不良
例外02 起點及整段範圍 只核對第一個位址
例外03 數量與資料結構及設備規則 把所有錯誤都當倍率錯
回覆正常但回讀不同 其他寫入者及設備自動更新 立即反覆覆寫
連線斷開或CRC失敗 交易記錄及結果待確認 認定設備一定未執行

若使用串列廣播,必須另外按串列規範和設備能力設計:廣播寫入沒有逐站正常回覆,不能套用單播等待成功的流程。新手測試先以指定單一設備的單播完成驗證,再評估廣播的適用性與等待時間。TCP的Unit ID欄位也不能直接拿來推定相同廣播行為。

復原時也要保留原設定與變更記錄。若原值已由其他操作員更新,不要把測試前的舊值無條件寫回;先確認目前擁有寫入權的人員與設備模式,再依維護程序還原。

FAQ與適用型號限制

FAQ1:把一點ON寫成0001可不可以?功能05的標準ON是FF00。若設備寄存器用整數一表示啟用,那是另一種資料模型,應按該寄存器文件選06或10,不能混成線圈編碼。

FAQ2:多點寫入較省時間就一定比較好?先確定全段連續、可寫及沒有保留洞。一次交易也不代表機械動作同步,更不能推論跨寄存器更新對所有外部觀察者都是原子的。

FAQ3:功能10回覆沒有資料,怎麼確認值?比對回覆的功能、起點和數量,再按權限讀回。若目標為只寫命令區,改用手冊提供的狀態,不能自行發明回讀位址。

FAQ4:123個寄存器和1968個線圈可否直接套所有設備?這是協定上限;實際支援量、閘道限制、PLC通訊緩衝和逾時預算還要各自確認,取所有限制中可成立的範圍。

本文適用於能取得Modbus映射表的客戶端實作與封包判讀,未指定某型PLC的指令或裝置位址。Q06UDVCPU搭配QJ71C24N時,仍須確認實際Modbus程式及串列通道設定,不能因CPU或模組名稱相同就視為本文PDU可直接呼叫。所有數值為離線練習。

參考:Modbus Application Protocol V1.1b3,第6.5、6.6、6.11、6.12節及例外回覆。

參考:Modbus官方規範索引,串列廣播須另查Serial Line V1.02。

延伸閱讀


使用 PLC 工具箱 →