最近在做诊断相关的开发工作,将自己接触到的知识点记录下来。前面的文章已经介绍过UDS的一些基础知识,和基本的一些概念,不清楚的可以查看之前的文章:UDS基础知识介绍
诊断会话控制服务 DiagnosticSessionControl,SID是0X10,主要功能是控制服务端的会话模式切换。一般默认上电后是在默认会话模式下,当某一个服务端正在运行时,只会出现一个会话模式,不会同时存在两个会话模式。
常用的会话模式有如下几种:
默认会话:01 Default Session,支持信息的读取和查询操作,权限最小。
编程会话:02 Programming Session 顾名思义这个是用来烧录程序的
扩展会话:03 Extended Session,主要是用来读写数据,如写入VIN,序列号,读写诊断码等
默认会话:当服务端在默认会话模式下收到默认会话的请求时,服务端应当重新初始化默认会话,即之前被临时激活或者改变的数据都应该恢复到刚上电初始化的状态,写入到非易失存储器(断电数据不会消失的存储器)的数据不会重新初始化。
其他会话:当服务端在默认会话模式下收到任何非默认会话模式请求,服务端应当切换到被请求的会话模式,并且如果通过0x86服务设置了事件的话,这时候需要暂停。但是目前基本上不会使用0x86服务,所以一般直接切换即可。
在非默认会话模式下收到非默认会话模式请求:服务端完成会话模式切换的同时需要完成以下操作:
a, 停止通过ResponseOnEvent(0x86)服务设置的事件;
b,重新锁定安全访问状态,并且重置依赖于安全访问的服务;
c,不依赖于安全访问的服务,如果在被请求的会话模式也支持,应当保持当前状态,例如通信控制服务和DTC控制服务。
上篇文章介绍UDS基础知识的时候,也有介绍过诊断请求的格式,有如下3种:
格式1:[Service Identifier] + [Sub-function]
格式2:[SID] + [Data Identifier]
格式3:[SID] + [Sub-function] + [DID]
诊断会话控制使用子功能参数diagnosticSessionType诊断会话类型,被用于激活电控单元中对应的诊断会话,具体的参数含义如下:
更完整的参数含义请参考ISO14229-1,表格很长,此处只截了一部分
sub-function严格来说是7个bit,而不是1个byte,因为它的最高位bit被用于抑制正响应(suppress positive response,SPR),如果这个bit被置1,则ECU不会给出正响应(positive response);如果这个bit被置0,则ECU会给出正响应。这样做的目的是可以告诉ECU不要发不必要的 response,从而节约通信资源。
当服务端收到诊断请求时,如果能执行则回复肯定响应,不能执行则回复否定响应;也有不给出响应的情况,就是抑制正响应(suppress positive response,SPR),如果这个bit被置1,则ECU不会给出正响应(positive response)
肯定响应的格式为:[SID + 0X40] + [Sub-function] + xx xx xx xx xx
当然肯定响应的格式是根据请求报文的格式来的,请求报文是[SID] + [Sub-function],则肯定响应就为[SID + 0X40] + [Sub-function];请求报文是[SID] + [DID],则肯定响应就是[SID + 0X40] + [DID]。其余字节是时间参数,后面举例子说明。
negative response的格式为3个字节,格式为:[0X7F] + [SID] + [NRC]
常用的否定响应码如下:
更详细完整的否定应答码请参考ISO14229-1 Table A.1
时间参数有两个,P2server_max和P2*server_max,每个参数占用两个字节,所以一共占用四个字节。虽然每个参数都是两个字节,但是其单位(精度)是不一样的,P2*参数的单位是10ms,也就是说P2*的结果需要把后面两个字节的数值乘以10才是实际的时间
此处的例子都是针对CAN总线网络为例。在举例之前,先介绍简单介绍一下CAN总线的诊断报文格式,后面文章会单独详细介绍
报文的类型包括了首帧FF,流控帧FC,连续帧CF和单帧SF四种。N_PCL中字节1的4-7位用来区分类型。N_PCLType = 0 单帧 N_PCLType = 1 首帧 N_PCLType = 2 连续帧 N_PCLType = 3 流控帧
肯定响应:
TX 02 10 03 00 00 00 00 00 // 02: 0表示单帧,2表示后面的数据有2个字节;10:10服务是诊断会话控制服务;03:表示子功能,扩展诊断会话;后面的0是填充位
RX 06 50 03 00 32 01 F4 AA// 06:0表示单帧,6表示后面的数据有6个字节;50:肯定响应码,值为服务请求的值加0X40;03表示子功能;00 32表示P2server_max,转换成十进制就是50,那么P2server_max就是50ms
01 F4表示P2*server_max,转换成十进制就是500,再乘以单位10ms,即P2*server_max为5000ms
否定响应:
TX 02 10 02 00 00 00 00 00 // 10:诊断会话控制服务,02:编程会话模式
RX 03 7F 10 78 AA AA AA AA // 03: 0表示单帧,3表示后面的数据有3个字节;7F为否定响应的SID;10为会话请求;78为否定应答码
最后,如果觉得有帮助,希望你能点个关注,一键三连,感激不尽