目录
在前面 《[CP_AUTOSAR]_系统服务_DEM模块(一)》文中,简要介绍了 DEM 模块的功能、与其它模块之间的功能交互;在 《[CP_AUTOSAR]_系统服务_DEM模块(二)》文中,简要介绍了 DEM 模块关于ECU启动阶段的行为、诊断监测器的重新初始化的功能规范。本文接着介绍诊断事件定义的功能规范。
参考文档《AUTOSAR_SWS_DiagnosticEventManager》
1、诊断事件定义
可以被 DEM 模块处理的原子级单元定义为诊断事件。诊断事件的状态表示了监测器的运行结果,DEM 模块可以通过 RTE 或者 BSW 模块获取监测器的执行结果。
DEM 模块使用 EventId 来管理系统中诊断事件的状态,并对各个诊断结果执行相应的行动,比如存储冻结帧。
[SWS_Dem_00153] DEM 模块应该通过一个 EventId 和 EventName 来表示一个诊断事件。所有的监测器以及BSW 模块使用 EventId 作为 EventName ,DEM 配置工具用数字替换符号名称。
[SWS_Dem_00154] 每个 DEM 模块 EventId 和相关的 EventName 都是唯一的。DEM 模块不应该设计多个监测器共享一个 EventId 的用例。DEM 模块使用内部监测器状态来存储汇报的诊断事件的状态。
1.1、Event priority(事件优先级)
基于重要性的事件排列被定义为事件优先级。如果要存储的事件数量超出了最大的内存条目,那么就可以根据事件优先级来决定哪些故障条目可以从 event memory 中移除。
[SWS_Dem_00382] 每个诊断事件都被分配一个优先级(参数为 DemDTCPriority)。
[SWS_Dem_00383] 最高优先级的数值为 1 ,优先级数值越大,表示的重要性越低。
1.2、Event occurrence(事件发生计数器)
[SWS_Dem_00011] DEM 模块为每一个 Event memory entry(单个存储的容器,用于存储该事件以及相关的数据,可以动态分配给指定的事件)提供事件发生计数器;
[SWS_Dem_00523] 如果诊断事件进入各自的 event memory (比如,主要故障内存由若干个事件内存条目组成),DEM 模块应该初始化事件发生计数器为1。
[SWS_Dem_00524] 如果配置参数 DemOccurrenceCounterProcessing 被设置为 DEM_PROCESS_OCCCTR_TF,DEM 模块中事件发生计数器应该加一,如果相关的诊断事件已经存储到 event memory 中,UDS 状态参数中 bit0 (TestFailed)由 0 变为 1 即可触发。
[SWS_Dem_00580] 如果配置参数 DemOccurrenceCounterProcessing 被设置为 DEM_PROCESS_OCCCTR_CDTC,DEM 模块需要将事件发生计数器应该加一,如果相关的诊断事件已经存储到 event memory 中 并且 UDS status bit 3 等于1,UDS 状态参数中 bit0 (TestFailed)由 0 变为 1 即可触发。
[SWS_Dem_00625] DEM 模块不再增加指定事件的发生计数器,如果发生计数器达到了最大值 255。
1.3、Event kind(事件类别)
有两种诊断事件类型:
1、与 BSW 模块相关的诊断事件:通过 API 函数 Dem_SetEventStatus 来汇报;
2、与 SWCs 模块相关的诊断事件:通过 RTE 接口函数 SetEventStatus 来汇报;
诊断事件的类别可以通过参数 DemEventKind 来配置。
1.4、Event destination(故障内存)
在 DCM - DEM 交互过程中,参数 DTCOrigin 被用于区分存储的内存区域。在不同的内存区域(primary,主要故障内存; user defined,用户自定义故障内存;permanent,永久故障内存),所允许的操作是不一样的。
配置参数 DemMemoryDestinationRef 定义了故障专用的存储位置,以及它相关的数据。
一、主要故障内存
故障状态掩码、失败计数器、Debounce 计数器、故障的总数、故障顺序表、第一次存储的事件以及最近一次存储的事件、冻结帧、扩展数据等;
二、用户自定义故障内存
与主要故障内存中存储的数据单元类似,由用户自定义;
故障状态掩码、失败计数器、Debounce 计数器等;
三、永久故障内存
排放相关的故障(比如,与 OBD 相关的驾驶循环、WWHOBD 有关的冻结帧数、暖机循环计数、IUMPR 计数器等)被自动分配到永久故障内存(Permanent Event Memory)中。作为 “Permanent DTC” 来存储故障,是来源于它的当前状态。在这个上下文中,该词语 “permanent” 是指与排放相关故障的属性有关,而非单单指 NVM 的永久性存储。
1.5、Diagnostic monitor definition(诊断监测器定义)
诊断检测器是能够决定组件单元的功能是否合理的例程实体。监测器功能为一条监测路径定义了故障类型(如短地、开路等)。一条监测路径代表了一个物理系统或者一个线圈正在被监控(如传感器输入)。一个诊断事件,一条监测路径。
下图为 SWC 中监测器的示例:
如果故障监测器所监测的系统正在抖动(比如运行正常的物理系统受到了扰动),汇报故障的 API 只有在抖动计数器达到预定值时才会被调用。诊断事件状态的改变(passed 或者 failed),是有必要去汇报的。通常,监视器总是调用Dem更有效,因此应该首选。因此,Dem处理未改变结果的报告是具体实施的。
如果监测器使用 DEM 模块内部的抖动计数器机制,每当执行带有功能检查的代码时,都会调用汇报的 API。
1.6、Event dependencies(事件独立性)
DemComponent 中事件优先级、以及DemComponents 之间的依赖关系,是被用于过滤汇报给故障内存的故障存储的。
当某个故障发生时,由于优先级或依赖关系导致其他故障也会相继发生,那么此时前者被称为因果故障(Causal Fault), 而后者则被称为连续故障(Consecutive Fault)。
[SWS_Dem_01126] 当一个事件报告为 FAILED 时,如果同一个 DemComponent 中具有更高优先级的其他事件已经为FAILED,则该事件应被视为连续故障(CONSECUTIVE FAULT)。
[SWS_Dem_01127] 当一个事件报告为 FAILED 时,如果父故障为FAILED,则该事件应被视为连续故障(CONSECUTIVE FAULT)。
[SWS_Dem_01128] 如果父故障发生(在同一个系统中的其它故障的失效都应该被忽略,比如传感器的供电异常,那么在供电异常故障汇报时,类似于传感器数值不正确的故障则应该被忽略,而供电异常则是传感器数值不正确故障的父故障),则该事件应被视为连续故障(CONSECUTIVE FAULT)。DEM 应该忽略事件的优先级。
[SWS_Dem_01129] 如果汇报的故障不被认定为连续故障,那么应被认定为 CAUSAL FAULT。因果故障会被正常执行事件处理,进行故障内存管理。
[SWS_Dem_01218] 如果汇报的故障不被认为是连续故障,并且已经配置了 DemCausalityDelayTime,则将其视为初步因果故障(PRELIMINARY-CAUSAL FAULT)。从汇报事件发生的时间点开始,直到经过 DemCausalityDelayTime,事件可以被重新认定为连续故障。如果在此期间在同一 DemComponent 内或任何父 DemComponent 上报告了另一个具有更高优先级的故障,则该事件应被重新视为连续故障。时间过去后,故障将不会被重新考虑。
[SWS_Dem_01130] 被认为是连续故障的故障不应存储到故障存储器中。(处理应类似于未满足存储条件)
[SWS_Dem_01211] 汇报 DEM_EVENT_STATUS_FDC_THRESHOLD_REACHED (例如,通过接口调用、或者达到了 debounce 算法中配置的阈值时) 被认为是故障事件的连续报告,则不应被存储到故障内存中。处理应类似于未满足储存条件
[SWS_Dem_01131] DEM 提供接口 Dem_GetComponentFailed ,其允许查询 DemComponents 的失效状态。
[SWS_Dem_01132] 如果 DemTriggerFiMReports 使能,每个 DemComponent 失效状态发生改变时,DEM 应该调用函数 DemTriggerOnComponentStatus 去通知 Fim 模块。
[SWS_Dem_01133] 如果组件状态正在改变并且 DemComponentFailedCallbackFnc 被配置,或者是DemComponentFailedCallbackUsePort 被设置为 TRUE ,DEM 模块应该触发回调函数 DemTriggerOnComponentStatus。
1.7、Component availability(组件可用性)
[SWS_Dem_01134] DEM 模块支持组件可用性。不可用的组件被视为未包含在系统中。
[SWS_Dem_01135] 接口函数 Dem_SetComponentAvailable 可以设置组件的可用性状态。
[SWS_Dem_01136] 设置组件(DemComponent)不可用,那么所有分配的事件也应该被设置为不可用。
[SWS_Dem_01239] 启动之后,所有的 DemComponents 都是可用的。
[SWS_Dem_01226] 如果通过函数 Dem_SetComponentAvailable 设置一个组件不可用,那么 DEM 模块应该设置其子组件为不可用,就像系统中不存在组件。
[SWS_Dem_01227] 如果一个组件被设置为不可用,DEM 模块应该设置所有分配到该组件的事件为不可用,包括这些事件的所有子节点。事件的行为类似于将每个事件单独设置为“不可用”。
[SWS_Dem_01228] 如果通过函数 Dem_SetComponentAvailable 设置一个组件不可用而且任何分配到该组件的独立事件是失效的,该独立事件会被保持为可用的。
[SWS_Dem_01229] 如果通过函数 Dem_SetComponentAvailable 设置一个组件为可用,所有被分配到该组件的事件也应该设置为可用,包括这些事件的子节点(如果这些子节点仍被设置不可用)。事件的行为类似于将每个事件单独设置为“可用”。
[SWS_Dem_01231] 如果函数 Dem_SetComponentAvailable 被调用去设置一个事件为可用,如果它当前相关的节点为不可用,那么函数返回值应该为 E_NOT_OK。
[SWS_Dem_01232] 如果函数 Dem_SetComponentAvailable 设置某个事件为可用,并且其组件为不可用,Dem_SetEventAvailable 函数应该返回 E_NOT_OK。