3.否定响应
输入输出控制的否定响应,是有子流程的,也就是说在前面第三篇介绍的主流程之后,有自己的单独的格式和参数检查,ISO标准里的流程截图如下。
按从上到下的顺序,每一步的检查内容列举如下:
- Minimum length check:这里最小长度检查包括了SID,DID和inputOutputControlParameter,最少是4个字节;
- 第一个NRC31:这里检查在当前诊断会话模式,是否支持请求的DID,以及inputOutputControlParameter是否支持;
- Total length check:总长度检查,即包括SID,DID,inputOutputControlParameter,controlState和controlMask的总长度,注意仅当inputOutputControlParameter=shortTermAdjustment的时候需要controlState,以及是否包含controlMask也是需要看controlState个数的;
- 第二个NRC31:如果需要使用controlState或者controlMask的话,检查请求里的这两个参数是否支持;
- NRC34:如果服务支持安全传输,这里检查安全传输的验证结果是否通过;
- NRC33:如果DID支持安全校验,这里检查安全校验服务是否已经验证通过;
- NRC22:如果DID需要一些条件检查的话,这里验证条件是否都已经满足;
如果以上检查都通过了,那么就是肯定响应了☺
4.inputOutputControlParameter
输入输出控制服务没有子功能,注意这个服务没有子功能,没有子功能,重要的事情说三遍!
所以它有个控制参数,这个参数是为了表明,目前是要控制后面的状态参数还是冻结或者恢复请求的DID等。
inputOutputControlParameter | 功能 |
---|---|
0 | 恢复ECU控制,将请求中指定的输入输出状态恢复到ECU自身控制 controlState:请求里不需要包含,响应里必须包含 |
1 | 恢复到默认值,将请求中指定的输入输出状态恢复到默认值 controlState:请求里不需要包含,响应里必须包含 |
2 | 冻结当前值,将请求中指定的输入输出状态的当前状态进行冻结,不再改变 controlState:请求里不需要包含,响应里必须包含 |
3 | 短时间调整,将请求中指定的输入输出状态设置成请求的状态 controlState:请求和响应里必须包含 |
4-0xFF | Reserved |
5.controlMask
controlMask说起来麻烦,但实际它并不复杂,看下图示例,假设我们的一个DID有两个controlState,那么它们对应的就是controlMask的前两个位,那么这两个位是干嘛的呢?他们用来表示请求里每个位对应的controlState是否需要控制,如果是0就不需要控制,是1就需要控制。如果请求里,controlMask的bit7=1,bit6=0,那本次要设置的是controlState1,对controlState2没有影响。
简单理解,可以认为controlMask就是人名,每个名字只有一个身份证即一位,而它对应的controlState则代表每个人的房产,有的人有一套房,有的人有两套房等等,我们要控制的是每个人租出去了几套房,嗯这个例子是不是就印象深刻了,哈哈哈~
按照上面的规则,如果记录的人名太多了,那么controlMask就超过一个字节了,超出去的就新开一个字节,仍然按这个从左到右的顺序一一对应。如果没有占满一个字节也要按一个字节算,后面的位暂时都设置为0。
最后需要注意的是,如果DID只控制一个controlState,那么是不能支持controlMask的。
三、数据示例
下面采用ISO里给的一个示例再解释一下这个服务,在example#2里,有如下定义,DID 0x0155定义包含了5个参数,即5个controlState,下表注明了其从左到右每个controlState所占用的数据大小以及位置。
既然是有5个参数,那么必然要使用controlMask在每次shortTermAdjustment请求的时候注明要调整的controlState是哪个。按照上个章节所描述的规则,controlMask的定义如下。
所以,如果想控制 IAC Pintle Position的话,只需要按照下面的内容请求即可。SID和DID内容不做解释,inputOutputControlParameter=3表示是短时间调整,第一个controlState设置为07表示要控制到07这个数值,其他的controlState为任何值都可以,为什么这么写?因为后面的controlMask设置了0x80,即bit7=1,其余位都是0,按照controlMask章节所述,这样设置表示请求里除了第一个参数其余均不做控制,所以其余的controlState无论设置什么值都是不会有影响的。
响应的数据就比较简单了,可以看到IAC Pintle Position因为被控制所以当前值是7,因为要求响应里必须带controlState值,所以其他的状态参数也都返回了当前的状态。
至此,输入输出控制服务记录完毕,欢迎留言讨论,附上篇和汇总链接
UDS诊断系列之十一 输入输出控制(2F)服务 上
UDS诊断系列链接汇总