UDS 服务 Service 0x31 RoutineControl 是用于对主机厂定义的一些特定程序的控制操作(启动程序、停止程序、请求运行结果)的服务。
它可以让诊断仪对服务器(如ECU)中的某些例程进行控制,例如擦除内存、检查编程依赖性、执行OBD测试等。它的请求格式如下:
其中,SID 是服务标识符,固定为 0x31,
sub-function 是子功能,用于指定对例程的操作动作,有三种可选项:
0x01 表示 startRoutine(启动程序)
0x02 表示 stopRoutine(停止程序)
0x03 表示 requestRoutineResults(请求程序的运行结果)
routineIdentifier
例程标识符,由两个字节组成,用于指定要控制的例程,有些是 ISO 定义的,有些是主机厂或供应商定义的;
routineControlOptionRecord
可选记录参数,用于携带其他信息,如程序的启动条件、停止条件等。
UDS 服务 Service 0x31 RoutineControl 的肯定响应格式如下:
其中,SID + 0x40 表示肯定响应的服务标识符,为 0x71;
sub-function 和 routineIdentifier 和请求中的相同;
routineStatusRecord 是可选参数,用于返回服务器相关的信息,如程序的运行结果、运行时间等。
关于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.肯定响应格式
其中,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。