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. 記錄每次觸發都會捕捉 |