目录
1、0x31服务(RoutineControl,例程控制服务)
Service description:
0x31服务(RoutineControl,例程控制服务)被客户端用于执行定义的一系列步骤并且获取相关的结果。该服务有很大的灵活性,但典型的使用方法可能包括如下的功能:例如擦除内存,重置或者学习自适应值,运行自测试,覆盖正常的服务端控制策略以及服务端值随时间变化的功能。一般来说,0x31服务用于控制更复杂类型的输出,而0x2F服务(inputOutputControlByIdentifier)服务用于控制相对简单的输出(如,静态的)。
0x31服务(RoutineControl,例程控制服务)被客户端用于:
— 开启一项例程;
— 停止一项例程;
— 请求一项例程的执行结果;
一项例程由一个2字节的例程标识符( routineIdentifier)来表示。
以下内容详细讲述了引用了例程标识符(routineIdentifier)的开始例程,停止例程,并且请求例程结果的使用方法:
开始例程
在StartRoutine请求消息完成和第一个响应报文完成之间的一段时间内,如果响应消息是肯定的或否定的,则该例程应在服务端内存中启动,这表明请求已经执行或正在执行。
例程可以是正在运行而不是正常运行代码的测试,也可以是正常运行代码使能的或者执行的例程。特别是在第一种情况下,可能需要使用0x10服务(DiagnosticSessionControl)在特定的诊断会话下切换服务端,或者在使用StartRoutine服务之前使用SecurityAccess服务解锁服务端。
停止例程
在StopRoutine请求消息完成和第一个响应报文完成之间的一段时间内,如果响应消息是肯定的或否定的,则该例程应在服务端内存中启动,这表明请求已经执行或正在执行。
请求例程结果
该子函数通过引用例程标识符(routineIdentifier)被客户端用于请求结果(如,退出的状态信息),其结果由服务端内存中执行的例程产生。
基于例程结果,其结果可以在stopRoutine子函数参数(如正常/异常的Exit With Results)中的肯定应答报文中接收,请求例程结果的子函数应该被使用。routineResults的一个例子可以是服务端收集的数据,由于服务端性能限制,这些数据在例行执行期间是无法传输的。
2、请求报文格式
2.1 请求报文定义
下表定义了请求报文的格式:
字节序号 | 参数值 | 约定 | 字节值 |
---|---|---|---|
#1 | RoutineControl Request SID | M | 0x31 |
#2 | sub-function = [ routineControlType ] | M | 0x00 - 0xFF |
#3 #4 | routineIdentifier [] = [ byte#1 (MSB) byte#2 (LSB) | M M | 0x00 – 0xFF 0x00 – 0xFF |
#5 . . #n | routineControlOptionRecord[] = [ routineControlOption#1 . . routineControlOption#m ] | C/U . . C/U | 0x00 - 0xFF . . 0x00 - 0xFF |
C:此参数是用户可选的,用于子函数参数startRoutine和stopRoutine。
2.2 请求报文中子函数参数定义
该服务使用子函数参数用来区分例程的控制类型。子函数参数的解释和使用方法见下表:
字节序号 | 参数值 | 约定 |
---|---|---|
0x00 | ISOSAEReserved ISO保留 | M |
0x01 | startRoutine 该参数表示服务端启动了由控制标识符指定的例程 | M |
0x02 | stopRoutine 该参数表示服务端停止由控制标识符指定的例程 | M |
0x03 | stopRoutine 该参数表示服务端返回由控制标识符指定例程执行的结果 | M |
0x04 - 0x7F | ISOSAEReserved ISO保留 | M |
2.3 请求报文中数据参数定义
该服务在请求报文中的数据参数定义如下表所示:
定义 |
---|
routineIdentifier 该参数表示服务端内部例程 |
routineControlOptionRecord 该参数记录包含了 — 例程进入选项参数,其具体描述了例程的启动条件(如,timeToRun,startUpVariables等) — 例程退出选项参数,其具体描述了例程的停止条件(如,timeToExpireBeforeRoutineStops变量等) |
3、肯定应答报文
3.1 肯定应答报文格式定义
字节序号 | 参数值 | 约定 | 字节值 |
---|---|---|---|
#1 | RoutineControl Response SID | M | 0x71 |
#2 | routineControlType | M | 0x00 - 0x7F |
#3 #4 | routineIdentifier [] = [ byte#1 (MSB) byte#2 (LSB) ] | M M | 0x00 - 0xFF 0x00 - 0xFF |
#5 | routineInfo | C1 | 0x00 - 0xFF |
#6 . . #n | routineStatusRecord[] = [ routineStatus#1 . . routineStatus#m ] | U . . U | 0x00 - 0xFF . . 0x00 - 0xFF |
C1:RoutineInfo该参数的字节指定了一个方案(例如,StartRoutine, StopRoutine, RequestRoutineResults),以允许通用的外部测试设备处理任何例程。即使ISO/SAE定义的routineStatusRecord的大小等于“0”数据字节,该参数对于由ISO/SAE规范(例如ISO 27145-3, SAE J1979-DA, ISO 26021)定义的任何例程也是必需的。对于routineStatusRecord完全由汽车制造商定义的例程,是否支持该参数,这个功能是可选的。该字节的定义应留给车辆制造商。
U:RoutineStatusByte #m只包含在routineStatusRecord[]中,如果车辆制造商指定了routineIdentifier (RID)。
3.2 肯定应答报文数据参数定义
该服务肯定应答报文中使用到的数据参数的定义见下表:
定义 |
---|
routineControlType 该参数的bit 6 - 0表示请求报文中的子函数参数。 |
routineIdentifier 该参数表示请求报文中的routineIdentifier。 |
routineInfo RoutineInfo字节编码是特定于汽车制造商的,并为汽车制造商提供了一种机制,该机制可以支持基于该返回值的所有实现例程(例如,如果需要stopRoutine或requestRoutineResults)的通用外部测试设备处理。 |
routineStatusRecord 该参数记录被用于给到客户端: — 例程开始后服务端状态的附属信息; — 例程停止后服务端状态的附属信息(例如,总运行时间、停止前例程生成的结果等)。 — 例程的结果(退出状态信息),该例程先前已在服务端中停止 |
4、支持的否定应答码(NRC_)
本服务实施了如下否定响应代码,下表记录了每个否定应答码发生的情况,如果服务端在错误场景使用了该服务,则应使用如下列出的否定响应码。
NRC | 描述 |
---|---|
0x12 | sub-functionNotSupported 请求的子函数总体不被支持或者不被RoutineIdentifier所支持时,会发送该NRC |
0x13 | incorrectMessageLengthOrInvalidFormat 请求报文长度不正确时,会发送该NRC |
0x22 | conditionsNotCorrect 当请求的RoutineControl不被满足时,会发送该NRC |
0x24 | requestSequenceError 以下情况会发送该NRC: — 例程当前处于活动状态,当接收到’startRoutine’子函数时无法重新启动(给定例程是否可以在活动时重新启动取决于车辆制造商); — 当接收到’stopRoutine’子函数时,例程当前没有活动; — 当收到’requestRoutineResults’子函数时,例程结果不可用(例如,请求的routineIdentifier从未启动); |
0x31 | requestOutOfRange 以上情况会会发送该NRC: — 服务端不支持请求的routineIdentifier; — 用户可选的routineControlOptionRecord包含请求的routineIdentifier的无效数据; |
0x33 | securityAccessDenied 客户端发送了一个请求,其带有有效安全的数据标识符,并且服务端的安全特征是激活的。 |
0x72 | GeneralProgrammingFailure 如果服务端在执行访问服务端内部存储器的例程时检测到错误,则应返回此NRC。例如,当例程擦除或编程永久存储器设备(例如闪存)中的某个存储器位置时,对该存储器位置的访问失败。 |
0x31服务(RoutineControl,例程控制服务)的否定应答码(NRC)具体处理过程。
5、0x31服务(RoutineControl,例程控制服务)案例说明
Example #1:sub-function = startRoutine
本小节规定了在服务端中启动一个例行程序的测试条件,在技术人员摆动被测系统的所有线束连接器时,持续(尽可能快地)间歇地测试所有输入和输出信号。routineIdentifier通过routineIdentifier 0x0201引用这个例程。
测试条件:ignition = on, engine = off, vehicle speed = 0 [kph];
客户端通过将suppressPosRspMsgIndicationBit(子函数参数的第7位)设置为“FALSE”(“0”)来请求响应消息。
0x31服务(RoutineControl,例程控制服务)的请求报文使用如下,由客户端发往服务端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | RoutineControl Request SID | 0x31 |
#2 | sub-function = startRoutine, suppressPosRspMsgIndicationBit = FALSE | 0x01 |
#3 #4 | routineIdentifier [ byte#1 ] (MSB) routineIdentifier [ byte#2 ] (LSB) | 0x02 0x01 |
0x31服务(RoutineControl,例程控制服务)的应答报文使用如下,由服务端发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | RoutineControl Response SID | 0x71 |
#2 | routineControlType = startRoutine | 0x01 |
#3 #4 #5 | routineIdentifier [ byte#1 ] (MSB) routineIdentifier [ byte#2 ] (LSB) routineStatusRecord [ routineStatus#1 ] = vehicle manufactuer specific | 0x02 0x01 0x32 |
Example #2:sub-function = stopRoutine
本小节规定了在服务端中停止一个例行程序的测试条件,在技术人员摆动被测系统的所有线束连接器时,持续(尽可能快地)间歇地测试所有输入和输出信号。routineIdentifier通过routineIdentifier 0x0201引用这个例程。
测试条件:ignition = on, engine = off, vehicle speed = 0 [kph];
客户端通过将suppressPosRspMsgIndicationBit(子函数参数的第7位)设置为“FALSE”(“0”)来请求响应消息。
0x31服务(RoutineControl,例程控制服务)的请求报文使用如下,由客户端发往服务端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | RoutineControl Request SID | 0x31 |
#2 | sub-function = stopRoutine, suppressPosRspMsgIndicationBit = FALSE | 0x02 |
#3 #4 | routineIdentifier [ byte#1 ] (MSB) routineIdentifier [ byte#2 ] (LSB) | 0x02 0x01 |
0x31服务(RoutineControl,例程控制服务)的应答报文使用如下,由服务端发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | RoutineControl Response SID | 0x71 |
#2 | routineControlType = stopRoutine | 0x02 |
#3 #4 #5 | routineIdentifier [ byte#1 ] (MSB) routineIdentifier [ byte#2 ] (LSB) routineStatusRecord [ routineStatus#1 ] = vehicle manufactuer specific | 0x02 0x01 0x30 |
Example #3:sub-function = requestRoutineResults
这个示例展示了如何在例程完成后获取结果值。当技术人员对测试系统的所有线束连接器上“摆动”时,程序已经连续地(尽可能快地)间歇地测试了所有输入和输出信号。引用这个例程的routineIdentifier是0x0201。试验条件: ignition = on, engine = off, vehicle speed = 0 [kph]。
客户端通过将suppressPosRspMsgIndicationBit(子函数参数的第7位)设置为“FALSE”(“0”)来请求响应消息。
0x31服务(RoutineControl,例程控制服务)的请求报文使用如下,由客户端发往服务端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | RoutineControl Request SID | 0x31 |
#2 | sub-function = requestRoutineResults, suppressPosRspMsgIndicationBit = FALSE | 0x03 |
#3 #4 | routineIdentifier [ byte#1 ] (MSB) routineIdentifier [ byte#2 ] (LSB) | 0x02 0x01 |
0x31服务(RoutineControl,例程控制服务)的应答报文使用如下,由服务端发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | RoutineControl Response SID | 0x71 |
#2 | routineControlType = requestRoutineResults | 0x03 |
#3 #4 | routineIdentifier [ byte#1 ] (MSB) routineIdentifier [ byte#2 ] (LSB) | 0x02 0x01 |
#5 #6 . . #n | routineStatusRecord [ routineStatus#1 ] = Vehicle Manufactuer Specific routineStatusRecord [ routineStatus#2 ] = inputSignal#1 . . routineStatusRecord [ routineStatus#m ] = inputSignal#m | 0x30 0x33 . . 0x8F |
Example #4:sub-function = startRoutine with routineControlOption
本条款规定了在变速箱控制单元中启动例行程序的测试条件,以在特殊模式下标定某一档位的换挡。挡位可以是#1到#20之间的任意档位,模式可以是台架、独立和车载。RoutineIdentifier通过routineIdentifier 0x0202引用这个例程。
测试条件: ignition = on, engine = off, vehicle speed = 0 [kph].
客户端通过将suppressPosRspMsgIndicationBit(子函数参数的第7位)设置为“FALSE”(“0”)来请求响应消息。
0x31服务(RoutineControl,例程控制服务)的请求报文使用如下,由客户端发往服务端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | RoutineControl Request SID | 0x31 |
#2 | sub-function = startRoutine, suppressPosRspMsgIndicationBit = FALSE | 0x01 |
#3 #4 | routineIdentifier [ byte#1 ] (MSB) routineIdentifier [ byte#2 ] (LSB) | 0x02 0x01 |
#5 #6 | routineControlOption#1 [ selected gear ] = vehicle manufacturer specific routineControlOption#2 [ test condition ] | 0x06 0x01 |
0x31服务(RoutineControl,例程控制服务)的应答报文使用如下,由服务端发往客户端:
字节顺序 | Description | 字节值 |
---|---|---|
#1 | RoutineControl Response SID | 0x71 |
#2 | routineControlType = startRoutine | 0x01 |
#3 #4 | routineIdentifier [ byte#1 ] (MSB) routineIdentifier [ byte#2 ] (LSB) | 0x02 0x01 |
#5 #6 . . #n | routineStatusRecord [ routineStatus#1 ] = Vehicle Manufactuer Specific routineStatusRecord [ routineStatus#2 ] = response time . . routineStatusRecord [ routineStatus#m ] = inputSignal#m | 0x32 0x33 . . 0x8F |