這篇文章將介紹InputOutputControlByIdentifier (0x2F) 和RoutineControl (0x31) 這兩個診斷服務的用途和用法。它倆的作用有點類似,都是呼叫ECU內部一些預定義的操作序列,相當於是我們從外部利用診斷手段控制ECU的介面。

InputOutputControlByIdentifier (0x2F)

ECU簡單來說就是一個對輸入(sensor)進行計算再產生輸出(actuator)的系統。2F這個服務就是對ECU的輸入和輸出進行控制。這個服務在生產線上會需要使用,比如,在總裝階段,工人需要驗證車上的各種功能是否正常,例如四個車窗的升降是否正常,如果挨個開關去按,那效率很低,如果透過一個診斷命令就能夠觀察到車窗升降的情況,效率則高得多。

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

ECU就是一個處理輸入資訊、輸出控制的系統

比如,ECU接收一個輸入訊號A,我們就可以利用2F給這個A賦個我們需要的值;ECU對某個執行器B進行控制,我們就可以利用2F服務再配上某些特定的引數來實現對B的控制,例如門控對車窗升降、後視鏡摺疊等的控制。

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

2F命令的格式

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自身邏輯功能相關的操作也可以定義。

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

31命令的格式

2F命令的格式

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則表明哪些條件不滿足,具體的內容就由廠家自己定義了。