1、P4Server_max与NRC0x78关系
先看一个数据流,如下所示:
如上的数据流中,上位机使用功能寻址(0x7FF)发送了$10 82的诊断请求,Server端给了一个NRC0x78响应,并且没有最终响应。
(一)需求解读
如果单纯的看这个数据流,大家可能比较迷茫,不知这个问题是对还是错。我们先看一下需求,如下所示:
解释:
对于Diagnostic Session Control($10)服务,P4Server_max = P2Server_max。P4Server_max = P2Server_max又会有怎样的约束呢?答:Server不能回复NRC0x78。此约束出自14229-2的约束,如下所示:
项目中,一般会约束P2Server_max = 50ms,也就意味着P4Server_max = P2Server_max = 50ms。如上的解释中,P4时间表示接收到诊断请求到最终给出响应的时间,这里的最终响应是指正响应或者否定响应。当P4Server_max = P2Server_max时,P2和P4实质就是一个时间约束,如下所示:
结论:上述的数据流中,并未有按照需求开发,即:当P4Server_max = P2Server_max时,Server仍然回复了NRC0x78。
2、NRC0x78与正响应抑制位的关系
问题数据流中,还有一个值得我们关注的点:功能寻址的正响应抑制位置位,即:suppressPosRspMsgIndicationBit = TRUE。什么意思呢?14229-1的解释如下:
意思是说,诊断服务的正响应抑制位置位的时候,正响应可以不用回复。那么,否定响应需要回复吗?答:需要回复。正响应抑制位只是约束了正响应可以不用回复,但是,诊断请求的正响应抑制位置位碰到了否定响应的时候,需要给出否定响应,否定响应属于最终响应。
再进一步思考:”功能寻址的所有否定响应否需要回复吗?”答:不是。怎么理解呢?14229-1给出的解释如下所示:
功能寻址中,如果碰到了NRC0x11(serviceNotSupported)、NRC0x7F(
serviceNotSupportedInActiveSession)、NRC0x12(sub-functionNotSupported)、NRC0x7E(sub-functionNotSupportedInActiveSession)以及NRC0x31(requestOutOfRange)时,可以不用回复。
这就完了吗?上述的两个需求中,我们注意到:Annex A.1的约束除外,Annex A.1约束又是什么呢?如下所示:
解释:
当诊断服务请求中,Server如果先响应了NRC0x78,那么,不管诊断服务是否正响应抑制位置位还是功能寻址碰到NRC0x11、NRC0x7F、NRC0x12、NRC0x7E、NRC0x31,均需要给出最终的响应,即:正响应或者否定响应。
所以,上述数据流的第二个问题:在Server响应了NRC0x78以后,没有给出最终响应。