--------这一章是DEM的最后一章,小编在这里介绍的是DTC发生时,是怎么存储在非易失存储器中的。废话不多,让我们继续学习。
Event Memory
event memory是DEM的精髓所在。
event memory是用于存储故障的EventID、扩展数据、故障状态、冻结帧等故障相关的数据的存储块,这个存储块应当被写入非易失性存储空间。如果存在一个完整的上下电过程,可以在NvM_ReadAll的时候把数据读取到存储在RAM中的变量,当下电时,NvM_WriteAll写入NvM。Event memory管理负责故障相关数据的进入event memory(Entry)、更新(update)、和去除(remove)。
1. event memory分类
event memory分为四种:
2. primary memory
2.1 primary memory entry
primary memory是一个大小为DemMaxNumberEventEntryPrimary用于存储故障相关数据的非易失性存储空间。如果每个故障进入primary memory的条件(DemEventMemoryEntryStorageTrigger)是DEM_TRIGGER_ON_TEST_FAILED ,那么故障在test failed时就可以向Dem_MainFunction “申请”进入primary memory,在Dem_MainFunction中会轮询不同的SWC或者BSW报告的故障,如report故障且primary memory有足够的空间用于存储,把这些故障有序地进入primary memory。用于管理primary memory的数组或者管理单元会把故障的EventID与存在primary memory中的位置相关联,然后更新下一个存储位置的索引。流程图如下
有一个问题就是如何使得SWC调用Dem_SetEventStatus(EventId, EventState)在故障failed之后进入到event memory中,并在event memory中处理故障状态(pending、confirmed、warningIndicator、老化)和记录故障相关的数据(冻结帧、扩展数据等)。因为SWC的monitor程序和Dem_MainFunction()处在两个不同的任务中,可以使用一个队列用于管理申请进入primary memory的请求(request),SWC或者BSW在report故障时,做入队操作,把故障及故障状态入队,在Dem_MainFunction()做出队操作 。由此实现event memory entry
2.2 event memory 存储
在Dem_MainFunction任务中,在检查到故障event memory entry的请求,如何把故障存到event memory中呢?
基本思路如下图:
第一步,检查故障是否已经存在event memory中,如果已经存在,则进入event memory processing,增加error cycle counter、判断故障状态是否达到confirmed条件、判断是否需要更新冻结帧;
如果不存在,则在event memory中寻找空间用于存储故障及其状态,如果event memory中空间已满,可以使用replacement机制
2.3 event memory processing
进入primary memory之后应当先整理event memory中的顺序,使得event memory中故障存储的顺序是按照故障进入memory的先后顺序排序,也可在entry时排序,然后对所有的故障进行故障状态位(pending、confirmed、warningindicator)的处理、扩展数据计算、老化处理、对新加入的或者更新状态的故障执行冻结帧存储逻辑等等。
2.3.1 UDS 故障状态(PENDING 、confirmed 、warningIndicator)
1)pending
故障(testFailed)进入event memory之后便会在给event memory的状态或上PENDING的状态位。
pending由1变为0的条件如下两图:
2)confirmed
故障状态confirmed策略有两种情况:
① 在non-emission related ECU中
当故障状态故障testFailed之后,置PENDING位后confirmed位便会同时置位,如下图:
(2)emission-related ECU
在故障状态PENDING置位后,此时的tested and failed cyclescounter加一,如果此时tested and failed cycles counter达到DemEventFailureCycleCounterThreshold,且此时的OBD driving cycle 处于开启状态,confirmedDTC位才会置位。
2.4 冻结帧存储
冻结帧根据不同类型的也分emission related freeze frame和non-emission related freeze frame,此处仅以non-emission related冻结帧为例。
冻结帧主要用于在发生故障的一瞬间记录当时的工况,如故障发生时的车速、发动机或电机转速、KL30电电压、里程数等,这些冻结帧可以被所有的故障记录,也就是任何一个故障在发生时,都应当记录这几个数据,作为冻结帧,可以称之为公共冻结帧。但是每个故障有其独特的功能和特性,需要记录与其特性相关的冻结帧,如转子过温,故障发生时,可记录转子温度、冷却液温度、三相电流等与温度相关的数据作为该故障特有的冻结帧,可称这些冻结帧为特有冻结帧。
event-specific的冻结帧既可以提前配置好,也可以通过标定分配不同与之相关的冻结帧。
每一个冻结帧应当有一个独有的DID与之对应,用于区分不同冻结帧的含义,可以为检测仪读取冻结帧时识别不同冻结帧的含义及长度。
冻结帧相关参数: