1.請求格式
RoutineControl (31服務) ,用於對主機廠定義的一些特定程序的控制操作(啟動程序、停止程序、請求運行結果)。關於31服務的請求格式如下:
(1)第2個字節routineControlType用於指定對程序的操作動作,其可選項如下(一般用得比較多的是01子服務):
01:startRoutine(啟動程序);
02:stopRoutine(停止程序);
03:requestRoutineResults(請求程序的運行結果)
(2)第3、4字節routineIdentifier表示指定的程序ID;這些特定的程序信息一般由車廠規定釋放;一般會在診斷調查表中體現。比如針對ECU的升級,一般需要指定以下幾個特定的程序功能(具體ID由車廠規定):
程序名+功能描述
CheckProgrammingPreconditions(編程條件檢查) 該程序用於對ECU升級條件(如車速信息等)的判斷,在ECU的BootLoader與APP程序中一般都要有該程序功能的定義。一般用於進入編程會話之前。
CheckAppSwAppDataValidity(檢查數據的有效性,如CRC校驗) 一般用於對升級數據中的每個塊信息的CRC校驗;ECU會將接收到的數據進行CRC計算,並與診斷儀計算發送過來的CRC進行比對;確保數據的准確性。
EraseFlashMemory(擦除Flash內存) 用於對此次升級要用到的內存空間進行擦除操作。一般用於請求APP數據下載(34服務)之前。
CheckProgrammingDependency(編程兼容性的檢查 ) 用於升級完成后對升級信息的兼容性檢查,例如對升級文件產品型號的檢查,必要的邏輯塊是否存在的檢查等操作。一般用於完成所有數據的升級之后。
(3)之后的數據代表可選記錄參數routineControlOptionRecord;一般用於攜帶其他信息,如程序的啟動條件、停止條件等;可根據實際需要進行使用;一般比較少用到。
2.肯定響應格式
ECU在收到對應的程序動作請求后,返回的肯定響應格式如下:
其中,routineStatusRecord是可選參數,用於在執行相應程序動作后,返回ECU相關的信息(如請求31 02服務請求停止時ECU可以通過該參數返回該程序總運行時間等信息);可根據實際需要進行使用;一般比較少用到。
3. 具體參數的配置
1.DCM模塊應該實現UDS服務例程控制(0x31),用於子功能startRoutine、stopRoutine和requestsRoutineResults。測試人員可以使用UDS服務0x31來啟動、停止或獲取由2字節routineldentifier標識的例程的結果。DCM模塊配置包含DCM支持的routineldentifier列表(請參閱配置參數DcmDspRoutineldentifier)。對於每個“例程ID”,DCM配置規定:
- 與此routineIdentifier關聯的函數Xxx_Start()。 (配置參數 DcmDspStartRoutineFnc and DcmDspRoutineUsePort)
- 請求和響應中可用的信號列表 。(配置參數 DcmDspStartRoutineIn and DcmDspStartRoutineOut)
- 與此routineIdentifier關聯的函數Xxx_Stop()。(配置參數 DcmDspStopRoutineFnc and DcmDspRoutineUsePort)
- 請求和響應中可用的信號列表 。(配置參數 DcmDspStopRoutineIn and DcmDspStopRoutineOut)
- 與此routineIdentifier關聯的函數Xxx_RequestResults()。(配置參數 DcmDspRequestRoutineResultsFnc and DcmDspRoutineUsePort)
- 響應中可用的信號列表 。(配置參數 DcmDspRequestRoutineResultsOut)
2.在接收UDS服務RoutineControl (0x31)時,Dcm模塊應檢查該例程是否受支持(請參閱配置參數DcmDspRoutine);如果不受支持,Dcm模塊應發送NRC 0x31(請求超出范圍)。
3.如果一個例程被設置為未使用(DcmDspRoutineUsed設置為FALSE), DCM應認為該例程不受支持(根據2)。
4.接收UDS服務RoutineControl (0x31)時,DCM模塊應檢查例程是否可以在當前會話中執行(請參閱配置參數DcmDspCommonAuthorizationRef)。如果不是。DCM模塊應發送NRC Ox31(請求超出范圍)。
5.當接收到UDS服務RoutineControl (0x31)時,DCM模塊應該檢查這個例程是否可以在當前安全級別執行(參見配置參數DcmDspCommonAuthorizationRef)。如果沒有,DCM模塊將發送NRC 0x33(安全訪問被拒絕)。
6.當UDS服務RoutineControl (0x31)被接收時,Dcm模塊應該檢查相應例程的子函數是否被支持(子函數0x02的配置容器DcmDspStopRoutine的存在性);子函數DcmDspRequestRoutineResults上的數據是0x03)。如果沒有,Dcm模塊將發送NRC 0x12(不支持子函數)。
7.UDS服務RoutineControl (0x31)的接收,Dcm模塊應檢查例程是否可以在當前模式條件下執行(請參閱配置參數DcmDspCommonAuthorizationRef)。如果沒有,Dcm模塊應發送參考DcmModeRule的計算負響應代碼。
8.當收到請求UDS服務RoutineControl (0x31)如果所有驗證已成功完成(見2,4,5), Dcm模塊依法分割routineControlOptionRecord收到的這個例程的輸入信號配置列表(參見配置參數DcmDspStartRoutineln和DcmDspStopRoutineln)。
9.當收到請求UDS服務RoutineControl (0x31)與子功能startRoutine,如果所有驗證已成功完成(見2,4,5), Dcm模塊將調用已配置的Xxx_start()函數傳遞dataln開始,計算從routineControlOptionRecord(見8),該例程的輸出信號配置列表中的dataOut引用(配置參數DcmDspStartRoutineOut)。根據DcmDspRoutineSignalType,數據鏈的數據長度可以是固定的,也可以是動態的。如果是動態的,則在參數currentDataLenath中提供datalength,參數currentDataLenath以字節為單位保存最后一個dataln參數的lenath。datalength只能在最后一個dataln參數上是動態的。
10.完成9時在完成SWS_Dcm_00400后,當Xxx_Start()不返回錯誤代碼,Dcm模塊應使用以下命令返回肯定響應:Xxx_Start()在dataOut中返回的數據作為例程信息和例程StatusRecord(dataOut根據輸出信號列表合並為此例程配置(請參閱配置參數DcmDspStartRoutineOut)) dataOut的數據長度可以是固定的或動態的根據DcmDspRoutineSignalType。如果是動態的,則數據長度應為參數currentDataLength中提供的參數,該參數保存字節的長度最后一個dataOut參數。 數據長度只能在最后一個dataOut上是動態的參數。。
11.當接收請求UDS服務RoutineControl (0x31)與子功能stopRoutine,如果所有驗證已成功完成(見2,4,5), Dcm模塊將調用已配置 xxx_stop()函數傳遞dataln,計算從routineControlOptionRecord(見8),和根據此例程的輸出配置signal列表的dataOut引用(參見配置參數DcmDspStopRoutineOut)。根據DcmDspRoutineSignalType,數據鏈的數據長度可以是固定的,也可以是動態的。如果是動態的,則datalength應該在參數currentDataLength中提供,該參數持有最后一個dataln參數的字節長度。datalength只能在最后一個dataln參數上是動態的。
12.當完成11時,收到UDS服務RoutineControl的請求時(0x31)具有子功能stopRoutine,如果所有驗證均已成功完成(請參見2,4,5),DCM模塊應該調用配置的Xxx_Stop()函數,並傳遞dataIn,該dataIn是從例程ControlOptionRecord(請參閱8)和dataOut參考根據為此例程配置的輸出信號列表(請參閱配置參數DcmDspStopRoutineOut)。 dataIn的數據長度可以固定或根據DcmDspRoutineSignalType動態。 如果是動態的,則數據長度應為在參數currentDataLength中提供,該參數保存字節的長度(以字節為單位)最后一個dataIn參數。 數據長度只能在最后一個數據上是動態的參數。
13.當接收請求UDS服務RoutineControl (0x31)與子功能requestRoutineResults,如果所有驗證已成功完成(見2,4,5) Dcm模塊將調用已配置好的Xxx_RequestResults()函數提供dataOut參考列表的顯示輸出信號配置這個例程(參見配置參數DcmDspRequestRoutineResultsOut) 。
14.當完成13時Xxx_RequestResults() 沒有返回錯誤代碼,Dcm模塊應當與積極的回應答復,Xxx_RequestResults() 返回的數據在dataOut routinelnfo和routineStatusRecord (dataOut合並根據這個例程的輸出信號confiqured列表(見DcmDspReduestRoutineResults)實現方式參數)。根據DcmDspRoutineSignalType,數據輸出的datalenath可以是固定的,也可以是動態的。如果是動態的,則datalength應該在參數currentDataLength中提供,該參數持有最后一個dataOut參數的字節長度。datalenath只能在最后一個dataOut參數上是動態的。
15.序列化所需AUTOSAR數據類型(有符號和無符號的int)從請求消息和響應消息的UDS服務RoutineControl目標字節順序已配置的 DcmDspRoutineSignalEndianness應當考慮DcmDspRoutine信號有DcmDspRoutineSignalType設置為固定長度(DcmDspRoutineSignalType設置為VARIABLE_LENGTH以外的值)。如果DcmDspRoutineSignalEndianness不存在,則應改用DcmDspDataDefaultEndianness。
16.接待的UDS服務RoutineControl (0x31),對每一個請求消除OBD范圍內(EO00-EOFF), Dcm模塊應獲取為OBD服務$8定義的RID值(See SWS_Dcm_00418 ,SWS_Dcm_00419),如果RID指的是對應的TID(見DcmDspRoutineTidRef)。
17.Dcm應按照ISO 14229-1[15]對RoutineControl 服務的NRC處理”。
18.接收UDS服務RoutineControl (0x31)時,Dcm模塊應檢查請求的總長度。如果請求長度錯誤,Dcm模塊將發送NRC 0x13(錯誤的消息長度或無效的格式)給測試人員。
19. Dcm應在完成總長度檢查和模式規則、安全級別和會話檢查DcmDspCommonAuthorizationRef之后,調用SWC的相應例程函數。
20.DcmDspRoutine應該支持服務端口、回調函數或TID引用。
21.如果不使用DcmDspRoutineTidRef,則DcmDspStartRoutine,DcmDspCommonAuthorizationRef和DcmDspRoutineUsePort應該是強制性的。
22.如果使用DcmDspRoutineTidRef,則應禁用DcmDspCommonAuthorizationRef、cmdsprequrequestroutineresults、dcmdspstop例程、DcmDspStartRoutine和DcmDspRoutineUsePort。