Autosar DEM模块

功能说明

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 对故障的处理可分为三个过程, 即故障报出、 故障恢复、 故障老化

  • 1.故障报出指因诊断监视器向 Dem 报告了故障测试失败的检测结果而导致 Dem 记录并存储该故障的过程, 此时通过 Dem 提供的接口函数可以查询到该故障的故障信息, 已报出的故障持续多个驾驶循环向 Dem 报告故障测试失败将请求点亮故障指示灯以警示驾驶员。
  • 2.故障恢复指由于连续多个驾驶循环中诊断监视器均未向 Dem 报告故障测试失败 Dem 请求熄灭故障指示灯的过程,此时仍可以通过 Dem 提供的接口函数查询到该故障的故障信息。
  • 3.故障老化指故障指示灯熄灭后连续多个驾驶循环中诊断监视器均未向 Dem 报告故障测试失败 Dem 删除该故障的过程,此时通过 Dem 提供的接口函数无法查询到该故障的故障信息。

Dem 提供了统一的故障管理和存储机制, SW-C 和 BSW 只需要向 Dem 实时报告故障的检测结果, 而无需关心故障的处理过程。 通过 Dcm 的诊断服务(UDS 服务) 读取 Dem 存储的故障状态及故障信息供故障分析使用。

DEM 功能模块关系图

在这里插入图片描述

操作循环

Dem 模块对诊断事件的处理是基于操作循环的状态来进行的。

UDS 操作循环

诊断事件

Dem模块以诊断事件作为故障处理的基本单元。Dem模块为每一个诊断事件分配一个唯一的诊断事件ID(配置项 DemEventId),用于区分不同的诊断事件。

DTC List为DEM模块开发输入,多个 event 可以 mapping 同一个DTC;而同一个 event 不能 mapping 多个DTC。(在项目中,通常一个DTC和一个诊断事件相对应)

故障上报

对于SWC,应该怎样上报Event状态呢?

  • 周期调用 Dem_SetEventStatus上报即为周期循环上报
  • 当Event状态变化时,调用Dem_SetEventStatus上报为触发上报
    在这里插入图片描述

事件优先级

事件优先级的定义是基于事件的重要程度来设定的。

当故障内存存满时, 低优先级的事件将被高优先级的事件替换掉。 事件优先级为 1 代表最高优先级, 事件优先级的数值越大优先级越低。

event 的优先级和 DTC 的优先级一样

事件发生计数器

Dem 模块为每一个事件提供一个事件发生计数器。 事件发生计数器在该事件进入故障内存时会被初始化为 1, 计数器的累加取决于配置项 DemOccurrenceCounterProcessing 的配置。

Event occurrence顾名思义就是故障事件发生计数器,故障上报次数越多,Event occurrence值越大,标志着该故障越“老”。

诊断事件的分类

诊断事件可以分为两种类型: BSW 和 SW-C, 由配置项 DemEventKind 进行配置。

不同类型的诊断事件使用的事件报告接口函数不同:

  • BSW 事件使用接口 Dem_ReportErrorStatus
  • SW-C 事件使用接口 Dem_SetEventStatus

在这里插入图片描述

注:为什么要划分事件类型?
应用层事件是在初始化启动之后,诊断逻辑才运行;
bsw层是在初始化阶段,需要报故障的逻辑,dem(未初始化)内部有一个buffer专门用来存储上报的事件,在dem初始化时,会将故障重新导入

事件故障内存

Dem 模块提供多种故障内存空间用于存储诊断事件与相关数据。

支持的故障内存包括:

  • 主要故障内存(Primary Event Memory),Dem 中必须存在的故障内存
  • 用户自定义故障内存(User Defined Event Memory),配置的多个用户自定义故障内存
  • 永久故障内存(Permanent Fault Memory

主要故障内存 和 用户自定义故障内存 基本上没有区别。一般 主要故障内存 就够用。

每个诊断事件可通过配置项DemMemoryDestinationRef进行选择。

1、主要故障内存

  1. 操作循环状态、 故障状态字节、 事件测试失败计数值以及防抖计数值, 参考结构体变量Dem_EventMemoryStatus
  2. 故障内存中故障个数、 故障在故障内存中的顺序列表、第一次存储的事件和最近一次存储的事件,参考结构体变量 Dem_PrimaryEventMemoryInfo
  3. 各种计数器以及冻结帧 、扩展数据存储缓存等 ,参考结构体数组变量 Dem_PrimaryEventMemoryEntry

2、用户自定义故障内存

  1. 故障内存中故障个数、 故障在故障内存中的顺序列表、第一次存储的事件和最近一次存储的事件,参考结构体变量 Dem_User0EventMemoryInfo 或者 Dem_User1EventMemoryInfo
  2. 各 种 计 数 器 以 及 冻 结 帧 、 扩 展 数 据 存 储 缓 存 等 , 参 考 结 构 体 数 组 变 量Dem_User0EventMemoryEntry 或者 Dem_User1EventMemoryEntry

3、永久故障内存

  1. OBD 相关的驾驶循环计数、 暖机循环计数、 WWHOBD 相关的冻结帧数据、 IUMPR 计数器等。参考结构体变量 Dem_PermanentEventMemoryEntry。

故障内存结构

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 也将被视为连续故障。

在这里插入图片描述

  • 若 Event_A 比 Event_B 先发生时,Event_A 则被视为 Causal Fault,而 Event_B 作为 Consecutive Fault直接忽略掉;
  • 若 Event_B 比 Event_A 先发生时, Event_B 和 Event_A 则被视为 Causal Fault;
  • 若 Event_B 已发生时, Event_E 就会当做 Consecutive Fault 被忽视掉, 因为 DemComponent1 即为Failed 状态, 其子节点 DemComponent2 下的 Event 都会被视为 Consecutive Fault 忽视;
  • 若 Event_E 和 Event_H 发生时, 两者都会被视为 Causal Fault 完成正常的事件处理, 因为两者并没有存在父子关系, Dem 模块会平等对待此类型的 DemComponent;
  • 若 DemCompopnent2 忽视自身优先级(DemComponentIgnoresPriority) 且 DemComponent1 处于Not Failed 状态时, 那么该 DemCompopnent2 下所有的 Event 都是平等关系, 按照正常 Causal Fault处理; 若此时 DemComponent1 为 Failed 状态时, 那么 DemComponent2 下的所有 Event 均会被视为 Consecutive Fault 来处理;

可通过 Dem_GetComponentFailed 接口获取指定监控组件是否为 Failed 状态。

故障码

故障码(DTC) 是关联某个诊断事件的独特标识符。

DTC 分为排放相关(OBD relevant) 和非排放相关(non OBD relevant)以及 J1939 三种类型,三种类型分别为:

  • OBD DTC(ISO 15031)
  • UDS DTC(ISO 14229)
  • J1939 DTC(SAE J1939-73)。

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_FULL1.优先级:最低
2.Active/Passive状态:Passive
3.发生的时间先后:最早发生的
DEM_DISPLACEMENT_PRIO_OCC1.优先级:最低
2.发生的时间先后:最早发生的

替换策略两者的区别在于:

  • DEM_DISPLACEMENT_FULL 比 DEM_DISPLACEMENT_PRIO_OCC 仅多了被动状态的判断条件。
  • 处于被动状态表示 DTC 状态字节的 Bit0(TestFailed) 为 0 时。
  • 条件判断顺序:如对比的两个事件的 DTC 优先级相同, 再对比事件的被动状态, 如果还是相同, 再对比发生时间。

在这里插入图片描述

Debounce 防抖机制

Dem 模 块 支 持 两 种 事 件 防 抖 方 式 , 包 括 Dem 内 部 实 现 防 抖 逻 辑 的

  • 基 于 计 数 器(DemDebounceCounterBased)
  • 基于定时器的防抖方式(DemDebounceTimeBase)

Autosar DEM DTC的Debounce策略

故障数据存储

1、冻结帧数据

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用于选择当存储条件多次满足时是否更新已存储的数据。

在这里插入图片描述

2、扩展数据

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老化机制

使能/存储条件

1、使能条件

Dem 模块支持为每个事件单独配置事件使能条件(DemEnableConditions), 在使能条件未满足之前,事件监视器向 Dem 模块报告的事件状态将会被忽略。Dem 定义了使能条件组(DemEnableConditionGroups)作为使能条件的分组集合。 事件的使能条件以使能条件组的形式进行配置。

2、存储条件

Dem 模块支持为每个事件单独配置事件存储条件(DemStorageConditions)。 在存储条件未满足之前,事件监视器向 Dem 模块报告的事件将不会进入故障内存或更新故障内存。 Dem 定义了存储条件组(DemStorageConditionGroups)作为存储条件的分组集合。 事件的存储条件以存储条件组的形式进行配置。

初始化

在 ECU 上电启动或复位时, 分两步。

  • 第一步, 在 NvM 模块初始化前, 需要先调用 Dem_PreInit 接口,这样可以处理来自 BSW 模块报告的事件
  • 第二步, 在 NvM 模块初始化完成, 恢复 NVRAM 数据后, 需要再调用 Dem_Init 接口, Dem 会通过 NvM_GetErrorStatus 接口获取 NvmRamBlock 是否读取正常, 如果不正常, Dem 会重新用默认数据来初始化所有的 Ram 数据

参考

  • https://zhuanlan.zhihu.com/p/658315949
  • 36
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值