AUTOMORPHSW Team

UDS $19 服務詳解:DTC 狀態位元組與子功能怎麼用

UDS $19 服務詳解:DTC 狀態位元組與子功能怎麼用

0x19 ReadDTCInformation 是 UDS 裡子功能最多、也最能體現「診斷」二字的服務。多數人只用過「把碼讀出來」,但 $19 真正的價值在狀態位元組與環境資料——它們回答的不是「有沒有故障」,而是「這個故障走到生命週期的哪一步、發生當下世界長什麼樣」。

本文是 UDS 是什麼 的深入篇。UDS 的 DTC 是 3 位元組(High/Middle/Low),與 OBD-II 的 5 碼格式不同——兩者的關係見 OBD2 是什麼

先懂狀態位元組:一個 DTC 的八個開關

每個 DTC 都帶著一個 8 位元的狀態位元組(DTC Status Byte),每一位元回答一個問題:

位元名稱回答的問題
bit 0testFailed此刻測試是失敗的嗎?
bit 1testFailedThisOperationCycle這個點火週期內失敗過嗎?
bit 2pendingDTC待定中(失敗過但還沒確認)?
bit 3confirmedDTC已確認(達到成熟化條件)?
bit 4testNotCompletedSinceLastClear清碼後這個測試還沒跑完過?
bit 5testFailedSinceLastClear清碼後失敗過嗎?
bit 6testNotCompletedThisOperationCycle本週期測試還沒跑完?
bit 7warningIndicatorRequested要求點亮警示燈嗎?

三個實務推論:

  1. testFailed=0 不代表沒問題——可能是條件還沒到(testNotCompleted),「沒測」與「測過沒事」是兩回事
  2. pending → confirmed 是成熟化機制:偶發一次不立刻定罪,連續幾個週期都失敗才確認——這套「防抖」邏輯正是測試要驗的重點
  3. 讀 DTC 時下的**狀態遮罩(Status Mask)**就是對這 8 位元做篩選:遮罩 0x08 =只要 confirmed 的

子功能地圖:常用的七個

子功能名稱用途
0x01reportNumberOfDTCByStatusMask符合遮罩的 DTC 有幾個(先問數量再撈明細)
0x02reportDTCByStatusMask依遮罩列出 DTC +狀態(最常用)
0x04reportDTCSnapshotRecordByDTCNumber快照(故障當下的環境資料)
0x06reportDTCExtDataRecordByDTCNumber擴充資料(發生次數、老化計數器等)
0x0AreportSupportedDTC這顆 ECU 支援哪些 DTC(測試的母集合)
0x14reportDTCFaultDetectionCounter故障偵測計數器(走向成熟的過程值)
0x03reportDTCSnapshotIdentification有哪些快照可讀

**快照(Snapshot/Freeze Frame)**是除錯金礦:DTC 確認的那一刻,ECU 把預先定義的一組環境值(車速、電壓、溫度、運轉狀態)凍結存檔。三個月後客訴進來,快照就是「案發現場的照片」。**擴充資料(Extended Data)**則記錄生命週期統計——發生次數、老化倒數(healing counter)——判斷「偶發還是慢性」靠它。

測試視角:$19 案例最常漏的四件事

  1. 成熟化與去成熟化路徑:注入故障 N 個週期 → confirmed;恢復正常 M 個週期 → 老化清除。N 與 M 的邊界(N-1 個週期會怎樣?)是規格對不對得上實作的試金石
  2. 快照內容的正確性:不只驗「讀得到」,要驗凍結的值是不是故障當下的值(時序問題會凍到錯的瞬間)
  3. 遮罩組合:0x02 帶不同遮罩的回應集合要互相一致(pending ∪ confirmed ⊆ supported)
  4. 與 $14 清碼的互動:清碼後所有狀態位元的重置行為、testNotCompletedSinceLastClear 的翻轉

一顆 ECU 幾百個 DTC,每個都有這套生命週期——這就是 $19 測試必須從 CDD 規格自動生成的原因(CANoe.DiVa 的做法),人工窮舉在數學上就不可行。


下一步

從 DTC 規格定義(CDD)到 $19 全子功能的自動化驗證,歐特莫夫(Vector Informatik 合作夥伴)協助把診斷測試建成可回歸的資產。