4. 诊断软件架构与集成方案设计

在基于 AUTOSAR 的 ECU 开发中,诊断功能并不是一个孤立的模块,而是由 DCM、DEM、FIM 三个基础软件模块协同构成的一条完整诊断链路。ETAS RTA 系列基础软件(RTA-CAR、RTA-BSW)为这条链路提供了符合 AUTOSAR 规范的实现,并在此基础上补充了 ETAS 特有的配置与集成接口。理解这三者的职责边界与交互方式,是设计诊断软件架构的第一步。

一、AUTOSAR 诊断栈的职责划分

DCM(Diagnostic Communication Manager)是诊断通信的管理者,它位于诊断栈的最上层,直接面向诊断仪。DCM 负责解析 UDS 服务请求(如 0x10 会话控制、0x22 读数据、0x2E 写数据、0x31 例程控制、0x19 读故障码),并决定该请求是本地处理还是转发给应用层。DCM 内部又分为 DSL(Diagnostic Session Layer)、DSD(Diagnostic Service Dispatcher)和 DSP(Diagnostic Service Processing)三个子层,分别处理会话与安全状态、服务分发、以及具体服务的执行。

DEM(Diagnostic Event Manager)是故障事件的管理者。应用层通过 Dem_SetEventStatus() 上报事件状态(PASSED/FAILED/PREPASSED/PREFAILED),DEM 根据配置的去抖策略(计数器去抖或时间去抖)判断事件是否真正故障,并管理故障码的存储、老化、快照数据(Freeze Frame)和扩展数据。DEM 不直接与诊断仪通信,它通过 DCM 的 0x19 服务对外提供故障码读取能力。

FIM(Function Inhibition Manager)是功能抑制的管理者。当某个故障事件被确认后,FIM 根据配置的抑制关系,禁止或限制依赖该事件的功能。例如,当氧传感器故障被确认后,FIM 可以禁止闭环燃油控制功能,使 ECU 切换到开环运行。FIM 的输入来自 DEM 的事件状态,输出是各功能模块的使能/禁止信号。

AUTOSAR 诊断栈与 ETAS RTA 集成架构 诊断仪 (Tester) CAN / DoIP DCM Diagnostic Communication Manager DSL 会话/安全层 DSD 服务分发层 DSP 服务处理层 DEM Diagnostic Event Manager 事件去抖 故障存储 快照/扩展数据 老化/清除 0x19 FIM Function Inhibition Manager 抑制条件评估 功能使能/禁止 事件状态 应用层 SWC / ETAS RTA 运行时 诊断服务回调 事件上报 功能执行 RTE 端口 Rte_Call Dem_SetEventStatus FiM_GetFunctionPermission 集成要点: 1. DCM 通过 Rte_Call 调用应用层诊断回调,回调函数名由 DCM 配置中的 ServiceTable 指定; 2. 应用层通过 Dem_SetEventStatus 上报事件,DEM 去抖后更新故障状态;FIM 依据 DEM 状态输出功能许可。

二、ETAS RTA 基础软件集成方式

ETAS RTA-CAR 提供完整的 AUTOSAR 基础软件栈,其中诊断相关模块以 RTA-BSW 组件形式交付。集成时,通常使用 ETAS ISOLAR-AB 工具进行配置,生成 Dcm_Cfg.h、Dem_Cfg.h、FiM_Cfg.h 等配置文件,再通过 RTA-CAR 的构建系统与 ECU 抽象层、微控制器抽象层一起编译链接。

集成的关键接口有三类。第一类是 DCM 到应用层的回调接口,DCM 通过 RTE 端口调用应用层实现的诊断服务处理函数,例如读取数据时调用 Rte_Call_DataServices_ReadData(),例程控制时调用 Rte_Call_RoutineServices_Start()。第二类是应用层到 DEM 的事件上报接口,应用层在检测到故障条件时调用 Dem_SetEventStatus(EventId, DEM_EVENT_STATUS_FAILED),DEM 根据配置的去抖算法决定是否将事件置为 confirmed。第三类是 FIM 到应用层的功能许可接口,应用层在执行关键功能前调用 FiM_GetFunctionPermission(FunctionId, &Permission),根据返回值决定是否允许该功能运行。

三、诊断通信层配置要点

诊断通信层配置主要涉及 DCM 的会话与安全访问配置。会话配置需要定义默认会话、编程会话、扩展会话之间的跳转关系,以及各会话下允许执行的服务集合。安全访问配置需要定义种子与密钥算法,通常由 OEM 提供算法库,集成时通过 Dcm_SecurityAccess_GetSeed() 和 Dcm_SecurityAccess_CompareKey() 两个回调实现。

以某发动机 ECU 为例,配置默认会话(0x01)下仅允许 0x10、0x22、0x19 服务;扩展会话(0x03)下增加 0x2E、0x31、0x27 服务;编程会话(0x02)下允许 0x34、0x36、0x37 等刷写服务。安全等级分为 Level 1(用于写数据)和 Level 2(用于刷写),种子长度 4 字节,密钥算法采用 AES-128 的简化版本。这些参数在 ISOLAR-AB 的 DCM 配置界面中逐项填写,生成对应的配置结构体。

四、集成接口定义与验证

集成接口定义的核心是明确每个诊断服务的输入输出参数、调用时机和返回值语义。以 0x22 读数据服务为例,DCM 收到请求后,根据 DataIdentifier 查找配置表,找到对应的 RTE 端口和操作,调用应用层的读取函数。应用层函数需要返回数据长度和指向数据缓冲区的指针,DCM 负责将数据组装成 UDS 响应报文。

验证时,可以使用 ETAS INCA 或 CANoe 发送诊断请求,观察响应报文是否符合预期。例如发送 22 F1 90 读取 VIN 码,预期响应为 62 F1 90 加上 17 字节 VIN 数据。如果响应为 7F 22 31,说明请求超出范围或会话不满足,需要检查 DCM 配置中的 DataIdentifier 是否使能、当前会话是否允许该服务。

集成顺序建议:先配置 DCM 基础通信与会话,再接入 DEM 事件上报,最后配置 FIM 抑制关系。每完成一层,用诊断仪验证该层功能正常后再进入下一层,避免多层问题叠加导致定位困难。

在实际项目中,诊断栈的集成往往与 ECU 的软件架构设计同步进行。建议在架构设计阶段就明确 DCM、DEM、FIM 的配置参数来源(OEM 规范、系统需求、安全需求),并在集成前完成接口定义文档的评审。ETAS RTA 系列提供了丰富的配置模板和示例工程,可以显著缩短集成周期,但前提是理解各模块的职责边界和交互时序,避免将应用层逻辑错误地放入 DCM 回调中,或忽略 DEM 去抖参数对故障确认时间的影响。