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分为四种:
类型 |
|
DemPrimaryMemory |
存储EventId、故障状态、冻结帧、扩展数据 |
DemUserDefinedMemory |
|
DemMirrorMemory |
|
permanent event memory |
用于存储OBD-relevant DTC |
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机制。
DemEventDisplacementStrategy |
|
DEM_DISPLACEMENT_FULL |
替换机制考虑优先级、故障状态active或者passive和故障出现次数 |
DEM_DISPLACEMENT_NONE |
替换机制失能 |
DEM_DISPLACEMENT_PRIO_OCC |
替换机制考虑优先级、故障出现次数 |
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的条件如下两图:
从图中标记5可以看出,如果连续两个operation cycle, event的状态都是test passed,那么PENDING的状态位即可由1变为0,event memory的PENDING状态即可清零。图中还可看出PENDING位由1变0的条件为:在两个operation cycle中故障都未发生,在第二个testPassed的operation cycle 结束的时候,PENDING位清零。但是对于没有shut down过程即直接掉电的ECU而言,可以在下一个operation cycle开启时把PENDING位清零。
(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与之对应,用于区分不同冻结帧的含义,可以为检测仪读取冻结帧时识别不同冻结帧的含义及长度。
冻结帧相关参数:
DemFreezeFrameRecordTrigger 冻结帧存储的触发条件 |
DEM_TRIGGER_ON_CONFIRMED |
UDS故障状态bit3(confirmedDTC)由0变为1时触发存储冻结帧 |
|
DEM_TRIGGER_ON_FDC_THRESHOLD |
当FDC到达阈值时触发冻结帧存储 |
|
DEM_TRIGGER_ON_PENDING |
UDS故障状态bit2(PENDING)由0到1触发冻结帧存储 |
|
DEM_TRIGGER_ON_TEST_FAILED |
UDS故障状态bit1(testFailed)由0变为1触发冻结帧存储 |
DemFreezeFrameRecordUpdate 该参数定义了冻结帧存储和更新的条件 |
DEM_UPDATE_RECORD_NO |
This record is only captured for new event memory entries. 记录只在第一次进入event memory时捕捉,及时第一次存储后不再更新。 |
|
DEM_UPDATE_RECORD_YES |
This record is captured every time. 记录每次触发都会捕捉 |