一 來源與契約
要把模組診斷整理成故障紀錄,先分清來源。CPU自我診斷、智慧型模組緩衝記憶體和模組錯誤歷史不是同一張通用表。緩衝記憶體可能只有目前錯誤狀態,未必有事件時間與歷史序號。先盤點Q06UDVCPU實際連接的模組型號、位置與版本,再查每個模組自己的手冊。
最小證據是sourceType、slot、model、rawCode、rawWords、eventTime、readAt、readResult。eventTime是模組描述的發生時刻,readAt是收集器讀取時刻,分開保存才不會把延遲誤當故障時間。
| 欄位 | 用途 |
|---|---|
| sourceType | 來源分類 |
| slot/model | 定位版本 |
| rawCode/rawWords | 原始證據 |
| eventTime/readAt | 分開時間 |
建立來源規格時記錄欄位位址、字數、有號或無號、碼值進位、更新條件及清除行為。本文不提供尚未核對模組的通用位址;同一數字在不同模組可能代表不同事件,因此搜尋和翻譯都必須帶上型號與來源身份。
再確認一次讀取涵蓋的資料是否一致。歷史表可能在讀取期間新增或旋轉,先讀到的索引與後讀到的內容未必屬同一輪。依該模組已提供的穩定讀法或序號核對;沒有保證時保存開始與結束時間,把一致性限制列入紀錄。
二 原始層與批次
讀到資料先寫immutable raw record,再產生normalized record。原始層保存來源、槽位、字組、事件時間、讀取時間和結果;正規化層才加入severity和關鍵字。讀取失敗不可複製上一筆正常值,否則通訊中斷會被誤報成恢復。只有目前狀態時標snapshot,不可冒充歷史。
每次收集建立批次編號,原始觀察逐次保存。若來源確實提供不重複事件序號,事件身份可採控制器身份、模組身份、來源重啟世代及序號;同一身份重讀可在查詢層合併。只有碼值和低解析度時間時,兩次真實事件可能相同,不宜直接刪掉其中一筆。
| 欄位 | 例值 | 作用 |
|---|---|---|
| batchId | B2026-01 | 追收集批次 |
| 來源事件身份 | CPU-A/槽3/世代E2/序號17 | 只有已確認唯一性才合併 |
| collectorEpoch | E4 | 重啟分段 |
| readResult | OK/Timeout | 失敗不補值 |
不要把所有欄位用加號串成未定義字串作唯一鍵。分欄保存身份或使用有明確欄位邊界的結構,避免槽位與碼值組合碰撞。收集器重啟編號只描述收集器,不一定等於模組重啟;若模組序號會重置,需另記來源世代與其判定依據。
原始層保留每次讀取,查詢層再增加中文說明、類別及映射版本。發現先前翻譯錯誤時,用新映射重建檢視即可,不能把原始字組改成新的診斷碼。未認得的碼保留原值與待解碼標記,並附實際手冊版本。
三 案例與環形覆蓋
以下完全是假設模組契約,不是某一三菱模組的碼表:槽3來源世代E2、事件序號17、原始碼0x21,來源時間09:59:58.400。收集器於10:00:00.120與10:00:01.000各讀到同一身份。原始層有兩筆觀察,事件檢視一筆、觀察次數為二;這不代表故障發生兩次。
若模組採環形歷史,最新事件可能覆蓋最舊項目。讀取器要保存讀取順序、lastReadAt和缺口;事件序號倒退、指標跳動或時間缺口時標possibleOverwrite,不能因資料庫有一筆就宣稱模組從未覆蓋。槽5無事件時間時eventTime=null,不能把readAt冒充發生時間。
| 時間 | 來源 | 結果 |
|---|---|---|
| 09:59:58.400 | 假設來源事件17 | 事件時間 |
| 10:00:00.120 | 第一次收集 | 原始觀察一 |
| 10:00:01.000 | 再讀事件17 | 原始觀察二 |
| 10:00:03.000 | 槽5無來源時間 | 僅保存讀取時間 |
假設之後出現事件序號18,碼值仍為0x21,就必須作為另一事件。相反地,某個目前狀態字由異常改正常,只支持兩個觀察點之間狀態改變;來源沒有明確關聯時,不能擅自宣告它是事件17的恢復版本。狀態快照與事件生命週期分開處理。
若歷史序號由17跳到20,先查18與19是否屬同一完整事件流、是否有篩選、重啟或覆蓋。只有已確認連續規則才可計算缺失兩筆。把序號倒退一律寫成環形覆蓋也不對,來源重置同樣可能造成倒退。
四 查詢與失敗先查
查CPU-A槽3在09:59至10:01的來源事件時,以控制器與模組身份、來源事件時間的半開區間篩選,再顯示讀取時間。槽5若沒有事件時間,不會憑空落入來源時間查詢;另外提供收集時間查詢,清楚標示它回答的是何時讀到,而非何時發生。
搜尋不到事件先查資料是否由模組提供、讀取是否成功、槽位型號是否寫反、歷史是否已覆寫。只有目前狀態而無歷史時,提高輪詢頻率不能補回消失事件;應另存snapshot。不要把CPU自我診斷碼當模組碼,也不要把清除LED當刪除歷史。timeout、格式錯誤、權限拒絕和不支援要分開記錄。驗收用新事件、相同事件重讀、讀取失敗三筆。
| 查詢 | 條件 | 結果 |
|---|---|---|
| 槽位 | slot=3、時間區間 | 保留延遲 |
| 原始碼 | rawCode=0x21 | 跨映射版本 |
| 覆蓋 | quality=possibleOverwrite | 列缺口 |
第二種查詢是相同型號與原始碼的歷史分布。查0x21時同時限制來源型號及碼表版本,避免把別的模組同碼混成同一故障。先看事件數,再看原始觀察數;本例兩次重讀同一事件應分別顯示一個事件與兩次觀察。
測試查詢還要加入一次逾時。逾時紀錄包含批次與失敗原因,但沒有新讀到的診斷值,不能用上次正常值填入。畫面可另顯示最後可信值及其時間,必須明確標成舊資料,避免操作員誤以為模組剛回報正常。
五 FAQ與限制
交付附raw、正規化結果、mappingVersion、手冊版本、收集器版本和batchId。CSV保留十六進位前綴及null,不把Unknown轉成零。完成預期是事件可查、重讀不重複、覆蓋有警示、失敗可追溯。
問:所有模組共用一張CPU診斷表嗎?答:不共用,先查實際模組手冊及來源類型。
問:同碼同時間可直接去重嗎?答:不保證。時間解析度或重複發生會碰撞,先確認事件身份規則,原始觀察應保留。
問:沒有事件時間怎麼搜尋?答:可按收集時間搜尋,但不能稱為故障發生時間查詢。
問:翻譯文字可以取代原始字組嗎?答:不能。保留原始資料與映射版本,才能日後重新解讀。
限制是未核對欄位不可自動解碼,Q06UDVCPU、序號及智慧型模組組合可能不同。本文不宣稱SM、SD或指令通用。
參考:QnUCPU手冊 第3.17與3.18節 CPU自我診斷及錯誤歷史範圍;特定模組緩衝記憶體仍須另查模組手冊