Dem全称为Diagnostic Event Manager,负责故障事件的处理、故障数据的存储和管理。
简单说其功能是:
- 故障事件确认前的故障debounce(去抖)
- 故障事件确认时的故障数据存储
- 故障发生后的故障老化、故障替代
AUTOSAR标准中对Dem模块最上层分了两菜单栏(参见图1),分别是
- DemConfigSet
- DemGeneral
DemConfigSet 负责不同DTC、event等的配置。
DemGeneral 负责DTC、event的共用部分,包括冻结帧、扩展帧、使能条件等。
图1 Dem的上层架构
下面主要介绍上层菜单下的配置选项。
DemConfigSet 下包含图2所示的配置项,下面针对常用的配置选项进行介绍。
图2 DemConfigSet配置项
DemComponent又名MonitorComponent,主要用于有关联的故障事件。
比如传感本身发生故障,这时控制器读取的数据应该被视为无效。
一个DemComponent是若干故障事件的集合:
在DemComponent内部,故障事件有优先级:
当最高优先级的故障事件状态为Failed导致其他故障事件状态也为Failed。
或者父节点DemComponent的状态为Failed,导致子节点DemComponent内的故障事件状态变成Failed,这种故障叫做连续错误(consecutive FAULT)。
其他被认为是偶发错误(casual FAULT)。
另外如果DemComponent内部故障事件优先级被忽略,那么仅有当父节点DemComponent的状态为Failed导致子节点DemComponent内的故障事件状态变成Failed被称作是连续错误(consecutive FAULT)。
DemDTCAttributes用于配置DTC的属性包括:
- 老化周期
- 故障优先级
- 存储方式(立即存储还是下电存储)
- 快照数据需记录的最大组数
- 参考的冻结帧数据快照数据
- 故障数据存储的memory
其中快照数据、扩展数据等需要在DemGeneral中配置。
DemDTC用于配置故障的DTC值(诊断故障码)、DTC的严重程度以及参考的DTC属性、Obd属性等。
这两项主要用于为不同的故障事件配置不同的debounce策略,
- 基于计数器的debounce策略
- 基于时间的debounce策略
或者由SWC自定义,具体请查看AUTOSAR故障Debounce策略。
DemObdDTC用于配置obd类故障事件是否支持Pto以及故障事件的DTC值等。
用于配置Pid以及相关联的应用层信号。
DemEventParameter用于配置故障的类型(BSW or SWC)、故障需要多少个运行循环才能确认、是否支持预存储功能、故障事件的debounce策略以及参考的DTC属性、DemComponent、使能条件、运行循环等。
以上参数基本为DemConfigSet比较重要的配置项,其他未介绍的可以查看标准。
DemGeneral主要用于配置DemConfigSet中不同event、DTC共用的一些参数,所以相对来说比较杂,下面针对一些进行介绍。
DemDataElementClass用于配置内部、外部元素,如表1所示,用于配置扩展数据和快照数据的数据源。其中内部元素如表2所示,外部元素主要分通过C/S或S/R接口获取应用层的数据。
DemDidClass用于配置快照数据的Did 以及对应的DemDataElementClass。
该项用于配置扩展数据的id、扩展数据触发储存条件和参考的DemDataElementClass。
该项主要用于配置快照数据的触发存储条件以及快照id。
该项用于配置快照数据包含的数据,数据来自DemDataElementClass。
故障诊断是由Dem模块和SWC共同完成的,如下图3所示,SWC中的Monitor Function对故障条件进行实时监控,并实时将故障条件的判定结果反馈至Dem模块判断是否发生故障,如图4所示。
图3 SWC与Dem模块
图4 Dem_SetEventStatus调用示意图
故障诊断由SWC与Dem模块共同完成的,故故障的debounce策略即可在SWC中实现,也可在Dem模块中实现。如果在SWC中,Dem_SetEventStatus()函数传给Dem的状态为passed或failed,如果在Dem,Dem_SetEventStatus()函数传给Dem的状态为prepassed或prefailed。
下面主要介绍在Dem中实现的debounce策略。Dem中提供了两种debounce策略,分别为基于计数器的debounce策略和基于时间的debounce策略,如图5所示。
图5 dem模块支持的debounce策略
在这种策略下,Dem会提供一个计数器(fault detection counter)用来记录判断的结果,当Diagnostic Monitor上报至dem的状态为prefailed,计数器会按步长增加,当达到设定的限值时,故障状态变成failed。当上报状态为prepassed,计数器按步长减少,当达到设定的限值时,故障状态变成passed。当以下对改策略涉及的重要参数进行解释。
1、FDC(fault detection counter):错误计数器,其范围为-128~127;
2、DemDebounceCounterFailedThreshold:故障从prefailed状态跳转至failed的限值;
3、DemDebounceCounterPassedThreshold:故障从prepassed状态跳转至passed状态的限值;
4、DemDebounceCounterIncrementStepSize:当DiagnosticMonitor上报Prefailed,错误计数器的增加量;
5、DemDebounceCounterDecrementStepSize:当DiagnosticMonitor上报Prepassed,错误计数器减少量;
6、DemDebounceCounterJumpDown:是否使能JumpDown功能。JumpDown功能是指当上一次Diagnostic Monitor上报的状态是prefailed,而当前上报的是prepassed,且当前计数器的值大于DemDebounceCounterJumpDownValue,错误计数器的值会重置为DemDebounceCounterJumpDownValue。如果JumpDown功能禁止,计数器按步长减少;
7、DemDebounceCounterJumpDownValue:当JumpDown功能使能,该变量定义了计数器的重置值;
8、DemDebounceCounterJumpUp:是否使能JumpUp功能。JumpUp功能是指当上一次Diagnostic Monitor上报的状态是prepassed,而这次上报的是prefailed,且当前计数器的值小于DemDebounceCounterJumpUpValue,错误计数器的值会重置为DemDebounceCounterJumpUpValue。如果JumpUp功能禁止,计数器按步长增加;
9:DemDebounceCounterJumpUpValue:当JumpUp功能使能,该变量定义了计数器的重置值;
下面用图6来讲解以上参数及基于计数器的debounde策略。
图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;
在这种策略下,计数器的初始值为0,其范围为-128~127,当Dem接收到Diagnostic Monitor发送的状态值开始计数,计数器的增长方向由接收到的状态决定,当计数器的值在一定时间达到阈值,完成此次判断,如果在未达到阈值时,Dem接收的状态发生变化,计数器会重新开始计数,并且计数方向也发生转变。
对于基于时间debounce的策略主要配置以下几个参数:
1、DebounceTimeBasedTaskTime:该变量定义基本的检测周期;
2、DemDebounceTimeFailedThreshold:定义故障状态从prefailed跳转至failed需要多少个DebounceTimeBasedTaskTime周期;
3、DemDebounceTimeFailedThreshold:定义故障状态从prepassed跳转至passed需要多少个DebounceTimeBasedTaskTime周期;
下面用图7来讲解以上参数以及基于时间的debounce策略。
图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、表示故障未发生;
在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)已有故障优先级大于或等于当前故障)。
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
下面先对八个状态位进行详细介绍。
故障诊断通常是周期性执行的,如果当前周期检测到故障条件满足,表示故障发生了,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位逻辑图
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逻辑图
confirmedDTC表示故障已经确认,故障数据存储至EEPROM或者FEE(如果支持实时存故障数据)。另外需要注意的是confirmedDTC置位为1不表示故障还发生,故障当前是否发生主要由testFailed状态确定。该位恢复为0的条件有以下三种:第一种为故障老化;第二种为故障替代;第三种是用Dem<…>clearDTC函数(USD 0x14服务,OBD为 0x04服务)清除故障信息。该位的逻辑图见图12.
图12 confirmedDTC逻辑图
TestNotCompletedSinceLastClear表示自从上次调用Dem<…>clearDTC函数清除故障信息后,是否成功执行对故障进行检测,该位的逻辑图见图13。
TestNotCompletedSinceLastClear=1,表示该故障自从上次清除之后还未进行检测。
TestNotCompletedSinceLastClear =0,表示该故障自从上次清除之后已成功进行检测。
图13 TestNotCompletedSinceLastClear逻辑图
TestFailedSinceLastClear表示自从上次动用Dem<…>clearDTC函数清除故障信息后,testFailed是否出现过置位为1。TestFailedSinceLastClear=0表示自从上次清除DTC之后,故障未发生过,TestFailedSinceLastClear=1表示自从上次清除之后故障又发生过。该位的复位条件有三种:第一种为调用Dem<…>clearDTC函数(USD 0x14服务,OBD为 0x04服务)清除故障信息,第二种是故障老化;第三种为故障替代。该位的逻辑图请参照图14。
图14 TestFailedSinceLastClear逻辑图
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 状态图
其中:
0 表示接收到清除故障信息命令,初始化DTCstatus byte;
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的条件;
一文搞懂AUTOSAR的DEM模块之前分开写过几篇DEM模块的文章,为了方面大家查找,把这几篇进行汇总。https://mp.weixin.qq.com/s?__biz=Mzg4NjIxODk4Mg==&mid=2247496230&idx=1&sn=711b3032878d7fefe15ab2cf78595ccb&chksm=cf9fbbaff8e832b97b752c0559a2cc41348cfd8c78ddb19be019608a87d23c98ed4d0beaab64&scene=21#wechat_redirect
Autosar诊断基础——诊断事件管理(DEM)_u012406840的博客-CSDN博客1https://blog.csdn.net/u012406840/article/details/107603731