AUTOSAR Diagnostic Services(诊断服务)
诊断是汽车 ECU 必不可少的能力,用于开发阶段、产线(EOL)和售后维修时对 ECU 进行检测、标定、刷写、读取故障等操作。AUTOSAR 以 UDS(Unified Diagnostic Services,统一诊断服务) 和 OBD 为基础,通过 CAN(ISO 15765)、以太网(DoIP)、LIN 等物理通道承载。
4.1 诊断分层
AUTOSAR 诊断功能由三个核心模块 + 底层协议组成:
┌──────────────────────────────────────────────┐
│ Application SWC (诊断应用) │
├──────────────────────────────────────────────┤
│ Dcm (Diagnostic Communication) │ 处理诊断请求/响应(解析、路由)
├──────────────────────────────────────────────┤
│ Dem (Diagnostic Event Manager) │ 诊断事件 DTC 管理、冻结帧
├──────────────────────────────────────────────┤
│ Fim (Function Inhibition Manager) │ 基于故障抑制功能
├──────────────────────────────────────────────┤
│ PduR + CanTp / LinTp / EthTp │ 诊断报文传输
├──────────────────────────────────────────────┤
│ Can / Lin / Eth(MCAL) │ 物理层
└──────────────────────────────────────────────┘
三个核心模块
- Dcm(诊断通信管理):
- 接收外部诊断请求(通过 PduR 从 CanTp/LinTp/EthTp 收到),解析 服务标识符(SID);
- 校验会话、安全、地址等,分发给应用层或诊断函数;
- 构造并发送诊断响应。
- Dem(诊断事件管理):
- 管理 诊断事件(Diagnostic Event) 与 DTC(Diagnostic Trouble Code,故障码);
- 记录事件状态、发生次数、冻结帧(Extended Data);
- 支持 Det 事件(开发团队 debug 用)→ Dem。
- Fim(功能抑制管理):
- 根据 DTC 状态抑制某个功能(例如故障时禁止特定控制逻辑)。
4.2 UDS 服务分类(ISO 14229)
UDS 服务按 SID(服务标识符)区分,常见的有:
4.2.1 会话与安全
| 服务 |
SID (hex) |
功能 |
| DiagnosticSessionControl |
0x10 |
会话切换(默认/编程/扩展) |
| ECUReset |
0x11 |
ECU 复位(硬件/软件) |
| SecurityAccess |
0x27 |
安全访问(解锁刷写/标定) |
| ControlSecurityStartup |
0x2F |
安全启动状态 |
| TesterPresent |
0x3E |
心跳(保持会话) |
4.2.2 数据读取
| 服务 |
SID |
功能 |
| ReadDataByIdentifier |
0x22 |
按 DID 读取数据(如版本号) |
| ReadMemoryByAddress |
0x23 |
按地址读取内存 |
| ReadScalingData |
0x33 |
读取标定数据 |
| ReadDataByPeriodicIdentifier |
0x2A |
周期性读取 |
| ReadDTCInformation |
0x19 |
读取 DTC(支持多种子功能) |
4.2.3 写入/编程
| 服务 |
SID |
功能 |
| WriteDataByIdentifier |
0x2E |
写入 (写 DID) |
| RoutineControl |
0x31 |
启动/停止例程(如 Flash) |
| RequestDownload |
0x34 |
请求下载(刷写) |
| RequestUpload |
0x35 |
请求上传 |
| TransferData |
0x36 |
传输数据块 |
| RequestTransferExit |
0x37 |
结束传输 |
| WriteMemoryByAddress |
0x3D |
按地址写入 |
4.2.4 输入输出控制(IO)
| 服务 |
SID |
功能 |
| ioControlByIdentifier |
0x2F |
IO 控制(如打开方向盘) |
4.2.5 清除
| 服务 |
SID |
功能 |
| ClearDiagnosticInformation |
0x14 |
清除 DTC |
4.3 诊断会话(Session)
- 默认会话(Default):上电后的常规会话,只能执行受限服务。
- 增强会话(Extended):允许更多服务(读数据、IO 控制等)。
- 编程会话(Programming):用于 Bootloader/刷写,通常需要安全访问(SecurityAccess) 解锁。
- 通过 0x10 服务切换,会话有超时(TesterPresent 维持,超时会返回默认会话)。
4.4 安全访问(Security Access)
- 请求方(Tester)通过 0x27 服务获得解锁权限,流程:
- Tester 发送
RequestSeed(请求种子);
- ECU 返回 Seed(种子,随机值);
- Tester 用算法计算 Key;
- Tester 发送 Key,Ecu 验证后解锁(允许刷写/标定)。
- 防止未授权访问。
4.5 DTC 与故障事件
- DTC 是标准化的故障码(如发动机故障 ISO 15031-6)。
- 每个 DTC 有关键属性:
- TestFailed(测试失败)、TestFailedSinceLast、PendingDTC、ConfirmedDTC
- 记录发生次数、冻结帧。
- Dem 事件→ DTC 映射:ECU 内部通过 Dem 注册故障事件,可被诊断读取。
4.6 与其它模块交互
- Dcm 与 PduR:Dcm 将诊断报文(PDU)通过 PduR 路由到 CanTp/LinTp/EthTp 等。
- Dcm 与 NvM:Dcm 可访问 NvM 保存/读取诊断数据(如 DTC 计数)。
- Dcm 与 application SWC:诊断函数(通过 RTE)调用应用层功能。
4.7 OBD(On-Board Diagnostics)与 UDS 区别
- OBD(ISO 15031)面向排放/环保监管,常用 OBD-II,读取发动机排放相关 DTC。
- UDS(ISO 14229)是更通用的诊断标准,用于整车广泛功能。
- 很多 ECU 同时支持 OBD 协议与 UDS 协议(多协议制式)。
小结
诊断服务是 ECU 交互的核心接口:通过 Dcm/Dem/Fim 与总线、RTE、NvM 结合,实现刷写、读故障、读取数据等。下一部分我们来学习 Memory Stack(内存/存储栈)。