3.否定响应
例程控制服务的否定响应,是有子流程的,也就是说在本系列第三篇介绍的主流程之后,有自己的单独的格式和参数检查,ISO标准里的流程截图如下。
按从上到下的顺序,每一步的检查内容列举如下:
- Minimum length check:这里最小长度检查包括了SID,SubFunction,RID,最少是4个字节;
- 第一个NRC31:这里检查在当前诊断会话模式,是否支持请求的RID,这里的RID即routineIdentifier;
- NRC34:如果服务支持安全传输,这里检查安全传输的验证结果是否通过;
- NRC33:如果DID支持安全校验,这里检查安全校验服务是否已经验证通过;
- NRC12:这里校验请求里的子功能是否支持;
- Total length check:总长度检查,即包括SID,SubFunction,RID,routineControlOptionRecord的总长度,routineControlOptionRecord的长度依据RID而定;
- 第二个NRC31:当检查逻辑执行到这里的时候,主要检查的是routineControlOptionRecord参数是否在RID定义的有效范围内;
- NRC22:NRC22有两个,第一个检查的是请求的服务和子功能的执行条件是否满足,第二个检查的是请求数据的执行条件是否满足;
- NRC24:31服务的子功能是有顺序的,即停止例程的请求必须是在开始例程的后面请求才可以,请求例程的执行结果也必须在开始例程之后才被允许,否则回复此NRC。
如果上面的检查内容都检查通过了,则回复肯定响应。
4.子功能
例程控制服务只有三个有效子功能,其他的都是保留值,其定义对应的就是上篇提到的三个功能。
子功能 | 定义 |
---|---|
01 | 开始例程,即开始执行请求的例程 |
02 | 停止例程,即停止执行请求的例程 |
03 | 请求例程结果,即要求服务端响应请求的例程的执行结果 |
三、数据示例
例程控制服务的格式比输入输出控制服务的要简单很多,因此,我只摘抄一个示例进行说明。
下图示例为请求开始执行例程,可以看到请求里的子功能字节是1,之后是被请求的RID。给出的示例中请求是不带数据的,因此到RID就结束了,而有些例程是需要请求带数据的,如进行CRC校验的时候需要客户端发送CRC结果给服务端,然后服务端才能跟自己计算的结果进行比较,这时候就需要将CRC结果放到RID后面发送出去。
响应的routineControlType跟子功能保持一致是1,在RID之后加上了该RID需要的数据,这个数据的OEM或者供应商根据实际内容定义的。
以下是系列链接:
UDS诊断系列之十三 例程控制(31)服务 上