UDS 診斷教程 (六)
這篇文章將介紹 InputOutputControlByIdentifier (0x2F) 和 RoutineControl (0x31) 這兩個診斷服務的用途
和用法。它倆的作用有點類似,都是調(diào)用 ECU 內(nèi)部一些預定義的操作序列,相當于是我們從外部利用診
斷手段控制 ECU 的接口。
InputOutputControlByIdentifier (0x2F)
ECU 簡單來說就是一個對輸入(sensor)進行計算再產(chǎn)生輸出(actuator)的系統(tǒng)。2F 這個服務就是對
ECU 的輸入和輸出進行控制。這個服務在生產(chǎn)線上會需要使用,比如,在總裝階段,工人需要驗證車上
的各種功能是否正常,例如四個車窗的升降是否正常,如果挨個開關去按,那效率很低,如果通過一個
診斷命令就能夠觀察到車窗升降的情況,效率則高得多。

比如,ECU 接收一個輸入信號 A,我們就可以利用 2F 給這個 A 賦個我們需要的值;ECU 對某個執(zhí)行器
B 進行控制,我們就可以利用 2F 服務再配上某些特定的參數(shù)來實現(xiàn)對 B 的控制,例如門控對車窗升降、后視鏡折疊等的控制。

2F 服務的 request 由 4 部分組成
1. SID
2. dataIdentifier,用于標識被控制的 IO 對象
3. controlOptionRecord,用于標識控制方式,比如是啟動、停止控制,還可以有一些自定義的參數(shù)
來進行更精準的控制,比如讓某個執(zhí)行器的動作持續(xù)多長時間。controlOptionRecord 又分為兩部
分,分別是 1 個 byte 的 inputOutputControlParameter,以及若干 byte 由廠家自定義使用的
controlState。
4. controlEnableMaskRecord,這是一個可選參數(shù),用于標識 controlOptionRecord 中的哪些
parameter 被使用。
UDS 明確定義了四種 inputOutputControlParameter
0x00 returnControlToECU (將控制權(quán)還給 ECU,即結(jié)束控制)
0x01 resetToDefault (將 dataIdentifier 所引用的輸入信號、內(nèi)部參數(shù)、輸出信號等設為默認值)
0x02 freezeCurrentState(將 dataIdentifier 所引用的輸入信號、內(nèi)部參數(shù)、輸出信號等凍結(jié)?。?/p>
0x03 shortTermAdjustment (將 dataIdentifier 所引用的輸入信號、內(nèi)部參數(shù)、輸出信號進行設置,其實
就相當于開始了對 ECU 的控制)
另外,UDS 定義可以用 22 服務讀取 2F 服務中使用的 dataIdentifier,返回值是狀態(tài)信息,具體的狀態(tài)信
息是什么,則由使用者自定義了。
我們以 14229 中舉的一個例子來感受一下 2F 服務:
這個例子是使用 2F 控制 Air Inlet Door Position (進氣口門位置),用標識符 0x9B00 來標識進氣口門的
位置。Air Inlet Door Position [%] = decimal(Hex) * 1 [%] ,即用一個百分比來表示這個位置。
step1:
tester 發(fā)送 22 9B 00 讀取當前進氣口門的位置
ECU 返回 62 9B 00 0A , 0x0A = 10(dec),表示當前位置是 10%
step2:
tester 發(fā)送 2F 9B 00 03 3C ,表示要將進氣口門的位置調(diào)整到 60%,0x3C = 60(dec)
ECU 返回 6F 9B 00 03 0C,表示接受控制,當前進氣口門的位置為 12%。因為 ECU 收到請求后是立刻
響應的,而門的位置調(diào)節(jié)需要時間,所以還沒有達到 60%。
step3:
過一段時間后 tester 發(fā)送 22 9B 00 讀取當前進氣口門的位置
ECU 返回 62 9B 00 3C , 0x3C = 60(dec),表示當前位置已經(jīng)到了 60%
step4:
tester 發(fā)送 2F 9B 00 00,將控制權(quán)交還給 ECU
ECU 返回 6F 9B 00 00 3A,表示接受請求,當前位置為 58%
step5:
tester 發(fā)送 2F 9B 00 02,凍結(jié) 9B 00 這個 ID 所代表的進氣口門位置這個狀態(tài)
ECU 返回 6F 9B 00 02 32,表示接受請求,當前位置保持在 50%
RoutineControl (0x31)
31 服務是調(diào)用 ECU 內(nèi)置的一些操作序列的接口,這個服務的應用很靈活,因為廠家可以根據(jù)自己的需要為 ECU 定義各種各樣的內(nèi)部操作,而要執(zhí)行這些操作只需要調(diào)用 31 服務就好了。典型的用途包括檢
查邊界條件、清除閃存、對數(shù)據(jù)進行較驗、對軟硬件依賴性進行校驗等,甚至有需要的話可以進行恢復出廠設置的操作,還有很多與 ECU 自身邏輯功能相關的操作也可以定義。

31 服務的 request 由 4 部分組成
1. SID
2. sub-function,用于標識要執(zhí)行什么動作,啟動(0x01)、停止(0x02)、查詢結(jié)果(0x03)?
3. routineIdentifier,用于標識要執(zhí)行的 routine
4. routineControlOptionRecord,這是一個可選參數(shù),用于標識 routine 執(zhí)行時所需要的參數(shù),由各家自定義它的內(nèi)容
舉個例子,假設用 0x0809 這個 ID 來代表檢查 ECU 是否滿足軟件刷寫條件(比如車速、轉(zhuǎn)速為 0,
KL15 接通等)的 routine。
tester 發(fā)送 31 01 08 09 來啟動 0x0809 這個 routine
如果所有條件都滿足,則 ECU 返回 71 01 08 09 作為 echo 即可,如果條件不滿足,則 ECU 返回 71 01 08 09 XX YY ZZ,后邊的 XX YY ZZ 則表明哪些條件不滿足,具體的內(nèi)容就由廠家自己定義了。