UDS 診斷教程(五)
這篇文章介紹 Stored Data Transmission (存儲數(shù)據(jù)傳輸,用于操作 DTC)這一類診斷服務(wù),涉及到兩條診斷命令,分別是:
0x14:ClearDiagnosticInformation
0x19:ReadDTCInformation
這兩條服務(wù)用于操作存儲在 ECU 中的 DTC,使用頻率很高,而且它們比較好地體現(xiàn)了“診斷”兩個字的含
義。
0x14:ClearDiagnosticInformation
這條診斷命令的格式比較簡單,用法也很好理解,即刪除存儲在 ECU 中的 DTC。

第一個字節(jié)就是 SID 了,后邊的三個字節(jié)用于標(biāo)識將要被刪除的 DTC 種類,UDS 規(guī)定用 FF FF FF 表示
所有種類的 DTC,由廠家自定義代表 Powertrain、Chassis、、Body、Network Communication 等種類
DTC 的值。
比如,14 FF FF FF 這條指令表示的就是刪除掉 ECU 中的所有 DTC。ECU 只需要返回一個 0x54 表示成
功執(zhí)行即可。
0x19:ReadDTCInformation
這條指令用于讀取存儲在 ECU 中的 DTC,它的格式如下

0x19 服務(wù)的 sub-function 代表了各式各樣讀取 DTC 的方法,UDS 給 19 服務(wù)的 sub-function 從 0x00 到
0x19 進(jìn)行了明確定義,我只使用過其中 4 種,下面對我用過的這些進(jìn)行介紹,如果大家對其他的感興趣,
可以查閱 ISO 14229 的定義。
sub-function = 0x01? (reportNumberOfDTCByStatusMask )
sub-function = 0x01 用于讀取符合特定條件的 DTC 數(shù)量,此時 parameter 為一個 byte 的 Mask,用于與
DTC 的 Status 進(jìn)行“與”運(yùn)算,而 ECU 返回的則是"與"運(yùn)算之后結(jié)果不為 0 的 DTC 的數(shù)量。DTC 的
Status 用一個 byte 表示,其中的 8 個 bit 分別代表 DTC 的不同狀態(tài),比如,bit 0 表示這個 DTC 是
active 的還是 passive 的,bit 4 表示這個 DTC 是否已經(jīng)被 confirm 了,如果 DTC 的狀態(tài)是 confirm,則
說明該 DTC 已經(jīng)被 ECU 存儲下來了。
比如:19 01 08 這個命令的用途,就是讀取所有狀態(tài)為 confirm 的 DTC 的數(shù)量。
sub-function = 0x02? (reportDTCByStatusMask )
sub-function = 0x02 用于讀取符合特定條件的 DTC 列表,此時 parameter 仍然為一個 byte 的 Mask,用
于與 DTC 的 Status 進(jìn)行“與”運(yùn)算,而 ECU 返回的則是"與"運(yùn)算之后結(jié)果不為 0 的 DTC 列表。
比如 19 02 01 這個命令的用途,就是讀取所有狀態(tài)為 active 的 DTC 的數(shù)量。此時 ECU 返回的格式應(yīng)該
是 59 02 01 XX XX XX 01 YY YY YY 09......。返回的 DTC 列表中的每個條目為 4 個字節(jié),前三個字節(jié)用
于標(biāo)識 DTC,比如 XX XX XX,最后一個字節(jié)用于標(biāo)識 DTC 狀態(tài),比如 01,表示 DTC 是 active 的,09
表示 DTC 是 active 且 confirm 的。
sub-function = 0x06? (reportDTCExtDataRecordByDTCNumber )
sub-function = 0x06 用于讀取某個 DTC 及其相關(guān)的環(huán)境數(shù)據(jù),此時 parameter 為 4 個 byte,前三個
byte 用于標(biāo)識我們要讀取的 DTC,第四個 byte 用于標(biāo)識要讀取的環(huán)境數(shù)據(jù)的范圍,UDS 規(guī)定使用 FF 來
表示讀取所有的環(huán)境數(shù)據(jù),各廠家可以要根據(jù)自己的需求定義其他的值來代表要讀取的環(huán)境數(shù)據(jù)的范圍。
環(huán)境數(shù)據(jù)包括 DTC 狀態(tài),優(yōu)先級,發(fā)生次數(shù),老化計數(shù)器,時間戳,里程等,廠家還可以根據(jù)自己的需
求定義一些此 DTC 產(chǎn)生時的測量數(shù)據(jù)。
比如 19 06 XX XX XX FF 就表示讀取 XX XX XX 這個 DTC 的所有環(huán)境數(shù)據(jù),ECU 的返回值應(yīng)該是 59
06 XX XX XX AA BB CC DD.....,其中 AA BB CC DD...代表的就是 XX XX XX 這個 DTC 產(chǎn)生時所一起
存儲的環(huán)境數(shù)據(jù)。
sub-function = 0x0E (reportMostRecentConfirmedDTC )
sub-function = 0x0E 時,不需要 parameter。0x0E 表示,要求 ECU 上報最近的一條被置為 confirm 的
DTC。我在《統(tǒng)一診斷服務(wù) (Unified diagnostic services , UDS) (三)》一文中介紹過 0x86 服務(wù),
sub-function = 0x0E 的 19 服務(wù)通常被作為參數(shù)傳遞給 86 指令,要求 ECU 在發(fā)生 DTC 存儲的時候進(jìn)行
自動上報,即 19 0E 這兩個字節(jié)的指令被嵌入到 86 服務(wù)的命令中。這條命令在開發(fā)階段會用到,比如驗
證某個故障路徑是否生效。
關(guān)于處理 DTC 的 UDS 服務(wù)就介紹這么多,如有疑問歡迎留言交流指正。