Dem全称为Diagnostic Event Manager,负责故障事件的处理、故障数据的存储和管理。
简单说其功能是:
- 故障事件确认前的故障debounce(去抖)
- 故障事件确认时的故障数据存储
- 故障发生后的故障老化、故障替代
1、AUTOSAR DEM模块整体框架
AUTOSAR标准中对Dem模块最上层分了两菜单栏(参见图1),分别是
- DemConfigSet
- DemGeneral
DemConfigSet 负责不同DTC、event等的配置。
DemGeneral 负责DTC、event的共用部分,包括冻结帧、扩展帧、使能条件等。
图1 Dem的上层架构
下面主要介绍上层菜单下的配置选项。
DemConfigSet 下包含图2所示的配置项,下面针对常用的配置选项进行介绍。
图2 DemConfigSet配置项
1. DemComponent
DemComponent又名MonitorComponent,主要用于有关联的故障事件。
比如传感本身发生故障,这时控制器读取的数据应该被视为无效。
一个DemComponent是若干故障事件的集合:
在DemComponent内部,故障事件有优先级:
当最高优先级的故障事件状态为Failed导致其他故障事件状态也为Failed。
或者父节点DemComponent的状态为Failed,导致子节点DemComponent内的故障事件状态变成Failed,这种故障叫做连续错误(consecutive FAULT)。
其他被认为是偶发错误(casual FAULT)。
另外如果DemComponent内部故障事件优先级被忽略,那么仅有当父节点DemComponent的状态为Failed导致子节点DemComponent内的故障事件状态变成Failed被称作是连续错误(consecutive FAULT)。
2. DemDTCAttributes
DemDTCAttributes用于配置DTC的属性包括:
- 老化周期
- 故障优先级
- 存储方式(立即存储还是下电存储)
- 快照数据需记录的最大组数
- 参考的冻结帧数据快照数据
- 故障数据存储的memory
其中快照数据、扩展数据等需要在DemGeneral中配置。
3. DemDTC
DemDTC用于配置故障的DTC值(诊断故障码)、DTC的严重程度以及参考的DTC属性、Obd属性等。
4. DemDebounceCounterBaseClass、DemDebounceTimeBaseClass
这两项主要用于为不同的故障事件配置不同的debounce策略,
- 基于计数器的debounce策略
- 基于时间的debounce策略
或者由SWC自定义,具体请查看AUTOSAR故障Debounce策略。
5. DemObdDTC
DemObdDTC用于配置obd类故障事件是否支持Pto以及故障事件的DTC值等。
6. DemPidClass
用于配置Pid以及相关联的应用层信号。
7. DemEventParameter
DemEventParameter用于配置故障的类型(BSW or SWC)、故障需要多少个运行循环才能确认、是否支持预存储功能、故障事件的debounce策略以及参考的DTC属性、DemComponent、使能条件、运行循环等。
以上参数基本为DemConfigSet比较重要的配置项,其他未介绍的可以查看标准。
DemGeneral
DemGeneral主要用于配置DemConfigSet中不同event、DTC共用的一些参数,所以相对来说比较杂,下面针对一些进行介绍。
1. DemDataElementClass
DemDataElementClass用于配置内部、外部元素,如表1所示,用于配置扩展数据和快照数据的数据源。
DemDataElementClass 其中内部元素如表2所示,外部元素主要分通过C/S或S/R接口获取应用层的数据。
2. DemDidClass
DemDidClass用于配置快照数据的Did 以及对应的DemDataElementClass。
3. DemExtendedDataRecordClass
该项用于配置扩展数据的id、扩展数据触发储存条件和参考的DemDataElementClass。
4. DemFreezeFrameRecordClass
该项主要用于配置快照数据的触发存储条件以及快照id。
5. DemFreezeFrameClass
该项用于配置快照数据包含的数据,数据来自DemDataElementClass。
DEM DTC的去抖动策略
故障诊断由Dem模块和SWC共同完成,如图3所示。SWC中的监控功能实时监控故障条件,并将故障条件的判定结果实时反馈给Dem模块,以判断是否发生故障,如图4所示。
图3 SWC与Dem模块
图4 Dem_SetEventStatus调用示意图
由于故障诊断由SWC和Dem模块共同完成,因此去抖动策略可以在SWC中实现,也可以在Dem模块中实现。
- 如果在SWC中实现,Dem_SetEventStatus()函数传递给Dem的状态为passed或failed;
- 如果在Dem中实现,Dem_SetEventStatus()函数传递给Dem的状态为prepassed或prefailed。
在Dem模块中实现的去抖动策略主要有两种:基于计数器的去抖动策略和基于时间的去抖动策略,如图5所示。
-
基于计数器的去抖动策略:这种策略通过计数器来记录故障条件的出现次数。当计数器达到预设的阈值时,故障状态被确认。这种方法适用于故障条件频繁出现但持续时间较短的情况。
-
基于时间的去抖动策略:这种策略通过测量故障条件的持续时间来判断故障状态。当故障条件持续时间超过预设的时间阈值时,故障状态被确认。这种方法适用于故障条件持续时间较长但出现频率较低的情况。
这两种去抖动策略可以根据具体的应用场景选择使用,以提高故障诊断的准确性和可靠性。
如图5所示。
图5 dem模块支持的debounce策略
基于计数器的去抖动(Debounce)策略
在这种策略下,Dem模块提供一个计数器(故障检测计数器)来记录故障状态。当诊断监控器(Diagnostic Monitor)上报状态为“预故障”(prefailed)时,计数器按设定的步长增加;当计数器达到设定的阈值时,故障状态变为“故障”(failed)。当上报状态为“预通过”(prepassed)时,计数器按设定的步长减少;当计数器达到设定的阈值时,故障状态变为“通过”(passed)。以下是该策略涉及的重要参数解释:
- FDC(Fault Detection Counter):故障检测计数器,范围为-128到127。
- DemDebounceCounterFailedThreshold:从预故障状态跳转到故障状态的阈值。
- DemDebounceCounterPassedThreshold:从预通过状态跳转到通过状态的阈值。
- DemDebounceCounterIncrementStepSize:当诊断监控器上报预故障时,计数器的增加步长。
- DemDebounceCounterDecrementStepSize:当诊断监控器上报预通过时,计数器的减少步长。
- DemDebounceCounterJumpDown:是否启用跳降功能。跳降功能指当上一次诊断监控器上报状态为预故障,而当前上报状态为预通过且计数器值大于DemDebounceCounterJumpDownValue时,计数器值重置为DemDebounceCounterJumpDownValue。如果跳降功能禁用,计数器按步长减少。
- DemDebounceCounterJumpDownValue:启用跳降功能时,计数器的重置值。
- DemDebounceCounterJumpUp:是否启用跳升功能。跳升功能指当上一次诊断监控器上报状态为预通过,而当前上报状态为预故障且计数器值小于DemDebounceCounterJumpUpValue时,计数器值重置为DemDebounceCounterJumpUpValue。如果跳升功能禁用,计数器按步长增加。
- DemDebounceCounterJumpUpValue:启用跳升功能时,计数器的重置值。
图6展示了基于计数器的去抖动策略及其参数:
图6 基于计数器的debounce策略图
其中:
1、5表示JumpDown功能;
3、4表示JumpUp功能;
2表示当前计数器小于DemDebounceCounterJumpDownValue ,所JumpDown功能没有激活;
6表示DemDebounceCounterJumpDownValue ;
7表示DemDebounceCounterJumpUpValue;
8表示DemDebounceCounterFailedThreshold ;
9表示DemDebounceCounterPassedThreshold ;
10、12表示故障确认,由于计数器的值达到了fail的限值;
11故障恢复,由于计数器的值达到pass的限值;
13表示Dem接收的状态为failed,所以故障直接置位;
14表示Dem接到的状态为passed,所以故障恢复;
15表示DemDebounceCounterIncrementStepSize;
16表示DemDebounceCounterDecrementStepSize;
基于时间的去抖动(Debounce)策略
在这种策略下,计数器的初始值为0,范围为-128到127。当Dem模块接收到诊断监控器(Diagnostic Monitor)发送的状态值时,开始计数。计数器的增长方向由接收到的状态决定。当计数器在一定时间内达到阈值时,完成此次判断。如果在未达到阈值时,Dem接收到的状态发生变化,计数器会重新开始计数,并且计数方向也会发生转变。
基于时间的去抖动策略主要配置以下几个参数:
- DebounceTimeBasedTaskTime:定义基本的检测周期。
- DemDebounceTimeFailedThreshold:定义故障状态从预故障(prefailed)跳转至故障(failed)所需的DebounceTimeBasedTaskTime周期数。
- DemDebounceTimePassedThreshold:定义故障状态从预通过(prepassed)跳转至通过(passed)所需的DebounceTimeBasedTaskTime周期数。
图7展示了这些参数及基于时间的去抖动策略:
- DebounceTimeBasedTaskTime:基本检测周期。
- DemDebounceTimeFailedThreshold:从预故障到故障的周期数。
- DemDebounceTimePassedThreshold:从预通过到通过的周期数。
图7 基于时间的debounce策略图
其中:
t failed:表示故障failed需要的时间,该值等于DebounceTimeBasedTaskTime乘以DemDebounceTimeFailedThreshold;
t passed:表示故障passed需要的时间,该值等于DebounceTimeBasedTaskTime乘以DemDebounceTimePassedThreshold;
1、表示Diagnostic Monitor传至Dem的状态为prefailed;并经过t failed时间故障状态编程failed;
2、表示Diagnostic Monitor传至Dem的状态为prepassed;此时计数器重新开始计数;
3、由于2时刻开始计数未达到阈值时,Dem接收的状态发生变化,此时计数器开始重新计数,并计数方向发生变化,经过t failed时间后,故障状态编程failed。
4、Dem接收的状态为failed,所以故障直接置位了;
5、Dem接收的状态为passed,所以故障直接恢复了;
6、表示故障已发生;
7、表示故障未发生;
03. DEM 故障数据存储策略
在AUTOSAR的Dem模块中,提供了DemEventDisplacementStrategy配置选项,用于选择不同的故障数据存储策略。这些策略包括:DEM_DISPLACEMENT_NONE、DEM_DISPLACEMENT_PRIO_OCC和DEM_DISPLACEMENT_FULL。
- DEM_DISPLACEMENT_NONE:当选择此策略时,如果故障数据存储区已满,新发生的故障数据将不会被存储。
- DEM_DISPLACEMENT_PRIO_OCC:此策略通过比较故障优先级(Priority)、故障发生时间(Occurrence)和bit6(TestNotCompletedThisOperationCycle bit)状态来决定是否存储故障数据。
- DEM_DISPLACEMENT_FULL:此策略通过比较故障优先级(Priority)、故障发生时间(Occurrence)、bit6(TestNotCompletedThisOperationCycle bit)状态和故障状态(Active/Passive status)来决定是否存储故障数据。
以下是各参数的详细解释:
- 故障优先级(Priority):在开发Dem模块时,为每个故障配置一个固定的优先级。
- 故障发生时间(Occurrence):指故障上报至Dem模块的时间。当同一驾驶循环中故障再次发生时,新的故障数据会覆盖上次的故障数据。
- 故障状态(Active/Passive status):指故障的当前状态,Active表示故障正在发生,Passive表示故障未发生。
图8展示了AUTOSAR故障数据存储的详细逻辑图。
图8 故障存储策略
如果DemOBDEventDisplacement设置为TRUE,,则故障存储策略会忽略满足以下条件的故障:
已有故障为排放相关的故障(AND)已有故障触发了MIL(OR)Pending位置位为1(OR)(已有故障有合法的冻结帧数据(OR)已有故障优先级大于或等于当前故障)。
04.DEM DTC 状态位含义
DTC status表示一个故障的状态,是故障数据存储、故障老化等机制的依据条件之一,DTC status总共包含8位,各位的含义见表3:
Bit | 描述 |
0 | TestFailed |
1 | TestFailedThisOperationCycle |
2 | PendingDTC |
3 | ConfirmedDTC |
4 | testNotCompletedSinceLastClear |
5 | testFailedSinceLastClear |
6 | TestNotCompletedThisOperationCycle |
7 | WarningIndicatorRequested |
表3 DTC status
下面先对八个状态位进行详细介绍。
Bit0 testFailed
故障诊断通常是周期性执行的,如果当前周期检测到故障条件满足,表示故障发生了,testFailed
会立即置1。下一个周期如果检测到该故障条件未满足,则testFailed
会立即恢复为0。
testFailed
恢复为0还有两种情况:
- 一种是调用
Dem_ClearDTC
函数清除故障信息(USD 0x14服务,或OBD 0x04服务) - 另一种是调用
Dem_ResetEventStatus
函数对该故障状态位进行复位。
testFailed
逻辑图见图9。
AUTOSAR标准中对testFailed
还有关于是否需要存储的描述,可以通过配置项DemStatusBitStorageTestFailed
进行配置。对于支持WWH-OBD的控制器则需将该配置项配置为true。
图9 testFailed位逻辑图
Bit1 TestFailedThisOperationCycle
TestFailedThisOperationCycle
用于表示当前运行循环是否出现过testFailed = 1
。
一旦testFailed
出现过置1的情况,TestFailedThisOperationCycle
会被置1。TestFailedThisOperationCycle
位恢复为0的条件有两种:
- 第一种是用
Dem_ClearDTC
函数清除故障信息(USD 0x14服务,或OBD 0x04服务); - 第二种是该运行循环结束或新的运行循环开始。
TestFailedThisOperationCycle
的变化逻辑请参照图10。
图10 TestFailedThisOperationCycle位逻辑图
Bit2 PendingDTC
PendingDTC
用于表示故障在当前运行循环或者上一个运行循环出现过testFailed
被置位为1,并且PendingDTC
的状态只有在当前循环测试完毕之后才会更新。也就是说,如果上一个循环故障发生了,PendingDTC
置1,当前循环故障没有发生,但是PendingDTC
仍为1,只有在下一个循环才会恢复为0。该位恢复0的条件有两种:
- 第一种是用
Dem_ClearDTC
函数清除故障信息(USD 0x14服务,或OBD 0x04服务); - 第二种是当前运行
TestFailedThisOperationCycle
未置为1,且TestNotCompletedThisOperationCycle
未置为1,同时运行循环结束或者下一个运行循环开始。
该位的逻辑图见图11。
PendingDTC
主要用于某些故障需要多个运行循环才能确认(Bit3 confirmedDTC=1
)的情况下,目前遇到的主要是OBD排放相关的故障需要实现PendingDTC
位。
图11 PendingDTC逻辑图
Bit3 confirmedDTC
confirmedDTC
表示故障已经确认,故障数据存储至EEPROM或者FEE(如果支持实时存故障数据)。
需要注意的是,confirmedDTC
置位为1不表示故障还在发生,故障当前是否发生主要由testFailed
状态确定。该位恢复为0的条件有以下三种:
- 第一种为故障老化;
- 第二种为故障替代;
- 第三种是用
Dem_ClearDTC
函数(USD 0x14服务,OBD为 0x04服务)清除故障信息。
该位的逻辑图见图12。
图12 confirmedDTC逻辑图
Bit4 TestNotCompletedSinceLastClear
TestNotCompletedSinceLastClear
表示自从上次调用Dem_ClearDTC
函数清除故障信息后,是否成功执行对故障进行检测。该位的逻辑图见图13。
TestNotCompletedSinceLastClear=1
:表示该故障自从上次清除之后还未进行检测。TestNotCompletedSinceLastClear=0
:表示该故障自从上次清除之后已成功进行检测。
图13 TestNotCompletedSinceLastClear逻辑图
Bit5 TestFailedSinceLastClear
TestFailedSinceLastClear
表示自从上次调用Dem_ClearDTC
函数清除故障信息后,testFailed
是否出现过置位为1。
TestFailedSinceLastClear=0
表示自从上次清除DTC之后,故障未发生过;TestFailedSinceLastClear=1
表示自从上次清除之后故障又发生过。
该位的复位条件有三种:
- 第一种为调用
Dem_ClearDTC
函数(USD 0x14服务,OBD为 0x04服务)清除故障信息; - 第二种是故障老化;
- 第三种为故障替代。
该位的逻辑图请参照图14。
图14 TestFailedSinceLastClear逻辑图
Bit6 testNotCompletedThisOperationCycle
testNotCompletedThisOperationCycle
表示该运行循环故障是否进行检测,或者说故障是否进行测试。该位的逻辑图见图15。
testNotCompletedThisOperationCycle=0
:表示当前循环已对该故障进行检测,进行测试。testNotCompletedThisOperationCycle=1
:表示当前循环还未对该故障进行检测,进行测试。
图15 testNotCompletedThisOperationCycle逻辑图
Bit7 WarningIndicatorRequested
WarningIndicatorRequested用于某些故障发生需要通过仪表盘的MIL灯通知用户。
- WarningIndicatorRequested=1表示请求点亮仪表盘的MIL灯。
- WarningIndicatorRequested=0表示不请求点亮仪表盘的MIL灯。
对于不需要通过仪表盘告知用户的故障,WarningIndicatorRequested始终为0,该位的逻辑图见图16.
图16 WarningIndicatorRequested逻辑图
上面主要单独对DTC status的各位进项介绍,下面通过一张状态图(如图17)来介绍各状态位的变化。
图17 状态图
上面主要单独对DTC状态的各位进行了介绍,下面通过一张状态图(如图17)来介绍各状态位的变化。
0:表示接收到清除故障信息命令,初始化DTC状态字节。
1,2:表示在运行循环1中故障检测,或者说故障测试已经开始,所以bit4、bit6状态发生变化。
3,4,5,6:表示testFailed
,TestFailedThisOperationCycle
,PendingDTC
,TestFailedSinceLastClear
位同时从0变为1,表示已检测到故障发生,但该故障需要两个运行周期才能确认,所以confirmedDTC
还是为0。
7:表示故障恢复。
8:表示故障再次发生。
9,10:表示在运行循环1结束,运行循环2开始的分界点。由于运行循环2中故障还未进行检测,所以TestFailedThisOperationCycle
状态从1变成0,testNotCompletedThisOperationCycle
状态从0变成1。
11:表示在运行循环2中故障检测还未开始。这时testFailed
的状态可以由制造商指定是否保留上一个循环中testFailed
的状态,在AUTOSAR中可以通过DemStatusBitStorageTestFailed
配置项配置。
12:表示在运行循环2中故障检测已经执行。
13,14:表示在运行循环2中故障发生了,所以testFailed
、TestFailedThisMonitoringCycle
置位为1。
15:由于故障在两个循环中都存在,confirmedDTC
置位为1。
16:用于记录故障连续在多少个运行循环中出现,用于确认故障的confirmedDTC
是否达到置1的条件。
小结:
DEM DTC状态位用于表示故障的状态,共包含8位,每个位都有特定的含义:
- Bit0: testFailed - 当前周期检测到故障条件满足时置1。
- Bit1: TestFailedThisOperationCycle - 当前运行循环中是否出现过testFailed=1。
- Bit2: PendingDTC - 当前或上一个运行循环中出现过testFailed=1。
- Bit3: confirmedDTC - 故障已确认并存储。
- Bit4: TestNotCompletedSinceLastClear - 自上次清除故障信息后是否成功检测。
- Bit5: TestFailedSinceLastClear - 自上次清除故障信息后是否出现过testFailed=1。
- Bit6: testNotCompletedThisOperationCycle - 当前运行循环中是否进行故障检测。
- Bit7: WarningIndicatorRequested - 请求点亮仪表盘的MIL灯。
这些状态位帮助确定故障的检测、存储和处理过程。