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负责通信模式管理,决定总线是否保持通信、是否允许进入睡眠。它们之间不是简单的线性关系,而是通过回调、通知和查询形成网状交互。
二、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通常通过以太网或调试接口输出,支持不同日志级别和上下文过滤。
六、一个典型诊断请求的完整路径
假设诊断仪通过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,确认整条链贯通后再测试故障相关服务。