1. 程式人生 > >統一診斷服務 (Unified diagnostic services , UDS) (五)

統一診斷服務 (Unified diagnostic services , UDS) (五)

這篇文章介紹Stored Data Transmission (儲存資料傳輸,用於操作DTC)這一類診斷服務,涉及到兩條診斷命令,分別是:

0x14:ClearDiagnosticInformation

0x19:ReadDTCInformation

這兩條服務用於操作儲存在ECU中的DTC,使用頻率很高,而且它們比較好地體現了“診斷”兩個字的含義。

0x14:ClearDiagnosticInformation

這條診斷命令的格式比較簡單,用法也很好理解,即刪除儲存在ECU中的DTC。

0x14診斷命令請求的格式

第一個位元組就是SID了,後邊的三個位元組用於標識將要被刪除的DTC種類,UDS規定用FF FF FF表示所有種類的DTC,由廠家自定義代表Powertrain、Chassis、、Body、Network Communication等種類DTC的值。

比如,14 FF FF FF這條指令表示的就是刪除掉ECU中的所有DTC。ECU只需要返回一個0x54表示成功執行即可。

0x19:ReadDTCInformation

這條指令用於讀取儲存在ECU中的DTC,它的格式如下

0x19診斷命令請求的格式

0x14診斷命令請求的格式

0x19服務的sub-function代表了各式各樣讀取DTC的方法,UDS給19服務的sub-function從0x00到0x19進行了明確定義,我只使用過其中4種,下面對我用過的這些進行介紹,如果大家對其他的感興趣,可以查閱ISO 14229的定義。

sub-function = 0x01 (reportNumberOfDTCByStatusMask)

sub-function = 0x01用於讀取符合特定條件的DTC數量,此時parameter為一個byte的Mask,用於與DTC的Status進行“與”運算,而ECU返回的則是"與"運算之後結果不為0的DTC的數量。DTC的Status用一個byte表示,其中的8個bit分別代表DTC的不同狀態,比如,bit 0 表示這個DTC是active的還是passive的,bit 4表示這個DTC是否已經被confirm了,如果DTC的狀態是confirm,則說明該DTC已經被ECU儲存下來了。

比如:19 01 08這個命令的用途,就是讀取所有狀態為confirm的DTC的數量。

sub-function = 0x02 (reportDTCByStatusMask)

sub-function = 0x02用於讀取符合特定條件的DTC列表,此時parameter仍然為一個byte的Mask,用於與DTC的Status進行“與”運算,而ECU返回的則是"與"運算之後結果不為0的DTC列表。

比如19 02 01這個命令的用途,就是讀取所有狀態為active的DTC的數量。此時ECU返回的格式應該是59 02 01 XX XX XX 01 YY YY YY 09......。返回的DTC列表中的每個條目為4個位元組,前三個位元組用於標識DTC,比如 XX XX XX,最後一個位元組用於標識DTC狀態,比如01,表示DTC是active的,09表示DTC是active且confirm的。

sub-function = 0x06 (reportDTCExtDataRecordByDTCNumber)

sub-function = 0x06用於讀取某個DTC及其相關的環境資料,此時parameter為4個byte,前三個byte用於標識我們要讀取的DTC,第四個byte用於標識要讀取的環境資料的範圍,UDS規定使用FF來表示讀取所有的環境資料,各廠家可以要根據自己的需求定義其他的值來代表要讀取的環境資料的範圍。環境資料包括DTC狀態,優先順序,發生次數,老化計數器,時間戳,里程等,廠家還可以根據自己的需求定義一些此DTC產生時的測量資料。

比如 19 06 XX XX XX FF就表示讀取 XX XX XX這個DTC的所有環境資料,ECU的返回值應該是59 06 XX XX XX AA BB CC DD.....,其中AA BB CC DD...代表的就是XX XX XX這個DTC產生時所一起儲存的環境資料。

sub-function = 0x0E(reportMostRecentConfirmedDTC)

sub-function = 0x0E時,不需要parameter。0x0E表示,要求ECU上報最近的一條被置為confirm的DTC。我在《統一診斷服務 (Unified diagnostic services , UDS) (三)》一文中介紹過0x86服務,sub-function = 0x0E的19服務通常被作為引數傳遞給86指令,要求ECU在發生DTC儲存的時候進行自動上報,即19 0E這兩個位元組的指令被嵌入到86服務的命令中。這條命令在開發階段會用到,比如驗證某個故障路徑是否生效。

關於處理DTC的UDS服務就介紹這麼多,如有疑問歡迎留言交流指正。