这一篇重点说一下诊断的请求和响应所包含的信息以及格式要求。
一、诊断数据单元
诊断数据单元一般包含地址信息和应用数据、应用数据长度,其中应用数据会包含服务ID、子功能参数(如果有)和应用数据参数:
1.地址信息:地址信息一般包含报文类型、目标地址、源地址、地址类型等信息,其中大家重点需要关注的是目标地址、源地址和地址类型。目标地址指的是诊断报文接收方的地址,源地址是诊断报文发送方的地址,地址类型指的是报文是物理寻址还是功能寻址。对于CAN报文来说,这个地址信息就是映射到CAN ID上的,以太网的报文格式里也有地址信息的位置,这是每条报文所必须包含的内容,映射关系都有固定的格式,这个后面专门会讲。
2.服务ID:服务ID是用来标识诊断里每个服务的唯一ID,请求和响应里的服务ID是不同的,分为服务请求的ID、服务肯定响应的ID以及服务否定响应的ID。下面是一个表格,列举了服务ID的划分。

仔细观察上面的表格,会发现以下两点:①请求和肯定响应的服务ID数值相差0x40,诊断的请求和响应的服务ID是一对一的,也就是说一个请求的服务ID所对应的肯定响应的服务ID是唯一的,请求的服务ID其BIT6=0,所对应的肯定响应的服务ID其BIT6=1,因此相差0x40;②否定响应只有一个服务ID,那就是0x7F。
3.应用数据参数:除了服务ID之外,诊断报文中还会有其他的参数和数据,根据服务不同,数据内容也会不同,例如有的服务是包含子功能的,那么服务ID后面紧跟的就是子功能,有的服务需要通过数据标识来决定请求的数据是什么,那么服务或服务和子功能后面还要跟着数据标识等等,更详细的数据格式会在后面每个服务的章节说明。
二、请求数据单元格式
请求数据单元同样按有没有子功能分成两种,先看带子功能的请求格式。如下表所示,请求里首先会包含地址信息,除远程地址外,其余都应该是必须有的;然后是服务ID,之后室一个字节的子功能,再后面是数据参数。数据单元最后还要带数据长度,这里的长度指的是应用数据长度,地址信息不包含在内。

不带子功能的服务请求跟带子功能的区别只有一个,就是服务后面紧跟数据参数,不再有子功能位置。
RA远程地址只有在Message type是远程诊断的时候,才会存在。远程诊断是一个稍微复杂的寻址方式,当TA不能够完全表示服务端的地址信息的时候,需要使用远程诊断的功能。
注意这里的远程诊断并非当前基于远程信息平台所搭建的云端远程诊断和升级系统。
可以想象这样一个场景,假设我们的车会外挂拖车模块,而且是可以外挂不同品牌的拖车。如果需要读取拖车的信息,汽车厂商的诊断仪不太可能会适配非官方的模块,这时候可以有这样一个解决方案,让与外挂的拖车相连接的总线节点作为一个网关。诊断仪配置可以填写远程地址的功能,发送诊断请求的时候,目标节点地址设置为这个网关,而RA地址填写所外接的拖车节点的地址,而这个网关可以识别报文的扩展地址从而将对应的请求和响应转发到相应的网段。
理解起来是不是挺复杂?复杂就对了,我解释起来也挺复杂,所以目前接触的乘用车并没有实际使用这套,而商用车使用UDS的也屈指可数,所以这里仅当了解就可以了。
三、肯定响应数据单元格式
肯定响应格式和请求的格式相差不大,只不过这里的SID换成了服务的响应ID,也就是请求的SID+0x40。

ISO14229-1里的图响应这儿最后没有写Length,不知道是忘记了还是特殊原因,因为对整体理解没有影响,这里不做深究。
四、否定响应数据单元格式
否定响应比较简单,地址信息和上面的数据单元里含义一致,应用数据部分只有三个字节的长度:第一个字节是否定响应的服务ID即0x7F,注意这个是固定的;第二个字节是请求的SID,即前面请求数据单元里的SID,它表示这个否定响应是针对哪一个请求的;最后一个字节是NRC,Negative Response Code,前面有介绍其含义,主要用来表示给出否定响应的具体原因是什么。

关于否定响应,这里多说一点,一般诊断的请求和响应是一问一答的形式,即无特殊要求(见系列之二)的请求之后要有响应,如果没有响应就表明服务端有问题。所以一般ECU接收到请求之后,要么给肯定响应,要么给否定响应。但是有一个否定响应是特殊的,当NRC是0x78的时候,这个NRC是pending的意思,表示当前服务端还没办法处理请求,需要再等等,过会儿再给响应,也就是说再过会儿会给一个肯定或者否定的响应,所以请记住这个特殊的NRC。
3244

被折叠的 条评论
为什么被折叠?



