![cover](https://img-blog.csdnimg.cn/img_convert/f8d712be06311fabdd4a65049da17f7b.png)
UDS 服务 Service 0x31 - RoutineControl
这里对 RID 的三种控制类型做一个详细的介绍:启动 RID 如果对诊断请求的响应是肯定或否定,则表明该请求已被执行或正在进行中,例程将从 StartRoutine 请求消息完成到第一响应消息完成之间的某个时间在服务器的内存中启动。如果是动态的,则数据长度应为在参数currentDataLength中提供,该参数保存字节的长度(以字节为单位)最后一个dataIn参数。如果是动态的,则datalen
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。
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)