(转载)Service 0x31 - RoutineControl

Service 0x31 - RoutineControl

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可以通过该参数返回该程序总运行时间等信息);可根据实际需要进行使用;一般比较少用到。

  1. 具体参数的配置

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(错误的消息长度或无效的格式)给测试人员。

  1. Dcm应在完成总长度检查和模式规则、安全级别和会话检查DcmDspCommonAuthorizationRef之后,调用SWC的相应例程函数。

20.DcmDspRoutine应该支持服务端口、回调函数或TID引用。

21.如果不使用DcmDspRoutineTidRef,则DcmDspStartRoutine,DcmDspCommonAuthorizationRef和DcmDspRoutineUsePort应该是强制性的。

22.如果使用DcmDspRoutineTidRef,则应禁用DcmDspCommonAuthorizationRef、cmdsprequrequestroutineresults、dcmdspstop例程、DcmDspStartRoutine和DcmDspRoutineUsePort。

猜你喜欢

转载自blog.csdn.net/oneofstudent/article/details/109453911