1. UDS诊断协议概述:什么是UDS、UDS在BMS中的作用、OSI七层模型与UDS的对应关系

大家好,我是老张。做BMS嵌入式开发这些年,我接触最多的协议之一就是UDS。说实话,刚入行那会儿我也觉得诊断协议就是个“锦上添花”的东西,直到有一次在客户现场,电池包报了个偶发故障,要不是UDS帮忙抓到了关键数据帧,那问题排查起来简直是大海捞针。

今天咱们就来聊聊UDS诊断协议。嗯,这一章算是整个课程的地基,我会尽量讲得通俗些。

1.1 什么是UDS?

UDS,全称是Unified Diagnostic Services,统一诊断服务。它不是一个具体的通信协议,而是一套标准化的诊断服务规范。说白了,它就是汽车电子系统里的一套“体检语言”。

你想想看,一辆车上有几十个ECU(电子控制单元),每个ECU都可能出问题。如果没有统一的标准,A厂商的ECU用一套诊断指令,B厂商的用另一套,那维修站得准备多少种诊断仪?

UDS就是来解决这个问题的。它定义了一套通用的“问诊”和“治疗”方法:

  • 读故障码:0x19服务,读取DTC(诊断故障码)
  • 读数据:0x22服务,读取当前电压、电流、温度等
  • 写数据:0x2E服务,写入标定参数或配置信息
  • 执行例程:0x31服务,比如执行电池均衡、继电器测试等
  • 控制通信:0x28服务,控制网络通信的启停

我个人习惯把UDS理解成“汽车界的HTTP协议”。HTTP定义了GET、POST这些方法,UDS定义了0x22、0x2E这些服务。底层用什么传输(CAN、以太网、LIN)不重要,只要上层服务是统一的就行。

核心要点:UDS是应用层的诊断规范,它不关心底层物理介质是什么。你可以在CAN总线上跑UDS,也可以在FlexRay甚至以太网上跑。这一点很重要,后面讲OSI模型时会再提到。

1.2 UDS在BMS中的作用

BMS(电池管理系统)是电动汽车的“心脏监护仪”。它负责监控电池的电压、电流、温度、SOC(荷电状态)、SOH(健康状态)等关键参数。一旦电池出问题,轻则续航缩水,重则热失控。

UDS在BMS中扮演什么角色?我总结了三个核心作用:

  1. 故障诊断与定位:当BMS检测到异常(比如单体电压过高、温度传感器开路),它会生成对应的DTC。通过UDS的0x19服务,诊断仪可以读取这些故障码,快速定位问题。
  2. 数据监控与标定:在研发阶段或售后维修时,工程师需要实时查看BMS内部数据。0x22服务可以读取任意内部变量,比如每个电芯的电压、MOSFET的温度、均衡状态等。0x2E服务则可以修改标定参数,比如过压保护阈值、均衡开启电压等。
  3. 例程控制与刷写:BMS有些特殊功能需要通过例程来触发。比如“主动均衡”例程、“继电器粘连检测”例程。另外,UDS的0x34/0x36/0x37服务组合(也就是我们常说的“刷写流程”),用于升级BMS的固件。我在项目中遇到过,有一次客户要求远程升级BMS程序,用的就是这套UDS刷写流程。

个人经验:在BMS开发中,UDS的0x22服务(读取数据标识符)是我用得最多的。我会把BMS内部的关键状态量都映射成DID(数据标识符),比如0xF190代表总电压,0xF191代表总电流。这样调试时,用诊断仪一读,所有数据一目了然,比用CANoe抓原始报文方便多了。

1.3 OSI七层模型与UDS的对应关系

很多初学者一听到OSI七层模型就头大。其实你不用背每一层的名字,只需要知道UDS在哪个位置干活就行。

OSI模型从下到上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。UDS属于应用层协议,它定义的是“服务”本身,而不是“怎么传”。

在汽车电子领域,最常用的底层是CAN总线。我画个对应关系给你看:

OSI层 CAN协议栈中的实现 说明
第7层:应用层 UDS (ISO 14229-1) 定义诊断服务,如0x22、0x2E、0x19等
第6层:表示层 (通常合并到应用层) 数据编码格式,如Intel/Motorola格式
第5层:会话层 (由UDS会话管理实现) 默认会话、扩展会话、编程会话等
第4层:传输层 ISO 15765-2 (CAN TP) 处理长报文的分包与重组,比如超过8字节的数据
第3层:网络层 ISO 15765-2 (部分功能) 寻址模式(物理寻址、功能寻址)
第2层:数据链路层 CAN控制器 (ISO 11898-1) CAN帧的发送与接收,仲裁机制
第1层:物理层 CAN收发器 (ISO 11898-2) 差分信号,电气特性

你看,UDS只负责第7层。它说“我要读0xF190这个DID”,至于这个请求怎么打包成CAN帧、怎么通过CAN总线发出去、对方收到后怎么回复——这些都不归UDS管,而是由下面的层来处理。

为什么会这样设计?说白了就是解耦。你可以在CAN上跑UDS,也可以换到以太网上跑UDS(DoIP,基于IP的诊断协议),上层代码几乎不用改,只需要换底层的传输层实现就行。

避坑指南:我曾经在项目中犯过一个低级错误——在实现UDS的0x22服务时,直接返回了一个超过8字节的数据,结果CAN帧装不下,导致接收方解析错误。后来才意识到,超过8字节的数据需要走CAN TP(传输层)进行分包。所以,写UDS代码时一定要搞清楚底层传输层的限制。

1.4 小结

这一章我们聊了三件事:

  • UDS是一套标准化的汽车诊断服务,类似于“汽车界的HTTP”。
  • 在BMS中,UDS主要用于故障诊断、数据监控、例程控制和固件刷写。
  • UDS位于OSI模型的应用层,底层通常走CAN总线,通过CAN TP处理长报文。

嗯,基础概念就这些。下一章我们会深入UDS的报文结构,看看一个诊断请求到底长什么样。到时候我会拿一个真实的BMS诊断报文来拆解,保证你看完就能上手。

对了,如果你手头有BMS开发板,建议先熟悉一下CAN工具(比如PCAN、Kvaser)的基本用法。后面很多章节都会用到。