车辆在运行过程中,不可避免地会发生一些故障,为了确保行车安全,我们要求车上的ECU能够实时监测部件的运行状态,一旦发现异常情况,能通过点亮报警灯等方式提示驾驶员。但是,点亮报警灯只能告诉驾驶员车辆发生了故障,最多只能定位到故障ECU,比如ABS报警灯亮说明ABS系统出现故障,但具体是什么部件发生故障并不能通过报警灯显示出来。这时就需要ECU在本地存储一个与故障相对应的故障代码,在进行维修的时候,可以通过车上的OBD接口连接诊断仪,把这个存储的故障代码读取出来,从而进一步定位到更加具体的故障部件,比如ABS传感器发生断路等。
以上就涉及到了车辆故障诊断的两个方面,一个是在线诊断(Onboard Diagnostic),包括故障实时监测、故障灯显示和故障代码实时更新存储,另一个是离线诊断(Offboard Diagnostic),就是指维修时连接外部诊断仪,进行故障码读取,从而快速定位故障部件,有的诊断仪还可以直接显示维修建议。
想要把存储的故障码读取出来,就需要诊断仪和ECU之间有一个通讯协议。目前最常用的是基于CAN线的UDS诊断。
UDS(Unified diagnostic service) 是由ISO 14229-1标准定义的一套国际通用的诊断服务指令,规定了诊断请求和响应的格式。在整个体系中处于最上层的应用层。
诊断指令通过 CAN(ISO 11898) 网络进行传输,当然现在也有基于CANFD或以太网等其它网络的诊断,诊断指令都是由UDS定义的,只不过底层传输方式不一样,本专栏只讨论基于CAN网络的诊断。
但有个问题是CAN每帧只能传输8个字节,而有些诊断指令的长度是大于8字节的,这个时候就需要在应用层和底层传输协议之间加入一个传输层,定义了一些多帧传输的机制。传输层对应的国际标准是ISO 15765-2/3,它的功能就是:发送方的传输层将应用层大于8字节的诊断数据按一定规则进行拆分,形成多个CAN帧进行发送,接收方的传输层收到这些CAN帧后,以相同的规则把应用层数据进行组合,形成完整的诊断数据。 它是上下层之间的一个媒介。
上面提到的是最基本的故障诊断功能,其实诊断能够完成的功能还有很多。例如,在车辆生产完毕时,需要对一些部件进行EOL下线检测,来验证装配是否正确,现在大多数下线检测都是通过诊断指令来实现的,比如给车身控制模块(BCM)发送一个诊断指令,让雨刷动两下,从而验证雨刷功能正常。
此外,很多车上的ECU会有更新升级软件的需求,最初都需要把ECU从车上拆下来,用专用的程序烧写设备进行软件烧写,但现在大部分车辆能够通过诊断仪来更新ECU软件,省去了拆装ECU的麻烦,在OBD接口上连接一个诊断仪就可以了。这个功能也是通过诊断来实现的,也就是我们常说的BootLoader。包括现在很火热的OTA,其底层实现方法也是诊断,只不过OTA不需要连接外部诊断仪,而是用Tbox、网关或车辆主机充当诊断仪,ECU软件更新包是从云端获取下来的,再通过诊断协议发送给ECU,实现软件的更新。
现在UDS诊断在车上越来越普及,开发和测试需求都越来越多,但UDS的学习成本其实还是蛮高的,14229-1这一本协议就四百多页,乍一看起来很没有头绪,网上其他一些资料也都比较零散。我在UDS诊断测试和开发这个方向工作了三年多了,手写了一套UDS代码和一套BootLoader代码,有了少许积累,想和大家分享一下我所学到的东西,以及开发和测试的一些经验。同时也是对自己所掌握的知识做一个全面的梳理和汇总,希望能在大家的学习过程中有一点帮助。文章我会力求简洁易懂,并且覆盖所有相关知识点,力争做一套全网做完整的UDS教程。
本专栏目前已更新完毕,包含了标准中所有服务的介绍,和与之相关的我所了解的东西。具体内容见下方目录,欢迎大家交流指正!如果有其它想要了解的地方可以评论或私信,一起探讨。感谢大家的关注~
1.1 应用层协议整体介绍
1.2 UDS应用层软件开发方法
1.3 诊断响应规则汇总
常用服务:
2.1.1 诊断和通讯管理功能单元概述
2.1.2 诊断会话控制服务(0x10)
2.1.3 初步了解CDD(以10服务为例)
2.1.4 ECU复位服务(0x11)
2.1.5 安全访问服务(0x27)
2.1.6 诊断仪在线服务(0x3E)
2.1.7 通信控制服务(0x28)
2.1.8 控制DTC设置服务(0x85)
不常用服务:
2.1.9 时间参数控制(0x83)
2.1.10 链接控制(0x87)
2.1.11 加密数据传输(0x84)
2.1.12 基于事件响应(0x86)
常用服务:
2.2.1 数据传输功能单元概述
2.2.2 数据读取和写入服务(0x22/0x2E)
不常用服务:
2.2.3 读取内存服务(0x23)
2.2.4 写内存服务(0x3D)
2.2.5 读取DID换算信息(0x24)
2.2.6 周期读取DID数据(0x2A)
2.2.7 动态定义DID(0x2C)
2.3.1 故障码(DTC)格式详解
2.3.2 故障码状态(statusOfDTC)详解
2.3.3 读取DTC数量(0x19 01)
2.3.4 读取DTC(0x19 02)
2.3.5 读取DTC快照记录(0x19 04)
2.3.6 读取DTC扩展数据记录(0x19 06)
2.3.7 读取所有支持的DTC(0x19 0A)
2.3.8 清除DTC信息(0x14)
2.4.1 输入输出控制服务(0x2F)
2.5.1 例程控制服务(0x31)
常用服务:
2.6.1 请求下载(0x34)
2.6.2 数据传输服务(0x36)
2.6.3 请求退出传输(0x37)与数据传输流程报文实例
不常用服务:
2.6.4 请求上传(0x35)
2.6.5 请求文件传输(0x38)
3.1 概述
3.2 CAN 与CAN FD基础
3.3 传输层协议
3.4 多帧传输
3.5 网络层定时参数
3.6 错误处理
3.7 地址格式
4.1 应用层定时参数
4.2 应用层错误处理
5.1 概述
5.2 内存空间分配和Flash擦写操作
5.3 ECU启动流程
5.4 更新流程
5.5 CRC32算法
6.1 使用DiVa进行诊断自动化测试
6.2 VT System 入门
6.3 VT System 板卡介绍
6.4 VT System 的使用
6.5 VT System 的FPGA附加模块
6.6 VT System 结合Diva实现诊断自动测试