诊断事件管理模块(DEM)处理和储存诊断监视器在软件组件(SW-Cs)和基础软件(BSW)模块中监测到的事件。这些储存的事件可以通过其他BSW或SWC的接口获得。
DEM包含DemGeneral和DemConfigSet两个部分,其中DemGeneral用于配置的所有诊断事件通用的部分,DemConfigSet则用于配置各个具体的诊断事件。
7.1 启动
[SWS_Dem_00169]DEM模块应分为预初始化和完全初始化两种操作模式。
[SWS_Dem_00180]Dem_PreInit函数应该使用Dem_SetEventStatus 和 Dem_ResetEventDebounceStatus初始化DEM模块处理事件和重置SWC和BSW模块反馈的防抖计时器所需内部状态。
Dem_PreInit在ECU启动过程中的NVM管理器初始化之前被ECU状态管理器调用。此时BSW可以通过Dem_SetEventStatus函数报告相关的诊断事件。
Dem_Init函数在启动过程中NVM管理器恢复数据之后被调用,然后初始化包括诊断监视器在内的SWCs。Dem_Init函数也在 Dem_Shutdown函数被调用之后用来重新初始化DEM。
Dem_Init使用注意事项:在DEM模块完成Dem_Init调用之前DEM模块是不起作用的。
7.2 监视器(Monitor)重新初始化
应用程序中的监视器的主要初始化是通过Rte_Start完成的。一些特定事件的部分可以由DEM触发。
[SWS_Dem_00003]DEM模块应该提供InitMonitorForEvent接口来触发诊断监视器的初始化。InitMonitorReason参数用于从监视器评估特定(重新)初始化原因,以确定要执行的初始化类型(SRS_BSW_00457)
提示: 配置器DemCallbackInitMForE用于指定每个事件相关的port(P/R中的P)或c-callback(这里指的应该是C/S接口中的C 以下称C口)。
[SWS_Dem_00679] Dem_RestartOperationCycle应该通过调用所有相关事件各自的C口InitMonitorForEvent,并将参数 InitMonitorReason 设置为 DEM_INIT_MONITOR_RESTART,以此来重新初始化诊断所有相关事件的监视器。(RS_Diag_04117)
[SWS_Dem_00680]应用程序接口Dem_ClearDTC在清除时间的情况下应触发相关事件的C口函数InitMonitorForEvent,InitMonitorReason 参数应设置为 DEM_INIT_MONITOR_CLEAR(RS_Diag_04117)
[SWS_Dem_00681]应用程序接口Dem_SetEnableCondition应触发相关事件的C口函数InitMonitorForEvent,当事件的使能条件被改为满足,从而满足事件的所有使能条件。 InitMonitorReason参数应设置为DEM_INIT_MONITOR_REENABLED。(RS_Diag_04125)
[SWS_Dem_00682]应用程序接口Dem_EnableDTCSetting在ControlDTC事件重新使能时应触发相关事件的C口函数InitMonitorForEvent。InitMonitorReason参数应设置为DEM_INIT_MONITOR_REENABLED。(RS_Diag_04125)
[SWS_Dem_01113]应用程序接口Dem_SetStorageCondition应触发相关事件的C口函数InitMonitorForEvent,当事件的存储条件被改为满足,从而满足时间的所有存储条件。当事件报告FAILED 或 PASSED但是存储条件被禁能时InitMonitorForEvent只是被回调。InitMonitorReason参数应该被是置为DEM_INIT_MONITOR_REENABLED。(RS_Diag_04219)
上面是两个例子
Use case1:在诊断事件监测器在运行过程中,$85服务触发或者是清除故障触发后,只要是诊断前置条件满足,那么监视器应该从头开始运行,并在运行结束时评估事件的状态,如passed 或者 failed。
Use case2:ECU 在运行4小时后重启,那么监视器应该从头开始运行,并在运行结束时评估事件的状态,如passed 或者 failed。
任何函数的初始化(那些可能和监视器相关的)也可以由Dem触发。
提示:Dem模块不评估回调函数的返回值(像E_OK等)。
[SWS_Dem_01046]如果InitMonitorForEvent 的多个触发器同时发生,InitMforE只能被调用一次。应按照以下优先级选择原因:DEM_INIT_MONITOR_CLEAR(最高优先级)、DEM_INIT_MONITOR_RESTART、DEM_INIT_MONITOR_REENABLED(最低优先级)(参见Dem_
InitMonitorReasonType)。
7.3 诊断事件定义
一个‘诊断事件’由一些可以被诊断模块处理的最小单元定义。‘诊断事件’的状态就是监视器的结果(参见7.3.5章)。Dem通过RTE或者其他BSW从SWC接收监视器的结果。
Dem模块使用EventId来管理一个系统的‘诊断事件’状态并且对单个测试结果执行所需的操作。例如,存储冻结帧。
[SWS_Dem_00153] Dem模块应该通过EventId和相近的EventName来表示每个诊断事件。(RS_Diag_04063)所有的监视器和BSW模块使用EventId作为诊断事件名称的代号。Dem配置工具用数字来代替符号名称。
[SWS_Dem_00154] EventId 和相关的 EventName 应该是唯一的。[SWS_Dem_00126](RS_- Diag_04063)
Dem无法处理多个监视器共享单个EventId的情况。
Dem用一个内部的监视器状态存储所要报告事件的状态。
Dem支持下图展示的多个特定事件配置参数。有关详细说明,请参阅第 10 章 配置规范。
7.3.1 事件优先级
事件优先级定义为事件的重要程度排名。当事件内存满了的时候用来决定哪些错误项可以被从事件内存。
[SWS_Dem_00382] 每个事件都应该有一个优先级(请参阅 DemDTCAttributes中的参数 DemDTCPriority)。(RS_Diag_04118, RS_Diag_04071)
[SWS_Dem_00383]优先级值 1 应为最高优先级。优先级值越大,重要性越低。(RS_Diag_04118, RS_Diag_04071)
7.3.2 事件触发
[SWS_Dem_00011]Dem模块应该为内个事件内存项(event memory entry)提供一个触发计时器。(RS_Diag_04067)
[SWS_Dem_00523]如果相关事件在响应的时间内存中被触发,Dem应该初始化触发计时器值为1。(RS_Diag_04067)
[SWS_Dem_00524]如果参数DemOccurrenceCounterProcessing被设置为DEM_PROCESS_OCCCTR_TF,则在相关事件已经被存储在事件内存中时,Dem应在每个UDS 状态位(bit 0)(TestFailed)从0转变为1时,将触发计时器增加1。(RS_Diag_04067)
[SWS_Dem_00580]如果配置参数DemOccurrenceCounterProcessing设置为DEM_PROCESS_OCCCTR_CDTC(参考DemPrimaryMemory或DemUserDefinedMemory),则在相关事件已经存储在事件内存中且UDS状态位3等于1时,Dem模块应在每个UDS状态位0从0转变为1时,将发生计数器增加1(参考第0章)。(RS_Diag_04105)
[SWS_Dem_00625]如果事件特定的发生计数器已达到最大值(255),则Dem不应该增加对应事件的触发计时器。(RS_Diag_04125)
7.3.3 事件类型
共有两种不同的事件类型:
- BSW相关事件(通过应用程序接口Dem_SetEventStatus上报)
- SW-C相关事件(通过RTE操作SetEventStatus上报)
这些类型是每个事件可配置的(参见DemEventParameter中的DemEventKind)。配置时间类型是必要的,因为bsw事件可能在完整的Dem初始化之前报告并且需要缓冲(参见7.8章)。
7.3.4 事件目标
配置参数DemMemoryDestinationRef(参考DemDTCAttributes)定义了事件及其相关数据的专用存储位置(参考第7.7.7章)。
“永久事件内存”的分配是从相关Dtc类型隐式推到来的(参考第7.4.1章)。排放相关的时间自动分配为永久事件内存,因为将事件存储为“永久DTC”的过程是根据其当前状态动态推导的(处理方法在第7.9.5.8章中描述)。
上下文中“永久”一词与排放相关事件的属性有关,并不仅仅与是否通过Nvm实现永久存储相关,这对任何时间内存类型都适用。不同时间类型的定义和使用是OEM特定的。
对于DCM-DEM接口,参数DTCOrigin用来区分不同的内存区域。目的是在不同的内存区域(主内存、用户定义内存、永久内存和镜像内存)进行特定的操作。
[SWS_Dem_CONSTR_6104]对DemMemoryDestinationRef的限制。【如果DemMirrorMemory被配置为DemMemoryDestinationRef,则必须在同一事件的DemPrimaryMemory或DemUserDefinedMemory上再配置另一个DemMemoryDestinationRef作为前提。如果一个目标不是DemMirrorMemory,则同一事件不能配置两个目标】
7.3.5 诊断监视器定义
诊断监视器是用来确定组件的功能是否正常。该监控功能可以识别监控对象的特定错误类型(例如短路接地、开路负载等等)。一个监视对象标识一个正在被检测的物理系统或电路,每个监控对象都与一个确切的争端事件相关联。
如果监视器自己消抖,只有在获得一个合格的结果(通过或失败)后上报故障的API才会被调用。如果结果发生变化,必须要上报。然而,对于监视器而言调用Dem通常总是在计算上更高效的,所以应优先选择。因此Dem去处理结果未发生改变的报告是特定的选择。
如果监视器用Dem内部的消抖机制 (参考 7.7.3),则只要执行带有功能检查的代码就会调用上报故障的API。
7.3.6 事件依赖关系
DemComponent中配置的事件的优先级和依赖关系被用于将错误报告过滤存储到故障内存中。
[SWS_Dem_01126]如果同一个DemComponent中有任一个高优先级的事件被报告为FAILED,则后面上报FAILED的事件都应被视为CONSECUTIVE FAULT(连续故障)。
[SWS_Dem_01126]如果同一个DemComponent中有任一个父组件被报告为FAILED,则后面上报FAILED的事件都应被视为CONSECUTIVE FAULT(连续故障)。
[SWS_Dem_01128]Dem应该允许忽略DemComponentIgnoresPriority事件的优先级。在这种情况下,只有存在父组件被报告未FAILED时该事件才被视为CONSECUTIVE FAULT(连续故障)(同一组件内的其他事件状态为FAILED时应该被忽略)。
[SWS_Dem_01129]如果报告的故障不是连续故障,则应被视为CAUSAL FAULT(因果故障),应被正常处理。
[SWS_Dem_01218]如果报告的故障不是连续故障,并且被配置为DemCausalityDelayTime则应被视为PRELIMINARY-CAUSAL FAULT(初步因果故障)。从事件上报发生的时间点开始,直到DemCausalityDelayTime时间结束,可以将该事件重新视为连续故障。如果在这个时间内有同一组件中更高优先级的故障或者父组件上报故障,那该事件应视为连续故障,这段事件外都不成立。
[SWS_Dem_01130]连续故障不应该被储存在故障内存中。(处理方式应同未满足存储条件)。
[SWS_Dem_01211]被视为故障连续上报的DEM_EVENT_STATUS_FDC_THRESHOLD_REACHED(例如通过接口调用或达到消算法中配置的阈值时)不应被储存到故障内存中。(处理方式应同未满足存储条件)。注意:DEM_EVENT_STATUS_FDC_THRESHOLD_REACHED 的其他报告不应被视为因果关系
[SWS_Dem_01131] Dem应该提供Dem_GetComponentFailed接口,用于查询DemComponents FAILED 状态。
[SWS_Dem_01132]如果启用了DemTriggerFiMReports,Dem在每次DemComponent状态改变时应通过调用DemTriggerOnComponentStatus函数通知FiM模块。
[SWS_Dem_01133]如果组件状态正在改变并且配置了DemComponentFailedCallbackFnc 或者DemComponentFailedCallbackUsePort 设置为 TRUE则Dem应该触发回调DemTriggerOnComponentStatus。
[SWS_Dem_CONSTR_06157]仅当未配置 DemComponentFailedCallbackFnc 时,才允许将 DemComponentFailedCallbackUsePort 设置为 TRUE。
参考文章:https://blog.csdn.net/weixin_43722921/article/details/140886074
标签:功能,Diag,规范,DEM,监视器,事件,第七章,SWS,Dem From: https://www.cnblogs.com/youngcccc/p/18613157