統一診斷服務 (Unified diagnostic services , UDS) (六)
這篇文章將介紹InputOutputControlByIdentifier (0x2F) 和RoutineControl (0x31) 這兩個診斷服務的用途和用法。它倆的作用有點類似,都是調用ECU內部一些預定義的操作序列,相當於是我們從外部利用診斷手段控制ECU的介面。
InputOutputControlByIdentifier (0x2F)
ECU簡單來說就是一個對輸入(sensor)進行計算再產生輸出(actuator)的系統。2F這個服務就是對ECU的輸入和輸出進行控制。這個服務在生產線上會需要使用,比如,在總裝階段,工人需要驗證車上的各種功能是否正常,例如四個車窗的升降是否正常,如果挨個開關去按,那效率很低,如果通過一個診斷命令就能夠觀察到車窗升降的情況,效率則高得多。
比如,ECU接收一個輸入信號A,我們就可以利用2F給這個A賦個我們需要的值;ECU對某個執行器B進行控制,我們就可以利用2F服務再配上某些特定的參數來實現對B的控制,例如門控對車窗升降、後視鏡摺疊等的控制。
2F服務的request由4部分組成
- SID
- dataIdentifier,用於標識被控制的IO對象
- controlOptionRecord,用於標識控制方式,比如是啟動、停止控制,還可以有一些自定義的參數來進行更精準的控制,比如讓某個執行器的動作持續多長時間。controlOptionRecord又分為兩部分,分別是1個byte的inputOutputControlParameter,以及若干byte由廠家自定義使用的controlState。
- controlEnableMaskRecord,這是一個可選參數,用於標識controlOptionRecord中的哪些parameter被使用。
UDS明確定義了四種inputOutputControlParameter
0x00 returnControlToECU (將控制權還給ECU,即結束控制)
0x01 resetToDefault (將dataIdentifier所引用的輸入信號、內部參數、輸出信號等設為默認值)
0x02 freezeCurrentState(將dataIdentifier所引用的輸入信號、內部參數、輸出信號等凍結住)
0x03 shortTermAdjustment (將dataIdentifier所引用的輸入信號、內部參數、輸出信號進行設置,其實就相當於開始了對ECU的控制)
另外,UDS定義可以用22服務讀取2F服務中使用的dataIdentifier,返回值是狀態信息,具體的狀態信息是什麼,則由使用者自定義了。
我們以14229中舉的一個例子來感受一下2F服務:
這個例子是使用2F控制Air Inlet Door Position (進氣口門位置),用標識符0x9B00來標識進氣口門的位置。Air Inlet Door Position [%] = decimal(Hex) * 1 [%] ,即用一個百分比來表示這個位置。
step1:
tester 發送22 9B 00讀取當前進氣口門的位置
ECU返回62 9B 00 0A , 0x0A = 10(dec),表示當前位置是10%
step2:
tester 發送2F 9B 00 03 3C ,表示要將進氣口門的位置調整到60%,0x3C = 60(dec)
ECU返回6F 9B 00 03 0C,表示接受控制,當前進氣口門的位置為12%。因為ECU收到請求後是立刻響應的,而門的位置調節需要時間,所以還沒有達到60%。
step3:
過一段時間後tester 發送22 9B 00讀取當前進氣口門的位置
ECU返回62 9B 00 3C , 0x3C = 60(dec),表示當前位置已經到了60%
step4:
tester 發送2F 9B 00 00,將控制權交還給ECU
ECU返回6F 9B 00 00 3A,表示接受請求,當前位置為58%
step5:
tester 發送2F 9B 00 02,凍結9B 00這個ID所代表的進氣口門位置這個狀態
ECU返回6F 9B 00 02 32,表示接受請求,當前位置保持在50%
RoutineControl (0x31)
31服務是調用ECU內置的一些操作序列的介面,這個服務的應用很靈活,因為廠家可以根據自己的需要為ECU定義各種各樣的內部操作,而要執行這些操作只需要調用31服務就好了。典型的用途包括檢查邊界條件、清除快閃記憶體、對數據進行較驗、對軟硬體依賴性進行校驗等,甚至有需要的話可以進行恢復出廠設置的操作,還有很多與ECU自身邏輯功能相關的操作也可以定義。
31服務的request由4部分組成
- SID
- sub-function,用於標識要執行什麼動作,啟動(0x01)、停止(0x02)、查詢結果(0x03)?
- routineIdentifier,用於標識要執行的routine
- routineControlOptionRecord,這是一個可選參數,用於標識routine執行時所需要的參數,由各家自定義它的內容
舉個例子,假設用0x0809這個ID來代表檢查ECU是否滿足軟體刷寫條件(比如車速、轉速為0,KL15接通等)的routine。
tester發送31 01 08 09來啟動0x0809這個routine
如果所有條件都滿足,則ECU返回71 01 08 09作為echo即可,如果條件不滿足,則ECU返回71 01 08 09 XX YY ZZ,後邊的XX YY ZZ則表明哪些條件不滿足,具體的內容就由廠家自己定義了。
推薦閱讀: