本篇主要介绍诊断在通信上的一些概念:功能寻址、物理寻址和网络传输层协议。
为什么要有功能寻址和物理寻址之分?
不管是什么通信介质,通信模式无外乎三种:单播,多播和广播。单播:一个发送端一个接收端;多播和广播:一个发送端多个接收端。诊断仪和总线上各个ECU之间通信,有时需要一对一(通过物理寻址实现),有时需要一对多(通过功能寻址实现)。即诊断仪发送的物理寻址报文只有一个ECU会接收处理,而同一总线上所有具备诊断的ECU都会接收并处理功诊断仪发送的功能寻址报文,所以每个ECU的物理寻址都是不同的,而同一总线上ECU的功能寻址都是相同的。有了接收ID,还需要应答ID,由ECU发送,诊断仪接收,各ECU都不同。
为什么要有网络传输层,网络传输层是怎么回事?
CAN不同于以太网,没有网段的概念。从OSI七层网络模型讲,实现CAN通信其实只需要物理层、数据链路层和应用层就够了。我们拿起任何一个项目的通信矩阵,可以看到与OBC相关的应用报文ID可能有十几个或者更多,并且报文的每一位都有固定且明确的物理含义,如电压电流值等。而诊断ID只有3个,即上面提到的功能寻址、物理寻址和应答ID。如果诊断跟应用程序一样,ISO14229中共有25个诊断服务,那可能需要分配的ID个数是25的倍数级。最关键的是CAN帧DLC为8,无法满足所有诊断请求和应答字节数的要求。所以ISO15765-2定义了一种CAN帧分割的网络传输层通信协议。
该协议对CAN帧的byte0-byte2进行了定义,由此产生了单帧(SF)、首帧(FF)、流控帧(FC)、连续帧(CF)。当发送端需要发送数据时,网络传输层会做如下处理,如果数据能用一帧CAN报文能传输完则封装为单帧传输,否则就需要涉及到首帧、流控帧和连续帧。
单帧:用于发送小于等于7字节的数据,如下图所示,byte0高4bit为0的是单帧,byte0低4bit为报文有效字节数。byte1-byte7为数据(包括无效的填充字节,填充数据可为任意值,通常为AA或55)。如例1,应用层需要发送数据[10 03],经过网络传输层封装,最终发送至总线的实际数据为[02 10 03 AA AA AA AA AA]。

多帧:当需要发送的数据字节数大于7字节,需要用到首帧、流控帧和连续帧的多帧传输方式,格式定义如下。

例如诊断仪需要发送数据[2E 00 01 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06]共01A字节,经过网络传输层封装,将数据通过首帧+3帧连续帧的方式传输至总线,诊断仪发送首帧后根据ECU流控帧的BS与STmin,连续帧的传输时序会有所不同,具体如下图所示。

总结
物理寻址:每个ECU的物理寻址各不相同,物理寻址的报文只有一个ECU会接收处理;
功能寻址:同一总线上具备诊断的ECU功能寻址是相同的,所有ECU都会接收并处理。
网络传输层:根据应用层需要发送数据的字节数(是否<=7字节)将数据封装成[单帧]或者[首帧+若干连续帧]的方式发送至总线。