AUTOSAR 规范定义了 Dem(Diagnositic Event Manager, 诊断事件管理器)
模块来处理和存储故障信息, 并把存储的故障信息通过接口传递给 Dcm 模块, 以便诊断仪或者电脑能够通过 UDS 服务获取相关诊断信息。
Dem 模块是专门用来管理和存储由 SW-C(Software Components, 软件组件) 和 BSW(Basic Software,基础软件) 中的诊断监视器检测到的故障诊断事件及故障信息。
故障信息包括故障码(DTC)、 故障状态字节(UDS DTC Status Byte)、 故障发生计数器(Occurrence Counter)、 冻结帧数据(Freeze Frame Data Record) 和扩展数据(Extended Data Record) 等, 这些信息将被 Dem 模块存储到 NvM(Non volatile RAM Manager, 非易失内存管理器) 中以便后续读出用于车辆故障分析。
Dem 对故障的处理可分为三个过程, 即故障报出、 故障恢复、 故障老化
Dem 提供了统一的故障管理和存储机制, SW-C 和 BSW 只需要向 Dem 实时报告故障的检测结果, 而无需关心故障的处理过程。 通过 Dcm 的诊断服务(UDS 服务) 读取 Dem 存储的故障状态及故障信息供故障分析使用。
Dem 模块对诊断事件的处理是基于操作循环的状态来进行的。
UDS 操作循环
Dem模块以诊断事件作为故障处理的基本单元。Dem模块为每一个诊断事件分配一个唯一的诊断事件ID(配置项 DemEventId),用于区分不同的诊断事件。
DTC List为DEM模块开发输入,多个 event 可以 mapping 同一个DTC;而同一个 event 不能 mapping 多个DTC。(在项目中,通常一个DTC和一个诊断事件相对应)
对于SWC,应该怎样上报Event状态呢?
事件优先级的定义是基于事件的重要程度来设定的。
当故障内存存满时, 低优先级的事件将被高优先级的事件替换掉。 事件优先级为 1 代表最高优先级, 事件优先级的数值越大优先级越低。
event 的优先级和 DTC 的优先级一样
Dem 模块为每一个事件提供一个事件发生计数器。 事件发生计数器在该事件进入故障内存时会被初始化为 1, 计数器的累加取决于配置项 DemOccurrenceCounterProcessing
的配置。
Event occurrence顾名思义就是故障事件发生计数器,故障上报次数越多,Event occurrence值越大,标志着该故障越“老”。
诊断事件可以分为两种类型: BSW 和 SW-C, 由配置项 DemEventKind
进行配置。
不同类型的诊断事件使用的事件报告接口函数不同:
Dem_ReportErrorStatus
Dem_SetEventStatus
注:为什么要划分事件类型?
应用层事件是在初始化启动之后,诊断逻辑才运行;
bsw层是在初始化阶段,需要报故障的逻辑,dem(未初始化)内部有一个buffer专门用来存储上报的事件,在dem初始化时,会将故障重新导入
Dem 模块提供多种故障内存空间用于存储诊断事件与相关数据。
支持的故障内存包括:
Primary Event Memory
),Dem 中必须存在的故障内存User Defined Event Memory
),配置的多个用户自定义故障内存Permanent Fault Memory
)主要故障内存 和 用户自定义故障内存 基本上没有区别。一般 主要故障内存 就够用。
每个诊断事件可通过配置项DemMemoryDestinationRef
进行选择。
Dem_EventMemoryStatus
;Dem_PrimaryEventMemoryInfo
;Dem_PrimaryEventMemoryEntry
。Dem_User0EventMemoryInfo
或者 Dem_User1EventMemoryInfo
;Dem_User0EventMemoryEntry
或者 Dem_User1EventMemoryEntry
。Autosar不会给出明确的标准怎么去做故障内存的管理,以下仅供参考:
在示例中,红色虚线中,每个方框代表一个NVM中的Block,并将 Block 主要分为3类:
status block
:用来存储所有 event 的状态entry block
:用来存储该故障的相关信息(DEM不会为所有的DTC分配一个block,entry block的数量可以配置,存储超过配置的数量会根据事件优先级覆盖低优先级故障)时间顺序block
:用来管理entry block,根据entry block中故障发生的时间顺序,在该block中列出
注:例如故障事件 3 已在故障内存中,当再次发送故障事件 3时,需要更改时间顺序block中的事件列表:3、2、5、1;该事件相关信息数据是否更新和配置项有关。
Dem 模块提供了监控组件(Monitored Components, 也称 DemComponent) 功能, 一个组件是若干个事件的集合, 用于有关联的事件。
在监控组件中, 需要区分连续故障和因果故障的概念: 当某个 Event 发生时, 由于优先级或依赖关系导致其他 Event 也会相继发生, 那么此时前者被称为因果故障(Causal Fault
), 而后者则被称为连续故障(Consecutive Fault
)。
因果故障和普通错误一样, 会正常执行事件处理, 进入故障内存, 但是对于连续故障则忽视, 不会进入故障内存。
同一组件节点内的诊断事件拥有不同的优先级。 一个组件内, 当一个最高优先级的事件报告 Failed,被视为因果故障时, 如果该组件内的其他更低优先级的事件报告 Failed 将被视为连续故障。 该组件下的子节点的所有事件, 如果报告了 Failed 也将被视为连续故障。
可通过 Dem_GetComponentFailed
接口获取指定监控组件是否为 Failed 状态。
故障码(DTC) 是关联某个诊断事件的独特标识符。
DTC 分为排放相关(OBD relevant) 和非排放相关(non OBD relevant)以及 J1939 三种类型,三种类型分别为:
UDS DTC故障码格式
主要故障内存中保存了所有事件的状态。 每个事件拥有各自独立的 UDS DTC 状态字节, 事件状态的定义符合 ISO-14229-1 中对 UDS DTC 状态字节的定义,详细参考:
UDS DTC状态掩码/DTC状态位
Dem为不同的用户提供了单独的API:
Dem_ClearDTC
Dem_DcmClearDTC
(for UDS to the Dcm)Dem_SetClearDTC
(for OBD to SW-Cs)Dem 提供配置项 DemClearDTCBehavior
用以定义何时向 Dcm 返回清除完成。
配置值 | 说明 |
---|---|
DEM_CLRRESP_VOLATILE Dem | 清除掉RAM中的数据后返回清除完成 |
DEM_CLRRESP_NONVOLATILE_TRIGGER Dem | 清除掉RAM中的数据且触发Nvm更新后返回清除完成 |
DEM_CLRRESP_NONVOLATILE_FINISH Dem | 清除掉RAM中的数据且Nvm更新完成后返回清除完成 |
故障内存的Entry个数可配置。
当诊断事件数量大于配置的Entry个数时,Dem 将根据事件的优先级、 主动/被动状态以及发生的先后顺序决定是否删除掉故障内存中的某个事件以存储新报告的事件。
Dem 模块提供两种替换策略, 由配置项 DemEventDisplacementStrategy
进行设定, 分别是:
配置值 | 替换条件 |
---|---|
DEM_DISPLACEMENT_FULL | 1.优先级:最低 2.Active/Passive状态:Passive 3.发生的时间先后:最早发生的 |
DEM_DISPLACEMENT_PRIO_OCC | 1.优先级:最低 2.发生的时间先后:最早发生的 |
替换策略两者的区别在于:
Dem 模 块 支 持 两 种 事 件 防 抖 方 式 , 包 括 Dem 内 部 实 现 防 抖 逻 辑 的
Autosar DEM DTC的Debounce策略
Dem 支持为每个故障配置一帧冻结帧数据(DemFreezeFrameClasss) 和 多个冻结帧数据记录号(DemFreezeFrameRecNumClasss) 用于记录故障发生或者故障状态变更时的环境数据。
DID(Data Identifier) 数据(DemDidClasss) 用于定义冻结帧数据的内容, 一帧冻结帧数据可以包含多个 DID 数据。
冻结帧数据记录用于定义冻结帧数据在不同时刻存储的值, 一帧冻结帧数据可以定义多个冻结帧数据记录号用于记录不同时刻的冻结帧数据。
配置项DemFreezeFrameRecordTrigger
用于选择存储时刻。
配置值 | 说明 |
---|---|
DEM_TRIGGER_ON_FDC_THRESHOLD | 当FDC(故障检测计数器)计数值达到阈值时 |
DEM_TRIGGER_ON_TEST_FAILED | 当诊断事件测试失败时(bito由0变1) |
DEM_TRIGGER_ON_PENDING | 当诊断事件为未确认故障时(bit2由0变1) |
DEM_TRIGGER_ON_CONFIRMED | 当诊断事件为确认故障时(bit3由0变1) |
配置项DemFreezeFrameRecordUpdate
用于选择当存储条件多次满足时是否更新已存储的数据。
Dem 支持为每个故障配置扩展数据(配置项 DemExtendedDataClassRef) 用于记录故障发生或者故障状态变更时的环境数据。
扩展数据记录(配置项 DemExtendedDataRecordClasss) 用于定义扩展数据的内容及存储条件, 一个扩展数据可以包含多个扩展数据记录(配置项 DemExtendedDataClasss)。
扩展记录号用来记录不同时刻的扩展数据。配置项DemExtendedDataRecordUpdate
用于选择存储时刻。
配置值 | 说明 |
---|---|
DEM_TRIGGER_ON_FDC_THRESHOLD | 当FDC计数值达到阈值时 |
DEM_TRIGGER_ON_TEST_FAILED | 当诊断事件测试失败时(bit0由0变1) |
DEM_TRIGGER_ON_PENDING | 当诊断事件为未确认故障时(bit2由0变1) |
DEM_TRIGGER_ON_CONFIRMED | 当诊断事件为确认故障时(bit3由0变1) |
DEM_TRIGGER_ON_PASSED | 当诊断事件测试通过时(bit0由1变0) |
配置项DemExtendedDataRecordUpdate
用于选择当存储条件多次满足时是否更新已存储的数据。
UDS DTC老化机制
Dem 模块支持为每个事件单独配置事件使能条件(DemEnableConditions), 在使能条件未满足之前,事件监视器向 Dem 模块报告的事件状态将会被忽略。Dem 定义了使能条件组(DemEnableConditionGroups)作为使能条件的分组集合。 事件的使能条件以使能条件组的形式进行配置。
Dem 模块支持为每个事件单独配置事件存储条件(DemStorageConditions)。 在存储条件未满足之前,事件监视器向 Dem 模块报告的事件将不会进入故障内存或更新故障内存。 Dem 定义了存储条件组(DemStorageConditionGroups)作为存储条件的分组集合。 事件的存储条件以存储条件组的形式进行配置。
在 ECU 上电启动或复位时, 分两步。
Dem_PreInit
接口,这样可以处理来自 BSW 模块报告的事件。Dem_Init
接口, Dem 会通过 NvM_GetErrorStatus
接口获取 NvmRamBlock 是否读取正常, 如果不正常, Dem 会重新用默认数据来初始化所有的 Ram 数据