1. 诊断协议栈概述:车载诊断协议栈的架构、分层模型与ECU中的位置
大家好,我是老周。今天咱们聊聊诊断协议栈的总体架构。说实话,这玩意儿是车载ECU开发的基石,也是很多新手最容易懵圈的地方。
你想想看,一辆车上有几十个ECU,每个ECU都可能出故障。怎么统一管理?怎么标准化诊断?这就是诊断协议栈要解决的问题。我个人习惯把诊断协议栈看作一个“翻译官”——它把诊断仪发来的请求,翻译成ECU能理解的内部操作,再把结果翻译回去。
1.1 诊断协议栈的分层模型
先看这张分层图,我当年刚入行时,对着这张图看了三天才真正理解。
| OSI层 | 诊断协议栈对应层 | 典型协议/模块 |
|---|---|---|
| 应用层 (Layer 7) | 诊断应用层 | UDS (ISO 14229-1) |
| 表示层 (Layer 6) | (通常合并到应用层) | 数据格式定义 |
| 会话层 (Layer 5) | 诊断会话管理 | 非默认会话、安全访问 |
| 传输层 (Layer 4) | 传输协议层 | ISO 15765-2 (DoCAN), ISO 10681-2 (DoIP) |
| 网络层 (Layer 3) | 网络层 | 单帧/多帧传输、流控制 |
| 数据链路层 (Layer 2) | 数据链路层 | CAN (ISO 11898), Ethernet (IEEE 802.3) |
| 物理层 (Layer 1) | 物理层 | CAN收发器、以太网PHY |
嗯,这里要注意:实际开发中,我们通常不会严格按OSI七层来划分。更常见的做法是分成三层:应用层、传输层、网络层+数据链路层。说白了,就是把OSI的上三层合并,下两层合并。
核心观点:诊断协议栈的本质,就是一套“请求-响应”的通信机制。上层定义“说什么”,下层定义“怎么说”。
1.2 OSEK/VDX与AUTOSAR的分层思想
说到分层模型,就绕不开OSEK/VDX和AUTOSAR。这两个标准,我建议你当成“圣经”来读。
OSEK/VDX时代,诊断模块叫OSEK-COM。它把通信分成了三层:
- 应用层:处理诊断数据
- 交互层:管理会话、时序
- 数据链路层:收发CAN报文
我在项目中遇到过一个问题:OSEK-COM的交互层对多帧传输的支持很弱。当时我们做Bootloader升级,传输大文件时经常丢帧。后来查了三个月,才发现是交互层的超时参数没配好。嗯,从那以后,我对时序参数就特别敏感。
AUTOSAR时代,诊断栈被拆得更细了。我列一下关键模块:
- DCM (Diagnostic Communication Manager):诊断通信管理器,负责解析UDS请求、路由、会话管理
- DEM (Diagnostic Event Manager):诊断事件管理器,负责DTC的存储、状态管理
- FIM (Function Inhibition Manager):功能抑制管理器,控制诊断功能的启用/禁用
- CanTp / DoIP_Tp:传输协议模块,处理单帧/多帧分包
- CanIf / EthIf:接口层,抽象硬件差异
我的建议:如果你是新手,先死磕DCM和DEM。这两个模块占了诊断栈80%的工作量。CanTp虽然重要,但配置工具(如Vector DaVinci)能帮你搞定大部分。
1.3 诊断协议栈在ECU中的位置
诊断协议栈不是独立存在的。它嵌在ECU的软件架构里,跟其他模块有千丝万缕的联系。我画个简图帮你理解:
+------------------------------------------+
| 应用层软件 (ASW) |
| (空调控制、车窗控制、发动机管理...) |
+------------------------------------------+
| 运行时环境 (RTE) |
+------------------------------------------+
| +--------+ +--------+ +--------+ |
| | DCM | | DEM | | FIM | |
| +--------+ +--------+ +--------+ |
| | CanTp | | CanIf | | 其他BSW| |
| +--------+ +--------+ +--------+ |
| | CAN/Ethernet驱动 |
| +--------------------------------------+
| 微控制器 (MCU) |
+------------------------------------------+
你看,诊断协议栈位于基础软件层 (BSW)。它向上通过RTE跟应用层交互,向下通过驱动层跟硬件交互。
这里有个关键点:诊断协议栈不直接控制硬件。比如你要读一个传感器的值,DCM收到请求后,会通过RTE调用应用层的接口。应用层再去读ADC,把结果返回。说白了,诊断栈只负责“传话”,不负责“干活”。
避坑指南:我曾经见过一个团队,把诊断逻辑直接写在应用层代码里。结果换了一个诊断仪,协议不兼容,整个应用层都要重写。记住:诊断协议栈必须独立于应用逻辑。这是架构红线,不能碰。
1.4 为什么分层这么重要?
你可能会问:搞这么复杂干嘛?直接写个函数处理诊断请求不行吗?
我举个例子你就明白了。假设你的ECU原本用CAN通信,现在要升级到车载以太网。如果诊断栈是分层设计的,你只需要换掉底层的CanTp和CanIf,换成DoIP_Tp和EthIf。上层的DCM、DEM完全不用动。
但如果是一锅粥的架构,呵呵,那你就等着加班吧。我在2018年就经历过一次这样的迁移,整整花了6个月。如果当时用了AUTOSAR分层架构,估计2个月就能搞定。
所以,分层模型不是学术上的花架子。它是实实在在的工程实践,能帮你省时间、省钱、省头发。
1.5 小结
这一章我们聊了:
- 诊断协议栈的分层模型,从OSI七层到实际的三层划分
- OSEK/VDX和AUTOSAR的架构差异,以及AUTOSAR的关键模块
- 诊断栈在ECU软件架构中的位置,以及它跟应用层的关系
下一章,我会带你深入DCM模块,看看一个诊断请求从收到到响应的完整流程。到时候我会分享一个我踩过的坑——关于会话超时的,保证让你印象深刻。
公众号:蓝海资料掘金营,微信deep3321