3. MICROSAR诊断栈架构拆解

MICROSAR诊断栈并不是一组彼此独立的模块,而是一条从总线报文到应用回调、再回到总线响应的完整处理链。理解这条链的关键,是先分清“谁负责搬运、谁负责解释、谁负责记录、谁负责决策”。本节按数据流方向拆解各模块职责,并给出它们之间的调用与依赖关系。

一、从物理层到诊断服务的分层视图

最底层是通信硬件与驱动:CAN控制器、CAN收发器、以太网MAC/PHY。其上是通信协议层,CAN侧由CanTp承担ISO 15765-2的分段与重组,以太网侧由DoIP承担ISO 13400-2的车辆识别、路由激活与诊断报文封装。再往上是诊断服务层Dcm,它负责解析UDS服务请求、管理会话与安全等级、执行服务分发。Dcm向下调用PduR与传输层,向上调用应用层的服务处理函数(通常由OEM或供应商生成的回调)。

与Dcm并列的是事件与故障管理层:Dem负责故障事件存储、DTC状态位维护、冻结帧与扩展数据记录;FiM负责功能抑制,根据Dem中的故障状态决定某些功能是否允许执行;Dlt负责日志与追踪,记录诊断交互、故障变化和内部事件。ComM负责通信模式管理,决定总线是否保持通信、是否允许进入睡眠。它们之间不是简单的线性关系,而是通过回调、通知和查询形成网状交互。

应用层 / SWC 诊断服务回调 · 故障事件上报 · 功能抑制查询 · 日志接口 Dcm UDS服务解析 · 会话/安全 服务分发 · 响应组包 Dem 故障事件存储 · DTC状态位 冻结帧 · 扩展数据记录 FiM 功能抑制 · 使能条件 基于Dem状态查询 CanTp ISO 15765-2 分段/重组 流控 · 超时管理 DoIP ISO 13400-2 车辆识别 路由激活 · 诊断报文封装 ComM 通信模式管理 总线睡眠/唤醒协调 Dlt 日志与追踪 · 诊断交互记录 PduR · CanIf / SoAd · 驱动与硬件 CAN控制器/收发器 · 以太网MAC/PHY 服务请求/响应 状态查询 日志记录

二、Dcm:诊断服务的总调度

Dcm是诊断栈的“大脑”。它接收来自CanTp或DoIP的完整UDS请求,按服务ID分发到对应的服务处理函数。以0x22(ReadDataByIdentifier)为例,Dcm先检查当前会话是否允许该服务,再检查安全等级是否满足,然后调用应用层注册的回调读取数据,最后按UDS格式组包响应。若请求长度不合法或服务不支持,Dcm直接生成否定响应(NRC 0x13或0x11),不向上层转发。

Dcm还负责会话状态机(默认会话、编程会话、扩展会话)和安全访问状态机(种子-密钥流程)。这两个状态机的状态变化会通过回调通知Dem和FiM,例如进入编程会话时可能触发故障码清除或功能抑制解除。

三、Dem与FiM:故障管理与功能抑制

Dem的核心是“事件-故障”两级模型。应用层通过Dem_SetEventStatus上报事件结果(通过/失败/预通过/预失败),Dem根据去抖策略(计数器或时间)决定是否将事件升级为故障。故障确认后,Dem更新DTC状态位(如testFailed、confirmedDTC、pendingDTC),并记录冻结帧和扩展数据。诊断仪通过0x19服务读取这些信息。

FiM不直接存储故障,而是向Dem查询“某个功能是否因故障被抑制”。例如,当氧传感器故障确认后,FiM可以禁止闭环控制功能。FiM的查询结果通常以“允许/不允许”的形式返回给应用层,应用层据此决定是否执行某项控制逻辑。这种设计把“故障记录”和“功能决策”解耦,便于不同车型复用。

四、CanTp与DoIP:两条传输通道

CanTp处理CAN总线上的长报文分段。以经典CAN为例,单帧最多8字节,诊断请求往往超过8字节,CanTp用首帧(FF)、连续帧(CF)、流控帧(FC)完成分段与重组。关键参数包括N_Bs、N_Cr、STmin,它们决定发送节奏和超时判断。若流控帧要求STmin=10ms,发送方必须在每帧之间至少间隔10ms,否则接收方可能丢弃。

DoIP用于以太网诊断,支持车辆识别(Vehicle Identification)、路由激活(Routing Activation)和诊断报文(Diagnostic Message)。DoIP报文头包含协议版本、载荷类型和长度,诊断数据作为载荷封装。与CanTp不同,DoIP本身不负责分段,分段由TCP/IP完成。两者在Dcm看来都是“传输层接口”,Dcm通过PduR选择走CAN还是以太网。

五、ComM与Dlt:通信协调与可观测性

ComM管理总线的通信模式:No Communication、Silent Communication、Full Communication。诊断请求到达时,ComM需要确保总线处于Full Communication状态;若总线已进入睡眠,Dcm的请求会触发唤醒。ComM与CanSM、EcuM协同,避免诊断过程中总线被意外关闭。

Dlt是诊断栈的“黑匣子”。它记录诊断请求与响应、故障状态变化、会话切换和安全访问结果。在排查“诊断仪收不到响应”时,Dlt日志可以快速定位是CanTp超时、Dcm否定响应还是应用层回调未返回。Dlt通常通过以太网或调试接口输出,支持不同日志级别和上下文过滤。

交互关系速记:Dcm是调度中心,向下依赖CanTp/DoIP搬运,向上调用应用回调;Dem是故障仓库,FiM是功能开关,两者通过状态查询联动;ComM保证通信通道可用;Dlt贯穿全栈记录关键事件。理解这条链,就能在诊断异常时按“传输→服务→应用→故障→通信”的顺序逐层排查。

六、一个典型诊断请求的完整路径

假设诊断仪通过CAN发送0x22 F1 90(读取VIN)。CanTp接收首帧后启动重组,收齐后通过PduR交给Dcm。Dcm检查会话(默认会话允许0x22),调用应用层回调读取VIN数据,组包为0x62 F1 90加17字节VIN。响应经PduR回到CanTp,CanTp按流控帧要求分段发送。若VIN读取失败,应用层返回失败,Dcm生成NRC 0x22(条件不满足)。整个过程中,Dlt记录请求、响应和时间戳,Dem不参与(因为0x22不直接触发故障事件),ComM保持总线唤醒。

若换成0x19 02(读取DTC),Dcm会调用Dem接口获取DTC列表,Dem返回已确认故障的DTC和状态位。此时FiM可能被应用层查询,以决定是否允许某些功能。可见,不同服务触发的模块组合不同,但Dcm始终是入口和出口。

七、配置与集成要点

在MICROSAR中,这些模块通过配置工具生成代码。Dcm需要配置服务表、会话权限、安全等级和回调函数名;Dem需要配置事件ID、去抖策略、DTC号和冻结帧数据;CanTp需要配置通道、地址、N_As/N_Ar/N_Bs/N_Br/N_Cs/N_Cr和STmin;DoIP需要配置逻辑地址、路由激活类型和TCP/UDP端口;ComM需要配置通道映射和用户请求。集成时最容易出错的是回调函数签名不匹配、PduR路由未使能、Dem事件ID与DTC映射错误。建议在台架上先用0x10 03进入扩展会话,再用0x22读取一个已知DID,确认整条链贯通后再测试故障相关服务。