4. 诊断通信管理DCM

诊断通信管理(Diagnostic Communication Manager,DCM)位于AUTOSAR基础软件的服务层,是UDS诊断服务在ECU内部的“总调度台”。它向上承接诊断仪通过CAN、CAN FD、DoIP或LIN发来的请求,向下调用诊断事件管理(DEM)、功能抑制管理(FIM)、内存管理(NvM)以及各应用软件组件的诊断回调。DCM的核心职责可以概括为四件事:会话管理、服务分发、安全访问、状态机协同。理解这四者的关系,是掌握AUTOSAR诊断通信的关键。

一、DCM在AUTOSAR中的位置与数据流

DCM并不直接操作总线驱动,它通过PDU Router与下层通信栈交互。诊断请求从总线进入PduR,经DCM的DSL(Diagnostic Session Layer)、DSD(Diagnostic Service Dispatcher)和DSP(Diagnostic Service Processing)三层处理后,再返回响应。下图展示了DCM内部三层结构及其与外部模块的关系。

DCM 内部结构与诊断数据流 诊断仪 / Tester UDS 请求 PduR / Com PDU 路由 DCM DSL 诊断会话层 会话状态 · 安全等级 · 协议/定时参数 · 缓冲管理 DSD 诊断服务分发 服务ID匹配 · 会话/安全权限校验 · 分发到DSP DSP 诊断服务处理 服务实现 · 子功能处理 · 响应组装 DEM NvM SWC 诊断响应回程

二、诊断会话管理:从默认会话到扩展会话

UDS定义了多种诊断会话,最常用的是默认会话(0x01)、编程会话(0x02)和扩展会话(0x03)。ECU上电后自动进入默认会话,此时只允许执行少数基础服务,如读取故障码、读取数据流。当诊断仪发送 10 03 请求切换到扩展会话后,DCM的DSL层会更新当前会话状态,并通知DSD层重新计算服务权限。

会话切换不是简单的变量赋值,它涉及三个动作:校验目标会话是否受支持、更新会话状态并启动S3定时器、触发会话变更回调。S3定时器默认为5000ms,若在S3超时前没有收到任何诊断请求,DCM会自动回退到默认会话,防止ECU长期停留在高权限状态。

会话切换的典型请求与响应:

请求: 10 03          // 切换到扩展会话
肯定响应: 50 03 00 32 01 F4
  - 50: 服务肯定响应
  - 03: 当前会话为扩展会话
  - 00 32: P2Server_max = 50ms
  - 01 F4: P2*Server_max = 5000ms

请求: 10 02          // 切换到编程会话
否定响应: 7F 10 22   // 条件不满足,需先安全访问

三、服务分发:DSD如何路由诊断请求

DSD层是DCM的“交通枢纽”。它根据请求中的SID(Service Identifier)查找配置表中对应的服务处理函数,并在分发前执行权限检查。权限检查包含两个维度:当前会话是否允许该服务、当前安全等级是否满足该服务要求。

以 0x27 安全访问服务为例,其子功能 0x01 请求种子在扩展会话下即可执行,但 0x02 发送密钥则要求会话正确且种子已请求。DSD通过配置表将SID、子功能、会话掩码、安全掩码绑定在一起,形成一张可裁剪的服务权限矩阵。

SID 服务名称 默认会话 扩展会话 编程会话 安全等级要求
0x10DiagnosticSessionControl允许允许允许无
0x11ECUReset允许允许允许无
0x14ClearDiagnosticInformation允许允许允许无
0x19ReadDTCInformation允许允许允许无
0x22ReadDataByIdentifier允许允许允许无
0x27SecurityAccess禁止允许允许无
0x2EWriteDataByIdentifier禁止允许允许等级1
0x31RoutineControl禁止允许允许等级1
0x34RequestDownload禁止禁止允许等级2
0x36TransferData禁止禁止允许等级2
0x37RequestTransferExit禁止禁止允许等级2

四、安全访问:种子与密钥的挑战应答

安全访问服务 0x27 采用“请求种子—发送密钥”的挑战应答机制。诊断仪先发送 27 01 请求种子,ECU生成一个随机数作为种子返回;诊断仪用预置算法对种子运算得到密钥,再通过 27 02 发送给ECU;ECU用相同算法验证密钥,验证通过后解锁对应安全等级。

安全等级通常分为Level 1和Level 2。Level 1用于写入标定数据、执行例程控制;Level 2用于刷写下载。安全等级具有会话绑定和超时回退特性:当会话从扩展会话回退到默认会话时,已解锁的安全等级自动失效;安全访问本身也有一个定时器,超时后需要重新解锁。

常见误区:把安全访问算法硬编码在应用层,导致不同项目移植时反复修改DCM配置。正确做法是将种子生成和密钥校验封装为DCM的安全访问回调函数,算法参数通过配置或标定量管理,DCM只负责流程调度。

五、会话与安全状态机设计

将会话状态和安全等级放在一起看,DCM实际上维护了一个二维状态空间。会话维度有默认、扩展、编程三个状态;安全维度有锁定、Level 1解锁、Level 2解锁三个状态。两个维度并非完全正交:编程会话通常要求先进入扩展会话并完成Level 2解锁,才能通过 10 02 切换。

设计状态机时需要明确以下转移条件:

  • 上电初始化:进入默认会话,安全等级为锁定。
  • 会话切换请求:校验目标会话合法性,合法则更新会话并重置S3定时器。
  • S3超时:从扩展/编程会话回退到默认会话,同时清除安全等级。
  • 安全访问成功:在当前会话下解锁对应等级,启动安全超时定时器。
  • 安全超时:安全等级回退到锁定,但会话保持不变。
  • ECU复位:所有状态回到上电初始值。

在AUTOSAR配置中,这些状态转移通过DcmDspSessionRow、DcmDspSecurityRow等容器描述。每个会话行定义会话ID、P2时间、P2*时间;每个安全行定义安全等级、种子大小、密钥大小、失败尝试次数上限。DCM在运行时根据这些配置自动完成状态迁移和权限判定,应用层只需实现具体的服务处理逻辑。

工程建议:在集成阶段,用CANoe或诊断脚本覆盖“默认→扩展→安全解锁→写入→回退”的完整路径,并专门测试S3超时和安全超时的边界值。状态机最容易出问题的地方不是正常流程,而是超时回退后残留的权限状态。

综上,DCM通过DSL管理会话、DSD分发服务、DSP执行处理,并以配置表驱动会话与安全状态机。掌握这三层结构和二维状态空间,就能在AUTOSAR项目中正确配置DCM、定位诊断权限问题,并为后续的刷写与标定功能打下基础。