診斷功能不一定只是讀取
你想知道線路為什麼出錯,第一步通常是保存目前狀態。若先按清除計數器,原本能說明故障頻率與累積時間的證據就消失了。Modbus 0x08把多種診斷放在同一個功能碼下面,真正決定動作的是後面的兩位元組子功能。只在操作畫面寫「Diagnostics」不足以判斷它是否改變設備狀態。
官方V1.1b3將0x08標為Serial Line only。不要因一台設備有Modbus TCP端口,就假定該端口支援串列診斷;透過閘道傳遞是否可用,也需由閘道與下游手冊共同確認。實際PLC若由自訂通訊程式組包,仍要另查程式的發送條件、互斥、逾時和接收檢查。
| 類別 | 子功能例(十六進位) | 操作前判斷 |
|---|---|---|
| 回送資料 | 0000 | 可測試請求與回覆路徑,仍需支援證據 |
| 讀取資訊 | 0002、000B、000C | 確認欄位、計數定義與重置起點 |
| 改變通訊狀態 | 0001、0004 | 可能重啟或停止正常回覆 |
| 清除累積資訊 | 000A、0014 | 先保存故障資料與清除原因 |
不要遍歷全部子功能來試哪一個能用。表中的分類是挑選診斷方法的起點;保留碼、未知碼及原廠未支援的子功能都應留在待確認欄。若維修工具只有一個整數輸入框,先看它使用十進位還是十六進位,避免把十進位10與十六進位10當成同一個子功能。
先用回送案例學會逐欄核對
離線建立一筆回送PDU:08 00 00 12 34。08是功能碼,00 00是Return Query Data,12 34是本例希望原樣回傳的兩個位元組。預期正常PDU也是08 00 00 12 34。這個案例只驗證回送結構,不讀Holding Register,不把1234當成某個PLC的D裝置地址。
| 欄位 | 請求 | 預期正常回覆 | 檢查 |
|---|---|---|---|
| 功能碼 | 08 | 08 | 不是88例外回覆 |
| 子功能 | 00 00 | 00 00 | 兩個位元組都相同 |
| 本例資料 | 12 34 | 12 34 | 逐位元組比較,勿交換 |
| 傳輸封裝 | 本表未含 | 本表未含 | RTU另含站號與CRC |
收到相同字串也先別急著宣布設備正常。有些串列轉換器或測試配置會把本地發送回送到接收端;要先確認沒有local echo,把實際站號、收發方向及遠端回覆時間一併保存。若回送測試通過,只能支持該條件下這一筆診斷交易成立,不代表所有功能碼、全部站點或長時間負載都正常。
離線反例:請求資料12 34,收到08 00 00 34 12。長度相同、功能碼相同仍不可接納,因為資料被交換。另收到88 01時,應記錄例外回覆並查功能或子功能支援度;不能把最後01解成診斷計數一。完全沒有回覆則先查支援、站號、串列格式及工具回送設定,不反覆送出其他會改狀態的子功能。
計數器要看增量 也要知道從何時開始
累積值1000本身不告訴你最近一分鐘是否惡化。建立基線時,至少記錄讀取時間、設備身分、子功能、原始十六進位資料、換算值、最近重啟或清除時間。各計數器統計的對象不同:總線上看見的訊息、本站處理的訊息、CRC錯誤與例外回覆不可混用。計算錯誤率前,先確認分子與分母具有相同觀察期間和統計母體。
| 自訂觀察項目 | 10:00讀值 | 10:01讀值 | 區間增量 |
|---|---|---|---|
| 本站記錄的總線訊息計數 | 1000 | 1120 | 120 |
| CRC錯誤計數 | 8 | 11 | 3 |
| 例外回覆計數 | 2 | 2 | 0 |
| 已知重啟/清除事件 | 無 | 無 | 仍須查紀錄是否完整 |
本例可說一分鐘內CRC錯誤計數增加3、訊息計數增加120。若要算3÷120=2.5%,必須先確認該產品訊息計數的收錄規則是否包含出錯訊框;否則只保存兩個增量,不把這個比例冠上「封包錯誤率」。診斷查詢本身也會增加通訊負載與某些計數,測試時要保持相同查詢方式。
再看溢位反例。假設產品明確定義16位元無號循環計數,從65530變成9,而且期間最多一次繞回、沒有重啟或清除,增量為65536−65530+9=15。若產品採飽和計數,或資料不足以排除重啟,就不能套此公式。讀值變小時先標記基線失效,查電源、重啟紀錄及清除操作,再決定是否可延續統計。
把會改狀態的操作另列程序
0004 Force Listen Only Mode會令設備進入只監聽、不作一般回覆的狀態,而且該操作本身沒有正常回覆。它不是適合隨手測試的「讀診斷」。若維修工具曾使用這個功能,後續逾時不能只歸咎於接線。依官方與設備文件確認0001 Restart Communications Option的恢復方式、事件清除及回覆條件,不能把設備所有逾時都用重啟來處理。
000A清除計數器及診斷暫存器,0014清除overrun相關計數與旗標,兩者範圍不同。需要清除時,先匯出原值、操作人、原因、設備時間與主站時間,再另建一個新觀察區間。不要把清除前後的值直接相減,也不要宣稱清除計數本身修好了線路。清完後不再增加錯誤才是值得追查的觀察,仍須相同工況驗證。
| 程序階段 | 完成後應看到 | 失敗時先查 |
|---|---|---|
| 只讀基線 | 原始PDU與各計數值能追溯 | 子功能是否支援、資料長度 |
| 人工核准變更 | 操作效果與恢復方式已確認 | 是否會重啟、清除或停止回覆 |
| 新區間觀察 | 新起點、相同負載與查詢頻率 | 是否混用清除前後資料 |
| 交接報告 | 前後比較與未確認事項分開 | 只有結果截圖而無條件紀錄 |
使用測試替身可先驗證報告程式:餵入正常增量、單次繞回、重啟後歸零、例外回覆和逾時五種紀錄。正常增量應可計算;其他狀況要依明訂條件給出數值或「不可比較」。不得因缺少資料就把錯誤計數填零,否則畫面看起來乾淨,實際上只是診斷失去連線。
FAQ與型號限制
FAQ1:功能碼08就是讀診斷暫存器嗎?不是。需再看兩位元組子功能;其中有回送、讀計數,也有改狀態及清除操作。
FAQ2:回送成功可以證明數值縮放正確嗎?不能。回送並未檢驗量測寄存器的倍率、型別或字序,這些仍要用設備資料表和已知輸入核對。
FAQ3:計數器降到零表示修好了嗎?不一定。設備可能重啟或被清除,必須重建觀察起點;沒有回覆時更不能把計數當零。
FAQ4:所有Modbus TCP設備都能送08嗎?不能推定。官方章節限定串列用途,產品或閘道是否提供轉送與擴充須查原廠文件。
本篇沒有指定目標從站、韌體或某個PLC程式,不能宣稱任何現場設備已支援全部子功能。以Q06UDVCPU搭配QJ71C24N時,還需核對實際通訊程式是否實作Modbus、可組送哪些PDU、如何轉呈例外與逾時;本篇不提供未經專案核對的緩衝記憶體位址或指令。
參考:Modbus Application Protocol V1.1b3,6.8與6.8.1:串列診斷、子功能及回覆條件。