目录
往期推荐
- ETAS工具链自动化实战指南<一>
- ETAS工具链自动化实战指南<二>
- ETAS工具链自动化实战指南<三>
- AUTOSAR工程师必读:Artop的核心功能
- Vector工具链自动化实战指南<一>
- isolar高手秘籍| ECU Configuration三分钟速成!
- 掌握核心步骤:RTA-BSW以太网配置全解析
- 一文详解TC399 CAN MCAL 配置
- LSL常见应用场景及示例<一>
- LSL常见应用场景及示例<二>
- LSL常见应用场景及示例<三>
- 为什么Autosar钟情arxml而非json?大揭秘!
在AutoSAR框架中,诊断事件管理器(DEM)扮演着至关重要的角色,它负责管理和响应车辆系统中的各种诊断事件。本文将深入探讨如何基于ETAS工具链的DEM模块的配置、功能实现以及如何在现有 RTA-CAR 项目中配置诊断栈和内存栈,并实现进一步的功能,如去抖动和其他基本用例。
DEM常见缩写词
-
AR: AUTOSAR
-
BSW: AUTOSAR 基础软件 / 硬件独立服务层
-
RTE: AUTOSAR 实时环境
-
OS: AUTOSAR 操作系统
-
DEM: 诊断事件管理器
-
SWC: 软件组件
-
DCM: 诊断通信管理器
-
DTC: 诊断故障代码
-
DID: 数据标识符
DEM关键功能概述
在AUTOSAR中,诊断事件管理器(DEM)是一个核心软件组件,负责监控系统中的事件,这些事件可能表明系统存在故障或错误,并管理这些事件报告给其他组件。它被设计为系统中所有诊断事件的中央控制点,维护所有诊断事件的列表:事件数据、状态信息,并基于这些事件触发特定的诊断操作。
事件检测(Event Detection)
在系统中检测诊断事件是DEM的初始操作,检测来自各种来源的事件:如发动机控制单元(ECU)或防抱死制动系统(ABS)的软件组件,以及传感器和执行器等硬件组件。当检测到事件时,DEM接收事件数据并分配一个诊断故障代码(DTC)。DTC用于表示系统中的特定故障或错误,并用于将诊断事件信息传达给其他组件。DTC通常是对应特定诊断事件的字母数字组合,可以由DEM存储/检索以供后续分析。
此外,DEM还为特定的诊断事件数据分配诊断数据标识符(DID)。DID用于识别和访问与诊断事件相关的数据;通常是对应特定诊断数据的数值。
事件评估(Event Evaluation)
在检测到事件后,DEM会评估事件数据以确定其严重级别。从简单的警告到可能需要立即注意的严重故障。DEM根据预配置的规则和阈值确定严重级别。一旦确定了严重级别,DEM可以根据事件的严重程度采取适当的行动。
事件反应(Event Reaction)
根据事件的严重程度,DEM可能会触发特定的诊断操作。例如,如果检测到严重故障,它可能会触发仪表盘上的警告灯以通知驾驶员,或关闭发动机以防止损坏或进一步故障。如果检测到较轻微的事件,DEM可能只是存储该事件以供日后分析。
事件报告(Event Reporting)
DEM还通过标准化接口管理诊断事件的报告,使得其他组件可以访问相关事件的数据和状态信息。这使得诊断测试仪或维修工具等组件能够分析这些事件并确定故障原因。DEM可以处理多个通信通道,允许其使用不同的通信协议(如CAN、UDS或以太网)向不同组件报告诊断事件。
事件存储(Event Storage)
DEM还可以处理和存储诊断事件的历史数据,这些信息可以用于后续分析或检查是否出现特定的问题模式。此外,DEM还可以清除故障代码(DTC),这在故障问题解决后非常有用,可以防止不必要的警告灯或警报。。
去抖动(Debouncing)
事件去抖动是DEM的另一个重要功能。事件去抖动指的是消除由单一物理事件引起的多个诊断事件的过程。这是通过确保一个诊断事件仅报告一次,即使在短时间内多次检测到也如此来实现的。事件去抖动通常通过使用定时器或计数器来实现。当检测到诊断事件时,定时器或计数器开始计时。如果在某个时间段内(即“去抖动时间”)检测到另一个相同故障的诊断事件,则忽略该事件,并重置定时器或计数器。如果在去抖动时间内没有检测到进一步的诊断事件,则定时器或计数器到期,诊断事件被报告。
事件老化(Event Aging)
事件老化指的是自动丢弃不再相关的旧诊断事件的机制。事件老化过程会从事件内存中删除超过指定时间限制的事件,或已经报告过的事件。这有助于防止事件内存被过时信息占满,确保只存储当前和相关的数据。
配置诊断主要工作流程
-
DEM创建
-
DemGeneral配置
-
DemEventMemorySet
-
DemClient
-
DemOperationCycles
-
DemRbGeneral
-
-
DemConfig配置
-
DemDTC
-
DemEventParameter
-
DemDataElementClass
-
DemExtendedDataRecordClass
-
DemDID
-
DemNvRamBlockId
-
-
BswM配置
-
动作项(Action Item)
-
动作列表项(Action List Item)
-
-
EcucM配置
-
DCM配置
-
DcmDsdServiceTable
-
DcmRbDspReadDTC
-
-
BSW生成
前提条件
ETAS工具详细操作步骤
Step1:创建DEM
首先创建一个新的DEM模块;右键单击Bsw Modules下的Services类别选择“Create Dem”:
DEM模块由两个容器组成:DemGeneral和DemConfigSet。以下先查看DemGeneral容器,然后配置包DemConfigSet。
DEM配置
创建DEM模块后,在BSW编辑器中打开。然后,导航到DemGeneral容器并开始配置以下参数:
Step2:DemGeneral配置
参数解释以及示例配置如下:
-
DemAgingRequiresNotFailedCycles = FALSE:定义老化周期计数器是否在具有测试失败报告的操作周期中处理。
-
DemAgingRequiresTestedCycles = TRUE:定义老化周期计数器是否在每个老化周期中处理,或者仅考虑测试过的老化周期。
-
DemAvailabilitySupport = DEM_EVENT_AVAILABILITY:此配置开关定义是否启用可用性支持。
-
DemClearDTCBehaviour = DEM_CLRRESP_NONVOLATILE_FINISH:定义清除易失性和非易失性存储器的诊断信息的过程,以及Dcm模块的正响应处理。
-
DemClearDTCLimitation = DEM_ALL_SUPPORTED_DTCS:定义ClearDTC API的范围。
-
DemDataElementDefaultEndianness = BIG_ENDIAN:定义属于数据元素的数据的默认字节序,如果DemExternalSRDataElementClass未定义字节序,则适用。
-
DemDebounceCounterBasedSupport = TRUE & DemDebounceTimerBasedSupport = FALSE:这些属性/参数定义是否启用基于计数器或基于计时器的去抖动支持。
-
DemDevErrorDetect = FALSE:启用/禁用开发错误的检测和通知。
-
DemEventCombinationSupport = DEM_EVCOMB_DISABLED:定义Dem模块支持的事件组合类型。
-
DemGeneralInterfaceSupport = FALSE:如果设置为TRUE,则提供GeneralEvtInfo、GeneralCallbackEventDataChanged和GeneralCallbackEventStatusChange接口。
-
DemMaxNumberPrestoredFF = 2:定义预存冻结帧的最大数量。
-
DemStatusBitHandlingTestFailedSinceLastClear = DEM_STATUS_BIT_NORMAL:定义是否应对自上次清除以来的TestFailed状态位应用老化和置换机制。
-
DemStatusBitStorageTestFailed = FALSE:启用/禁用永久存储TestFailed状态位。如果启用,在下一次电源循环中存储事件的失败。
-
DemTaskTime = 0.01:周期性循环任务的时间。
-
DemHeaderFileInclusion = Diagnostic_SWC.h:在DEM模块中包含包含使用的C回调声明的头文件。
DemEventMemorySet
如下图所示,在DemGeneral容器中导航创建DemEventMemorySet:
DemEventMemorySet参数
-
DemMaxNumberEventEntryPermanent = 10 :可以存储在永久内存中的最大事件数量
-
DemTypeOfDTCSupported = DEM_DTC_TRANSLATION_ISO14229_1:定义由Dem_GetTranslationType返回的格式
如下图所示:导航到 DemPrimaryMemory 容器:
配置以下参数:
DemPrimaryMemory 参数
-
DemDtcStatusAvailablityMask = 255:DEM支持的DTC状态位掩码。在UDS服务0x19的正响应中使用。
-
DemEventDisplacementStrategy = DEM_DISPLACEMENT_FULL:定义是否支持事件置换以及遵循的策略。
-
DemEventMemoryEntryStorageTrigger = DEM_TRIGGER_ON_TEST_FAILED:分配事件内存条目的主要触发器。
-
DemMaxNumberEventEntryPrimary = 2:可以存储在主内存中的最大事件数量。
-
DemTypeOfFreezeFrameRecordNumeration = DEM_FF_RECNUM_CALCULATED:定义分配冻结帧记录编号的类型,对应于特定事件的冻结帧记录。
-
DemOccurenceCounterProcessing = DEM_PROCESS_OCCCTR_CDTC:定义故障确认过程中对发生计数器的考虑。
DemClient
配置了通用参数和 EventMemorySet 之后,下一步是创建一个可以通过API访问DEM的客户端。如下图所示:导航到 DemGeneral 内的 DemClient 容器:
DemClient 配置示例:
DemClient 属性
以下是每个配置属性的简要说明及其用途:
-
DemClientFunctionality = DEM_CLIENT_USES_FULL_FUNCTIONALITY:定义DEM为DemClient提供的功能。
-
DemClientId = 1:DEM客户端的唯一标识符。
-
DemClientUsesRte = FALSE:如果为TRUE,客户端将仅使用通过RTE路由的DEM模块。提供C/S接口:CddIf, EvMemOverflowIndication。
-
DemRbClientPriority = 1:定义DemClient可以具有的唯一优先级值;值越低,优先级越高。
-
DemEventMemorySetRef = DemEventMemorySet:将客户端引用到包含客户端特定设置和事件内存的分配事件内存容器。
DemOperationCycles
如下图所示:导航到 DemGeneral 内的 DemOperationCycles 容器。
在DEM中,操作周期是指两个时间点之间的持续时间。一个操作周期有开始和结束点,在此期间诊断监控器会定期检查诊断事件。如下图所示:配置操作周期:
DemOperationCycle 属性
-
DemOperationCycleAutostart:定义操作周期是否在Dem_PreInit期间自动(重新)启动。
-
DemOperationCycleId:操作周期的唯一标识符。
-
DemRbIsStartViaApiAllowed:定义是否允许在Dem_RestartOperationCycle中启动依赖周期。(需要DemLeadingCycleRef)
-
DemLeadingCycleRef:定义与当前配置的操作周期处理相关的操作周期。
DemRbGeneral
配置完 DemOperationCycle 之后,配置 DemRbGeneral 容器。如下图所示:导航到 DemRbGeneral 容器:
DemRbGeneral
相关示例配置及参数说明:
DemRbGeneral 属性
-
DemRbAgingCounterType = COUNT_UP:定义要使用的老化计数器类型(如果使用)。
-
DemRbCheckApiConsistency = TRUE:控制对DEM C和RTE API一致性进行的检查。
-
DemRbClearDtcClearsAllBits = TRUE:控制是否清除DTC时清除所有的isobyte位,如果为FALSE,则不会清除testfailed标志和警告指示标志。
-
DemRbDTCSettingBlocksReporting = TRUE:控制DTC设置是否会阻止事件状态的报告,如启用条件,或DTC设置是否不阻止报告以允许系统行为。
-
DemRbDebounceTimeBasedTaskTime = 0.001:配置基于时间的去抖任务时间。
-
DemRbEnableNvmBlockLengthChecks = TRUE:定义是否启用或禁用NVM块长度的静态断言检查。
-
DemRbEventMemoryGenericSupported = TRUE:启用/禁用对通用事件内存服务的支持:Dem_GetDTCByOccurenceTime 和 Dem_GetEventMemoryOverflow。
-
DemRbMirrorMemoryDisplacementStrategyType = AUTOSAR:定义镜像内存使用的置换策略类型。
-
DemRbMirrorMemoryType = MIRROR_ON_CLEAR:定义镜像内存的类型。
-
DemRbOccurrenceCounterType = AUTOSAR:定义发生计数器的类型。
-
DemRbOperationCycleStatusStorage = TRUE:定义操作周期状态是否在电源周期内可用。
-
DemRbStatusByteConsistencyPreference = STATUS_BYTE_BLOCK:声明当事件状态字节NVM块和事件内存NVM块不一致时,优先选择哪个来源。
-
DemRbValidationMode = Dem_ValidationMode_Standard:定义执行的验证是否应特别增强以适应RTA-BSW BSW事件,或它们是否应为标准项目验证。
DemDataElementClass
综上,DemGeneral 已经配置完毕。下一步配置DTC。如下图所示:在 DemGeneral 中导航到DemDataElementClass容器:
DemDataElementClass
以下示例将配置三个 DemDataElementClass:两个外部客户端/服务器数据元素类和一个内部类。从第一个外部类开始,在 DemDataElementClass 容器中选择 DemExternalCSDataElementClass:
配置DemDataElementClass_EngineSpeed
DemExternalCSDataElementClass 属性
-
DemDataElementArraySize = 1:定义数组中元素的数量,如果数据元素是一个数组。注意:这不是字节大小。
-
DemDataElementProvideMonitorData = FALSE:如果为 TRUE,生成的函数调用以检索数据元素时,
monitorData0
作为额外的第一个参数。 -
DemDataElementReadFnc = RTE_EngineSpeed_Data:定义用于获取相应值的 C 函数 "ReadDataElement" 的原型,当
DemDataElementUsePort
设置为 FALSE 时使用。 -
DemDataElementUsePort = FALSE:如果为 TRUE,将生成一个 R-Port 以获取数据元素。
配置完这个类后,创建另一个外部客户端/服务器类 "DemDataElementClass_VehicleSpeed",步骤如下:
如下所示,创建一个 "DemDataElementClass_Aging_Counter"配置容器:
DemInternalDataElementClass 属性
-
DemDataElementDataSize = 1:定义数据元素的大小(以字节为单位)。
-
DemInternalDataElement = DEM_AGINGCTR_UPCNT:定义映射到数据元素的 Dem 内部值。
DemExtendedDataRecordClass
扩展数据记录 (EDRs) 用于存储与诊断事件相关的附加信息,能够包含多个数据字段(DemDataElementClass),这些字段特定于某种类型的诊断事件。在以下示例中,它将用于表示老化计数器。
如下图所示,导航到 DemGeneral 中的 DemExtendedDataRecordClass:
DemExtendedDataRecordClass 属性
-
DemExtendedDataRecordNumber = 1:分配给每个 EDR 的唯一标识符,用于区分它们,并可用于根据严重性对事件进行优先排序。例如,可以将更高严重性的事件分配更高的数字,以便系统优先处理它们。
-
DemExtendedDataRecordTrigger = DEM_TRIGGER_ON_TEST_FAILED:触发 EDR 创建和存储的机制,通常在满足某些条件或阈值时设置,例如生成故障代码或传感器读数达到限制值。当激活时,DEM 会自动为事件创建和存储 EDR。
-
DemExtendedDataRecordUpdate = DEM_UPDATE_RECORD_NO:添加/修改现有 EDR 中的信息的过程,使其随着诊断事件的演变或解决而保持最新和准确。只有在满足配置的触发条件时才会捕获。对于这个老化计数器,这个属性不需要,因此设置为“不”。
-
DemDataElementClassRef = DemDataElementClass_Aging_Counter:链接到该 EDR 所属的 DemDataElementClass。
DemExtendedDataClass
扩展数据类包含扩展数据记录的组合,将它们分组。它代表事件相关的数据,因为诊断事件可以包含最多一组扩展数据记录,冻结帧记录也是如此。要从已创建的 EDR 创建扩展数据类,如下图所示:导航到 DemGeneral 中的 DemExtendedDataClass:
如下图所示,这个容器引用 aging counter:
DemDidClass
剩余的两个 DemDataElementClass 将用于配置诊断数据标识符(DIDs)。DIDs 是用于访问与诊断事件相关的数据的标识符,对应于特定的数据片段。所以下一步要创建 DemDidClass,如下图所示:导航到 DemGeneral 中的容器:
设置EngineSpeed的 DemDataElementClassRef为 DemDataElementClass_EngineSpeed,如下所示配置:
设置VechicleSpeed的 DemDataElementClassRef为DemDataElementClass_VehicleSpeed,如下所示配置:
DemFreezeFrameClass
冻结帧允许在诊断事件发生时捕获和存储特定时刻的值。其目的是在发现诊断事件时提供系统状态的“快照”。DemFreezeFrameClass 通常被实现为存储多个参数值的数据结构。
如下图所示,导航到 DemGeneral 中的 DemFreezeFrameClass 容器:
将 DemFreezeFrameClass 命名为 "Set1_Freeze",并按如下配置,包括对之前创建的两个 DIDs 的引用:
DemNvRamBlockId
DEM 模块通常使用非易失性内存来存储与诊断事件相关的数据。因此,DEM 使用的 Nv-Memory 块也必须在 NvM 中进行配置。请注意,这只是一个典型情况,但 DEM 也可以配置为仅使用 RAM。在以下示例中,选择使用的是永久内存,因此必须配置 NvM block。
注意:要计算每个块描述符的 BlockLength 参数,要考虑以下内容:
-
对于每个 EventStatusByte 块描述符,大小必须等于 DEM 中配置的诊断事件数量加一。
-
对于每个 Eventmemorylocation 块描述符,大小取决于某些参数的配置,参考结构 ‘Dem_EvMemEventMemoryType’ 以计算大小。
返回 DEM 配置,并设置对 NvMBlockDescriptors 的引用,创建 DemNvRamBlockId 容器,如下所示:
以下是配置的四个 DemNvRamBlockId示例:
Step3:DemConfigSet配置
DemDebounceCounterBasedClass
现在,所有 DemGeneral 容器已配置完成,下一步配置在 DEM 模块的 DemConfigSet 容器。首先要配置的是 DemDebounceCounterBasedClass。在之前步骤里已经配置了是否使用基于计数器还是基于定时器的去抖动功能,在以下示例中选择了基于计数器的去抖动功能。
如下图所示,导航到 DemDebounceCounterBasedClass 容器:
去抖动功能的相关属性设置,如下图所示:
DemDebounceCounterBasedClass 属性
-
DemDebounceBehaviour = DEM_DEBOUNCE_FREEZE:定义事件去抖动算法的行为方式。
-
DemDebounceCounterDecrementStepSize = 2:定义内部去抖动计数器递减的步长大小。
-
DemDebounceCounterFailedThreshold = 1:定义内部去抖动计数器的值,用于指示失败状态。
-
DemDebounceCounterIncrementStepSize = 2:定义内部去抖动计数器递增的步长大小。
-
DemDebounceCounterJumpDown = TRUE:激活跳下功能。
-
DemDebounceCounterJumpUp = TRUE:激活跳上功能。
-
DemDebounceCounterPassedThreshold = -2:定义内部去抖动计数器的值,用于指示通过状态。
-
DemDebounceCounterStorage = FALSE:定义去抖动计数器的值是否为非易失性。
DemDTCAttributes
DemDTCAttributes 容器包含与诊断故障代码(DTC)相关的属性,例如严重性、功能单元和 DTC 的状态。它是 DEM 模块的一个重要部分。
如下图所示,导航到 DemConfigSet 内的 DemDTCAttributes 容器:
如下所示,创建一个 DTC,参数配置示例如下:
DemDTC 属性
-
DemDTCFunctionalUnit = 2:一个 1 字节的值,用于标识报告 DTC 的对应基础车辆/系统功能,并且对报告严重性信息是必需的。
-
DemDTCSeverity = DEM_SEVERITY_MAINTENANCE_ONLY:根据 ISO 14229-1 定义 DTC 的严重性。
-
DemDTCValue = 12648496:UDS 的唯一诊断故障代码值。
-
DemDTCAttributesRef = DemDTCAttributes_Event_0:定义与此 DTC 配对的 DemDTCAttributes。
DemComponents
DemComponent 存储有关车辆中各种组件或子系统的信息,这些组件或子系统可以生成 DTC。每个组件/子系统由一个唯一的 DemComponent 记录表示;存储的信息包括:组件的名称、类型,以及可以触发 DTC 的事件或条件。
如下图所示创建一个 DemComponent,导航到 DemConfigSet 中的DemComponent容器:
如下图所示:根据以下示例参数创建一个 DemComponent:
DemComponent 属性
-
DemComponentId = 1:DemComponent 的唯一标识符。
-
DemComponentIgnoresPriority = TRUE:定义是否忽略该组件事件的优先级。在这个小项目示例中设置为 TRUE。
-
DemRbComponentAllowedRecoveries = 5:一个点火周期内组件允许的恢复次数。用于限制系统在非可靠监控情况下的切换。
DemEventParameter
DemEventParameter 保存与事件相关的参数的信息,这些事件可以触发 DTC。它用于将 DTC 与 DemComponent 和操作周期链接起来。下一步创建一个 DemEventParameter。
如下图所示,导航到 DemConfigSet 中的 DemEventParameter:
如下图所示,使用以下示例参数创建一个DemEventParameter:
DemEventParameter Attributes
-
DemEventAvailable = TRUE:配置事件为可用或不可用。
-
DemEventConfirmationThreshold = 1:定义 DTC 确认状态的操作周期阈值,符合 ISO 14229-1 的确认阈值。
-
DemEventId = 1:诊断事件的唯一标识符。
-
DemEventKind = DEM_EVENT_KIND_SWC:区分 SW-C 和 BSW 事件。
-
DemComponentClassRef = DemComponent_Event_0_CommStatus:引用的组件类。
-
DemDTCRef = DemDTC:引用的 DTC。
-
DemOperationCycleRef = DemOperationCycle_0:引用的操作周期。
创建 DemEventParameter 后,如下图所示:引用之前创建的 **Debounce Class**:
Step4:BswM 配置
在配置完 DEM 模块后,它必须被包含在 BswM 模块中,以便在启动时进行初始化。
如下图所示,导航到 BSW 模块中的 BswM 模块,路径为 ** BSW Modules → Mode Mgm。
Action Item(s)
在这里有三个进一步的 BswM 配置容器,重点在于 BswMModeControl。将主要有 BswMActionLists 和 BswMActions 的属性,这些属性是DEM初始化所必需的。
如下图所示:使用 BSW 编辑器打开BSWM模块,然后导航到 BswMConfig 容器。首先创建一个 BswMAction,因为它稍后将被添加到一个在运行时执行的BswMActionList中。
在此容器中,为 "BswM_AI_Dem_Init" 和 "BswM_AI_DemShutdown" 创建新的 BswMAction,并将它们的调用函数设置如下:
操作列表项目Action List Item(s)
在创建 Action Items后,接下来是将它们实现到操作列表中。
如下图所示:返回到容器:BswMActionLists,并找到操作列表 BswM_AL_BswModules_InitListReadAll。在此容器中添加新的初始化操作项 BswM_AI_Dem_Init
如下所示:对 BswM_AI_DemShutdown 进行相同的操作,但在 BswM_AL_Shutdown 内进行配置。
Step5:EcuM 配置
DEM 模块应区分预初始化模式和完全初始化模式(操作模式)。函数 Dem_PreInit
将初始化 DEM 模块内部状态,以处理事件并重置由 BSW 模块报告的去抖动计数器。
将此函数添加到 EcuM 初始化列表中,如下所示:
Step6:DCM 配置
以下将使用 UDS 0x19 服务来读取诊断事件内存。下一步编辑DcmDsdServiceTable,并通过设置其标识符、配置将可用的诊断会话以及子服务的可用性来添加新的服务:
以类似的方式,配置所需的子服务;在以下示例中,已配置子服务 4、6 和 10,如下图所示:
最后,切换到 Dcmdsp,创建一个类型为 DcmRbDspReadDTC 的新容器,并设置在单个请求中可以读取的最大 DTC 数量以及最大记录数:
Step7:BSW 生成
生成BSW代码:
确保在生成器中勾选了 DEM: