從一個設定值選擇正確功能
要寫入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。