1. 诊断协议概述:UDS协议栈架构、OSI七层模型在诊断中的应用、诊断会话与服务的概念

大家好,我是你们的老朋友。今天咱们正式开始聊UDS诊断协议。说实话,这玩意儿在汽车电子里,就像人的神经系统一样重要。车出了毛病,4S店的诊断仪插上OBD口,靠的就是这套协议跟ECU“对话”。

我刚开始接触诊断协议那会儿,也觉得这东西挺玄乎的。后来踩的坑多了,慢慢就摸清了门道。今天这一章,咱们先把地基打牢——搞懂UDS协议栈长什么样,OSI七层模型在诊断里怎么用,以及会话和服务到底是个啥。

1.1 UDS协议栈架构

UDS,全称是Unified Diagnostic Services,统一诊断服务。它定义了一套标准化的“问话”和“回答”方式。不管你是博世的ECU,还是大陆的ECU,只要支持UDS,诊断仪就能用同样的指令去读故障码、刷写程序。

UDS协议栈,说白了就是一套软件分层结构。从上到下,大致分为三层:

  • 应用层:这是最上层,定义了具体的诊断服务。比如读数据、写数据、执行例程等。咱们后面要讲的DTC管理,主要就在这一层。
  • 会话层/表示层:这一层负责管理诊断会话。比如你进入“编程会话”才能刷写程序,进入“扩展会话”才能做特殊标定。不同会话下,能用的服务不一样。
  • 传输层/网络层:这一层负责把应用层的数据打包、拆包,然后通过物理总线发出去。最常见的传输层协议是ISO 15765-2(也叫CAN TP)。

我个人习惯把UDS协议栈想象成一个“快递系统”。应用层是你要寄的东西(比如“读取故障码”这个指令),传输层是快递员和货车,负责把东西安全送到目的地。物理层就是高速公路(CAN总线)。

核心要点:UDS协议栈的核心思想是“分层解耦”。每一层只关心自己的事,上层不用管下层怎么传数据,下层也不用管上层传的是什么内容。这样设计,换总线(比如从CAN换成以太网)时,只需要改传输层和物理层,应用层代码基本不用动。

1.2 OSI七层模型在诊断中的应用

说到分层,就不得不提OSI七层模型。很多刚入行的朋友觉得OSI模型太理论,跟实际开发没关系。其实不然。你想想看,诊断仪和ECU之间通信,数据是怎么从诊断仪的屏幕,跑到ECU的RAM里的?

OSI七层模型给出了一个标准答案。在UDS诊断里,这七层是这样对应的:

OSI层 UDS诊断中的角色 典型协议/标准
7. 应用层 诊断服务(读DTC、写数据等) ISO 14229-1 (UDS)
6. 表示层 数据格式转换(如Intel/Motorola格式) ISO 14229-2
5. 会话层 会话管理(默认、扩展、编程) ISO 14229-2
4. 传输层 数据分段与重组(长报文传输) ISO 15765-2 (CAN TP)
3. 网络层 网络路由(网关转发诊断报文) ISO 15765-2
2. 数据链路层 CAN帧封装、错误检测 ISO 11898-1 (CAN)
1. 物理层 CAN总线电平、线束 ISO 11898-2

嗯,这里要注意。实际开发中,我们最常打交道的其实是第7层(应用层)和第4层(传输层)。第5、6层在UDS里被合并到了ISO 14229-2里,叫“会话层和表示层服务”。

我曾经在一个项目里遇到过这样的问题:诊断仪发送一个“读取数据”的请求,ECU就是不响应。查了半天,发现是传输层的数据长度字段填错了。你看,这就是分层的好处——问题出在哪一层,就查哪一层,不用把整个协议栈翻个底朝天。

1.3 诊断会话与服务的概念

聊完分层,咱们说说两个最基础的概念:会话和服务。

1.3.1 诊断会话

诊断会话,你可以理解成ECU的“工作模式”。ECU上电后,默认处于默认会话(Default Session)。在这个模式下,只能做一些基本操作,比如读故障码、读版本号。如果你想刷写程序,或者做特殊标定,就得切换到编程会话(Programming Session)或扩展会话(Extended Session)。

为什么要有会话?说白了,是为了安全。你想想看,如果随便一个诊断仪都能刷写ECU程序,那车还不得乱套?所以UDS规定:不同的操作,必须在对应的会话下才能执行。

常见的会话类型有:

  • 默认会话 (0x01):上电后的默认状态,只能执行基础诊断服务。
  • 编程会话 (0x02):用于刷写ECU软件,通常需要安全访问认证。
  • 扩展会话 (0x03):用于标定、特殊测试等,也需要安全访问。
  • 安全系统诊断会话 (0x04):用于安全相关系统的诊断,比如安全气囊。

会话切换是通过10服务(DiagnosticSessionControl)来完成的。比如,诊断仪发送10 02,ECU就会从默认会话切换到编程会话。

避坑指南:我曾经遇到过一个问题——ECU在编程会话下待久了,会自动切回默认会话。这是因为UDS协议里有个“会话超时”机制(S3定时器)。如果诊断仪在超时时间内没有发送任何请求,ECU就会认为诊断结束了,自动退出当前会话。所以,做刷写工具时,一定要记得周期性地发送“保持会话”的请求(比如3E 00服务)。

1.3.2 诊断服务

诊断服务,就是UDS定义的一系列“指令”。每个服务都有一个唯一的ID(SID,Service Identifier)。比如:

  • 10 服务:诊断会话控制
  • 11 服务:ECU复位
  • 14 服务:清除诊断信息(清DTC)
  • 19 服务:读取DTC信息
  • 22 服务:读取数据(通过DID)
  • 2E 服务:写入数据(通过DID)
  • 31 服务:例程控制(执行特定功能)
  • 34 服务:请求下载(刷写用)
  • 36 服务:传输数据(刷写用)
  • 37 服务:请求退出传输(刷写用)

每个服务都有固定的请求格式和响应格式。比如22服务(读取数据),请求格式是:22 + DID(2字节)。响应格式是:62 + DID + 数据。

举个例子:诊断仪想读取ECU的“点火开关状态”(假设DID是0xF190),它会发送:22 F1 90。ECU收到后,返回:62 F1 90 01(01表示点火开关打开)。

你看,是不是很简单?但实际项目中,DID的定义、数据的格式、字节序(Intel还是Motorola),这些细节才是容易出坑的地方。

1.4 本章知识体系总览

为了让大家更直观地理解本章内容,我画了一张图。这张图展示了UDS诊断协议栈的分层结构,以及OSI七层模型在其中的映射关系。

UDS诊断协议栈与OSI七层模型映射 UDS诊断协议栈 应用层 诊断服务 (10, 19, 22, 2E, 31...) 会话层 / 表示层 会话管理、数据格式转换 传输层 / 网络层 CAN TP (ISO 15765-2) 数据链路层 CAN控制器 物理层 CAN收发器、总线 OSI七层模型 7. 应用层 6. 表示层 5. 会话层 4. 传输层 3. 网络层 2. 数据链路层 1. 物理层 虚线箭头表示UDS协议栈各层与OSI模型的映射关系

这张图里,左侧是UDS协议栈的简化分层,右侧是标准的OSI七层模型。虚线箭头标出了它们之间的映射关系。你可以看到,UDS的应用层对应OSI的第7层,会话层和表示层对应第5、6层,传输层和网络层对应第3、4层,数据链路层和物理层对应第1、2层。

我个人觉得,这张图是理解UDS协议栈的“通关地图”。每次遇到诊断通信问题,我都会先在这张图上定位——问题出在哪一层?是应用层的服务没定义对,还是传输层的CAN TP参数没配好?定位清楚了,解决问题就快多了。

注意事项:在实际项目中,UDS协议栈的实现通常由两部分组成:一部分是应用层代码(处理诊断服务逻辑),另一部分是传输层代码(处理CAN TP通信)。这两部分代码通常由不同的人开发,甚至来自不同的供应商。所以,接口定义一定要清晰,否则联调的时候会非常痛苦。我曾经就见过因为传输层和应用层的“数据长度”定义不一致,导致ECU死活不响应诊断请求的案例。

好了,这一章的内容就到这里。咱们把UDS协议栈的架构、OSI七层模型的应用、以及会话和服务的基本概念都捋了一遍。这些东西是后面所有章节的基础,一定要理解透。

可可精品资料库