# 诊断事件管理器(DEM)规范
| 属性 | 值 |
|---|---|
| 文档标题 | 诊断事件管理器规范 (Specification of Diagnostic Event Manager) |
| 文档所有者 | AUTOSAR |
| 文档责任方 | AUTOSAR |
| 文档标识号 | 019 |
| 文档状态 | Final |
| 所属 AUTOSAR 标准 | Classic Platform |
| 所属标准发布版本 | 4.4.0 |
| 原文 PDF | AUTOSAR_SWS_DiagnosticEventManager.pdf(共 516 页) |
---
## 文档变更历史
| 日期 | 发布版本 | 变更人 | 变更说明 |
|---|---|---|---|
| 2018-10-31 | 4.4.0 | AUTOSAR Release Management | 澄清异步 API 行为;IUMPR 分母在操作循环开始时被锁定;支持类型化 C/S 接口;次要修正/澄清/编辑性更改(详见 ChangeDocumentation);更新并优化 Dcm 与 Dem 之间的交互;使多个函数异步化 |
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 将约束处理从 ECUC 表中的描述性文本转移到显式需求中;次要修正/澄清/编辑性更改(详见 ChangeDocumentation) |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 移除上下文变通方案并重构回调行为;引入 monitor status 并更新回调处理的时点;引入用于多客户端访问 Dem 的客户端概念;优化 API 以获得更好的运行时性能并对齐返回值,以允许 Dcm 映射根据 ISO 14229-1 [1] 返回返回值;支持多个诊断服务器的事件内存;澄清阈值和操作循环处理;次要修正/澄清/编辑性更改(详见 ChangeDocumentation) |
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 新增 API(`Dem_GetEventFreezeFrameDataEx`、`Dem_GetEventExtendedDataRecordEx`,带 buffersize 参数),并修正返回值定义;为 UDS 服务 `0x19 0x05` 提供 OBD FreezeFrame;ISO 14229-1:2013 [2] 中服务 `0x14` 的 NRC 处理;细化 DataElements 的服务接口;次要修正/澄清/编辑性更改(详见 ChangeDocumentation) |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 支持 ISO 27145 (WWH-OBD / Euro VI) [3];更新以支持 ISO 14229-1:2013 [1];引入事件依赖关系;细化 DTC/Event 抑制 |
| 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 进一步澄清事件合并;澄清 DTC 组;编辑性更改 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 为服务接口添加 API 表;澄清事件合并;编辑性更改;移除变更文档章节 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 合并多个 Dem 内部数据元素的新报告;支持 J1939;支持 OBD;重构 Dem/Dcm 接口;引入新的去抖行为和去抖计数器存储;扩展清除 DTC 功能;支持事件抑制;扩展 DTC 存储行为;引入用户控制的 warning indicator requested 位;引入操作循环的自动启动行为;引入每个 DTC 的多种格式;重构 `Dem_ResetEventStatus` 行为 |
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | 重构 Dlt 交互;重构 Dem/Dcm 接口;修正 include 结构和 RTE 接口;细化特性的多个方面 |
| 2009-12-18 | 4.0.1 | AUTOSAR Administration | 重构 Dem/Dcm 接口;扩展"诊断监视器"的定义;引入"Event significance"和"DTC suppression";重构 OBD(特别是服务 `$02` 的接口、readiness 和永久内存);重构文件结构;完成 Revision 1 上的问题处理 |
| 2010-02-02 | 3.1.4 | AUTOSAR Administration | 改进和扩展 Dem 功能性描述(特别是:状态位处理、事件位移、去抖、故障确认和指示器处理、事件合并、启用与存储条件、事件相关数据、操作循环管理);引入 SW-C 功能诊断方法;增加 Dlt 交互和调试接口;文档结构重构和扩展;法律声明修订 |
| 2008-08-13 | 3.1.1 | AUTOSAR Administration | 文档结构重构和扩展;为 OBD 支持增加 API 和配置参数;改进 DCM 与软件组件之间的交互;法律声明修订 |
| 2007-12-21 | 3.0.1 | AUTOSAR Administration | 改进 RTE 合规性;改进配置部分;改进文档结构;重构并收紧数据类型使用;增加新 API;扩展文档元信息;进行小布局调整 |
| 2007-01-24 | 2.1.115 | AUTOSAR Administration | 修订"用户建议";增加"Revision Information" |
| 2006-11-28 | 2.1 | AUTOSAR Administration | 完全重构和扩展去抖部分;`Dem_ClearGroupOfDTC` 和 `Dem_ClearSingleDTC` 被 `Dem_SingleDTC` 替代;增加 `Dem_GetNextFilteredDTCAndFDC`、`Dem_SetDTCFilterForRecords`、`Dem_GetSizeOfFreezeFrame`、`Dem_SetValueByOemId`、`Dem_SetEnableCondition`、`Xxx_DemGetFaultDetectionCounter`;`DTCTranslationType` 在多个 API 中被 `DTCKind` 替代;新增 "Service DEM" 章节;函数 ID 重构;文件结构重构和扩展;配置章节重构和扩展;`Dem_GetNextFilteredDTC` 重构;法律声明修订 |
| 2006-05-16 | 2.0 | AUTOSAR Administration | 布局调整 |
---
## 目录
- [1 介绍与功能概述](#1-介绍与功能概述)
- [2 缩略语和缩写](#2-缩略语和缩写)
- [2.1 缩略语](#21-缩略语)
- [2.2 缩写](#22-缩写)
- [3 相关文档](#3-相关文档)
- [3.1 输入文档与相关标准规范](#31-输入文档与相关标准规范)
- [3.2 相关规范](#32-相关规范)
- [4 约束与假设](#4-约束与假设)
- [4.1 限制](#41-限制)
- [4.2 对汽车域的适用性](#42-对汽车域的适用性)
- [5 与其他模块的依赖关系](#5-与其他模块的依赖关系)
- [5.1 文件结构](#51-文件结构)
- [5.2 集成提示](#52-集成提示)
- [6 需求可追溯性](#6-需求可追溯性)
- [7 功能规范](#7-功能规范)
- [7.1 启动行为](#71-启动行为)
- [7.2 监视器重新初始化](#72-监视器重新初始化)
- [7.3 诊断事件定义](#73-诊断事件定义)
- [7.4 DTC 定义](#74-dtc-定义)
- [7.5 被监视组件定义](#75-被监视组件定义)
- [7.6 操作循环管理](#76-操作循环管理)
- [7.7 事件内存描述](#77-事件内存描述)
- [7.8 BSW 错误处理](#78-bsw-错误处理)
- [7.9 OBD 特定功能](#79-obd-特定功能)
- [7.10 J1939 特定功能](#710-j1939-特定功能)
- [7.11 与其他软件模块的交互](#711-与其他软件模块的交互)
- [7.12 版本检查](#712-版本检查)
- [7.13 错误分类](#713-错误分类)
- [7.14 错误检测](#714-错误检测)
- [7.15 错误通知](#715-错误通知)
- [8 API 规范](#8-api-规范)
- [8.1 导入类型](#81-导入类型)
- [8.2 类型定义](#82-类型定义)
- [8.3 函数定义](#83-函数定义)
- [8.4 期望接口](#84-期望接口)
- [8.5 调度函数](#85-调度函数)
- [8.6 服务接口](#86-服务接口)
- [9 序列图](#9-序列图)
- [10 配置规范](#10-配置规范)
- [11 不适用的需求](#11-不适用的需求)
---
## 1 介绍与功能概述
服务组件**诊断事件管理器(Diagnostic Event Manager, Dem)**负责处理和存储诊断事件(故障)及相关数据。此外,Dem 向 Dcm 提供故障信息(例如,从事件内存读取所有存储的 DTC)。Dem 向应用层和其他 BSW 模块提供接口。
Dem 规范文档的基本目标是为汽车制造商和组件供应商定义一种"诊断故障内存"通用方法。
本规范定义了 AUTOSAR 基本软件模块**诊断事件管理器(Dem)**的功能、API 和配置。内部行为的部分内容是制造商特定的,并在"限制"章节中进行描述。
---
## 2 缩略语和缩写
下面的术语表包括 Dem 模块相关的、未在 [4, AUTOSAR glossary] 中列出的缩略语和缩写。
### 2.1 缩略语
| 缩略语 | 描述 |
|---|---|
| Activation Mode 1 | 故障不存在 - MIL 应闪烁一次。 |
| Activation Mode 2 | "on-demand-MI" - 如果 OBD 系统根据歧视显示策略命令 on-demand-MI,则 MIL 应闪烁两次。 |
| Activation Mode 3 | "short-MI" - 如果 OBD 系统根据歧视显示策略命令 short-MI,则 MIL 应闪烁三次。 |
| Activation Mode 4 | "continuous-MI" - 如果 OBD 系统根据歧视显示策略命令 continuous-MI,则 MIL 应保持持续点亮("continuous-MI")。 |
| Aging(老化) | 在定义的操作循环次数后,从事件内存中不再失败的事件/DTC 的遗忘/删除。 |
| Aging Counter(老化计数器) | "Aging Counter" 或 "Aging Cycle Counter" 或 "DTC Aging Counter" 指定用于执行老化的计数器。它对操作循环次数进行计数,直到事件/DTC 从事件内存中移除。 |
| Class B1 counter | Class B1 故障已被确认且 TestFailed 时发动机运行的引擎小时数。 |
| Combined DTC(合并 DTC) | 正常 DTC,但由多个监视器报告的多个事件引用(例如 ECU Defect,由不同 HW 缺陷组成)。 |
| Continuous-MI counter | 命令 continuous-MI 时发动机运行的小时数。 |
| Cumulative Continuous-MI counter | 在其生命周期内 MI 被持续命令点亮期间的引擎小时数。 |
| Debounce counter | 用于基于计数器的去抖算法的内部计数器。 |
| DemComponent / Monitored Component | 被监视组件是系统的一部分,由一个或多个监视器检查其正确操作。(参见章节 7.5) |
| Dem-internal data value | 某些数据值(例如 occurrence counter)由 Dem 模块自身内部计算。 |
| Denominator | 特定监视器 m 的分母(Denominatorm)是一个计数器,指示车辆驾驶事件的数量,并考虑该特定监视器的特定条件。 |
| Dependent / Secondary ECUs | 依赖/辅助(或 dep. / sec.)ECU 始终与主 ECU 或 Primary ECU 相关联。 |
| Directed acyclic graph | 无循环依赖的依赖图。 |
| Displacement(位移) | 用需要存储的更重要的事件内存条目替换最不重要的事件内存条目。 |
| DTC group | 唯一标识一组 DTC 的集合。DTC 组映射到有效 DTC 的范围内。通过提供一组 DTC,表示请求对该组的所有 DTC 执行特定操作。DTC 组定义由 ISO 14229-1 [2] 以及 OEM/供应商特定定义。 |
| DtcGroupAllDtcs | 所有已配置 DTC 的分组(表示为 0xFFFFFF)。 |
| Event combination(事件合并) | 事件合并是将多个事件合并到一个特定合并 DTC 的方法。它用于将不同监视器结果适配为一个可在服务站明确评估的重要故障。 |
| Event debouncing(事件去抖) | 去抖是一种特殊机制(例如基于计数器),用于评估诊断事件是否合格。这在潜在信号去抖之上工作,可以在 SW-C 或 Dem 内部完成。 |
| Event confirmation(事件确认) | 在通过故障确认计数器评估的循环或时间内的合格事件重复检测时确认诊断事件。因此,UDS 状态位 3(ConfirmedDTC)也被设置。 |
| Event memory(事件内存) | 事件内存(例如 Primary memory)由多个事件内存条目组成。 |
| Event memory entry(事件内存条目) | 事件内存条目是用于事件及其事件相关数据的单个存储容器。事件内存条目动态分配给特定事件。 |
| Event memory overflow indication(事件内存溢出指示) | 事件内存溢出指示指示此特定事件内存是否已满,以及下一个要存储在此事件内存中的事件是否发生。 |
| Event qualification(事件限定) | 如果设置了已通过或失败结果(Dem 内部或由其他 BSW 模块或 SW-C 报告),则诊断事件被限定。 |
| Event related data(事件相关数据) | 事件相关数据是附加数据,例如传感器值或时间戳/里程,与事件一起存储在事件内存中。ISO 定义了两种类型的事件相关数据:freeze frame(快照记录)和 extended data(扩展数据)。 |
| Event status byte(事件状态字节) | ISO 14229-1 [1] 中定义的状态字节,基于事件级别。 |
| Extended data record(扩展数据记录) | 扩展数据记录是用于存储分配给故障的特定信息的记录。 |
| Failure counter(失败计数器) | Failure counter 表示 ISO 14229-1 [2] 中的 Trip Counter。Trip Counter 对发生故障的操作循环(驾驶循环)数进行计数。如果计数器达到阈值(例如 2 个驾驶循环),则 confirmed 位从 0 变为 1。 |
| Fault Detection Counter | ISO 和 FDC-API 中使用的 sint8 值。 |
| Freeze frame(冻结帧) | 冻结帧定义为数据(DIDs/PIDs)记录。冻结帧与 ISO 14229-1 [2] 中的 SnapShotRecords 相同。 |
| General Denominator(通用分母) | 通用分母是一个计数器,指示车辆已运行的次数,同时考虑一般条件。 |
| Healing(愈合) | 在一段时间/几个操作循环内关闭警告指示器,包括报告的已通过结果的处理。 |
| In-Use performance ratio(IUMPR,在用性能比) | OBD 系统特定监视器 m 的在用性能比(IUPR)为:IUPRm = Numeratorm / Denominatorm。 |
| Master ECU(主 ECU) | 作为 Primary ECU,主 ECU 在其事件内存中存储"自己的"和"报告的"相关 dep./sec ECU 错误。除此之外,主 ECU 还必须执行特殊的主任务,例如 MIL Master 或提供"通用 nominator"信息。 |
| Monitor(监视器) | 诊断监视器是确定组件正确功能的例程实体。也可以使用"诊断功能"一词。 |
| Numerator(分子) | 特定监视器 m 的分子(Numeratorm)是一个计数器,指示车辆已运行使得遇到该特定监视器检测故障所需的所有监视条件的次数。 |
| NvM is marked for NvM_WriteAll | Dem 已调用 `NvM_SetRamBlockStatus()` 来设置相应的 NvM 块将由 `NvM_WriteAll()` 写入。 |
| Operating cycle(操作循环) | "操作循环"是事件限定和 Dem 调度的基础(例如点火钥匙 off-on 循环、驾驶循环等)。 |
| OBD | OBD(On-Board Diagnostics,车载诊断)是一个通用术语,指车辆的自诊断和报告能力。OBD 系统为车辆所有者或维修技术人员提供各种车辆子系统的健康状态信息。 |
| OBD ECUs | 在车辆中可以有 3 种不同类型的 OBD ECU:
• Master ECU(每辆车一个)
• Primary ECUs(每辆车多个)
• Dependent / Secondary ECUs(每辆车多个) |
| P-Code | 动力总成代码 |
| PFC cycle | 永久故障代码 - 驾驶循环(OBD 术语) |
| Positive Callback from NvM | Dem 模块应使用 NVRAMManager [5] 的 API `NvM_WriteBlock` 和 `NvM_GetErrorStatus`,如果需要在 `Dem_Init` 和 `Dem_Shutdown` 之间存储数据。此外,如果写入块成功完成,API `NvM_GetErrorStatus` 应等待肯定响应。 |
| PossibleErrors | PossibleErrors 指元模型中定义的 ApplicationErrors。 |
| Primary ECU(Primary ECU) | Primary ECU 在其事件内存中存储"自己的"和"报告的"相关 dep./sec ECU 错误。 |
| RBM cycle | OBD 术语:通用 nominator / 基于速率的监视 - 驾驶循环(OBD 术语) |
| Readiness(就绪状态) | 就绪状态涉及 UDS 状态字节的已测试位 `TestNotCompletedSinceLastClear`(位 4)和 `TestNotCompleteThisOperationCycle`(位 6)。 |
| Triggered to NvM | Dem 模块应使用 NVRAMManager [5] 的 API `NvM_WriteBlock`,如果需要在 `Dem_Init` 和 `Dem_Shutdown` 之间触发数据存储。此外,如果请求已被接受,Dem 模块应等待 `NvM_WriteBlock` 的肯定响应。 |
| UDS status bit 0 | UDS 状态字节的 testFailed 位。指示最近执行的测试的结果。 |
| UDS status bit 1 | UDS 状态字节的 testFailedThisOperationCycle 位。指示诊断测试是否在当前操作循环中的任何时间报告了 testFailed 结果。 |
| UDS status bit 2 | UDS 状态字节的 pendingDTC 位。指示诊断测试是否在当前或上一个完成操作循环中的任何时间报告了 testFailed 结果。 |
| UDS status bit 3 | UDS 状态字节的 confirmedDTC 位。指示是否已检测到足够的故障以保证 DTC 被存储到长期内存中。 |
| UDS status bit 4 | UDS 状态字节的 testNotCompletedSinceLastClear 位。指示自上次调用 ClearDiagnosticInformation 以来,DTC 测试是否已运行并完成。 |
| UDS status bit 5 | UDS 状态字节的 testFailedSinceLastClear 位。指示自上次调用 ClearDiagnosticInformation 以来,DTC 测试是否已完成并出现失败结果。 |
| UDS status bit 6 | UDS 状态字节的 testNotCompletedThisOperationCycle 位。指示 DTC 测试在当前操作循环中是否已运行并完成。 |
| UDS status bit 7 | UDS 状态字节的 warningIndicatorRequested 位。报告与特定 DTC 关联的任何警告指示器的状态。 |
| UDS status byte | ISO 14229-1 [1] 中定义的状态字节,基于 DTC 级别。 |
### 2.2 缩写
| 缩写 | 描述 |
|---|---|
| API | Application Programming Interface |
| BSW | Basic Software |
| CDD | Complex Device Driver |
| CRC | Cyclic Redundancy Check |
| Dcm | Diagnostic Communication Manager |
| Dem | Diagnostic Event Manager |
| Det | Default Error Tracer |
| DID | Data Identifier |
| DTC | Diagnostic Trouble Code |
| DTR | Diagnostic Test Result |
| DYC | OBD Term: Driving Cycle(OBD 术语) |
| ECU | Electronic Control Unit |
| EcuM | Electronic Control Unit Manager |
| FDC | Fault Detection Counter |
| Fim | Function Inhibition Manager |
| FMI | Failure Mode Indicator(SAE J1939) |
| FTB | Failure Type Byte |
| HW | Hardware |
| ID | Identification/Identifier |
| ISO | International Standardization Organization |
| IUMPR | In Use Monitoring Performance Ratio(OBD 术语) |
| J1939Dcm | SAEJ1939 Diagnostic Communication Manager |
| MIL | Malfunction Indicator Light(SAE J1979)或 Lamp(SAE J1939) |
| NVRAM | Non volatile RAM |
| OBD | On-Board-Diagnostics |
| OC | Occurrence Count(SAE J1939) |
| OEM | Original Equipment Manufacturer(汽车制造商) |
| OS | Operating System |
| PID | Parameter Identification(SAE J1587 或 SAE J1979) |
| PTO | Power Take Off |
| RAM | Random Access Memory |
| ROM | Read-only Memory |
| RTE | Runtime Environment |
| SPN | Suspect Parameter Number(SAE J1939) |
| SSCP | synchronous server call point |
| SW | Software |
| SW-C | Software Component |
| UDS | Unified Diagnostic Services |
| VOBD | Vehicle On-Board-Diagnostic |
| WUC | OBD Term: Warm up cycle(OBD 术语) |
| WIR | Warning Indicator Request |
| WWH-OBD | World Wide Harmonized On-Board-Diagnostic |
---
## 3 相关文档
### 3.1 输入文档与相关标准规范
引用:
- [1] **Unified diagnostic services (UDS) – Part 1: Specification and requirements**(2006-12 版)— `http://www.iso.org`
- [2] **Unified diagnostic services (UDS) – Part 1: Specification and requirements**(2013-03 版)— `http://www.iso.org`
- [3] **Road vehicles – Implementation of World-Wide Harmonized On-Board Diagnostics (WWH-OBD) communication requirements – Part 1: General information and use case definition** — `http://www.iso.org`
- [4] **Glossary** — `AUTOSAR_TR_Glossary`
- [5] **Specification of NVRAM Manager** — `AUTOSAR_SWS_NVRAMManager`
- [6] **General Specification of Basic Software Modules** — `AUTOSAR_SWS_BSWGeneral`
- [7] **Specification of a Diagnostic Communication Manager for SAE J1939** — `AUTOSAR_SWS_SAEJ1939DiagnosticCommunicationManager`
- [8] **Requirements on Function Inhibition Manager** — `AUTOSAR_SRS_FunctionInhibitionManager`
- [9] **Specification of Diagnostic Communication Manager** — `AUTOSAR_SWS_DiagnosticCommunicationManager`
- [10] **Requirements on Diagnostics** — `AUTOSAR_SRS_Diagnostics`
- [11] **General Requirements on Basic Software Modules** — `AUTOSAR_SRS_BSWGeneral`
- [12] **Road vehicles – Communication between vehicle and external equipment for emission-related diagnostic – Part 5: Emission-related diagnostic services** — `http://www.iso.org`
- [13] **SAE J2012-DA Digital**
- [14] **SAE J1939-73 Application Layer – Diagnostics**
- [15] **Road vehicles – Interchange of digital information on electrical connections between towing and towed vehicles – Part 4: Diagnostic communication** — `http://www.iso.org`
- [16] **ISO 17356-3**: Road vehicles – Open interface for embedded automotive applications – Part 3: OSEK/VDX Operating System (OS)
- [17] **SAE J1979**
- [18] **SAE J1979-DA Digital Annex of E/E Diagnostic Test Modes**
- [19] **Title 13, California Code Regulations, Section 1971.1, On-Board Diagnostic System Requirements for 2013 and Subsequent Model-Year Heavy-Duty Engines** (HD OBD)
- [20] **Title 13, California Code Regulations, Section 1968.2, Malfunction and Diagnostic System Requirements for 2004 and Subsequent Model-Year Passenger Cars, Light-Duty Trucks, and Medium-Duty Vehicles and Engines** (OBD II) — `http://www.arb.ca.gov/regact/obdii06/19682clean.pdf`
- [21] **Road vehicles – Implementation of World-Wide Harmonized On-Board Diagnostics (WWH-OBD) communication requirements – Part 3: Common message dictionary** — `http://www.iso.org`
- [22] **Software Component Template** — `AUTOSAR_TPS_SoftwareComponentTemplate`
- [23] **Diagnostic Extract Template** — `AUTOSAR_TPS_DiagnosticExtractTemplate`
### 3.2 相关规范
AUTOSAR 提供了关于基本软件模块的通用规范 [6, SWS BSW General],该规范也适用于诊断事件管理器。
因此,SWS BSW General 应被视为诊断事件管理器的附加且必需的规范。
---
## 4 约束与假设
Dem 中定义的一些同步 API 调用可能需要可变时间才能完成。因此,必须在系统配置中考虑此可变时间。
⌈[SWS_Dem_00126]⌋ 每个 ECU 上应只有一个可用的 Dem 模块。`(SRS_Diag_04002)`
Dem 可以具有多个不同的事件内存段。将 DTC 映射到相应段是通过参数 DTC Origin 完成的。特定 ECU 的 Dem 仅可由位于同一 ECU 内的软件组件访问。
### 4.1 限制
必须为整个 ECU 考虑时序约束。如果对 Dem 的响应速度有明确的要求高于 Dem 基本循环时间,则必须实现本 AUTOSAR 文档中未指定的特殊措施。在具有许多事件的 ECU 中尤其如此。
事件和 DTCStatusChange 的回调在极少数情况下不是确定性的,因此不应将其用于安全相关用例。请考虑 ISO-14229-1 [2] 中的一般声明:不建议将 DTC 状态与故障安全策略相关联。
SWS 中缺少 Dem <=> SW-C 交互期间由 RTE 报告的基础结构错误处理,如果实现者需要,可能必须考虑。
Dem 能够支持其他事件内存(永久内存、镜像内存和用户定义内存),但未详细定义特定的事件内存处理。
本规范未指定 Dem 与特定排放相关 SW-C 之间交互的某些细节,因为它们取决于 SW-C 实现。未定义以下功能:
- MIL 激活(MIL 处理程序与 Dem 的交互、MIL 灯泡检查、就绪闪烁、催化剂损坏失火时的闪烁等)
- 失火故障处理(对所有气缸的去抖、过滤单个/多个失火故障)
- 支持失火和燃油系统故障特定愈合的类似条件
注:对于 OBD2,要求仅在与检测到失火和燃油系统故障的类似条件下才能治愈(产生离开 Service $07)。"类似性"是根据由故障检测时存在的发动机转速、发动机负荷和温度条件的范围跨越的"窗口"得出的。
对于类似条件的处理,假定失火检测/燃油系统诊断的 SW-C 模块自身执行必要的计算。也就是说,它在 Dem 中并未全局解决。然而,根据各自的失火检测/燃油系统诊断的特定接口要求,这可能导致 Dem 的扩展。任何进一步的实施需要根据诊断和 Dem 实施为特定发动机控制单元项目定义。
DTCStoredDataRecordNumber(绝对冻结帧记录寻址功能)仅限于 0x00(OBD 冻结帧,参见 7.11.2.4 子节)。由其记录号标识的特定扩展数据记录的结构对于每个 ECU 是唯一的。
由于架构设计,Dcm 可能在处理"read diagnostic data"服务时锁定事件内存更新(参见 [SWS_Dem_00270])。
本规范涵盖 SAE J1939 相关诊断要求的子集(参见 [7, SWS J1939 Dcm] 中的表 1:支持的 DMx 消息)。SPN 转换方法仅限于版本 4(CM = 0)。
AUTOSAR 仅支持 ID 从 0x10 到 0xFF 的用户定义内存,由 AUTOSAR 提出以替代 ISO 14229:1 [2]。
指示器仅为 DemEventMemorySet 本地。Dem 不支持在多个 DemEventMemorySet 上使用指示器的配置。
参数 DemOperationCycleAutostart [ECUC_Dem_00805] 已过时,应忽略。
### 4.2 对汽车域的适用性
Dem 旨在满足具有 OBD 要求的 ECU 以及没有 OBD 要求的 ECU 的设计需求。目前的直接适用域是车身、底盘和动力总成 ECU。但是,没有理由不能使用 Dem 来实现用于其他汽车域(例如信息娱乐)的 ECU。
---
## 5 与其他模块的依赖关系
AUTOSAR 诊断事件管理器(Dem)具有与以下基本软件模块和软件组件的接口和依赖关系:
```text
SW-C SW-C SW-C
providing data controlling indicator
(used for event memory (e.g. lamps, text message,
Filter entries) etc.)
Services Monitor
(optional)
AUTOSAR
Software
AUTOSAR Runtime Environment (RTE)
BSW
Filter Services
Monitor
(optional)
System Services Communication Memory Services
Services
ECU State Manager
Dcm
NVRAM
FiM Dem Manager
J1939Dcm
Dlt
Basic Software
Figure 5.1: Dependencies of the Dem to other software modules
```
- **功能抑制管理器(FiM)**(参见 [8, SWS FiM])负责评估和分配事件到软件组件所需的动作(例如特定"监视器"的抑制)。Dem 在监视器状态更改时通知和更新功能抑制管理器(FiM),以便根据分配的依赖关系停止或释放功能实体。
- **诊断通信管理器(Dcm)**(参见 [9, SWS Dcm])负责 UDS 和 SAE J1979 通信路径以及诊断服务的执行,从而处理来自外部测试仪或车载测试系统的诊断请求。它转发来自外部诊断扫描工具的请求,并进一步负责组装响应消息(DTC、状态信息等),这些消息随后将传输到外部诊断扫描工具。
- **J1939 诊断通信管理器(J1939Dcm)**(参见 [7, SWS J1939 Dcm])负责 SAE J1939-73 诊断通信协议。
- **软件组件(SW-C)和基本软件(BSW)模块**可以访问 Dem 以更新和/或检索当前监视器状态和 UDS 状态信息。SW-C 和 BSW 模块可以从 Dem 检索数据,例如打开或关闭指示灯。监视器是 SW-C / BSW 模块的子组件。
- **数据提供程序 SW-C 和/或 BSW 模块**将提供 Dem 所需的数据(即事件相关数据),例如能够创建事件内存条目。
- **NVRAM Manager(NvM)**(参见 [5])提供在 NVRAM 中存储数据块的机制。NVRAM 块(最大大小是配置的问题)分配给 Dem,并由 Dem 用于实现 UDS 状态信息和相关数据的永久存储(例如跨上电复位)。
- **ECU 状态管理器(EcuM)**负责包括 Dem 在内的基本软件组件的基本初始化和反初始化。
- **RTE** 实现 BSW 的调度机制,例如为 ECU 中使用的每个 BSW 模块分配优先级和内存保护。
### 5.1 文件结构
#### 5.1.1 代码文件结构
有关详细信息,请参阅 SWS_BSWGeneral [6] 中章节 5.1.6"代码文件结构"(子章节"链接时配置源"和"构建后配置源")。
#### 5.1.2 头文件结构
为包含标识符参数的配置容器生成符号名称(参见 TPS_ECUC_02108),如事件 Id 符号、操作循环、指示器、启用/存储条件等。
请注意,SW-C 事件 Id 也专门发布给复杂设备驱动程序,这些驱动程序可能访问特定 SW-C 事件的状态。SW-C 使用不同的端口来区分不同的事件。
### 5.2 集成提示
由于跨模块通信,建议将 Dem 和 J1939Dcm 映射到同一任务,以便为 RTE 配置正确的调用上下文。可能有其他 BSW 供应商特定的解决方案,允许更灵活的映射(例如通过在 BSW 内部行为中描述此跨模块通信,或通过类似的机制与 Dcm <-> Dem 交互)。
---
## 6 需求可追溯性
下表引用了 [10] 和 [11] 中指定的需求,并链接到这些需求的实现。
| 需求 | 描述 | 由...实现 |
|---|---|---|
| [SRS_BSW_00005] | µC 抽象层(MCAL)的模块可能没有硬编码的水平接口 | [SWS_Dem_00999] |
| [SRS_BSW_00101] | 基本软件模块应能够通过单独的初始化函数初始化变量和硬件 | [SWS_Dem_00180] [SWS_Dem_00181] [SWS_Dem_00256] [SWS_Dem_00340] |
| [SRS_BSW_00161] | AUTOSAR 基本软件应提供微控制器抽象层,该层为更高软件层提供标准化接口 | [SWS_Dem_00999] |
| [SRS_BSW_00162] | AUTOSAR 基本软件应提供硬件抽象层 | [SWS_Dem_00999] |
| [SRS_BSW_00164] | 中断服务例程的实现应由操作系统、复杂驱动程序或模块完成 | [SWS_Dem_00999] |
| [SRS_BSW_00168] | SW 组件应由基本软件中公共 API 中定义的函数测试 | [SWS_Dem_00999] |
| [SRS_BSW_00170] | AUTOSAR SW 组件应提供有关其对故障、信号质量、驱动程序需求的依赖性的信息 | [SWS_Dem_00999] |
| [SRS_BSW_00171] | ECU 中不需要的基本软件组件的可选功能应在预编译时可配置 | [SWS_BSW_00255] [SWS_Dem_00579] |
| [SRS_BSW_00300] | 所有 AUTOSAR 基本软件模块都应由明确的名称标识 | [SWS_Dem_00512] |
| [SRS_BSW_00301] | 所有 AUTOSAR 基本软件模块应仅导入必要的信息 | [SWS_Dem_00176] |
| [SRS_BSW_00310] | API 命名约定 | [SWS_Dem_00256] |
| [SRS_BSW_00327] | 错误值命名约定 | [SWS_Dem_00999] |
| [SRS_BSW_00331] | 所有基本软件模块应严格分离错误和状态信息 | [SWS_Dem_00999] |
| [SRS_BSW_00336] | 基本软件模块应能够关闭 | [SWS_Dem_00102] [SWS_Dem_00182] [SWS_Dem_00341] |
| [SRS_BSW_00337] | 开发错误的分类 | [SWS_Dem_00368] |
| [SRS_BSW_00339] | 报告生产相关错误状态 | [SWS_Dem_00167] [SWS_Dem_00207] [SWS_Dem_01079] [SWS_Dem_01212] [SWS_Dem_01289] |
| [SRS_BSW_00341] | 模块文档应包含所有所需的信息 | [SWS_Dem_00999] |
| [SRS_BSW_00347] | 应实施 BSW 驱动程序不同实例的命名分离 | [SWS_Dem_00999] |
| [SRS_BSW_00348] | 所有 AUTOSAR 标准类型和常量应放在标准类型头文件中并组织好 | [SWS_Dem_00999] |
| [SRS_BSW_00350] | 所有 AUTOSAR 基本软件模块应允许启用/禁用开发错误的检测和报告 | [SWS_Dem_00999] |
| [SRS_BSW_00353] | 目标和编译器特定范围的所有整数类型定义应放在单个类型头文件中并组织好 | [SWS_Dem_00999] |
| [SRS_BSW_00357] | 对于 API 调用的成功/失败,应定义标准返回类型 | [SWS_Dem_00999] |
| [SRS_BSW_00359] | 所有 AUTOSAR 基本软件模块回调函数应避免返回值 | [SWS_Dem_00999] |
| [SRS_BSW_00360] | AUTOSAR 基本软件模块回调函数允许具有参数 | [SWS_Dem_00999] |
| [SRS_BSW_00361] | 编译器特定范围的非标准化关键字的所有映射应放在编译器特定类型和关键字头文件中并组织好 | [SWS_Dem_00999] |
| [SRS_BSW_00369] | 所有 AUTOSAR 基本软件模块不应通过 API 返回特定的开发错误代码 | [SWS_Dem_01255] [SWS_Dem_01261] [SWS_Dem_01270] [SWS_Dem_01271] [SWS_Dem_01274] [SWS_Dem_01299] [SWS_Dem_01300] [SWS_Dem_01313] |
| [SRS_BSW_00373] | 每个 AUTOSAR 基本软件模块的主处理函数应根据定义的约定命名 | [SWS_Dem_00125] |
| [SRS_BSW_00374] | 所有基本软件模块应提供可读的模块供应商标识 | [SWS_Dem_00999] |
| [SRS_BSW_00375] | 基本软件模块应报告唤醒原因 | [SWS_Dem_00999] |
| [SRS_BSW_00379] | 所有软件模块应在头文件和模块 XML 描述文件中提供模块标识符 | [SWS_Dem_00999] |
| [SRS_BSW_00387] | 无描述 | [SWS_Dem_01046] |
| [SRS_BSW_00402] | 每个模块应提供版本信息 | [SWS_Dem_00177] |
| [SRS_BSW_00406] | 表示 BSW 模块是否已初始化的静态状态变量应在调用 BSW 模块的任何 API 之前用值 0 初始化 | [SWS_Dem_00124] [SWS_Dem_00169] [SWS_Dem_00364] |
| [SRS_BSW_00407] | 每个 BSW 模块应提供读取专用模块实现的版本信息的函数 | [SWS_Dem_00177] |
| [SRS_BSW_00433] | 主处理函数只允许从 BSW Scheduler 提供的任务体中调用 | [SWS_Dem_00999] |
| [SRS_BSW_00457] | 应用软件组件的回调函数应由基础软件调用 | [SWS_Dem_00003] [SWS_Dem_00284] [SWS_Dem_00613] [SWS_Dem_00986] [SWS_Dem_00987] [SWS_Dem_01005] |
| [SRS_Com_02041] | AUTOSAR 模块应将复杂数据类型作为一致的数据集处理 | [SWS_Dem_00918] [SWS_Dem_00919] [SWS_Dem_00920] |
| [SRS_Diag_04000] | 无描述 | [SWS_Dem_00933] |
| [SRS_Diag_04001] | 无描述 | [SWS_Dem_00299] [SWS_Dem_00359] [SWS_Dem_00645] [SWS_Dem_00716] [SWS_Dem_00745] [SWS_Dem_00751] [SWS_Dem_00753] [SWS_Dem_00761] [SWS_Dem_00763] [SWS_Dem_00965] [SWS_Dem_01076] [SWS_Dem_01077] [SWS_Dem_01092] [SWS_Dem_01220] [SWS_Dem_01248] |
| [SRS_Diag_04002] | 诊断事件(故障)管理应建立为基本软件模块 | [SWS_Dem_00126] |
| [SRS_Diag_04005] | 管理 Security Access 级别处理 | [SWS_Dem_00999] |
| [SRS_Diag_04006] | 管理会话处理 | [SWS_Dem_00999] |
| [SRS_Diag_04007] | 为涉及诊断功能的应用程序提供诊断服务处理 | [SWS_Dem_00999] |
| [SRS_Diag_04010] | 无描述 | [SWS_Dem_00060] [SWS_Dem_00079] [SWS_Dem_00172] [SWS_Dem_00204] [SWS_Dem_00213] [SWS_Dem_00216] [SWS_Dem_00228] [SWS_Dem_00230] [SWS_Dem_00264] [SWS_Dem_00277] [SWS_Dem_00281] [SWS_Dem_00287] [SWS_Dem_00415] [SWS_Dem_00417] [SWS_Dem_00439] [SWS_Dem_00513] [SWS_Dem_00584] [SWS_Dem_00599] [SWS_Dem_00624] [SWS_Dem_00645] [SWS_Dem_00657] [SWS_Dem_00671] [SWS_Dem_00828] [SWS_Dem_00947] [SWS_Dem_01253] [SWS_Dem_01254] [SWS_Dem_01256] [SWS_Dem_01257] [SWS_Dem_01258] [SWS_Dem_01269] [SWS_Dem_01273] [SWS_Dem_01290] [SWS_Dem_01296] [SWS_Dem_01304] [SWS_Dem_01305] [SWS_Dem_01306] |
| [SRS_Diag_04015] | 根据 ISO15765-3 进行时序处理 | [SWS_Dem_00999] |
| [SRS_Diag_04016] | 通过发送否定响应 0x78 支持"Busy handling" | [SWS_Dem_00999] |
| [SRS_Diag_04019] | 在将诊断响应传输到应用程序后提供确认 | [SWS_Dem_00999] |
| [SRS_Diag_04020] | 抑制对诊断工具请求的响应 | [SWS_Dem_00999] |
| [SRS_Diag_04021] | 并行处理不同的诊断会话 | [SWS_Dem_00999] |
| [SRS_Diag_04024] | 当外部扫描工具请求时,访问和处理特定的数据元素和数据元素组 | [SWS_Dem_00479] [SWS_Dem_01194] |
| [SRS_Diag_04025] | 无描述 | [SWS_Dem_00622] |
| [SRS_Diag_04031] | 在事件状态更改时通知功能抑制管理器(FIM),以便根据 SW 组件的依赖关系处理它们 | [SWS_Dem_00029] [SWS_Dem_01189] [SWS_Dem_01325] [SWS_Dem_01326] |
| [SRS_Diag_04032] | 不同的诊断地址应由多个(物理)通道支持 | [SWS_Dem_00999] |
| [SRS_Diag_04033] | 在扩展和制造商特定的诊断会话中支持读/写 ECU 数据的 upload/download 服务 | [SWS_Dem_00999] |
| [SRS_Diag_04057] | 分类用于量产、OBD 和专家使用的事件 | [SWS_Dem_00057] [SWS_Dem_00370] [SWS_Dem_00518] [SWS_Dem_00649] [SWS_Dem_00906] [SWS_Dem_01066] |
| [SRS_Diag_04058] | 访问不同事件内存的能力 | [SWS_Dem_00171] |
| [SRS_Diag_04059] | 配置时序参数 | [SWS_Dem_00999] |
| [SRS_Diag_04061] | 无描述 | [SWS_Dem_00153] [SWS_Dem_00598] [SWS_Dem_00616] [SWS_Dem_00617] [SWS_Dem_00621] [SWS_Dem_00745] [SWS_Dem_01092] |
| [SRS_Diag_04063] | 为每个监视路径处理专用事件标识符,以支持不同事件/故障的自主处理 | [SWS_Dem_00153] [SWS_Dem_00154] [SWS_Dem_00942] [SWS_Dem_01034] [SWS_Dem_01037] |
| [SRS_Diag_04064] | 为事件、状态信息和环境数据的存储提供可配置的缓冲区大小 | [SWS_Dem_00999] |
| [SRS_Diag_04065] | 无描述 | [SWS_Dem_00570] [SWS_Dem_00571] [SWS_Dem_00572] [SWS_Dem_00573] [SWS_Dem_00661] [SWS_Dem_00664] [SWS_Dem_01057] [SWS_Dem_01059] [SWS_Dem_01061] [SWS_Dem_01075] [SWS_Dem_01185] [SWS_Dem_01198] |
| [SRS_Diag_04066] | 无描述 | [SWS_Dem_00010] [SWS_Dem_00162] [SWS_Dem_00212] [SWS_Dem_00236] [SWS_Dem_00238] [SWS_Dem_00239] [SWS_Dem_00240] [SWS_Dem_00548] [SWS_Dem_00648] [SWS_Dem_00934] [SWS_Dem_01199] [SWS_Dem_01207] |
| [SRS_Diag_04067] | 根据 ISO 14229-1 提供诊断状态信息 | [SWS_Dem_00006] [SWS_Dem_00011] [SWS_Dem_00016] [SWS_Dem_00051] [SWS_Dem_00059] [SWS_Dem_00060] [SWS_Dem_00187] [SWS_Dem_00212] [SWS_Dem_00213] [SWS_Dem_00330] [SWS_Dem_00385] [SWS_Dem_00386] [SWS_Dem_00387] [SWS_Dem_00388] [SWS_Dem_00389] [SWS_Dem_00390] [SWS_Dem_00391] [SWS_Dem_00392] [SWS_Dem_00393] [SWS_Dem_00394] [SWS_Dem_00395] [SWS_Dem_00409] [SWS_Dem_00421] [SWS_Dem_00431] [SWS_Dem_00523] [SWS_Dem_00524] [SWS_Dem_00525] [SWS_Dem_00529] [SWS_Dem_00539] [SWS_Dem_00566] [SWS_Dem_00638] [SWS_Dem_00823] [SWS_Dem_00936] [SWS_Dem_01186] [SWS_Dem_01276] [SWS_Dem_01277] [SWS_Dem_01278] [SWS_Dem_01280] [SWS_Dem_01281] [SWS_Dem_01282] [SWS_Dem_01283] [SWS_Dem_01284] [SWS_Dem_01285] [SWS_Dem_01286] [SWS_Dem_01287] [SWS_Dem_91008] |
| [SRS_Diag_04068] | AUTOSAR 中的诊断应支持事件特定的去抖计数器,以在内部改善信号质量(根据 ISO 14229-1 附录 D) | [SWS_Dem_00019] [SWS_Dem_00204] [SWS_Dem_00264] [SWS_Dem_00343] [SWS_Dem_00344] [SWS_Dem_00413] [SWS_Dem_00414] [SWS_Dem_00416] [SWS_Dem_00417] [SWS_Dem_00418] [SWS_Dem_00419] [SWS_Dem_00420] [SWS_Dem_00421] [SWS_Dem_00422] [SWS_Dem_00423] [SWS_Dem_00424] [SWS_Dem_00425] [SWS_Dem_00426] [SWS_Dem_00427] [SWS_Dem_00428] [SWS_Dem_00429] [SWS_Dem_00431] [SWS_Dem_00432] [SWS_Dem_00433] [SWS_Dem_00434] [SWS_Dem_00435] [SWS_Dem_00437] [SWS_Dem_00438] [SWS_Dem_00439] [SWS_Dem_00526] [SWS_Dem_00527] [SWS_Dem_00643] [SWS_Dem_00684] [SWS_Dem_00685] [SWS_Dem_00730] [SWS_Dem_00772] [SWS_Dem_00774] [SWS_Dem_00778] [SWS_Dem_00779] [SWS_Dem_00818] [SWS_Dem_00844] [SWS_Dem_00985] [SWS_Dem_01213] [SWS_Dem_01279] |
| [SRS_Diag_04069] | 无描述 | [SWS_Dem_00046] [SWS_Dem_00501] [SWS_Dem_00503] [SWS_Dem_00535] [SWS_Dem_00567] [SWS_Dem_00701] [SWS_Dem_00865] [SWS_Dem_00886] [SWS_Dem_00896] [SWS_Dem_00967] [SWS_Dem_01233] [SWS_Dem_01303] |
| [SRS_Diag_04071] | 根据定义的重要性(如优先级和/或严重性)处理事件 | [SWS_Dem_00232] [SWS_Dem_00382] [SWS_Dem_00383] [SWS_Dem_00692] [SWS_Dem_01291] [SWS_Dem_01292] [SWS_Dem_01293] [SWS_Dem_01294] |
| [SRS_Diag_04072] | 无描述 | [SWS_Dem_00218] |
| [SRS_Diag_04073] | 无描述 | [SWS_Dem_00024] [SWS_Dem_00163] [SWS_Dem_00440] [SWS_Dem_00441] [SWS_Dem_00442] [SWS_Dem_00536] [SWS_Dem_00539] [SWS_Dem_00540] [SWS_Dem_00541] [SWS_Dem_00542] [SWS_Dem_00672] [SWS_Dem_01050] [SWS_Dem_01051] [SWS_Dem_01052] [SWS_Dem_01053] [SWS_Dem_01295] |
| [SRS_Diag_04074] | 无描述 | [SWS_Dem_00039] [SWS_Dem_00040] [SWS_Dem_00050] [SWS_Dem_00071] [SWS_Dem_00075] [SWS_Dem_00076] [SWS_Dem_00188] [SWS_Dem_00189] [SWS_Dem_00191] [SWS_Dem_00193] [SWS_Dem_00225] [SWS_Dem_00234] [SWS_Dem_00271] [SWS_Dem_00282] [SWS_Dem_00464] [SWS_Dem_00465] [SWS_Dem_00564] [SWS_Dem_00576] [SWS_Dem_00582] [SWS_Dem_00585] [SWS_Dem_00595] [SWS_Dem_00630] [SWS_Dem_00631] [SWS_Dem_00775] [SWS_Dem_00796] [SWS_Dem_00807] [SWS_Dem_00918] [SWS_Dem_00919] [SWS_Dem_00920] [SWS_Dem_00969] [SWS_Dem_00989] [SWS_Dem_00995] [SWS_Dem_00996] [SWS_Dem_00997] [SWS_Dem_01062] [SWS_Dem_01268] [SWS_Dem_01272] [SWS_Dem_01320] [SWS_Dem_01321] [SWS_Dem_01322] [SWS_Dem_01323] |
| [SRS_Diag_04075] | 无描述 | [SWS_Dem_00198] |
| [SRS_Diag_04076] | 无描述 | [SWS_Dem_00194] [SWS_Dem_00601] [SWS_Dem_01021] [SWS_Dem_01026] |
| [SRS_Diag_04077] | 使用持久性模块提供的标准机制 | [SWS_Dem_00164] [SWS_Dem_00329] [SWS_Dem_00551] [SWS_Dem_01237] [SWS_Dem_01238] |
| [SRS_Diag_04082] | 无描述 | [SWS_Dem_00315] [SWS_Dem_00321] [SWS_Dem_00323] [SWS_Dem_00325] [SWS_Dem_00610] [SWS_Dem_00612] [SWS_Dem_00627] [SWS_Dem_00735] [SWS_Dem_00738] [SWS_Dem_00742] [SWS_Dem_00746] [SWS_Dem_00766] [SWS_Dem_00769] [SWS_Dem_00933] [SWS_Dem_01073] [SWS_Dem_01187] |
| [SRS_Diag_04085] | 无描述 | [SWS_Dem_00463] |
| [SRS_Diag_04086] | 无描述 | [SWS_Dem_00999] |
| [SRS_Diag_04087] | 无描述 | [SWS_Dem_00999] |
| [SRS_Diag_04089] | 无描述 | [SWS_Dem_00999] |
| [SRS_Diag_04090] | 无描述 | [SWS_Dem_00999] |
| [SRS_Diag_04091] | 向应用程序通知有效冻结帧数据 | [SWS_Dem_00999] |
| [SRS_Diag_04093] | 内存溢出指示 | [SWS_Dem_00397] [SWS_Dem_00398] [SWS_Dem_00399] [SWS_Dem_00559] [SWS_Dem_01023] |
| [SRS_Diag_04095] | 无描述 | [SWS_Dem_00233] [SWS_Dem_00243] [SWS_Dem_00733] [SWS_Dem_01113] |
| [SRS_Diag_04097] | 应用程序中的分散和模块化诊断配置 | [SWS_Dem_00999] |
| [SRS_Diag_04098] | 与标准 bootloader 交互 | [SWS_Dem_00999] |
| [SRS_Diag_04100] | 用于日志记录和跟踪的接口 | [SWS_Dem_00999] |
| [SRS_Diag_04101] | 无描述 | [SWS_Dem_00999] |
| [SRS_Diag_04102] | 无描述 | [SWS_Dem_00935] |
| [SRS_Diag_04105] | 事件内存管理 | [SWS_Dem_00580] [SWS_Dem_00607] [SWS_Dem_00683] [SWS_Dem_00780] [SWS_Dem_00781] [SWS_Dem_00783] [SWS_Dem_00784] [SWS_Dem_00785] [SWS_Dem_00786] [SWS_Dem_00922] [SWS_Dem_00923] [SWS_Dem_01000] |
| [SRS_Diag_04107] | 提供防御行为 | [SWS_Dem_00339] |
| [SRS_Diag_04109] | 提供用于检索事件内存条目数的接口 | [SWS_Dem_00651] [SWS_Dem_00652] |
| [SRS_Diag_04110] | SAE J1939 灯状态 | [SWS_Dem_00546] [SWS_Dem_00858] ... [SWS_Dem_00974] |
| [SRS_Diag_04111] | SAE J1939 扩展冻结帧 | [SWS_Dem_00877] [SWS_Dem_00899] [SWS_Dem_00900] [SWS_Dem_00901] [SWS_Dem_00902] [SWS_Dem_00903] [SWS_Dem_00904] [SWS_Dem_00905] [SWS_Dem_00906] [SWS_Dem_00907] |
| [SRS_Diag_04112] | DEM 模块应支持 SAE J1939 定义的 DTC | [SWS_Dem_00645] ... [SWS_Dem_00981] |
| [SRS_Diag_04113] | 支持一组 SAE J1939 DM 消息 | [SWS_Dem_00770] ... [SWS_Dem_01180] |
| [SRS_Diag_04115] | 作为 UDS 服务 ControlDTCSetting 一部分的可选参数 DTCSettingControlOption Record 应限于 GroupOfDTC | [SWS_Dem_00080] [SWS_Dem_00626] |
| [SRS_Diag_04117] | DTC 删除的可配置行为 | [SWS_Dem_00343] [SWS_Dem_00620] [SWS_Dem_00670] [SWS_Dem_00679] [SWS_Dem_00680] [SWS_Dem_00879] |
| [SRS_Diag_04118] | 可选支持事件位移 | [SWS_Dem_00382] [SWS_Dem_00383] [SWS_Dem_00400] ... [SWS_Dem_01186] |
| [SRS_Diag_04119] | 根据分配的诊断会话处理诊断服务的执行 | [SWS_Dem_00999] |
| [SRS_Diag_04120] | 支持预定义的 AddressAndLengthFormat Identifier | [SWS_Dem_00999] |
| [SRS_Diag_04121] | 根据 ISO 14229-1 提供对服务 DynamicallyDefineDataIdentifier 的处理 | [SWS_Dem_00999] |
| [SRS_Diag_04122] | 无描述 | [SWS_Dem_00664] [SWS_Dem_00665] [SWS_Dem_00666] |
| [SRS_Diag_04124] | 将当前去抖计数器值非易失存储以跨掉电循环 | [SWS_Dem_00674] [SWS_Dem_00675] [SWS_Dem_00676] [SWS_Dem_00782] |
| [SRS_Diag_04125] | 事件去抖计数器应可配置 | [SWS_Dem_00625] [SWS_Dem_00654] ... [SWS_Dem_01004] |
| [SRS_Diag_04126] | 可配置的事件抑制 | [SWS_Dem_00687] [SWS_Dem_01080] ... [SWS_Dem_01302] |
| [SRS_Diag_04127] | DTCSnapshot Records 和 DTCExtended DataRecords 的可配置记录号和触发选项 | [SWS_Dem_00002] [SWS_Dem_00261] ... [SWS_Dem_01308] |
| [SRS_Diag_04128] | 无描述 | [SWS_Dem_00606] [SWS_Dem_00831] ... [SWS_Dem_00838] |
| [SRS_Diag_04129] | 提供 OBD 特定的配置功能 | [SWS_Dem_00752] [SWS_Dem_00932] [SWS_Dem_01220] [SWS_Dem_01221] [SWS_Dem_01222] [SWS_Dem_01234] [SWS_Dem_01235] |
| [SRS_Diag_04131] | 一致的事件管理机制 | [SWS_Dem_01063] [SWS_Dem_01064] |
| [SRS_Diag_04133] | 事件内存条目的老化 | [SWS_Dem_00019] [SWS_Dem_00442] ... [SWS_Dem_01221] |
| [SRS_Diag_04134] | 无描述 | [SWS_Dem_01310] [SWS_Dem_01311] [SWS_Dem_01391] |
| [SRS_Diag_04135] | 支持 UDS 服务 $38 (RequestFileTransfer) | [SWS_Dem_00999] |
| [SRS_Diag_04136] | 可配置的"confirmed"阈值 | [SWS_Dem_00999] |
| [SRS_Diag_04137] | 替换故障的定义 | [SWS_Dem_01087] [SWS_Dem_01089] [SWS_Dem_01090] [SWS_Dem_01091] |
| [SRS_Diag_04139] | 支持 UDS 服务 0x19 的子功能 0x42 | [SWS_Dem_00999] |
| [SRS_Diag_04141] | 能够将事件数据捕获与报告的事件同步 | [SWS_Dem_00351] [SWS_Dem_00748] ... [SWS_Dem_01183] |
| [SRS_Diag_04142] | 无描述 | [SWS_Dem_01007] [SWS_Dem_01017] ... [SWS_Dem_01239] |
| [SRS_Diag_04143] | 无描述 | [SWS_Dem_00999] |
| [SRS_Diag_04144] | 无描述 | [SWS_Dem_00999] |
| [SRS_Diag_04145] | 无描述 | [SWS_Dem_00999] |
| [SRS_Diag_04146] | 无描述 | [SWS_Dem_00999] |
| [SRS_Diag_04148] | 提供通知应用程序有关诊断数据更改的功能 | [SWS_Dem_00259] |
| [SRS_Diag_04150] | 支持 ISO 14229-1 定义的主要故障内存 | [SWS_Dem_00242] [SWS_Dem_00243] [SWS_Dem_01202] [SWS_Dem_01203] [SWS_Dem_01206] |
| [SRS_Diag_04151] | 事件状态处理 | [SWS_Dem_01208] [SWS_Dem_01209] |
| [SRS_Diag_04154] | 无描述 | [SWS_Dem_91025] |
| [SRS_Diag_04155] | 在事件相关数据更新时通知应用程序和 BSW 模块 | [SWS_Dem_00475] [SWS_Dem_00618] [SWS_Dem_00619] [SWS_Dem_01003] |
| [SRS_Diag_04156] | 支持 DTCFunctionalUnit | [SWS_Dem_00594] |
| [SRS_Diag_04158] | 无描述 | [SWS_Dem_00243] |
| [SRS_Diag_04160] | 根据 ISO 14229-1 的 ResponseOnEvent | [SWS_Dem_00562] |
| [SRS_Diag_04161] | 提供对 ASMIP 算法的支持 | [SWS_Dem_01242] [SWS_Dem_01243] [SWS_Dem_01244] [SWS_Dem_01245] [SWS_Dem_01246] |
| [SRS_Diag_04162] | 并行故障内存访问 | [SWS_Dem_01251] [SWS_Dem_01252] [SWS_Dem_01263] |
| [SRS_Diag_04164] | 为多个诊断服务器实例(虚拟 ECU)提供独立的事件内存 | [SWS_Dem_01247] |
| [SRS_Diag_04165] | 在报告主事件时触发多个事件 | [SWS_Dem_01250] [SWS_Dem_CONSTR_6115] |
| [SRS_Diag_04178] | 根据 ISO 14229-1 支持操作循环 | [SWS_Dem_00019] [SWS_Dem_00673] ... [SWS_Dem_01318] |
| [SRS_Diag_04179] | 提供用于监视应用程序的接口 | [SWS_Dem_00331] [SWS_Dem_00756] [SWS_Dem_00759] |
| [SRS_Diag_04181] | 无描述 | [SWS_Dem_00600] [SWS_Dem_00608] [SWS_Dem_00765] [SWS_Dem_00850] |
| [SRS_Diag_04185] | 在清除事件时通知应用程序 | [SWS_Dem_01240] [SWS_Dem_01241] |
| [SRS_Diag_04189] | 支持 Snapshot Records 和 Extended DataRecords 的细粒度配置 | [SWS_Dem_00469] [SWS_Dem_00779] [SWS_Dem_00821] [SWS_Dem_00995] [SWS_Dem_01216] |
| [SRS_Diag_04190] | 在 Snapshot Records 和 Extended DataRecords 中使用内部数据元素 | [SWS_Dem_00469] [SWS_Dem_00470] ... [SWS_Dem_01311] |
| [SRS_Diag_04191] | 无描述 | [SWS_Dem_00515] [SWS_Dem_00516] [SWS_Dem_00667] [SWS_Dem_00668] [SWS_Dem_00669] [SWS_Dem_01295] [SWS_Dem_01332] |
| [SRS_Diag_04192] | 提供处理事件特定启用条件的能力 | [SWS_Dem_00201] [SWS_Dem_00202] [SWS_Dem_00446] [SWS_Dem_00447] [SWS_Dem_00449] [SWS_Dem_00450] [SWS_Dem_00604] [SWS_Dem_01038] |
| [SRS_Diag_04194] | ClearDTC 应可供应用程序访问 | [SWS_Dem_00515] [SWS_Dem_00516] ... [SWS_Dem_01332] |
| [SRS_Diag_04195] | 已配置事件内存中 DTC 的按时间顺序报告顺序 | [SWS_Dem_00161] [SWS_Dem_00219] ... [SWS_Dem_00787] |
| [SRS_Diag_04201] | 支持将特定事件分配给客户特定 DTC 的配置 | [SWS_Dem_00231] [SWS_Dem_00269] |
| [SRS_Diag_04204] | 提供每个警告指示器的当前状态 | [SWS_Dem_00074] [SWS_Dem_00650] |
| [SRS_Diag_04205] | 支持 Snapshot Records | [SWS_Dem_00208] [SWS_Dem_01190] [SWS_Dem_01312] |
| [SRS_Diag_04213] | 支持 ISO 14229-1 定义的镜像故障内存 | [SWS_Dem_01205] [SWS_Dem_01206] |
| [SRS_Diag_04214] | 支持 ISO 14229-1 定义的用户定义故障内存 | [SWS_Dem_01202] [SWS_Dem_01203] [SWS_Dem_01217] |
| [SRS_Diag_04219] | 提供处理事件特定存储条件的能力 | [SWS_Dem_00453] [SWS_Dem_00455] ... [SWS_Dem_01309] |
| [SRS_Diag_04220] | 支持 DTC 抑制 | [SWS_Dem_00915] [SWS_Dem_01100] [SWS_Dem_01101] [SWS_Dem_01102] [SWS_Dem_01307] [SWS_Dem_01315] |
| [SRS_Mem_08549] | NVRAM manager 应提供在软件更新后自动初始化 RAM 数据块的功能 | [SWS_Dem_00578] |
| [SWS_BSW_00050] | 检查传递给初始化函数的参数 | [SWS_Dem_00173] |
| [SWS_BSW_00212] | NULL 指针检查 | [SWS_Dem_00173] |
---
## 7 功能规范
诊断事件管理器(Dem)处理和存储由软件组件(SW-C)和基本软件(BSW)模块中的诊断监视器检测到的事件。存储的事件信息可通过其他 BSW 模块或 SW-C 的接口访问。
图 7.1 显示了 Dem 配置。DemGeneral 包含配置的全局部分,DemConfigSet 包含多个配置部分。
```text
AUTOSARParameterDefinition:
EcucDefinitionCollection
+module
Dem: EcucModuleDef DemConfigSet: EcucParamConfContainerDef DemEventParameter:
+subContainer EcucParamConfContainerDef
upperMultiplicity = 1
lowerMultiplicity = 0 upperMultiplicity = 65535
lowerMultiplicity = 1
+container
DemDTC: EcucParamConfContainerDef
+subContainer
upperMultiplicity = 65535
lowerMultiplicity = 0
DemGeneral: EcucParamConfContainerDef
+container upperMultiplicity = 1
lowerMultiplicity = 1
Figure 7.1: Top-level view of Dem configuration
```
### 7.1 启动行为
⌈[SWS_Dem_00169]⌋ Dem 模块应区分预初始化模式和完全初始化模式(操作模式)。`(SRS_BSW_00406)`
⌈[SWS_Dem_00180]⌋ 函数 `Dem_PreInit` 应初始化 Dem 模块处理事件所需的内部状态,并使用 `Dem_SetEventStatus` 和 `Dem_ResetEventDebounceStatus` 重置 SW-C 或 BSW 模块报告的去抖计数器。`(SRS_BSW_00101)`
函数 `Dem_PreInit` 由 ECU State Manager 在 ECU 启动阶段、NVRAM Manager 初始化之前调用。BSW 模块可以通过 `Dem_SetEventStatus` 开始报告相关事件(参见 [SWS_Dem_00167])。
函数 `Dem_Init`(另请参见 [SWS_Dem_00340])在 ECU 启动阶段、NVRAM Manager 完成 NVRAM 数据恢复后调用。包括监视器在内的 SW-Components 在此后初始化。函数 `Dem_Init` 还用于在调用 `Dem_Shutdown` 后重新初始化 Dem 模块。
`Dem_Init` 的注意事项:在 Dem 模块的环境调用函数 `Dem_Init` 之前,Dem 模块不可用。
### 7.2 监视器重新初始化
监视器在应用程序中的主要初始化通过 `Rte_Start` 完成。监视器的事件特定部分的初始化可以由 Dem 触发。
⌈[SWS_Dem_00003]⌋ Dem 模块应提供接口 `InitMonitorForEvent` 以触发诊断监视器的初始化(另请参见章节 7.7.3 和 [SWS_Dem_00573])。`(SRS_BSW_00457)`
函数参数 `InitMonitorReason` 指示初始化的原因/触发。
注:Dem 模块不评估此回调函数的返回值(例如,如果返回值不是 E_OK)。
注:配置容器 `DemCallbackInitMForE` 用于指定每个事件的相关端口或 c-callback。
⌈[SWS_Dem_00679]⌋ API `Dem_SetOperationCycleState` 应在事件的操作循环启动或重新启动时触发相关事件的回调函数 `InitMonitorForEvent`。`InitMonitorReason` 参数应设置为 `DEM_INIT_MONITOR_RESTART`。`(SRS_Diag_04117)`
⌈[SWS_Dem_00680]⌋ `Dem_ClearDTC` API 应在清除事件时触发相关事件的回调函数 `InitMonitorForEvent`。`InitMonitorReason` 参数应设置为 `DEM_INIT_MONITOR_CLEAR`。`(SRS_Diag_04117)`
⌈[SWS_Dem_00681]⌋ API `Dem_SetEnableCondition` 应在事件的启用条件更改为已满足且因此事件的所有启用条件都已满足时触发相关事件的回调函数 `InitMonitorForEvent`。`InitMonitorReason` 参数应设置为 `DEM_INIT_MONITOR_REENABLED`。`(SRS_Diag_04125)`
⌈[SWS_Dem_00682]⌋ API `Dem_EnableDTCSetting` 应在事件的 ControlDTCSetting 重新启用时触发相关事件的回调函数 `InitMonitorForEvent`。`InitMonitorReason` 参数应设置为 `DEM_INIT_MONITOR_REENABLED`。`(SRS_Diag_04125)`
⌈[SWS_Dem_01113]⌋ API `Dem_SetStorageCondition` 应在事件的存储条件更改为已满足且因此事件的所有存储条件都已满足时触发相关事件的回调函数 `InitMonitorForEvent`。此外,仅当事件在存储条件禁用时报告 FAILED 或 PASSED 时才应调用回调。`InitMonitorReason` 参数应设置为 `DEM_INIT_MONITOR_REENABLED`。`(SRS_Diag_04095)`
以下图显示了使用接口 `InitMonitorForEvent` 的两个示例:
```text
Figure 7.2: Use-case of the interface InitMonitorForEvent for a specific event
Figure 7.3: Use-case of the interface InitMonitorForEvent for a specific event
```
任何函数的初始化(可能涉及监视器)也可以由 Dem 触发。
注:Dem 模块不评估此回调函数的返回值(例如,如果返回值不是 E_OK)。
示例:在清除 Dem 模块时(根据服务 04/ISO 15031-5 [12] 请求),可以初始化适配。
⌈[SWS_Dem_01046]⌋ 如果同时发生多个 `InitMonitorForEvent` 触发,则 `InitMforE` 应仅被调用一次。原因应按以下优先级选择:`DEM_INIT_MONITOR_CLEAR`(最高优先级)、`DEM_INIT_MONITOR_RESTART`、`DEM_INIT_MONITOR_REENABLED`(最低优先级)(参见 `Dem_InitMonitorReasonType`)。`(SRS_BSW_00387)`
### 7.3 诊断事件定义
"诊断事件"定义了可由 Dem 模块处理的原子单元。"诊断事件"的状态表示监视器的结果(参见章节 7.3.5)。Dem 通过 RTE 或其他 BSW 模块从 SW-C 接收监视器的结果。
Dem 模块使用 EventId 来管理系统的"诊断事件"状态,并对各个测试结果执行所需的操作,例如存储冻结帧。
⌈[SWS_Dem_00153]⌋ Dem 模块应通过 EventId 和相关 EventName 表示每个诊断事件。`(SRS_Diag_04061, SRS_Diag_04063)`
所有监视器和 BSW 模块使用 EventId 作为符号 EventName。Dem 配置工具将符号名称替换为数字。
⌈[SWS_Dem_00154]⌋ EventId 和相关 EventName 在由 ECU 配置表示的每个 Dem 模块中应唯一(参见 [SWS_Dem_00126])。`(SRS_Diag_04063)`
Dem 未被设计为能够处理多个监视器共享单个 EventId 的情况。
Dem 模块使用内部监视器状态来存储报告事件的状态。向 Dcm 报告 UDS 状态。
Dem 模块支持几个事件特定的配置参数,如下图所示。有关详细描述,请参阅章节 10 配置规范。
```text
DemEventParameter: +parameter DemEventId: EcucIntegerParamDef
EcucParamConfContainerDef max = 65535, min = 1, symbolicNameValue = true
upperMultiplicity = 65535
lowerMultiplicity = 1
Figure 7.4: Event parameter configuration (part 1)
Figure 7.5: Event parameter configuration (part 2)
```
#### 7.3.1 事件优先级
事件优先级定义为基于重要性级别的事件排名。它用于确定在存储的事件数超过最大内存条目数(事件内存已满)的情况下,可以从事件内存中删除哪些故障条目。
⌈[SWS_Dem_00382]⌋ 每个支持的事件应分配一个优先级(参见 `DemDTCAttributes` 中的参数 `DemDTCPriority`)。`(SRS_Diag_04118, SRS_Diag_04071)`
⌈[SWS_Dem_00383]⌋ 优先级值 1 应为最高优先级。较大的优先级值应定义较低的重要性。`(SRS_Diag_04118, SRS_Diag_04071)`
#### 7.3.2 事件发生
⌈[SWS_Dem_00011]⌋ Dem 模块应为每个事件内存条目提供发生计数器。`(SRS_Diag_04067)`
⌈[SWS_Dem_00523]⌋ 如果相关事件被输入到相应的事件内存中,Dem 模块应使用值 1 初始化发生计数器。`(SRS_Diag_04067)`
⌈[SWS_Dem_00524]⌋ 如果配置参数 `DemOccurrenceCounterProcessing` 设置为 `DEM_PROCESS_OCCCTR_TF`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则在每次 UDS 状态位 0(TestFailed)从 0 转换为 1 时,如果相关事件已存储在事件内存中,则 Dem 模块应将发生计数器增加一。`(SRS_Diag_04067)`
⌈[SWS_Dem_00580]⌋ 如果配置参数 `DemOccurrenceCounterProcessing` 设置为 `DEM_PROCESS_OCCCTR_CDTC`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则在每次 UDS 状态位 0 从 0 转换为 1 时,如果相关事件已存储在事件内存中且 UDS 状态位 3 等于 1(参见章节 0),则 Dem 模块应将发生计数器增加一。`(SRS_Diag_04105)`
⌈[SWS_Dem_00625]⌋ Dem 模块不应再增加事件特定的发生计数器,如果它已达到其最大值(255,参见 [SWS_Dem_00471])。`(SRS_Diag_04125)`
#### 7.3.3 事件类型
有两种不同类型的事件:
- **BSW 相关事件**(通过 C-API 报告 - `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`,则应将同一事件上的另一个 `DemMemoryDestinationRef`(`DemPrimaryMemory` 或 `DemUserDefinedMemory`)配置为前提条件。如果一个目的地不是 `DemMirrorMemory`,则不应为同一事件配置两个目的地。`c()`
⌈[SWS_Dem_CONSTR_6114]⌋ `DemMemoryDestinationRef` 的限制:DTC 只能通过 `DemMemoryDestinationRef` 引用同一 `DemEventMemorySet` 的事件内存。不支持 DTC 通过不同 `DemEventMemorySet` 上的 `DemMemoryDestinationRef` 引用事件内存的场景。`c()`
#### 7.3.5 诊断监视器定义
诊断监视器是确定组件正确功能的例程实体。此监视功能识别监视路径的特定故障类型(例如接地短路、开路负载等)。监视路径表示正在监视的物理系统或电路(例如传感器输入)。每个监视路径关联一个诊断事件。
```text
Runnable Entity
(p) →
(t) → triggered (e . g. on operation invoked event )
R 1 ( p) R 2 ( t)
R3 (t) Diagnostic Monitor
R 4 ( p)
R6 ( p ) R 5 (t )
SW-C
... ... ...
Figure 7.6: Example for a monitor embedded within a SW-C
```
如果监视器自行去抖,则仅在获得合格结果(已通过或失败)后调用报告 API。如果结果更改,则至少需要一次报告。但是,对于监视器而言,始终调用 Dem 通常在计算上更有效,因此应优先选择。因此,对于 Dem 处理未更改结果的报告是特定于实现的。
如果监视器使用 Dem 内部去抖机制(参见章节 7.7.3),则在执行具有功能检查的代码时调用报告 API。
#### 7.3.6 事件依赖关系
分配的 DemComponent 内事件的优先级以及 DemComponents 之间的依赖关系用于过滤错误报告到故障内存的存储。
⌈[SWS_Dem_01126]⌋ 当事件报告 FAILED 时,如果同一 DemComponent 上具有更高优先级的任何其他事件已为 FAILED,则应将其视为连续故障。`(SRS_Diag_04142)`
⌈[SWS_Dem_01127]⌋ 当事件报告 FAILED 时,如果任何父 DemComponent 为 FAILED,则应将其视为连续故障。`(SRS_Diag_04142)`
⌈[SWS_Dem_01128]⌋ Dem 应允许忽略 DemComponent 事件的优先级(`DemComponentIgnoresPriority`)。在这种情况下,仅当任何父组件为 FAILED 时,事件才应被视为连续故障(同一组件上其他事件的 FAILED 状态应被忽略)。`(SRS_Diag_04142)`
⌈[SWS_Dem_01129]⌋ 如果报告的故障不视为连续故障,则应视为因果故障。因果故障应正常处理。`(SRS_Diag_04142)`
⌈[SWS_Dem_01218]⌋ 如果报告的故障不视为连续故障且已配置 `DemCausalityDelayTime`,则应视为初步因果故障。从事件报告发生的时间点开始,直到 `DemCausalityDelayTime` 过去,事件可以重新被视为连续故障。如果在此期间报告同一 DemComponent 或任何父 DemComponent 上具有更高优先级的另一个故障,则事件应重新视为连续故障。时间过去后,故障将不再重新考虑。`(SRS_Diag_04142)`
⌈[SWS_Dem_01130]⌋ 视为连续故障的故障不应存储到故障内存中。(处理应类似于未满足的存储条件)。`(SRS_Diag_04142)`
⌈[SWS_Dem_01211]⌋ `DEM_EVENT_STATUS_FDC_THRESHOLD_REACHED` 的报告(例如,通过接口调用或在去抖算法中达到配置的阈值时)被视为失败事件的连续报告,不应存储到故障内存中。处理应类似于未满足的存储条件。`(SRS_Diag_04142)`
注:`DEM_EVENT_STATUS_FDC_THRESHOLD_REACHED` 的其他报告不应视为因果。
⌈[SWS_Dem_01131]⌋ Dem 应提供接口 `Dem_GetComponentFailed`,允许查询 DemComponent 的 FAILED 状态。`(SRS_Diag_04142)`
⌈[SWS_Dem_01132]⌋ 如果启用了 `DemTriggerFiMReports`(参见 `DemGeneral`),Dem 应通过调用函数 `DemTriggerOnComponentStatus` 在 DemComponent 失败状态的每次更改时通知 FiM 模块 [8]。`(SRS_Diag_04142)`
⌈[SWS_Dem_01133]⌋ 如果组件状态正在更改且配置了 `DemComponentFailedCallbackFnc` 或将 `DemComponentFailedCallbackUsePort` 设置为 TRUE,则 Dem 应触发回调 `DemTriggerOnComponentStatus`。`(SRS_Diag_04142)`
⌈[SWS_Dem_CONSTR_06157]⌋ 仅当未配置 `DemComponentFailedCallbackFnc` 时,才允许将 `DemComponentFailedCallbackUsePort` 设置为 TRUE。`c()`
#### 7.3.7 组件可用性
⌈[SWS_Dem_01134]⌋ Dem 应支持 DemComponent 的可用性。不可用的组件应被视为它们未包含在系统中(例如,`Dem_GetComponentFailed` 将返回 `E_NOT_OK`)。`(SRS_Diag_04142)`
⌈[SWS_Dem_01135]⌋ 接口 `Dem_SetComponentAvailable` 应可用于设置组件的可用性状态。`(SRS_Diag_04142)`
⌈[SWS_Dem_01136]⌋ 将 DemComponent 设置为不可用时,所有分配的事件也应设置为不可用。`(SRS_Diag_04142)`
⌈[SWS_Dem_01239]⌋ 启动后,所有 DemComponent 都应可用。`(SRS_Diag_04142)`
⌈[SWS_Dem_01226]⌋ 如果通过 `Dem_SetComponentAvailable` 将 DemComponent 设置为"不可用",则 Dem 应将所有依赖组件(子节点)视为已设置为"不可用"。`(SRS_Diag_04142)`
⌈[SWS_Dem_01227]⌋ 如果通过 `Dem_SetComponentAvailable` 将 DemComponent 设置为"不可用",则 Dem 应将所有分配的事件设置为"不可用",包括所有子节点的事件。事件的行为将类似于将每个事件单独设置为"不可用"(例如设置事件状态)。`(SRS_Diag_04142)`
⌈[SWS_Dem_01228]⌋ 如果通过 `Dem_SetComponentAvailable` 将 DemComponent 设置为"不可用",并且已分配给它的任何单独事件(参见 [SWS_Dem_01227])已失败,则该单独事件将保持为"可用"。`Dem_SetComponentAvailable` 仍应返回 `E_OK`。`(SRS_Diag_04142)`
⌈[SWS_Dem_01229]⌋ 如果通过 `Dem_SetComponentAvailable` 将 DemComponent 设置为可用,则所有分配的事件也设置为"可用",包括所有子节点的事件(如果这些节点尚未设置为"不可用")。单独事件的行为将类似于将它们单独设置为"可用"(例如触发 `InitMonitorForEvent`)。`(SRS_Diag_04142)`
⌈[SWS_Dem_01231]⌋ 如果为事件调用函数 `Dem_SetEventAvailable` 以将事件设置为"可用",并且其相关节点当前为"不可用",则该函数应返回 `E_NOT_OK`。`(SRS_Diag_04142)`
⌈[SWS_Dem_01232]⌋ 如果使用 `Dem_SetEventAvailable` 将事件设置为可用且其组件为"不可用",则 `Dem_SetEventAvailable` 应返回 `E_NOT_OK`。`(SRS_Diag_04142)`
### 7.4 DTC 定义
"诊断故障代码"定义了映射到 Dem 模块的"诊断事件"的唯一标识符(显示给诊断测试仪)。Dem 向 Dcm 模块提供"诊断故障代码"的状态(参见章节 7.11.2)。
```text
DemConfigSet: +subContainer DemDTC:
EcucParamConfContainerDef EcucParamConfContainerDef
upperMultiplicity = 65535
lowerMultiplicity = 0
+reference
DemObdDTCRef:
DemDTC: +destination EcucReferenceDef
EcucParamConfContainerDef upperMultiplicity = 1
upperMultiplicity = 65535 lowerMultiplicity = 0
lowerMultiplicity = 0
Figure 7.7: DTC configuration
```
#### 7.4.1 DTC 类型
DTC 类型(`DTCKind`)定义了 DTC 的语义含义。它可以区分排放相关 DTC 和非排放相关 DTC。在 OBD-II 的上下文中,相关的 DTC 类型值是 `DEM_DTC_KIND_EMISSION_RELATED`。
⌈[SWS_Dem_00164]⌋ Dem 模块应支持基于事件到 DTC 分配的 DTC 类型配置。`(SRS_Diag_04077)`
#### 7.4.2 DTC 格式
DTC 格式定义了 DTC 值的内部表示方式。可以使用以下 DTC 格式:
- `DEM_DTC_FORMAT_UDS` - 根据 ISO 14229-1 的 3 字节 DTC 值
- `DEM_DTC_FORMAT_OBD` - 2 字节 DTC 值(主要用于 OBD-II)
- `DEM_DTC_FORMAT_J1939` - J1939 格式
```text
UDS DTC value (3 bytes):
+-----------+-----------+-----------+
| HighByte | MidByte | LowByte |
+-----------+-----------+-----------+
| 2 bits: First DTC character |
| 4 bits: Second DTC character |
| 4 bits: First digit of DTC number |
|-------------------------------------|
| 4 bits: Second digit of DTC number |
| 4 bits: Third digit of DTC number |
|-------------------------------------|
| 4 bits: Fourth digit of DTC number |
| 4 bits: Fifth digit of DTC number |
+-------------------------------------+
```
#### 7.4.3 DTC 组
DTC 组用于将多个 DTC 组合在一起以进行操作。Dcm 提供清除 DTC 组的服务。
DTC 值的最高有效字节的 2 位定义了 DTC 的"系统",第二个最高有效字节的 4 位定义了"组"。通过提供 DTC 组,外部测试仪可以寻址属于某个组的所有 DTC。
⌈[SWS_Dem_00594]⌋ Dem 应支持 ISO 14229-1 [2] 中定义的 DTC 功能单元。`(SRS_Diag_04156)`
#### 7.4.4 DTC 严重性
DTC 严重性(`Severity`)定义 DTC 的严重性分类:
| 严重性值 | 描述 |
|---|---|
| `DEM_SEVERITY_NO_SEVERITY` | 没有可用严重性信息 |
| `DEM_SEVERITY_MAINTENANCE_ONLY` | 仅维护 |
| `DEM_SEVERITY_CHECK_AT_NEXT_HALT` | 下次停止时检查 |
| `DEM_SEVERITY_CHECK_IMMEDIATELY` | 立即检查 |
#### 7.4.5 功能单元
功能单元(DTCFunctionalUnit)标识 DTC 所涉及的系统功能单元。它是一个 8 位值(0..255)。
#### 7.4.6 DTC 重要性
DTC 重要性(`DTCSignificance`)定义 DTC 的相对重要性。OEM 可以使用它来将 DTC 分类为 OEM 特定类别。
#### 7.4.7 抑制 DTC 输出
`Suppress DTC output` 用于在某些条件下抑制 DTC 的报告。
#### 7.4.8 事件的可用性(可见性和计算)
事件可用性控制事件的可见性和计算。可以使用 `Dem_SetEventAvailable` API 在运行时控制事件的可用性。
#### 7.4.1 DTC 类型
有两种不同类型的 DTC:
- **非 OBD 相关 DTC**(UDS DTC)
- **OBD 相关 DTC**
此类型从 `DemDTCAttributes` 配置中隐式派生。如果参数 `DemObdDTC` 存在,则 DTC 和所有相关事件都是 OBD 相关的。
#### 7.4.2 DTC 格式
⌈[SWS_Dem_00013]⌋ Dem 模块应根据以下格式支持 DemDTC 的 DTC 格式:
- ISO-14229-1 [2]
- SAE J2012 OBD DTC(也称为 2 字节 DTC)[13]
- SAE J1939-73 [14]
- ISO 11992-4 [15]
- SAE J2012 WWH-OBD DTC(也称为 3 字节 DTC)[13]
`c()`
配置参数 `DemTypeOfDTCSupported` 用于指定 ECU 支持的 [SWS_Dem_00013] 中定义的 DTC 格式之一(参见 `Dem_GetTranslationType`)。需要此参数来确定要为 ISO-14229-1 [2] 服务 Read DTC Information(0x19)报告的 DTC 格式值。
⌈[SWS_Dem_00645]⌋ Dem 模块应基于单独的配置参数支持 UDS、OBD 和 J1939 DTC 的不同 DTC 编号(参见 `DemConfigSet` 中的参数 `DemDTC` 和 `DemObdDTC`)。`(SRS_Diag_04010, SRS_Diag_04001, SRS_Diag_04112)`
DTC 可以具有三种格式(UDS、OBD 和 J1939)的任何组合,即同时具有一种、两种或三种格式。因此,Dem 将在内部处理三个 DTC 值列表。报告的格式取决于 `Dem_DTCFormatType` 或由相关 API 的上下文定义。
⌈[SWS_Dem_00277]⌋ Dem 应将 DTC 值报告为 uint32,其中 byte 0 = LowByte,byte 1 = MiddleByte,byte 2 = HighByte 且 byte 3 未使用。对于 OBD DTC 格式,仅使用两个字节(HighByte、LowByte)。Dem 服务应将这些 DTC 报告为 uint32,其中 byte 1 = LowByte,byte 2 = HighByte,byte 3 未使用,byte 0 = 0x00。`(SRS_Diag_04010)`
```text
non OBD unused DTC HighByte DTC MiddleByte DTC LowByte
OBD unused DTC HighByte DTC LowByte 0x00
Byte 3 Byte 2 Byte 1 Byte 0
Figure 7.9: DTC Byte Order
```
⌈[SWS_Dem_00921]⌋ J1939DTC 的 SPN 应与 SPN 转换方法版本 4(CM = 0)结合表示为所有 19 位的 Intel 格式。`(SRS_Diag_04113)` 有关详细信息,请参见 [14] 中第 5.7.1.11 节 SPN 转换方法。
⌈[SWS_Dem_01180]⌋ Dem 应将 DTC 值报告为 uint32,其中 byte 0 = LowByte,byte 1 = MiddleByte,byte 2 = HighByte 且 byte 3 未使用。对于 WWH-OBD DTC 格式,仅使用三个字节(HighByte、MiddleByte 和 LowByte)。Dem 服务应将这些 DTC 报告为 uint32,其中 byte 1 = LowByte,byte 2 = HighByte,byte 0 用作 FTB(根据 SAE J2012-DA)[13]。`(SRS_Diag_04113)`
⌈[SWS_Dem_CONSTR_06146]⌋ `DemDtcValue` 的依赖性:OBD DTC `DemDtcValue` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_00269]⌋ 函数 `Dem_GetDTCOfEvent` 应获取通过 Dem 配置映射到 EventId 的 DTC。`(SRS_Diag_04201)`
#### 7.4.3 DTC 组
除单个 DTC 值外,还可以配置 DTC 组(参见 `DemGroupOfDTC`),如 ISO 14229-1 [2] 附录 D.1 中所定义。每个 DTC 组都有自己分配的 DTC 组值(必须与任何其他 DTC 和 DTC 组值唯一)。当请求对 DTC 组执行操作(如 ClearDTC 和 Disable/Enable DTC)时,DTCGroup 由 DTC 值选择。
⌈[SWS_Dem_01059]⌋ `DemGroupOfDTC` 应表示 DTC 组边界的值。`(SRS_Diag_04065)`
注:具有全局边界 0x000100 和 0xfffe00 的组不需要配置,因为 ALL 组是自动定义的。
⌈[SWS_Dem_01061]⌋ 所请求组的 dtc-code 和下一个较高 dtcgroup-code 之间的范围内的所有 DTC 应视为属于该组。`(SRS_Diag_04065)`
注:DTC 组与诊断服务 ClearDiagnosticInformation(0x14,参见 `Dem_ClearDTC`)以及诊断服务 ControlDTCSetting(0x85,参见 `Dem_DisableDTCSetting` 和 `Dem_EnableDTCSetting`)相关。
提供了以下 DTC 组:
- 'all DTCs' DTC 组(强制性,固定值 = 0xFFFFFF)
- 排放相关 WWH-OBD DTC(0xFFFF33)
请注意,DTC 组 'all DTCs' 不会在 `DemGroupOfDTC` 中配置,因为它始终由 Dem 模块提供。
```text
DemGroupOfDTC: DemGroupDTCs:
EcucParamConfContainerDef EcucIntegerParamDef
+parameter
lowerMultiplicity = 0 min = 256
upperMultiplicity = 65535 max = 16776959
Figure 7.10: DTC group configuration
```
考虑到 0xFFFFFF 是不可配置的值,表示"all DTCs 组",为组"X"配置的每个 DTC 应具有在开区间 `(ID_of_group_X, ID_of_next_configured_group)` 中的 id,例如:
```text
powertrain DTC group –> 0x3FFF00 DTC1 –> 0x3FFF04
DTC2 –> 0x3FFF06
.
.
.
DTCn –> 0x3FFF0E
body DTC group –> 0x7FFF0F ...
DTCs in the body DTC group
...
```
作为上述 DTC 组方法的配置约束,如果配置了一个或多个 DTC 组,则无法配置独立于组的 DTC。
#### 7.4.4 DTC 严重性
DTC 严重性用于根据 ISO-14229-1 [2] 附录 D.3"DTC 严重性和类别定义"提供有关特定事件重要性的信息。`DemDTCSeverity` 仅适用于 UDS DTC。
⌈[SWS_Dem_01291]⌋ 如果调用 API `Dem_GetSeverityOfDTC` 或 `Dem_GetNextFilteredDTCAndSeverity`,并且为所选 DTC 配置了 `DemDTCSeverity` 中的严重性值,则 Dem 应将在 `DemDTCSeverity` 中配置的值设置为 DTCSeverity。`(SRS_Diag_04071)`
⌈[SWS_Dem_01292]⌋ 如果调用 API `Dem_GetSeverityOfDTC` 或 `Dem_GetNextFilteredDTCAndSeverity`,并且为所选 DTC 未在 `DemDTCSeverity` 中配置严重性值,则 Dem 应将 `DEM_SEVERITY_NO_SEVERITY` 设置为 DTCSeverity。`(SRS_Diag_04071)`
#### 7.4.5 功能单元
⌈[SWS_Dem_01293]⌋ 如果调用 API `Dem_GetFunctionalUnitOfDTC`,并且为所选 DTC 配置了 `DemDTCFunctionalUnit` 中的功能单元值,则 Dem 应在输出参数 `DTCFunctionalUnit` 中设置在 `DemDTCFunctionalUnit` 中配置的值。`(SRS_Diag_04071)`
⌈[SWS_Dem_01294]⌋ 如果调用 API `Dem_GetFunctionalUnitOfDTC`,并且为所选 DTC 未在 `DemDTCFunctionalUnit` 中配置功能单元,则 Dem 应在输出参数 `DTCFunctionalUnit` 中设置值 0x00。`(SRS_Diag_04071)`
#### 7.4.6 DTC 重要性
DTC 有两个不同重要性级别:
- **fault(故障)**:对与组件/ECU 本身相关的故障进行分类(并且例如需要维修操作)
- **occurrence(发生)**:对指示有关系统行为不足的附加信息的问题进行分类(例如与 ECU 控制范围之外的条件相关)
此重要性级别按事件可配置(参见 `DemDTCAttributes` 中的 `DemDTCSignificance`),并且可以映射为数据元素(参见 `DEM_SIGNIFICANCE`)。
#### 7.4.7 抑制 DTC 输出
本节描述通过 API 调用在运行时动态抑制事件/DTC。被抑制的 DTC 的行为方式是测试仪看不到它,但诊断监视器可以继续处理它。
一个示例用例可以是:决定在某个市场中隐藏 DTC 的决定由 SW-C 在运行时做出。
配置参数 `DemSuppressionSupport`(参见 `DemGeneral`)控制 DTC 抑制功能的可用性。
⌈[SWS_Dem_00915]⌋ 如果此 DTC 的所有相关事件都不可用(参见章节 7.4.8),则 Dem 应抑制 DTC。`(SRS_Diag_04220)`
如果 DTC 和事件之间存在一对一关系,则如果相关事件不可用,则抑制 DTC。如果 DTC 是合并 DTC,则如果所有合并事件都不可用,则抑制 DTC。
关于输出和查询函数,被抑制的 DTC 被视为好像它们未在系统中配置。
⌈[SWS_Dem_01100]⌋ 被抑制 DTC 的 DTC 查询函数行为:在单个被抑制的所选 DTC 上调用以下任何 API 时:
- `Dem_GetStatusOfDTC`
- `Dem_GetSeverityOfDTC`
- `Dem_GetFunctionalUnitOfDTC`
- `Dem_ClearDTC`
Dem 应返回 `DEM_WRONG_DTC`。`(SRS_Diag_04220)`
⌈[SWS_Dem_01101]⌋ 被抑制的 DTC 不应对以下 Dcm 查询函数可见;因此以下函数应将 DTC 视为过滤器不匹配:
- `Dem_DcmGetDTCOfOBDFreezeFrame`
- `Dem_DcmReadDataOfOBDFreezeFrame`
- `Dem_DcmGetInfoTypeValue08`
- `Dem_DcmGetInfoTypeValue0B`
- `Dem_DcmReadDataOfPID01`
- `Dem_DcmGetDTRData`
- `Dem_GetDTCByOccurrenceTime`
- `Dem_GetNextFilteredDTC`
- `Dem_GetNextFilteredDTCAndFDC`
- `Dem_GetNextFilteredDTCAndSeverity`
- `Dem_GetNextFilteredRecord`
- `Dem_J1939DcmClearDTC`
- `Dem_J1939DcmFirstDTCwithLampStatus`
- `Dem_J1939DcmGetNextDTCwithLampStatus`
- `Dem_J1939DcmGetNextFreezeFrame`
- `Dem_J1939DcmSetDTCFilter`
- `Dem_J1939DcmGetNumberOfFilteredDTC`
- `Dem_J1939DcmGetNextFilteredDTC`
- `Dem_J1939DcmSetRatioFilter`
- `Dem_J1939DcmGetNextFilteredRatio`
- `Dem_J1939DcmReadDiagnosticReadiness1`
- `Dem_J1939DcmReadDiagnosticReadiness2`
- `Dem_J1939DcmReadDiagnosticReadiness3`
- `Dem_SelectFreezeFrameData`
- `Dem_SetDTCFilter`
- `Dem_SelectExtendedDataRecord`
`(SRS_Diag_04220)`
注:这意味着 DTC 的(外部)报告(例如 DTC 编号、UDS 状态、DTC 扩展数据记录、DTC 统计数据、IUMPR 等)被抑制。
⌈[SWS_Dem_01102]⌋ DTC 抑制不应停止相应 DTC 的事件处理。`(SRS_Diag_04220)`
注:这意味着例如事件限定、环境数据更新和功能降级仍在 Dem 中处理。
注:如果 DTC/冻结帧不应存储在故障内存中,则应另外使用存储条件。
⌈[SWS_Dem_01307]⌋ `Dem_GetDTCSuppression` 的功能:如果调用 `Dem_GetDTCSuppression`,Dem 应在输出参数 `SuppressionStatus` 中返回 DTC 抑制状态。值 TRUE 表示 DTC 通过调用 `Dem_SetDTCSuppression` 抑制,其中 `SuppressionStatus = TRUE`;值 FALSE 表示 DTC 当前未被抑制。`(SRS_Diag_04220)`
⌈[SWS_Dem_01315]⌋ 如果调用 `Dem_SetDTCSuppression`,Dem 应将所选 DTC 的抑制状态设置为参数 `SuppressionStatus` 的值。`(SRS_Diag_04220)`
还有各种原因,为什么 DTC 未被处理,因此对诊断不可见,但抑制状态本身仅由 `Dem_SetDTCSuppression` 更改。`Dem_GetDTCSuppression` 仅评估此抑制状态。
#### 7.4.8 事件的可用性(可见性和计算)
本节描述将事件标记为不可用而不从实际配置中删除它们的方法。不可用的事件被视为好像它未包含在 Dem 配置中。
一个示例用例可以是:控制单元及其软件支持不同种类的硬件以进行控制。硬件变体在某些可用或不可用的部分中有所不同。应应用相同的控制单元和软件。
1. 每个硬件变体生成一个标定集。应用工程师设置构建后配置以确保软件对硬件正确行为。对于不包括在硬件变体中的某些部分,这意味着需要关闭、抑制相关事件。这些事件应完全中立地表现,从不设置 LastFailed,不导致跛行模式,对修理厂服务不可见。
=> ECUC 参数 `DemEventAvailable`
2. 一个标定涵盖多个硬件变体。在生产期间,甚至在运行时(由修理厂)更改硬件时,某些编码位被写入控制单元,或接收某些网络消息,以根据硬件更改更改软件的行为。与 1a 类似,需要抑制某些事件。
=> 接口 `Dem_SetEventAvailable`
⌈[SWS_Dem_00687]⌋ Dem 应提供将事件视为好像它们未配置为 `DemEventParameter` 的功能。配置参数 `DemAvailabilitySupport` 用于启用该功能(包括 API `Dem_SetEventAvailable`)。`(SRS_Diag_04126)`
⌈[SWS_Dem_01103]⌋ 不可用的事件不应在 service `$01` PID `$41` 的计算中考虑。`(SRS_Diag_04126)`
⌈[SWS_Dem_01104]⌋ 引用不可用事件的 IUMPR 比率不应计算或报告。`(SRS_Diag_04126)`
⌈[SWS_Dem_01105]⌋ 引用事件的 DTR 不应计算或报告(`Dem_SetDTR`)。`(SRS_Diag_04126)`
⌈[SWS_Dem_01106]⌋ Dem 不应在 VARIANT-POST-BUILD 中提供函数 `Dem_SetEventAvailable`。理由:在 VARIANT-POST-BUILD 中,初始值在 `Dem_Init`(构建后初始化时间)之前无效。`(SRS_Diag_04126)`
⌈[SWS_Dem_01107]⌋ 配置参数 `DemEventAvailable` 的值应用作事件的可用性初始值,可以通过 API `Dem_SetEventAvailable` 动态更改。`(SRS_Diag_04126)`
注:`Dem_SetEventAvailable` 在 `Dem_Init` 之前可用,以在应用程序启动之前"预先配置"Dem。
注:如果事件的可用性通过 `Dem_SetEventAvailable` 更改,并且 ECU 已断电并再次通电。所需状态必须通过使用 `Dem_SetEventAvailable` 再次设置。
⌈[SWS_Dem_01108]⌋ 如果事件设置为不可用,则相应的事件应被视为好像它未在系统中配置(例如,`Dem_SetEventStatus` 和 `Dem_GetEventUdsStatus` 应返回 `E_NOT_OK`)。以下 API 会受到影响:
- `Dem_SetEventStatus`
- `Dem_GetEventUdsStatus`
- `Dem_ResetEventDebounceStatus`
- `Dem_ResetEventStatus`
- `Dem_PrestoreFreezeFrame`
- `Dem_ClearPrestoredFreezeFrame`
- `Dem_GetDebouncingOfEvent`
- `Dem_GetDTCOfEvent`
- `Dem_GetFaultDetectionCounter`
- `Dem_GetEventFreezeFrameDataEx`
- `Dem_GetEventExtendedDataRecordEx`
- `Dem_ClearDTC`
- `Dem_DcmGetDTRData`
- `Dem_RepIUMPRFaultDetect`
- `Dem_RepIUMPRDenRelease`
- `Dem_SetWIRStatus`
`(SRS_Diag_04126)`
注:事件的可用性也可能影响 DTC 的抑制(参见 [SWS_Dem_00915])。
⌈[SWS_Dem_01109]⌋ 当使用 `AvailableStatus = FALSE` 调用 API `Dem_SetEventAvailable` 时,Dem 应在以下情况下返回 `E_NOT_OK`:
- 事件已存在事件内存条目,或
- 任何事件状态标志 'testFailed'、'pending'、'confirmed' 或 'warningIndicatorRequested' 被设置
`(SRS_Diag_04126)`
⌈[SWS_Dem_01302]⌋ `Dem_SetEventAvailable` 的异步行为:Dem 应异步处理 `Dem_SetEventAvailable` 的调用。这意味着最终结果在稍后的时间点可用。`(SRS_Diag_04126)`
稍后的时间点意味着特定于实现,它可以是下一个主函数并在 `Dem_SetEventAvailable` 返回之后。
⌈[SWS_Dem_01110]⌋ 如果使用 `AvailableStatus == 'false'` 调用 `Dem_SetEventAvailable`,Dem 应将该事件的 UDS 状态设置为 0x00。`(SRS_Diag_04126)`
注:如果 UDS 状态更改,则调用相应的回调以正确向用户提供有关更改状态的信息。
⌈[SWS_Dem_01111]⌋ 如果使用 `AvailableStatus == 'true'` 调用 `Dem_SetEventAvailable`,Dem 应将该事件的 UDS 状态设置为 0x50。`(SRS_Diag_04126)`
⌈[SWS_Dem_01230]⌋ 如果调用函数 `Dem_SetEventAvailable` 将事件设置为"可用",Dem 应使用 `DEM_INIT_MONITOR_REENABLED` 作为 `InitMonitorReason` 触发事件初始化。`(SRS_Diag_04142)`
### 7.5 被监视组件定义
被监视组件是系统的一部分,与检查正确操作相关。组件的故障需要被报告和记录。为此,通常定义一个或多个监视并将其分配给组件。
此外,此类组件的状态是相关的,用于影响系统行为(组件状态可用于 Fim)和错误文档(过滤连续故障条目)。
Dem 允许将受监视组件明确定义为 DemComponent,定义事件和组件之间的关系,并最终允许定义组件之间的关系。
```text
ECU CAN Signal1
RAM BusOff Gradient
ROM MSCFailure Range
Plaus
Signal2
Gradient
Range
Plaus
HWC1 HWC2 HWC3
Gradient
Range
Gradient
Range
Gradient
Range
Signal3
Plaus Plaus Plaus
S3_Gradient
S3_Range
S3_Plaus
Figure 7.11: Event dependencies
```
#### 7.5.1 组件和依赖关系的定义
⌈[SWS_Dem_01118]⌋ Dem 应将受监视组件表示为具有唯一标识符的 DemComponent,该标识符用于接口中以标识组件。`(SRS_Diag_04142)`
⌈[SWS_Dem_01119]⌋ 每个 DemComponent 应具有布尔状态 FAILED,表示组件是否有错误的信息。`(SRS_Diag_04142)`
⌈[SWS_Dem_01120]⌋ Dem 应允许定义 DemComponent 之间的关系。关系是有向的,这意味着一个组件依赖于另一个组件(`DemImmediateChildComponentRef`)。具有有向关系(也通过多个组件)的任何组件被视为父组件。`(SRS_Diag_04142)`
示例:a -> b -> c -> d
- a 和 b 是 c 的父级
- c 和 d 依赖于 b
⌈[SWS_Dem_CONSTR_6106]⌋ DemComponent 的依赖关系仅支持有向无环图结构。`c()`
⌈[SWS_Dem_01121]⌋ Dem 应允许将事件分配给 DemComponent。`(SRS_Diag_04142)`
⌈[SWS_Dem_CONSTR_6107]⌋ 事件可以分配给一个 DemComponent,用于监视测试错误条件。多个事件可以分配给同一组件。`c()`
⌈[SWS_Dem_01122]⌋ Dem 应允许按优先级对分配给 DemComponent 的事件进行排序。优先级按事件定义为 `DemComponentPriority`。`(SRS_Diag_04142)`
⌈[SWS_Dem_01123]⌋ 在报告事件错误(`DEM_MONITOR_STATUS_TF`)时,分配的 DemComponent 应在事件报告的上下文中设置为 FAILED。`(SRS_Diag_04142)`
⌈[SWS_Dem_01124]⌋ 在将 DemComponent 设置为 FAILED 时,所有依赖组件应设置为 FAILED。`(SRS_Diag_04142)`
⌈[SWS_Dem_01125]⌋ 当所有分配的事件都为 NOT FAILED(`DEM_MONITOR_STATUS_TF`)且所有父组件都为 NOT FAILED 时,DemComponent 应设置为 NOT FAILED。`(SRS_Diag_04142)`
### 7.6 操作循环管理
Dem 模块提供定义不同操作循环的可能性(参考 ISO-14229-1 [2])。
操作循环的示例包括:
- 点火开/关循环
- 上电/断电循环
- OBD 驾驶循环
- 发动机暖机循环
- 操作活动/被动循环
- 累积运行时间
各种操作循环用作计算循环相关状态信息(例如 `testCompleteThisOperationCycle`)的基础。此外,操作循环是某些功能(如故障确认和故障老化)的基础。通过 `Dem_RestartOperationCycle` 重新启动或切换到下一个操作循环是计算这些功能的触发器。
```text
DemGeneral: EcucParamConfContainerDef
upperMultiplicity = 1
lowerMultiplicity = 1
+subContainer
DemOperationCycle: DemOperationCycleAutostart:
EcucParamConfContainerDef EcucBooleanParamDef
+parameter
upperMultiplicity = 256 lowerMultiplicity = 1
lowerMultiplicity = 1 upperMultiplicity = 1
defaultValue = false
DemOperationCycleId:
EcucIntegerParamDef
lowerMultiplicity = 1
+parameter upperMultiplicity = 1
symbolicNameValue = true
min = 0
max = 255
+reference DemLeadingCycleRef:
EcucReferenceDef
+destination lowerMultiplicity = 0
upperMultiplicity = 1
requiresSymbolicNameValue = true
Figure 7.12: Operation cycle configuration
```
```text
DemDTCAttributes: DemAgingCycleRef: DemOperationCycle:
EcucParamConfContainerDef EcucReferenceDef EcucParamConfContainerDef
upperMultiplicity = 65535 lowerMultiplicity = 0 upperMultiplicity = 256
lowerMultiplicity = 0 upperMultiplicity = 1 lowerMultiplicity = 1
+destination
+reference
DemEventParameter: DemOperationCycleRef:
EcucParamConfContainerDef EcucReferenceDef
+reference +destination
upperMultiplicity = 65535
lowerMultiplicity = 1
DemGeneralOBD: DemOBDPFCCycleRef:
EcucParamConfContainerDef +reference EcucReferenceDef +destination
upperMultiplicity = 1 lowerMultiplicity = 1
lowerMultiplicity = 0 upperMultiplicity = 1
DemLeadingCycleRef: +reference
EcucReferenceDef
lowerMultiplicity = 0
upperMultiplicity = 1 +destination
requiresSymbolicNameValue = true
Figure 7.13: Operation and aging cycle assignment
```
⌈[SWS_Dem_01318]⌋ 操作循环重启:仅允许在 `Dem_PreInit` 之后调用函数 `Dem_RestartOperationCycle`。如果在 `Dem_Init` 之前重新启动操作循环,则应在 `Dem_Init` 之后完成重新启动的处理。`(SRS_Diag_04178)`
⌈[SWS_Dem_01316]⌋ 操作循环重启:Dem 应仅在上次重启完全处理后才重新启动操作循环。换句话说,这意味着没有操作循环重启队列。`(SRS_Diag_04178)`
⌈[SWS_Dem_01221]⌋ Dem 允许使用 `DemLeadingCycleRef` 参数定义依赖操作循环。只要设置了该参数,操作循环就被视为依赖操作循环。只要未设置该参数,操作循环就被视为"正常"操作循环。`(SRS_Diag_04129, SRS_Diag_04133)`
⌈[SWS_Dem_01222]⌋ 如果传递给 `Dem_SetCycleQualified` 的操作循环未配置为依赖操作循环,则应报告 Det 错误 `DEM_E_WRONG_CONFIGURATION`。`(SRS_Diag_04129)`
⌈[SWS_Dem_01317]⌋ Dem 应跨功率循环存储依赖操作循环的限定状态。`(SRS_Diag_04178)`
⌈[SWS_Dem_01224]⌋ 操作循环重启:每当通过 `Dem_RestartOperationCycle` 请求重新启动操作循环时,依赖于所选操作循环的所有操作循环也应重新启动,但前提是它们已限定。`(SRS_Diag_04178)`
注:将依赖操作循环设置为限定不会启动操作循环,即使之前已启动前导操作循环。
⌈[SWS_Dem_01225]⌋ 操作循环重启:重新启动依赖操作循环时,其操作循环限定应重置。`(SRS_Diag_04178)`
⌈[SWS_Dem_01234]⌋ API `Dem_GetCycleQualified` 应在输出参数 `isQualified` 中提供所请求操作循环的限定状态。`(SRS_Diag_04129)`
⌈[SWS_Dem_01235]⌋ 如果传递给 `Dem_GetCycleQualified` 的操作循环根本未配置,则应报告 Det 错误 `DEM_E_WRONG_CONFIGURATION`。`(SRS_Diag_04129)`
⌈[SWS_Dem_01220]⌋ 如果将 `DemOBDDelayedDCYConfirmedAndMIL` 设置为 TRUE,则链接到 OBD 驾驶循环(`DemOBDDrivingCycleRef`)的事件的行为应更改:
如果操作循环未限定,则应处理状态报告,但已确认状态的更新除外。在 OBD 驾驶循环设置为限定的时刻,Dem 应执行所需的计算以达到在循环"未限定"阶段期间收集的事件的已确认状态。`(SRS_Diag_04001, SRS_Diag_04129)`
OBD 法规要求操作循环的特定实现。对于排放相关 ECU,必须相应地实施这些。
#### 7.6.1 操作循环计数器
#### 7.6.2 操作循环计数器
##### 7.6.2.1 自上次失败以来的循环
计数器"自上次失败以来的循环"表示自 DTC 故障检测计数器上次达到其最大值 +127(自上次清除 DTC 信息以来)以来的操作循环数。应包括所有操作循环,包括测试未完成的那些循环。
⌈[SWS_Dem_00984]⌋ 如果计数器"自上次失败以来的循环"映射到扩展数据记录(`DemInternalDataElement` 设置为 `DEM_CYCLES_SINCE_LAST_FAILED`),则每个"事件相关数据"记录应可用。`(SRS_Diag_04190)`
⌈[SWS_Dem_00771]⌋ 如果内部去抖计数器达到 `DemDebounceCounterFailedThreshold`(最新的 UDS 状态位 0 从 0 变为 1),并且此计数器未存储在事件内存中且有可用的事件内存条目,则应分配新条目,并且计数器应启动并初始化为零。`c()`
⌈[SWS_Dem_00772]⌋ 如果内部去抖计数器达到 `DemDebounceCounterFailedThreshold`(最新的 UDS 状态位 0 从 0 变为 1),并且此计数器存储在事件内存中,则计数器应初始化为零。`(SRS_Diag_04068)`
⌈[SWS_Dem_00773]⌋ 如果计数器可用且已启动,则应在引用操作循环结束时递增(参见 `DemOperationCycleRef`)。`(SRS_Diag_04178)`
⌈[SWS_Dem_00774]⌋ 计数器应实现为单字节。如果任何计数操作会导致计数器滚动超过 0xFF,则计数值应保持在 0xFF。`(SRS_Diag_04068)`
##### 7.6.2.2 自第一次失败以来的循环
计数器"自第一次失败以来的循环"表示自 DTC 故障检测计数器首次达到其最大值 +127(自上次清除 DTC 信息以来)以来的操作循环数。应包括所有操作循环,包括测试未完成的那些循环。
⌈[SWS_Dem_00775]⌋ 如果计数器"自第一次失败以来的循环"映射到扩展数据记录(`DemInternalDataElement` 设置为 `DEM_CYCLES_SINCE_FIRST_FAILED`),则每个"事件相关数据"记录应可用。`(SRS_Diag_04074, SRS_Diag_04190)`
⌈[SWS_Dem_00776]⌋ 如果内部去抖计数器达到 `DemDebounceCounterFailedThreshold`(最新的 UDS 状态位 0 从 0 变为 1),并且此计数器未存储在事件内存中且有可用的事件内存条目,则应分配新条目,并且计数器应启动并初始化为零。`(SRS_Diag_04125)`
⌈[SWS_Dem_00777]⌋ 如果计数器可用且已启动,则应在引用操作循环结束时递增(参见 `DemOperationCycleRef`)。`c()`
⌈[SWS_Dem_00778]⌋ 计数器应实现为单字节。如果任何计数操作会导致计数器滚动超过 0xFF,则计数值应保持在 0xFF。`(SRS_Diag_04068)`
##### 7.6.2.3 失败循环
计数器"失败循环"表示自 DTC 信息上次清除以来 DTC 故障检测计数器达到其最大值 +127 的操作循环数。
⌈[SWS_Dem_00779]⌋ 如果计数器"失败循环"映射到扩展数据记录(`DemInternalDataElement` 设置为 `DEM_FAILED_CYCLES`),则每个"事件相关数据"记录应可用。`(SRS_Diag_04068, SRS_Diag_04189, SRS_Diag_04190)`
⌈[SWS_Dem_00780]⌋ 如果内部去抖计数器达到 `DemDebounceCounterFailedThreshold`(最新的 UDS 状态位 0 从 0 变为 1),并且此计数器未存储在事件内存中且有可用的事件内存条目,则应分配新条目,并且计数器应启动并初始化为零。`(SRS_Diag_04105)`
⌈[SWS_Dem_00781]⌋ 如果计数器可用且已启动,则在 UDS 状态位 1 设置为 1 的情况下,应在引用操作循环结束时递增(参见 `DemOperationCycleRef`)。`(SRS_Diag_04105)`
⌈[SWS_Dem_00782]⌋ 计数器应实现为单字节。如果任何计数操作会导致计数器滚动超过 0xFF,则计数值应保持在 0xFF。`(SRS_Diag_04124)`
### 7.7 事件内存描述
"事件内存"被定义为一组位于专用内存块中的事件记录。事件记录至少包括 UDS 状态和事件相关数据。
⌈[SWS_Dem_00010]⌋ Dem 模块应支持主要事件内存。`(SRS_Diag_04066)`
⌈[SWS_Dem_00548]⌋ 如果已配置(参见 [SWS_Dem_00162]),Dem 模块应支持其他事件内存(用户定义、镜像、永久)。`(SRS_Diag_04066)`
⌈[SWS_Dem_01247]⌋ 通过容器 `DemEventMemorySet` 配置,Dem 支持多个独立的事件内存。每个带 `DemClient` 参数的 API 调用应仅适用于为此客户端配置的事件内存(主要、镜像或用户定义)。`(SRS_Diag_04164)`
⌈[SWS_Dem_CONSTR_06118]⌋ 单个事件内存中的唯一 DTC 值:`DemDtcValue` 在引用同一事件内存的所有 DTC 中应唯一。`c()`
⌈[SWS_Dem_CONSTR_06119]⌋ ECU 内唯一 OBD DTC 值:`DemDtcValue` 在引用同一事件内存的所有 DTC 中应唯一。`c()`
Dem 可以配置为支持多个 `DemEventMemorySet`。这允许 Dem 存储多个诊断服务器的 DTC 和事件相关数据。每个 `DemEventMemorySet` 被视为独立实体。一个 `DemEventMemorySet` 中的更改仅影响本地寻址的 `DemEventMemorySet`,在另一个 `DemEventMemorySet` 中不可见。
因此,在一个事件内存上执行 ClearDTC 等操作仅影响寻址的 `DemEventMemorySet`。换句话说,ClearDTC 操作对不同 `DemEventMemorySet` 中的 DTC 或事件相关数据没有影响。
⌈[SWS_Dem_01217]⌋ 为了从 `Dem_DTCOriginType` 计算用户定义内存 ID,如果值在 [0x0100, 0x01FF] 范围内,Dem 应从获取的值中减去 0x0100。`(SRS_Diag_04214)`
不同事件内存的大小在 Dem 配置中可配置。
⌈[SWS_Dem_00162]⌋ Dem 应提供配置参数以使故障内存大小适应可用的 ECU 内存空间(参见配置参数 `DemMaxNumberEventEntryPrimary`、`DemMaxNumberEventEntryMirror` 或 `DemMaxNumberEventEntryUserDefined`)。`(SRS_Diag_04066)`
⌈[SWS_Dem_00329]⌋ 对于存储到非易失性内存,Dem 应使用 NVRAM Manager(参见章节 7.11.5)。`(SRS_Diag_04077)`
下图显示了逻辑 Dem 事件内存布局的示例:
```text
Event Memory
primary mirror ...
Event Memory Layout
event counter
Example
1st entry 2nd entry ... nth entry
1st entry EventId 2nd entry nth entry
Freeze Frame 1 Freeze Frame 2* Extended Data
milage milage condition byte
abs. time abs. time frequency counter 1 Refer to 1st Refer to 1st
FF Data 1 FF Data 1 : entry entry
FF Data 2 FF Data 2 but: ... but:
: : ev. rel. data o ev. rel. data p
: :
FF Data m FF Data m
* only at the second appearance, up to the maximal number of freeze frames
1 frequency (occurrence) counter only increments
Figure 7.14: Example of a logical Dem event memory layout
```
如果存在内存大小的限制,则有必要提供事件内存的溢出指示和位移策略(参见章节 7.7.2)。
#### 7.7.1 事件状态管理
"事件状态管理"是 Dem 记录和保留事件、事件状态和相关数据的能力。
⌈[SWS_Dem_00330]⌋ Dem 模块应提供报告事件状态的能力,允许诊断监视器通知 Dem 内部诊断测试的结果(参见 `Dem_SetEventStatus`)。`(SRS_Diag_04067)`
⌈[SWS_Dem_01333]⌋ API `Dem_SetEventStatusWithMonitorData` 应具有与 `Dem_SetEventStatus` 相同的功能,唯一的区别是它提供更多参数以及要存储在事件相关数据中的数据。`c()`
位于应用程序中的监视器应在新的测试结果可用时立即调用函数(`Dem_SetEventStatus`)报告事件状态。这将独立于 Dem 模块的当前状态完成(参见图 7.15)。
```text
Figure 7.15: Example for using Dem_SetEventStatus
```
⌈[SWS_Dem_00331]⌋ Dem 模块应提供在未报告已通过结果的情况下重置事件的失败状态的能力(参见 `Dem_ResetEventStatus`)。`(SRS_Diag_04179)`
注:`Dem_ResetEventStatus` 并不意味着事件状态报告(如 `Dem_SetEventStatus` 所做的那样)。调用后,监视器状态未限定或测试。监视器将使用函数 `Dem_ResetEventStatus` 来停用跛行模式并切换回正常操作。此时,监视器通常尚未通过 OK 测试,因此无法使用 `Dem_SetEventStatus` 进行测试并通过。
⌈[SWS_Dem_00187]⌋ `Dem_ResetEventStatus` 的行为:函数 `Dem_ResetEventStatus` 应将事件状态位 0(TestFailed)设置为 0,并在已配置时将 Dem 内部去抖算法重置为初始值。Dem 应在稍后的时间点异步执行此操作。`(SRS_Diag_04067)`
稍后的时间点意味着确切的时刻是特定于实现的。这可能是下一个主函数,并在 `Dem_ResetEventStatus` 返回之后。
状态更改回调的可能调用也会异步触发。
注:函数 `Dem_ResetEventStatus` 不更改监视器状态和 UDS 状态位 6,也不清除预存储的冻结帧。
⌈[SWS_Dem_00638]⌋ 如果事件已在本操作循环中测试(UDS 状态位 6 设置为 0),则函数 `Dem_ResetEventStatus` 应返回 `E_NOT_OK`。`(SRS_Diag_04067)`
⌈[SWS_Dem_00051]⌋ 如果调用 API `Dem_GetEventUdsStatus`,Dem 应提供特定事件的当前事件状态字节。`(SRS_Diag_04067)`
注:函数 `Dem_GetEventUdsStatus` 提供给 SW-C 或其他 BSW 模块(例如 FiM)在事件级别上使用。Dcm 在 DTC 级别上使用函数 `Dem_GetStatusOfDTC`。
⌈[SWS_Dem_00844]⌋ Dem 应提供函数 `Dem_GetDebouncingOfEvent()`,用于报告事件的去抖状态。输出参数 `DebouncingState` 返回包括中间状态在内的去抖。一个特定的 OBD 特定位应在测试完成且去抖处于其限制时支持 DTR 更新触发,同时满足启用和存储条件。`(SRS_Diag_04068)`
Dem 支持按事件配置以禁止在同一操作循环中重置事件。
⌈[SWS_Dem_01208]⌋ 如果配置参数 `DemEventRecoverableInSameOperationCycle` 设置为 FALSE,则如果事件状态字节的 "TestFailedThisOperationCycle" 标志设置为 1,则将忽略 PASSED 报告(直接或间接地在去抖之后通过 `Dem_SetEventStatus`)。`(SRS_Diag_04151)`
注:去抖独立于 `DemEventRecoverableInSameOperationCycle` 的值完成。FDC 可以独立于 `DemEventRecoverableInSameOperationCycle` 的设置达到 -128。
⌈[SWS_Dem_01209]⌋ Dem 应独立于配置参数 `DemEventRecoverableInSameOperationCycle` 的设置执行配置的去抖。即,如果 `DemEventRecoverableInSameOperationCycle` 设置为 FALSE,并且此事件的监视器报告 PREPASSED,则 Dem 仍应处理去抖(例如递减计数器)。`(SRS_Diag_04151)`
⌈[SWS_Dem_01250]⌋ 如果配置了 `DemMultiEventTriggering`,并且调用以下任何 API:
- `Dem_SetEventStatus`
- `Dem_ResetEventStatus`
- `Dem_PrestoreFreezeFrame`
- `Dem_ClearPrestoredFreezeFrame`
- `Dem_ResetEventDebounceStatus`
使用由 `DemMultiEventTriggeringMasterEventRef` 引用的 `DemMultiEventTriggering` 的 EventId,对于此 `DemMultiEventTriggering` 的每个 `DemMultiEventTriggeringSlaveEventRef`,Dem 应使用相同的参数触发相同的 API 调用,只有 EventId 参数应替换为从 `DemMultiEventTriggeringSlaveEventRef` 引用的事件。`(SRS_Diag_04165)`
⌈[SWS_Dem_CONSTR_6115]⌋ Dem 不支持使用以下 API 调用:
- `Dem_SetEventStatus`
- `Dem_ResetEventStatus`
- `Dem_PrestoreFreezeFrame`
- `Dem_ClearPrestoredFreezeFrame`
- `Dem_ResetEventDebounceStatus`
使用由容器 `DemMultiEventTriggering` 中的任何 `DemMultiEventTriggeringSlaveEventRef` 引用的 EventId。这些事件专用于通过为主事件(`DemMultiEventTriggeringMasterEventRef`)调用这些 API 进行内部触发。如果在这些情况下调用任何这些 API,Dem 的行为是未定义的。`(SRS_Diag_04165)`
##### 7.7.1.1 状态位支持
⌈[SWS_Dem_00006]⌋ 默认情况下,Dem 模块应根据 ISO-14229-1 [2] 中的定义为每个诊断事件实现所有 UDS 状态位的当前集合。`(SRS_Diag_04067)`
注:对于本规范,事件的 ISO-14229-1 [2] 的 UDS 状态字节由 Dem 数据类型 `Dem_UdsStatusByteType` 表示(在章节 8.6.1.21 中定义)。如果不需要支持特定的 UDS 状态位(另请参见 [SWS_Dem_00060]),则此类优化或限制可以以供应商特定方式实现。
⌈[SWS_Dem_01276]⌋ 如果调用 API `Dem_GetEventUdsStatus`,参数 EventId 中的事件存在且根据章节 7.4.8 可用,则 Dem 应将 UDS 状态字节复制到输出参数 `UdsStatusByte` 中并返回 `E_OK`。`(SRS_Diag_04067)`
⌈[SWS_Dem_01277]⌋ 如果调用 API `Dem_GetEventUdsStatus`,参数 EventId 中的事件不存在或根据章节 7.4.8 不可用,则 Dem 应返回 `E_NOT_OK`。`(SRS_Diag_04067)`
##### 7.7.1.2 监视器状态和 UDS 状态更新
状态位处理是 Dem 功能的重要组成部分。SWC 或 BSW 模块经常通过 API `Dem_SetEventStatus` 报告监视器结果。调用这些函数将触发 Dem 的状态位处理。
⌈[SWS_Dem_01278]⌋ Dem 应提供每个事件的监视器状态以存储当前监视器状态信息。监视器状态包含 `Dem_MonitorStatusType` 中定义的信息。`(SRS_Diag_04067)`
⌈[SWS_Dem_01279]⌋ Dem 应在调用 `Dem_SetEventStatus` 函数的上下文中同步执行基于计数器的事件去抖。`(SRS_Diag_04068)`
⌈[SWS_Dem_01280]⌋ 在调用 `Dem_SetEventStatus` 并去抖之后,Dem 应以与 UDS 状态相同的方式处理监视器状态:
- 位 0(TestFailed)根据 [SWS_Dem_00386]
- 位 1(TestNotCompleteThisOperationCycle)根据 [SWS_Dem_00394]
监视器状态字节处理应在调用 `Dem_SetEventStatus` 函数的上下文中同步完成。`(SRS_Diag_04067)`
⌈[SWS_Dem_01281]⌋ 如果配置了参数 `DemGeneralCallbackMonitorStatusChangedFnc`,则 Dem 应使用 `_DemTriggerOnMonitorStatus` 的签名调用此配置的 C 函数。`(SRS_Diag_04067)`
⌈[SWS_Dem_01282]⌋ 在处理监视器状态时,只要监视器状态已更改,Dem 就应调用监视器状态更改回调函数:
- `_DemTriggerOnMonitorStatus`
`(SRS_Diag_04067)`
⌈[SWS_Dem_01283]⌋ 在为 `DemEventKind = DEM_EVENT_KIND_SWC` 的报告事件处理监视器状态时,只要监视器状态已更改并且为此事件配置了 C/S 接口,Dem 就应调用监视器状态更改回调 C/S 接口 `CallbackMonitorStatusChange`。`(SRS_Diag_04067)`
⌈[SWS_Dem_CONSTR_06120]⌋ `DemGeneralCallbackMonitorStatusChangedFnc` 的依赖性:`DemGeneralCallbackMonitorStatusChangedFnc` 仅在 `DemGeneralInterfaceSupport` 设置为 TRUE 时才应存在。`c()`
限制:通过 RTE 使用 `monitorStatusChange` 仅限于 SWC 监视。所有基本软件监视不能通过 RTE 用此回调覆盖。要在 SW-C 中获取所有监视的完整 `statusChange` 信息,应使用 `eventStatusChange` 回调。
通过 RTE 的 `CallbackMonitorStatusChange` 和 `GeneralCallbackMonitorStatusChanged` 进一步限于仅在已知上下文中更改其状态的监视。例如,如果监视器状态从 CDD 更改(例如通过 C 函数调用 `Dem_SetEventAvailable`),则不得使用通过 RTE 的监视器状态更改回调。
理由:AUTOSAR RTE 要求通过 RTE 从 BSW 到 SW-C 的调用在已知的调用上下文中完成。对于同步监视器状态更改回调,这仅对从 SW-C 报告的事件是可能的。对于从 BSW 模块报告的事件,不可能向 RTE 提供调用上下文。因此,Dem 仅对从 SW-C 报告的事件提供 C/S 接口 `CallbackMonitorStatusChange`。对于从 BSW 模块报告的事件,不提供此类 C/S 接口。此外,接口 `GeneralCallbackMonitorStatusChanged` 不作为 C/S 通过 RTE 提供,因为此回调只能对从 SW-C 报告的事件调用,而不能对从 BSW 模块报告的事件调用。这显然会导致混乱。
如果需要在 SW-C 中具有对监视器状态更改回调的一般同步反应,则同步反应可以在使用 `_DemGeneralTriggerOnMonitorStatus` 或 `_DemTriggerOnMonitorStatus` 的 CDD 范围内处理。
⌈[SWS_Dem_CONSTR_6116]⌋ 将监视器状态更改回调的使用限于仅从 SW-C 报告的事件:如果从 Cdd 或 BSW 模块调用 `Dem_SetEventAvailable`,则相应的监视器状态更改回调只能用作 C 函数,而不能通过 RTE 接口。`c()`
⌈[SWS_Dem_01284]⌋ 在处理 clear DTC 命令时(例如通过 `Dem_ClearDTC`),Dem 应将分配给已清除 DTC 的监视器状态设置为 0x04。`(SRS_Diag_04067)`
⌈[SWS_Dem_01285]⌋ Dem 应异步处理 UDS 状态。这意味着它在调用 `Dem_SetEventStatus` 函数的上下文之外计算。`(SRS_Diag_04067)`
⌈[SWS_Dem_01286]⌋ 如果调用 API `Dem_SetEventStatus` 并且 Dem 已根据 [SWS_Dem_01280] 同步处理报告的监视器状态,并且相应的 UDS 状态(参见 [SWS_Dem_01285])无法处理,则 Dem 应报告开发错误 `DEM_E_UDS_STATUS_PROCESSING_FAILED`。`(SRS_Diag_04067)`
```text
SW-C or BSW «module» Dem processing
Dem
SW-C or BSW Task Dem main function
Dem_SetEventStatus()
Ask for queued events()
Process UDS status()
Figure 7.16: Synchronous and asynchronous event processing
```
注:有关事件内存管理的详细描述,请参阅章节 7.7.2。
⌈[SWS_Dem_01064]⌋ 镜像内存与 UDS 状态的计算无关。`(SRS_Diag_04131)`
⌈[SWS_Dem_01287]⌋ 如果调用 API `Dem_GetMonitorStatus`,Dem 应将当前监视器状态复制到输出参数 `MonitorStatus` 中并返回 `E_OK`。`(SRS_Diag_04067)`
⌈[SWS_Dem_01288]⌋ 如果使用无效的 EventId 调用 API `Dem_GetMonitorStatus`,则 Dem 应返回 `E_NOT_OK`。`c()`
⌈[SWS_Dem_01326]⌋ 监视器状态应在 `Dem_Init` 中初始化。对 `Dem_GetMonitorStatus` 的任何调用应在监视器状态未初始化时返回 `E_NOT_OK`。`(SRS_Diag_04031)`
##### 7.7.1.3 状态位转换
本节描述 UDS 状态字节的各个状态位的行为(参见 ISO-14229-1 [2],UDS 状态字节 - 位转换)。
⌈[SWS_Dem_00385]⌋ 在将 clear 命令应用于特定 DTC(参见章节 7.7.2.2)之后,Dem 模块应将 UDS 状态字节设置为 0x50(就绪位 4 和 6 设置为 1,其他所有位均设置为零)。`(SRS_Diag_04067)`
注:在应用 clear 命令后的 UDS 状态字节的值也表示此字节的交付状态(初始状态)。
⌈[SWS_Dem_00386]⌋ Dem 模块应根据图 7.17 实现 UDS 状态位 0 的状态位转换。`(SRS_Diag_04067)`
⌈[SWS_Dem_00387]⌋ Dem 模块应支持配置参数 `DemStatusBitStorageTestFailed`(参见 `DemGeneral`)以确定 UDS 状态位 0 的信息是易失性存储还是非易失性存储。`(SRS_Diag_04067)`
⌈[SWS_Dem_00388]⌋ 如果配置参数 `DemStatusBitStorageTestFailed` 设置为 False,则 Dem 模块不应跨功率循环保留 UDS 状态位 0 的信息(易失性)。`(SRS_Diag_04067)`
⌈[SWS_Dem_CONSTR_6113]⌋ 测试失败状态位存储的配置:对于 WWH-OBD ECU,`DemStatusBitStorageTestFailed` 应设置为 True。`c()`
⌈[SWS_Dem_00525]⌋ 如果配置参数 `DemStatusBitStorageTestFailed` 设置为 True,则 Dem 模块应跨功率循环保留 UDS 状态位 0 的信息(非易失性)。`(SRS_Diag_04067)`
```text
Dem_SetEventStatus Dem_SetEventStatus
[EventStatus = [EventStatus =
DEM_EVENT_STATUS_PASSED] Dem_SetEventStatus[EventStatus = DEM_EVENT_STATUS_PASSED] OR DEM_EVENT_STATUS_FAILED]
Dem_ResetEventStatus[(OperationCycleId == DemOperationCycleRef)] OR
Dem_ClearDTC
Initial Bit 0 TestFailed = TestFailed =
state FALSE TRUE
Dem_SetEventStatus[EventStatus = DEM_EVENT_STATUS_FAILED]
Figure 7.17: UDS status bit 0 TestFailed logic
```
⌈[SWS_Dem_00389]⌋ Dem 模块应根据图 7.18 实现 UDS 状态位 1 的状态位转换。`(SRS_Diag_04067)`
注:如果使用 PendingDTC 位(参见 [SWS_Dem_00006])或 Dem 模块支持跨功率循环的操作循环(参见 `DemOperationCycleStatusStorage`),则事件状态位 1(TestFailedThisOperationCycle)的信息是非易失性的。
```text
Dem_SetEventStatus Dem_SetEventStatus
[EventStatus = [EventStatus =
DEM_EVENT_STATUS_PASSED] DEM_EVENT_STATUS_{FAILED|PASSED}]
Dem_RestartOperationCycle [(OperationCycleId == DemOperationCycleRef)] OR
Dem_ClearDTC
Initial Bit 1 TestFailed TestFailed
state ThisOperationCycle = ThisOperationCycle =
FALSE TRUE
Dem_SetEventStatus[EventStatus = DEM_EVENT_STATUS_FAILED]
Figure 7.18: UDS status bit 1 TestFailedThisOperationCycle logic
```
⌈[SWS_Dem_00390]⌋ Dem 模块应根据图 7.19 实现 UDS 状态位 2 的状态位转换。`(SRS_Diag_04067)`
⌈[SWS_Dem_01183]⌋ UDS 状态位 2 的信息需要非易失性存储。`(SRS_Diag_04141)`
```text
Dem_SetEventStatus
[EventStatus =
Dem_SetEventStatus DEM_EVENT_STATUS_FAILED]
[EventStatus = Dem_RestartOperationCycle[(OperationCycleId == DemOperationCycleRef) &&
DEM_EVENT_STATUS_PASSED] (TestFailedThisOperationCycle == 0) AND
(TestNotCompletedThisOperationCycle == 0)] OR
Dem_ClearDTC OR
{FaultRecordOverwritten}
Initial Bit 2 PendingDTC = PendingDTC =
state FALSE TRUE
Dem_SetEventStatus[EventSatus = DEM_EVENT_STATUS_FAILED]
Figure 7.19: UDS status bit 2 PendingDTC logic
```
⌈[SWS_Dem_00391]⌋ Dem 模块应根据图 7.20 实现 UDS 状态位 3 的状态位转换。`(SRS_Diag_04067)`
注:事件状态位 3(ConfirmedDTC)的信息是非易失性的(但它也可以基于相应的事件内存条目计算)。
```text
Dem_RestartOperationCycle
[(OperationCycleId == DemOperationCycleRef) &&
(testFailedThisOperationCycle == 0) &&
(failure counter+1 < DemEventFailureCycleCounterThreshold)]
/failure counter++
Dem_RestartOperationCycle[(OperationCycleId == DemOperationCycleRef) && {AgingCriteriaFulfilled}] OR
{FaultRecordOverwritten} OR
Dem_ClearDTC
Initial Bit 3 ConfirmedDTC = ConfirmedDTC =
state FALSE TRUE
/failure counter=0
Dem_SetEventStatus[(EventStatus = DEM_EVENT_STATUS_FAILED) &&
(testFailedThisOperationCycle == 0) && ((failure counter+1) >= DemEventFailureCycleThreshold)]
/failure counter = 0
Dem_RestartOperationCycle
[(OperationCycleId == DemOperationCycleRef) &&
(testFailedThisOperationCycle == 0) &&
(testNotCompleteThisOperationCycle == 0)]
/failure counter = 0
Figure 7.20: UDS status bit 3 ConfirmedDTC logic
```
注:"AgingCriteriaFulfilled" 条件由 [SWS_Dem_00498] 指定。"FaultRecordOverwritten" 条件由 [SWS_Dem_00409] 指定。
⌈[SWS_Dem_00392]⌋ Dem 模块应根据图 7.21 实现 UDS 状态位 4 的状态位转换。`(SRS_Diag_04067)`
注:事件状态位 4(TestNotCompletedSinceLastClear)的信息是非易失性的。
```text
Dem_SetEventStatus
[EventStatus =
DEM_EVENT_STATUS_{FAILED|PASSED}]
Dem_ClearDTC
Initial Bit 4 TestNotCompleted TestNotCompleted
state SinceLastClear = SinceLastClear =
TRUE FALSE
Dem_SetEventStatus[EventStatus = DEM_EVENT_STATUS_{FAILED|PASSED}]
Figure 7.21: UDS status bit 4 TestNotCompletedSinceLastClear logic
```
⌈[SWS_Dem_00393]⌋ Dem 模块应根据图 7.22 实现 UDS 状态位 5 的状态位转换。`(SRS_Diag_04067)`
注:事件状态位 5(TestFailedSinceLastClear)的信息是非易失性的。
```text
Dem_SetEventStatus Dem_SetEventStatus
[EventStatus = [EventStatus =
DEM_EVENT_STATUS_PASSED] DEM_EVENT_STATUS_{FAILED|PASSED}]
{AgingCriteriaFulfilled} (optional) OR
{FaultRecordOverwritten} (optional) OR
Dem_ClearDTC
Initial Bit 5 TestFailed TestFailed
state SinceLastClear = SinceLastClear =
FALSE TRUE
Dem_SetEventStatus[EventStatus = DEM_EVENT_STATUS_FAILED]
Figure 7.22: UDS status bit 5 TestFailedSinceLastClear logic
```
注:"AgingCriteriaFulfilled" 条件(由 [SWS_Dem_00498] 指定)和 "FaultRecordOverwritten" 条件(由 [SWS_Dem_00409] 指定)的相关性取决于配置参数 `DemStatusBitHandlingTestFailedSinceLastClear`(参见 `DemGeneral`)。
⌈[SWS_Dem_00394]⌋ Dem 模块应根据图 7.23 实现 UDS 状态位 6 的状态位转换。`(SRS_Diag_04067)`
注:如果使用 PendingDTC 位(参见 [SWS_Dem_00006]),或 Dem 模块支持跨功率循环的操作循环(参见 `DemOperationCycleStatusStorage`),则事件状态位 6(TestNotCompleteThisOperationCycle)需要非易失性存储。
```text
Dem_SetEventStatus
[EventStatus =
DEM_EVENT_STATUS_{FAILED|PASSED}]
Dem_RestartOperationCycle[(OperationCycleId == DemOperationCycleRef)] OR
Dem_ClearDTC
Initial Bit 6 TestNotCompleted TestNotCompleted
state ThisOperationCycle = ThisOperationCycle =
TRUE FALSE
Dem_SetEventStatus[EventStatus = DEM_EVENT_STATUS_{FAILED|PASSED}]
Figure 7.23: UDS status bit 6 TestNotCompleteThisOperationCycle logic
```
⌈[SWS_Dem_00395]⌋ Dem 模块应根据图 7.24 实现 UDS 状态位 7(WarningIndicatorRequested)的状态位转换。`(SRS_Diag_04067)`
注:UDS 状态位 7(WarningIndicatorRequested)的信息可能是易失性的(因为它是基于分配的警告指示器状态计算的)。
```text
(Dem_ClearDTC OR
{WarningIndicatorOffCriteriaFulfilled} )
AND {warning indicator not requested on due to Latched failsafe for particular DTC}
WarningIndicator WarningIndicator
Initial Bit 7
Requested = Requested =
state
FALSE TRUE
Dem_SetEventStatus[EventStatus = DEM_EVENT_STATUS_FAILED] AND
{WarningIndicatorOnCriteriaFulfilled}
Figure 7.24: UDS status bit 7 WarningIndicatorRequested logic
```
注:"WarningIndicatorOffCriteriaFulfilled" 和 "WarningIndicatorOnCriteriaFulfilled" 条件在章节 7.7.9 中指定。
注:ISO-14229-1 [2] 还将"warning indicator not requested on due to latched failsafe for particular DTC" 指定为条件。这必须由监视器确保。
##### 7.7.1.4 活动/被动状态
如果事件被限定为失败,则它变为活动状态。如果事件被限定为已通过,则它变为被动状态。可以从事件状态字节派生此状态。
由于 UDS 状态位 0 在持久存储能力中可配置(参见配置参数 `DemStatusBitStorageTestFailed`),活动/被动的含义也会受到影响:
- 如果 TestFailed 位是非易失性存储的,则"event active" 等于 TestFailed = 1,"event passive" 等于 TestFailed = 0。
- 如果 TestFailed 位仅是易失性存储的,则还需要有关此事件是否已在此功率循环中测试/报告的信息。只要此信息不存在,活动/被动状态是未定义的。
注:还有一些 ECU,其中所有监视器在启动阶段运行。在这种情况下,将活动/被动状态直接映射到 TestFailed 位也足够了。
##### 7.7.1.5 状态位更改的通知
Dem 模块可以通知监视器和/或其他组件有关事件或 DTC 状态更改的信息。
注:对于异步事件处理,Dem 模块将为每个事件/DTC 限定触发相应的通知函数两次。
⌈[SWS_Dem_00016]⌋ Dem 模块应在每次 UDS 状态更改时触发事件特定的回调函数 `EventUdsStatusChanged`。`(SRS_Diag_04067)`
注:Dem 模块不评估此回调函数的返回值(例如,如果返回值不是 E_OK)。
注:配置容器 `DemCallbackEventUdsStatusChanged`(在 `DemEventParameter` 中)用于为每个事件指定一个或多个端口/c-callback。
注:FiM 的相应回调函数在章节 7.10 中指定。
```text
DemEventParameter:
EcucParamConfContainerDef DemCallbackEventUdsStatusChanged: DemCallbackEventUdsStatusChangedFnc:
+subContainer EcucParamConfContainerDef +parameter EcucFunctionNameDef
upperMultiplicity = 65535
lowerMultiplicity = 1 lowerMultiplicity = 0 lowerMultiplicity = 0
upperMultiplicity = * A upperMultiplicity = 1
DemCallbackMonitorStatusChanged: DemCallbackMonitorStatusChangedFnc:
+subContainer EcucParamConfContainerDef +parameter EcucFunctionNameDef
lowerMultiplicity = 0 lowerMultiplicity = 0
upperMultiplicity = * A upperMultiplicity = 1
Figure 7.25: EventStatusChanged callback configuration
```
⌈[SWS_Dem_00284]⌋ Dem 模块应在每次 DemDTC 状态更改时触发 `DemCallbackDTCStatusChanged` 中配置的回调函数。`(SRS_BSW_00457)`
⌈[SWS_Dem_00986]⌋ Dem 模块应在每次 DemObdDTC 状态更改时触发 `DemCallbackOBDDTCStatusChanged` 中配置的回调函数。`(SRS_BSW_00457)`
⌈[SWS_Dem_00987]⌋ Dem 模块应在每次 J1939 DTC 状态更改时触发 `DemCallbackJ1939DTCStatusChanged` 中配置的回调函数。`(SRS_BSW_00457)`
注:Dem 模块不评估此回调函数的返回值(例如,如果返回值不是 E_OK)。
注:`EventUdsStatusChanged` 的结果可能仅在事件合并的情况下与 `DTCStatusChanged` 的结果不同(参见章节 7.7.5)。
注:配置容器 `DemCallbackDTCStatusChanged`(在 `DemGeneral` 中)、`DemCallbackOBDDTCStatusChanged`(在 `DemGeneralOBD` 中)和 `DemCallbackJ1939DTCStatusChanged`(在 `DemGeneralJ1939` 中)用于为 Dem 模块全局指定一个或多个端口/c-callback。
```text
DemGeneral: EcucParamConfContainerDef
DemCallbackDTCStatusChanged: DemCallbackDTCStatusChangedFnc:
upperMultiplicity = 1 +parameter EcucFunctionNameDef
EcucParamConfContainerDef
lowerMultiplicity = 1
lowerMultiplicity = 0 lowerMultiplicity = 0
upperMultiplicity = * upperMultiplicity = 1
+subContainer
DemGeneralOBD: DemCallbackOBDDTCStatusChanged: DemCallbackDTCStatusChangedFnc:
EcucParamConfContainerDef +subContainer EcucParamConfContainerDef +parameter EcucFunctionNameDef
upperMultiplicity = 1 lowerMultiplicity = 0 lowerMultiplicity = 0
lowerMultiplicity = 0 upperMultiplicity = * upperMultiplicity = 1
+subContainer
DemGeneralJ1939: DemCallbackJ1939DTCStatusChanged: DemCallbackDTCStatusChangedFnc:
EcucParamConfContainerDef +subContainer EcucParamConfContainerDef +parameter EcucFunctionNameDef
upperMultiplicity = 1 lowerMultiplicity = 0 lowerMultiplicity = 0
lowerMultiplicity = 0 upperMultiplicity = * upperMultiplicity = 1
Figure 7.26: DTCStatusChanged callback configuration
```
#### 7.7.2 事件内存管理
事件内存管理定义为在 Dem 模块内和从 Dem 模块添加、更新和删除事件内存条目的过程。Dem 模块确定事件内存条目是新的还是当前存在于事件内存中。
注:本节中的需求不决定软件实现,而是描述 ECU 对来自测试工具的请求的行为。
⌈[SWS_Dem_01199]⌋ Dem 模块应支持配置参数 `DemMemoryDestinationRef` 以定义各个 DTC 的目标内存。使用 Dem 接口时,`Dem_DTCOriginType` 选择目标内存。`(SRS_Diag_04066)`
注:OBD 相关 DTC 可以存储在主要或用户定义事件内存中。
⌈[SWS_Dem_01207]⌋ Dem 模块应支持配置参数 `DemMemoryDestinationRef` 以定义各个 DTC 的目标内存。使用 Dem 接口时,`Dem_DTCOriginType` 选择目标内存。`(SRS_Diag_04066)`
注:OBD 相关 DTC 可以存储在主要或用户定义故障内存中。
⌈[SWS_Dem_01063]⌋ 用户定义内存应具有与主要内存相同的行为(事件保留、事件优先级排序、老化、位移)。`(SRS_Diag_04131)`
注:镜像内存可以具有不同的行为,该行为是特定于项目的,不在本文档中描述。
```text
[Dem_SetEventStatus( PREFAILED | PREPASSED | FAILED | PASSED ) or
Dem_SetEventStatus( PREFAILED | PREPASSED | FAILED | PASSED ) ]
[not fulfilled]
Check enable conditions
[fulfilled]
[PREFAILED or PREPASSED]
Process event debouncing
[FAILED] [PASSED]
Check for
[qualified as FAILED] event [qualified as PASSED]
qualification
TestFailed bit = 0,
TestFailed bit = 1,
TestNotCompleteThisOpCycle = 0;
TestFailedThisOpCycle = 1,
TestNotCompleteSince LastClear = 0,
TestNotCompleteThisOpCycle = 0;
TestNotCompleteSinceLastClear = 0, [not qualified]
TestFailedSinceLastClear = 1
Check validity
of storage
conditions
[fulfilled]
[not fulfilled]
Pending = 1
[Yes]
Confirmed Level
Confirmed = 1
Reached?
[No]
[DEM_TRIGGER_ON_CONFIRMED] DemEventMemory [DEM_TRIGGER_ON_PENDING]
EntryStorageTrigger?
[No] [No]
ConfirmedDTC changed PendingDTC changed
from 0 to 1? from 0 to 1?
[Yes]
[Yes]
Process event retention
[Not Fullfilled AND
DemResetConfirmedBitOnOverflow == True]
Check retention
result
[Fullfilled OR DemResetConfirmedBitOnOverflow == False]
[TRUE] Check [FALSE]
WarningIndicatorRequest bit = 1 WarningIndicatorOnCondition
Figure 7.27: General diagnostic event storage processing
```
##### 7.7.2.1 事件保留
事件保留定义了 Dem 模块记录和处理事件(DTC)、UDS 状态信息和事件相关数据(例如冻结帧、扩展数据)的能力。
```text
Check
Check if
event
event is
memory
already
[not stored] for free
stored
entry [memory full]
Process event
displacement
[memory entry available]
[stored]
Check
displacement
[old event memory entry removed] result
Event memory entry
storage
[new event memory entry not possible]
fullfilled not
fullfilled
Figure 7.28: General diagnostic event retention processing
```
市场上有几种不同的策略可以分配事件内存条目。因此,Dem 模块能够配置分配事件内存条目的主要触发器。除了主要触发器之外,可能还有次要触发器(参见 `DemFreezeFrameRecordTrigger`),主要用于更新事件内存的内容(例如拥有最新更新的 FreezeFrames)。
⌈[SWS_Dem_00783]⌋ 如果事件:
1. 被限定为失败(UDS 状态位 0 从 0 变为 1),并且
2. 配置参数 `DemEventMemoryEntryStorageTrigger` 设置为 `DEM_TRIGGER_ON_TEST_FAILED` 或 `DEM_TRIGGER_ON_FDC_THRESHOLD`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),并且
3. 不存在事件内存条目,
则 Dem 模块应尝试根据图 7.28 在其配置的事件内存中分配事件内存条目(参见 `DemMemoryDestinationRef`)。`(SRS_Diag_04105)`
⌈[SWS_Dem_00784]⌋ 如果事件:
1. 变为 pending(UDS 状态位 2 从 0 变为 1),并且
2. 配置参数 `DemEventMemoryEntryStorageTrigger` 设置为 `DEM_TRIGGER_ON_TEST_FAILED` 或 `DEM_TRIGGER_ON_FDC_THRESHOLD`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),并且
3. 不存在事件事件内存,
则 Dem 模块应尝试根据图 7.28 在其配置的事件内存中分配事件内存条目(参见 `DemMemoryDestinationRef`)。`(SRS_Diag_04105)`
⌈[SWS_Dem_00922]⌋ 如果事件:
1. 处于 pending 状态(UDS 状态位 2 设置为 1)并被重新限定为失败(UDS 状态位 0 从 0 变为 1),并且
2. 配置参数 `DemEventMemoryEntryStorageTrigger` 设置为 `DEM_TRIGGER_ON_TEST_FAILED` 或 `DEM_TRIGGER_ON_FDC_THRESHOLD`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),并且
3. 不存在事件内存条目,
则 Dem 模块应尝试根据图 7.28 在其配置的事件内存中分配事件内存条目(参见 `DemMemoryDestinationRef`)。`(SRS_Diag_04105)`
⌈[SWS_Dem_00785]⌋ 如果事件:
1. 被确认(UDS 状态位 3 从 0 变为 1),并且
2. 配置参数 `DemEventMemoryEntryStorageTrigger` 设置为 `DEM_TRIGGER_ON_CONFIRMED` 或 `DEM_TRIGGER_ON_TEST_FAILED` 或 `DEM_TRIGGER_ON_FDC_THRESHOLD`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),并且
3. 不存在事件内存条目,
则 Dem 模块应尝试根据图 7.28 在其配置的事件内存中分配事件内存条目(参见 `DemMemoryDestinationRef`)。`(SRS_Diag_04105)`
⌈[SWS_Dem_00923]⌋ 如果事件:
1. 被确认(UDS 状态位 3 设置为 1)并被重新限定为失败(UDS 状态位 0 从 0 变为 1),并且
2. 配置参数 `DemEventMemoryEntryStorageTrigger` 设置为 `DEM_TRIGGER_ON_CONFIRMED` 或 `DEM_TRIGGER_ON_TEST_FAILED` 或 `DEM_TRIGGER_ON_FDC_THRESHOLD`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),并且
3. 不存在事件内存条目,
4. 如果 `DemResetConfirmedBitOnOverflow` 设置为 false,
则 Dem 模块应尝试根据图 7.28 在其配置的事件内存中分配事件内存条目(参见 `DemMemoryDestinationRef`)。`(SRS_Diag_04105)`
⌈[SWS_Dem_00786]⌋ 如果事件:
1. 使用 Dem 内部去抖(基于计数器或基于时间),并且
2. Dem 内部去抖计数器递增并达到 `DemCounterBasedFdcThresholdStorageValue` 或 `DemTimeBasedFdcThresholdStorageValue`,并且
3. 配置参数 `DemEventMemoryEntryStorageTrigger` 设置为 `DEM_TRIGGER_ON_FDC_THRESHOLD`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),并且
4. 不存在事件事件内存,
则 Dem 模块应尝试根据图 7.28 在其配置的事件内存中分配事件内存条目(参见 `DemMemoryDestinationRef`)。`(SRS_Diag_04105)`
注:如果事件内存条目已存在,则可能有其他触发器来更新事件内存条目的内容(参见章节 7.7.7 "事件相关数据")。
⌈[SWS_Dem_CONSTR_06155]⌋ `DemTimeBasedFdcThresholdStorageValue` 的依赖性:`DemTimeBasedFdcThresholdStorageValue` 仅在 `DemFreezeFrameRecordTrigger` 设置为 `DEM_TRIGGER_ON_FDC_THRESHOLD` 或 `DemExtendedDataRecordTrigger` 设置为 `DEM_TRIGGER_ON_FDC_THRESHOLD` 或 `DemEventMemoryEntryStorageTrigger` 设置为 `DEM_TRIGGER_ON_FDC_THRESHOLD`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`)时才应存在。`c()`
##### 7.7.2.2 清除事件内存条目
Dem 模块的事件内存条目可以通过各种诊断服务按 DTC 清除(例如服务 0x14 ClearDiagnosticInformation 或服务 $04 Clear/Reset emission-related diagnostic information)。因此,Dem 为不同的用户提供单独的 API:
- `Dem_ClearDTC`
- `Dem_J1939DcmClearDTC`(用于 J1939 到 J1939Dcm [7],参见章节 7.10.2)
⌈[SWS_Dem_01203]⌋ 如果请求 Dem 模块清除诊断信息并且所选 DTC 设置为 DTC 组 'all DTCs' 并且所选 `DTCOrigin` 设置为 `DEM_DTC_ORIGIN_PRIMARY_MEMORY` 或 `DEM_DTC_ORIGIN_USERDEFINED_MEMORY_`,则 Dem 应重置所有事件和 DTC 状态字节并清除分配给所请求 `DTCOrigin` 的事件相关数据。`(SRS_Diag_04150, SRS_Diag_04214)`
⌈[SWS_Dem_01205]⌋ 如果请求 Dem 模块清除诊断信息并且所选 DTC 设置为 DTC 组 'all DTCs' 并且所选 `DTCOrigin` 设置为 `DEM_DTC_ORIGIN_MIRROR_MEMORY`,则 Dem 应仅清除分配给镜像事件内存的事件条目。它不影响 UDS 状态。`(SRS_Diag_04213)`
⌈[SWS_Dem_01206]⌋ Dem 应仅在清除操作的所选 `DTCOrigin` 是主要或用户定义事件内存时调用回调 `DemClearEventAllowed`。`(SRS_Diag_04150, SRS_Diag_04213)`
清除过程可以由不同的客户端启动。每当这些接口之一启动清除过程时,Dem 内部清除机制将锁定,直到清除请求完成并将结果返回给请求用户。
⌈[SWS_Dem_01240]⌋ 如果 `DemClearDtcNotificationTime` 配置为 START,则 Dem 应通知应用程序有关清除 DTC 操作的开始。如果配置了 `DemClearDtcNotificationFnc`,则 Dem 应调用此配置的函数,否则 Dem 应调用 R-Port `ClearDtcNotification`。`(SRS_Diag_04185)`
⌈[SWS_Dem_01241]⌋ 如果 `DemClearDtcNotificationTime` 配置为 FINISH,则 Dem 应通知应用程序有关清除 DTC 操作的结束。Dem 应考虑配置参数 `DemClearDTCBehavior`,它定义诊断信息的清除过程包括清除完成。如果配置了 `DemClearDtcNotificationFnc`,则 Dem 应调用此配置的函数,否则 Dem 应调用 R-Port `ClearDtcNotification`。`(SRS_Diag_04185)`
⌈[SWS_Dem_00661]⌋ 如果多个客户端并行请求 `Dem_ClearDTC`,则 Dem 应在内部处理不同的请求。`(SRS_Diag_04065, SRS_Diag_04194)`
⌈[SWS_Dem_00664]⌋ 如果清除 DTC 过程由一个客户端启动且仍在进行中,则如果另一个客户端调用 `Dem_ClearDTC`,Dem 应返回 `DEM_PENDING`。`(SRS_Diag_04065, SRS_Diag_04122)`
⌈[SWS_Dem_00670]⌋ 如果配置参数 `DemClearDTCLimitation` 设置为 `DEM_ONLY_CLEAR_ALL_DTCS`,则使用与 `DEM_DTC_GROUP_ALL_DTCS` 不同的所选 DTC 组调用 API `Dem_ClearDTC`,Dem 应返回 `DEM_WRONG_DTC`。`(SRS_Diag_04117)`
⌈[SWS_Dem_00570]⌋ 如果请求 Dem 模块清除诊断信息并且配置参数 `DemClearDTCBehavior` 设置为 `DEM_CLRRESP_VOLATILE`,则 Dem 模块应在易失性内存清除后返回 `E_OK`。`(SRS_Diag_04065, SRS_Diag_04194)`
⌈[SWS_Dem_00571]⌋ 如果请求 Dem 模块清除诊断信息并且配置参数 `DemClearDTCBehavior` 设置为 `DEM_CLRRESP_NONVOLATILE_TRIGGER`,则 Dem 模块应在易失性内存清除后返回 `E_OK`,并触发非易失性内存的清除。`(SRS_Diag_04065, SRS_Diag_04194)`
⌈[SWS_Dem_00572]⌋ 如果请求 Dem 模块清除诊断信息并且配置参数 `DemClearDTCBehavior` 设置为 `DEM_CLRRESP_NONVOLATILE_FINISH`,则 Dem 模块应在易失性内存和非易失性内存清除后返回 `E_OK`。`(SRS_Diag_04065, SRS_Diag_04194)`
注:Dem 实现负责持久数据的一致性。(参见 SWS_NvM_00698:在 NvM 处理作业时传递给 `NvM_WriteBlock` 的 RAM 缓冲区的内容可能不会更改)。如何确保数据一致性(UDS 状态字节、冻结帧数据和所有其他相关信息)是特定于实现的(取决于已实现的 NvM 策略)。选项包括但不限于其他 RAM 镜像和更改排队,直到 RAM 区域可以再次修改。
注:如果 Dcm 模块接收到 API `Dem_ClearDTC` 的返回类型 `DEM_CLEAR_OK`,则 Dcm 模块发送肯定响应(参见 [9])。
⌈[SWS_Dem_01057]⌋ 如果请求 Dem 模块清除诊断信息并且配置参数 `DemClearDTCBehavior` 设置为 `DEM_CLRRESP_NONVOLATILE_FINISH`,则如果非易失性内存的清除失败,Dem 模块应返回 `DEM_CLEAR_MEMORY_ERROR`。`(SRS_Diag_04065)`
⌈[SWS_Dem_01202]⌋ 失败的清除 DTC 操作的定义:如果请求 Dem 模块清除诊断信息,则 Dem 应在以下情况下返回 `DEM_CLEAR_FAILED`:
- 在清除单个 DTC 的情况下,至少一个分配给 DTC 的事件的 `DemClearEventAllowed` 回调返回 FALSE。
- 在清除 DTC 组或所有 DTC 的情况下,应按清除单个 DTC 的方式清除各个 DTC。如果清除所有单个 DTC 返回 `DEM_CLEAR_FAILED`,则结果的返回值应为 `DEM_CLEAR_FAILED`。
`(SRS_Diag_04150, SRS_Diag_04214)`
⌈[SWS_Dem_00573]⌋ 如果 `DemTriggerMonitorInitBeforeClearOk` 设置为 TRUE,则 `Dem_ClearDTC` 在事件初始化触发之前不应返回 `E_OK`(回调函数 `InitMonitorForEvent` 被调用)。如果 `DemTriggerMonitorInitBeforeClearOk` 设置为 FALSE,则 `DEM_CLEAR_OK` 不考虑事件初始化(`InitMonitorForEvent`)。`(SRS_Diag_04065, SRS_Diag_04194)`
此功能用于某些特殊事件,这些事件绝不能在特定状态下从事件内存中清除,例如 ECU 的特殊操作模式(例如装配、运输或闪存模式)或 Dcm 会话(可以使用 API `Dcm_GetSesCtrType` 确定)。
可以按事件配置(参见 `DemCallbackClearEventAllowed`),是否应通过此回调函数向 SW-C / BSW 模块询问事件删除允许。每个事件可以分配一个回调(表示特定条件)。如果多个条件适用,则需要由一个回调单独汇总。
⌈[SWS_Dem_00515]⌋ Dem 模块应在清除事件之前为每个配置的事件调用回调 `DemClearEventAllowed`。`(SRS_Diag_04191, SRS_Diag_04194)`
⌈[SWS_Dem_00667]⌋ 如果 DTC 未配置为使用事件合并,回调 `DemClearEventAllowed` 的输出参数 `Allowed` 返回 "false" 且返回值等于 `E_OK`,则 Dem 不应清除相应的事件内存条目和 Dem 内部数据值。`(SRS_Diag_04191, SRS_Diag_04194)`
⌈[SWS_Dem_01295]⌋ 如果 DTC 配置为使用事件合并,并且仅一个 `DemClearEventAllowed` 回调的输出参数 `Allowed` 设置为 FALSE 并返回 `E_OK`,则 Dem 不应清除事件状态、相应的事件内存条目和 Dem 内部数据值。`(SRS_Diag_04191, SRS_Diag_04194, SRS_Diag_04073)`
⌈[SWS_Dem_00668]⌋ 如果回调 `DemClearEventAllowed` 的输出参数 `Allowed` 返回 "false" 并且配置参数 `DemClearEventAllowedBehavior` 设置为 `DEM_NO_STATUS_BYTE_CHANGE`,则不应修改相关的 UDS 状态字节。`(SRS_Diag_04191, SRS_Diag_04194)`
⌈[SWS_Dem_00669]⌋ 如果回调 `DemClearEventAllowed` 的输出参数 `Allowed` 返回 "false" 并且配置参数 `DemClearEventAllowedBehavior` 设置为 `DEM_ONLY_THIS_CYCLE_AND_READINESS`,则相关的 UDS 状态位 1(TestFailedThisOperationCycle)、4(TestNotCompletedSinceLastClear)、5(TestFailedSinceLastClear)和 6(TestNotCompletedThisOperationCycle)应重置。`(SRS_Diag_04191, SRS_Diag_04194)`
⌈[SWS_Dem_01332]⌋ 如果根据 [SWS_Dem_00669] 部分清除事件,则依赖功能应按事件完全未清除的方式处理。这意味着回调函数 `InitMonitorForEvent` 不会被调用,并且 FDC 在这种情况下将保持不变。`(SRS_Diag_04191, SRS_Diag_04194)`
⌈[SWS_Dem_00516]⌋ 如果回调 `DemClearEventAllowed` 的返回值等于 `E_NOT_OK`,则返回值不应更改,并允许事件删除。`(SRS_Diag_04191, SRS_Diag_04194)`
Dem 支持未分配给任何事件内存的事件。这发生在 `DemEventParameter` 中未配置可选参数 `DemDTCRef` 的情况下。事件在分配给它们的事件内存被清除时被清除。如果没有分配的事件内存,则这些事件永远不会被清除。对于这种情况,Dem 提供配置参数 `DemClearEventsWithoutDTCEventMemoryRef`。
⌈[SWS_Dem_01249]⌋ 如果通过任何 `Dem_ClearDTC` API 清除由 `DemClearEventsWithoutDTCEventMemoryRef` 引用的事件内存,则 Dem 还应清除所有未分配给任何事件内存的事件。`c()`
注:事件位移(主要由事件优先级控制)和老化不受此回调的影响。
##### 7.7.2.3 事件内存溢出指示
⌈[SWS_Dem_00397]⌋ Dem 模块应为每个事件内存指示事件内存是否已满以及是否尝试在此事件内存中存储其他事件。`(SRS_Diag_04093)`
此溢出指示可用于触发 Dem 模块的进一步内部行为(例如位移策略)。此外,它可用于修理厂中的其他故障分析。
⌈[SWS_Dem_00398]⌋ Dem 模块应提供 API `Dem_GetEventMemoryOverflow` 以提供对相应事件内存的溢出指示状态的访问。`(SRS_Diag_04093)`
注:此 API 可用于供应商特定的诊断服务或其他供应商特定的处理,并提供给 SW-C 以及复杂设备驱动程序。
⌈[SWS_Dem_00651]⌋ Dem 模块应提供 API `Dem_GetNumberOfEventMemoryEntries` 以返回当前存储在事件内存中的事件内存条目数。`(SRS_Diag_04109)`
注:对于报告的数目,所有事件都独立于故障确认进行考虑。
⌈[SWS_Dem_00399]⌋ 如果此内存的所有 DTC 通过 `Dem_ClearDTC` 删除,则相应事件内存的事件内存溢出指示应重置。`(SRS_Diag_04093)`
注:在老化删除单个 DTC 的情况下,事件内存的溢出指示不会重置,以在 ECU 收到此特定事件内存的显式清除命令之前保持此状态信息。ECU 本身在正常运行期间不应更改此状态信息(因为它在修理厂中使用)。
##### 7.7.2.4 事件位移
事件位移意味着最不重要的已存在事件内存条目被需要存储的新事件内存条目替换。在位移期间,最不重要的条目丢失。
⌈[SWS_Dem_00400]⌋ 如果事件保留要分配新事件内存条目且没有可用的事件内存条目,则 Dem 模块应根据 [SWS_Dem_00406] 检查要被新事件内存条目替换的已分配事件内存条目。`(SRS_Diag_04118)`
注:如果事件内存大小配置为覆盖所有可能的事件,则不会发生位移。
⌈[SWS_Dem_00401]⌋ Dem 模块提供配置参数 `DemEventDisplacementStrategy`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),定义是否可以替换现有事件内存条目。`(SRS_Diag_04118)`
⌈[SWS_Dem_00402]⌋ 如果事件位移被禁用(`DemPrimaryMemory` 或 `DemUserDefinedMemory` 中的 `DemEventDisplacementStrategy` 选择 `DEM_DISPLACEMENT_NONE`),则 Dem 模块在事件内存已满时不应替换现有事件内存条目。`(SRS_Diag_04118)`
⌈[SWS_Dem_00406]⌋ 如果事件位移已启用(`DemPrimaryMemory` 或 `DemUserDefinedMemory` 中的 `DemEventDisplacementStrategy` 选择 `DEM_DISPLACEMENT_FULL` 或 `DEM_DISPLACEMENT_PRIO_OCC`),则 Dem 模块应通过组合不同的位移条件执行以下顺序(参见图 7.29):
1. 优先级(参见 [SWS_Dem_00403])
2. 活动/被动状态(可配置,仅适用于 `DemPrimaryMemory` 或 `DemUserDefinedMemory` 中的 `DEM_DISPLACEMENT_FULL`)(参见 [SWS_Dem_00404])
3. 发生次数(参见 [SWS_Dem_00405])
`(SRS_Diag_04118)`
注:燃油系统/失火需要优先于其他(US/EU5),A 类优先于 B1、B2、C(Euro VI)。
⌈[SWS_Dem_00403]⌋ 如果位移策略为 `DEM_DISPLACEMENT_FULL` 或 `DEM_DISPLACEMENT_PRIO_OCC`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则 Dem 模块应通过更高优先级的事件替换较低优先级的事件。`(SRS_Diag_04118)`
⌈[SWS_Dem_00404]⌋ 如果位移策略为 `DEM_DISPLACEMENT_FULL`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则 Dem 模块应优先替换被动事件(参见章节 7.7.1.4)。`(SRS_Diag_04118)`
⌈[SWS_Dem_00405]⌋ 如果位移策略为 `DEM_DISPLACEMENT_FULL` 或 `DEM_DISPLACEMENT_PRIO_OCC`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则 Dem 模块应按时间顺序优先替换较旧存储的事件而不是较新存储的事件(参见 [SWS_Dem_00412] 和 [SWS_Dem_00787])。`(SRS_Diag_04118)`
```text
Search entries with lowest
priority
Priority of reported
event > priority of
Yes found entries?
( 1 2 3 '
'.1' ' 0 ** (45
NO
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 1 2 3 4
5 4 3 2 1 0 9 8 7 6 5 4 3 2 1
2 %& 3 4 5 6 7 8 9 + %&
,-./
Found entries with
lowest priority left?
Yes
Priority of reported event
>= pririty of found entries
A
Yes
Search passive entries of
found entries
Passive memory No 5 6 7 8 9 /.(
event > priority of
entries found? 6 7 8 9
found entries?
No
Yes
Displace oldest found entry Yes
with reported event
Displace no entry
New event memory
Old event memory entry entry not possible
removed
Figure 7.29: Combined displacement criteria processing
```
⌈[SWS_Dem_00407]⌋ 如果没有识别出用于位移的事件内存条目,则 Dem 模块应丢弃存储请求。`(SRS_Diag_04118)`
⌈[SWS_Dem_00692]⌋ 如果报告了一个事件,并且存在具有相同优先级的事件内存条目,并且现有事件未在此操作循环中测试(TestNotCompletedThisOperationCycle 位 == 1),则 Dem 应用报告的事件替换现有事件。`(SRS_Diag_04118, SRS_Diag_04071)`
⌈[SWS_Dem_00693]⌋ 如果报告了一个事件,并且存在具有相同优先级的事件内存条目,并且现有事件已在此操作循环中测试(TestNotCompletedThisOperationCycle 位 == 0),则 Dem 应丢弃报告的事件。`(SRS_Diag_04178)`
⌈[SWS_Dem_00695]⌋ 如果配置参数 `DemOBDEventDisplacement` 设置为 TRUE,则具有以下条件的所有排放相关事件在位移机制期间不应考虑,并且不应从错误内存中替换:
- `Eventold` 是排放相关的
- AND
- (`Eventold` 触发 MIL 指示器
- OR(`Eventold` 持有法定冻结帧 AND 具有相等或更高优先级)
- OR Pending-DTC==1)
`(SRS_Diag_04195)`
⌈[SWS_Dem_00696]⌋ 如果配置参数 `DemOBDEventDisplacement` 设置为 FALSE,则 Dem 模块应处理位移而不使用 OBD 行为(参见图 7.29)。`(SRS_Diag_04195)`
⌈[SWS_Dem_00408]⌋ 如果识别出用于位移的事件内存条目,则 Dem 模块应从事件内存中删除此事件内存条目。`(SRS_Diag_04118)`
注:此已删除的事件内存条目现在应用于挂起的存储触发器。
⌈[SWS_Dem_00409]⌋ 如果在位移期间删除了事件内存条目,则 Dem 模块应将 UDS 状态位 2 和 UDS 状态位 3 重置为 0,如果配置参数 `DemResetConfirmedBitOnOverflow`(参见 `DemGeneral`)设置为 true。`(SRS_Diag_04067, SRS_Diag_04118)`
⌈[SWS_Dem_01186]⌋ 如果在位移期间删除了事件内存条目,则在 `DemStatusBitHandlingTestFailedSinceLastClear` 设置为 `DEM_STATUS_BIT_AGING_AND_DISPLACEMENT` 且 `DemResetConfirmedBitOnOverflow` 设置为 true 的情况下,UDS 状态位 5 应重置为 0。`(SRS_Diag_04067, SRS_Diag_04118)`
##### 7.7.2.5 事件内存条目的报告顺序
⌈[SWS_Dem_00410]⌋ Dem 模块应按事件存储的时间顺序报告 DTC(参见 API `Dem_GetNextFilteredDTC`),如果:
- DTCStatus 参数具有 "pending DTC" 或 "confirmed DTC" 位或两个位都设置
- DTCStatus 参数的所有其他位都设置为 false
- `DemResetConfirmedBitOnOverflow` 设置为 true
`(SRS_Diag_04195)`
注:时间顺序仅用于报告目的,并不意味着明确的内存结构,这是特定于实现的。
注:报告顺序可能因用于对 DTC 记录进行排序的算法的客户特定属性而异,以防未确认或挂起。如果其他 UDS 状态掩码参数需要时间顺序,则可能需要额外的资源。
⌈[SWS_Dem_00787]⌋ 如果"存储的事件"被重新限定为失败(UDS 状态位 0 从 0 变为 1)并且相应的事件内存条目存在,则 Dem 模块应通过将特定事件设置为最近的事件内存条目来更新事件存储的时间顺序。`(SRS_Diag_04195)`
⌈[SWS_Dem_00411]⌋ 如果请求 Dem 模块按时间顺序报告,则应首先报告最近的事件内存条目。`(SRS_Diag_04195)`
⌈[SWS_Dem_00412]⌋ 如果新事件存储在事件内存中,则 Dem 应通过将新事件设置为最近的事件内存条目来更新时间顺序。`(SRS_Diag_04195, SRS_Diag_04195)`
注:如果在同时点存储了多个事件内存条目,则这些元素的时间报告顺序是未定义的。这取决于实现,首先报告或替换这些条目中的哪一个。
#### 7.7.3 诊断事件的去抖
通常,ECU 可以实现几种类型的去抖以改善信号质量。本节描述 Dem 模块应如何实现用于故障成熟(诊断事件去抖)的基本算法。
如果 Dem 模块配置为实现特定事件的去抖算法,则应在 Dem 内部执行以下去抖算法之一。否则,在 SW-C 或 BSW 中实现的相应监视器将在完成诊断事件去抖后报告特定事件的状态。有关 Dem 与 SW-C 或 BSW 之间的交互,请参阅 API `InitMonitorForEvent`(参见章节 7.2)。
如果需要在特定时间内获取已通过或失败状态,则诊断监视器负责。
⌈[SWS_Dem_00413]⌋ Dem 模块应支持使用配置容器 `DemDebounceAlgorithmClass` 按事件配置去抖算法。`(SRS_Diag_04068)`
```text
DemDebounceAlgorithmClass: DemDebounceTimeBase:
EcucChoiceContainerDef +choice EcucParamConfContainerDef
lowerMultiplicity = 1 upperMultiplicity = 1
upperMultiplicity = 1 lowerMultiplicity = 0
DemEventParameter: DemDebounceCounterBased:
EcucParamConfContainerDef +subContainer EcucParamConfContainerDef
+choice
upperMultiplicity = 65535 upperMultiplicity = 1
lowerMultiplicity = 1 lowerMultiplicity = 0
DemDebounceMonitorInternal:
+choice EcucParamConfContainerDef
upperMultiplicity = 1
lowerMultiplicity = 0
Figure 7.30: Event-specific debounce algorithms
```
##### 7.7.3.1 基于计数器的去抖算法
⌈[SWS_Dem_00526]⌋ Dem 模块应提供配置参数 `DemDebounceCounterBasedSupport`(参见 `DemGeneral`)以启用或禁用 Dem 内部基于计数器的去抖。`(SRS_Diag_04068)`
⌈[SWS_Dem_00414]⌋ 如果配置容器 `DemDebounceAlgorithmClass` 设置为 `DemDebounceCounterBased`,则 Dem 模块应为每个单独的事件提供内部去抖计数器,以限定报告的事件。`(SRS_Diag_04068)`
对于较大的去抖范围,内部去抖计数器的最大范围定义为 sint16。这并不暗示任何明确的实现。
```text
DemDebounceAlgorithmClass:
EcucChoiceContainerDef
lowerMultiplicity = 1
upperMultiplicity = 1
+choice
DemDebounceCounterBased:
EcucParamConfContainerDef DemDebounceCounterBasedClassRef: DemDebounceCounterBasedClass:
+reference EcucReferenceDef +destination EcucParamConfContainerDef
upperMultiplicity = 1
lowerMultiplicity = 0 upperMultiplicity = 1 upperMultiplicity = 65535
lowerMultiplicity = 1 lowerMultiplicity = 0
Figure 7.31: Counter based debounce algorithm
```
⌈[SWS_Dem_00415]⌋ Dem 模块应根据内部去抖计数的值和范围计算故障检测计数器(根据 UDS 为 -128 ... +127),以将内部计数值线性映射到外部值。`(SRS_Diag_04010)`
⌈[SWS_Dem_00416]⌋ Dem 模块应提供配置参数 `DemDebounceCounterFailedThreshold` 用于定义指示失败状态(活动)的事件特定限制。`(SRS_Diag_04068)`
⌈[SWS_Dem_00417]⌋ Dem 模块应提供配置参数 `DemDebounceCounterPassedThreshold` 用于定义指示已通过状态(被动)的事件特定限制。`(SRS_Diag_04010, SRS_Diag_04068)`
⌈[SWS_Dem_00418]⌋ 当监视器报告 `DEM_EVENT_STATUS_PREFAILED` 时,Dem 模块应使用其配置的步长(参见 `DemDebounceCounterIncrementStepSize`)递增内部去抖计数器。`(SRS_Diag_04068)`
⌈[SWS_Dem_00419]⌋ 当监视器报告 `DEM_EVENT_STATUS_PREPASSED` 时,Dem 模块应使用其配置的步长(参见 `DemDebounceCounterDecrementStepSize`)递减内部去抖计数器。`(SRS_Diag_04068)`
⌈[SWS_Dem_00420]⌋ 如果监视器报告 `DEM_EVENT_STATUS_FAILED`,则 Dem 模块应将内部去抖计数值设置为其配置的作为失败标准的阈值。`(SRS_Diag_04068)`
⌈[SWS_Dem_00421]⌋ 如果监视器报告 `DEM_EVENT_STATUS_PASSED`,则 Dem 模块应将内部去抖计数值设置为其配置的作为通过标准的阈值。`(SRS_Diag_04067, SRS_Diag_04068)`
⌈[SWS_Dem_00422]⌋ Dem 模块应提供配置参数 `DemDebounceCounterJumpDown` 用于启用 jump-down 行为。`(SRS_Diag_04068)`
⌈[SWS_Dem_00423]⌋ 如果启用了 jump-down 行为,则 Dem 模块应提供配置参数 `DemDebounceCounterJumpDownValue` 定义新的内部去抖计数器初始值。当当前去抖计数值大于 `DemDebounceCounterJumpDownValue` 时,每次报告 pre-passed 值应首先将去抖计数器重置为 `DemDebounceCounterJumpDownValue`,然后执行 pre-passed 去抖事件([SWS_Dem_00419])。`(SRS_Diag_04068)`
注:这仅在计数方向从递增变为递减时发生。
⌈[SWS_Dem_00424]⌋ Dem 模块应提供配置参数 `DemDebounceCounterJumpUp` 用于启用 jump-up 行为。`(SRS_Diag_04068)`
⌈[SWS_Dem_00425]⌋ 如果启用了 jump-up 行为,则 Dem 模块应提供配置参数 `DemDebounceCounterJumpUpValue` 定义新的内部去抖计数器初始值。当当前去抖计数值小于 `DemDebounceCounterJumpUpValue` 时,每次报告 pre-failed 值应首先将去抖计数器重置为 `DemDebounceCounterJumpUpValue`,然后执行 pre-failed 去抖事件([SWS_Dem_00418])。`(SRS_Diag_04068)`
注:这仅在计数方向从递减变为递增时发生。
```text
FAILED
jump up jump up
PREFAILED
Reports
PREPASSED
jump down don't jump jump down
PASSED
FDC max
Failed
step up
Fault
0
Detection
Counter jump down value
step down
jump up value
Passed FDC min
Failed
Event
status
Passed
t
Figure 7.32: Example of counter based debouncing (including jump behaviour)
```
注:在图 7.32 中,故障检测计数器的值线性映射到内部去抖计数器值。
API `Dem_ResetEventDebounceStatus` 的动作 `DEM_DEBOUNCE_STATUS_FREEZE` 与基于计数器的去抖无关。`Dem_ResetEventDebounceStatus` 的动作 `DEM_DEBOUNCE_STATUS_RESET` 由 [SWS_Dem_00684] 涵盖。
`DemDebounceBehavior DEM_DEBOUNCE_STATUS_FREEZE` 在章节 7.7.6 中涵盖。`DemDebounceBehavior DEM_DEBOUNCE_RESET` 由 [SWS_Dem_00654] 和 [SWS_Dem_00677] 涵盖。这如图 7.33 所示。
```text
DemDebounceBehavior = FREEZE
FAILED /
PASSED
PREFAILED /
PREPASSED
Reports
Failed / FDC max/min (+127/-128)
Passed
Enable Condition(s) not fulfilled OR
Fault ControlDTCSetting disabled
0
Detection
Counter
t
DemDebounceBehavior = RESET
FAILED /
PASSED
PREFAILED /
PREPASSED
Reports
Failed / FDC max/min (+127/-128)
Passed
Enable Condition(s) not fulfilled OR
Fault ControlDTCSetting disabled
0
Detection
Counter
t
Figure 7.33: Counter based debouncing behavior on enable conditions
```
⌈[SWS_Dem_00674]⌋ 如果配置参数 `DemDebounceCounterStorage` 设置为 True,则 Dem 模块应非易失性存储内部去抖计数器的当前值(参见 [SWS_Dem_00341])。`(SRS_Diag_04124)`
注:不支持基于时间的去抖的 `DemDebounceCounterStorage`。
⌈[SWS_Dem_00675]⌋ 如果配置参数 `DemDebounceCounterStorage` 设置为 True,则 Dem 模块应在每次启动期间重新存储内部去抖计数器的当前值(最迟在 `Dem_Init` 中)。`(SRS_Diag_04124)`
注:使用内部去抖计数器非易失性存储的 BSW 事件不能在 `Dem_Init` 之前报告,因为该值需要首先恢复。
⌈[SWS_Dem_00676]⌋ 如果开发错误检测已启用,并且为将 `DemDebounceCounterStorage` 设置为 True 的事件在 `Dem_Init` 之前或 `Dem_Shutdown` 之后调用 `Dem_SetEventStatus` 或 `Dem_ResetEventDebounceStatus`,则 Dem 模块应设置错误代码 `DEM_E_WRONG_CONDITION`。`(SRS_Diag_04124)`
⌈[SWS_Dem_CONSTR_06151]⌋ `DemCounterBasedFdcThresholdStorageValue` 的依赖性:配置参数 `DemCounterBasedFdcThresholdStorageValue` 仅在 `DemFreezeFrameRecordTrigger` 设置为 `DEM_TRIGGER_ON_FDC_THRESHOLD` 或 `DemExtendedDataRecordTrigger` 设置为 `DEM_TRIGGER_ON_FDC_THRESHOLD` 或 `DemEventMemoryEntryStorageTrigger` 设置为 `DEM_TRIGGER_ON_FDC_THRESHOLD` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06152]⌋ `DemDebounceCounterJumpDownValue` 的依赖性:`DemDebounceCounterJumpDownValue` 仅在 `DemDebounceCounterJumpDown` 设置为 TRUE 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06153]⌋ `DemDebounceCounterJumpUpValue` 的依赖性:`DemDebounceCounterJumpUpValue` 仅在 `DemDebounceCounterJumpUp` 设置为 TRUE 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06154]⌋ `DemDebounceCounterStorage` 的依赖性:`DemDebounceCounterStorage` 仅在 `DemOperationCycleStatusStorage` 设置为 TRUE 时才应存在。`c()`
##### 7.7.3.2 基于时间的去抖算法
⌈[SWS_Dem_00527]⌋ Dem 模块应提供配置参数 `DemDebounceTimeBasedSupport`(参见 `DemGeneral`)以启用或禁用 Dem 内部基于时间的去抖。`(SRS_Diag_04068)`
⌈[SWS_Dem_00426]⌋ 如果配置容器 `DemDebounceAlgorithmClass` 设置为 `DemDebounceTimeBased`,则 Dem 模块应为每个单独的事件提供内部去抖计时器,以限定报告的事件。`(SRS_Diag_04068)`
对于较长的去抖周期,内部去抖计时器的最大范围定义为 sint16。这并不暗示任何明确的实现。
```text
DemDebounceAlgorithmClass:
EcucChoiceContainerDef
lowerMultiplicity = 1
upperMultiplicity = 1
+choice
DemDebounceTimeBase: DemDebounceTimeBaseClass:
DemDebounceTimeBaseClass:
EcucParamConfContainerDef
DemDebounceTimeBaseRef: EcucParamConfContainerDef
upperMultiplicity = 1 +reference EcucReferenceDef +destination
upperMultiplicity = 65535
lowerMultiplicity = 0
upperMultiplicity = 1 lowerMultiplicity = 0
lowerMultiplicity = 1
Figure 7.34: Time based debounce algorithm
```
⌈[SWS_Dem_00427]⌋ Dem 模块应根据内部去抖计时器的值和范围计算故障检测计数器(根据 UDS 为 -128 ... +127),以将内部计时器值线性映射到外部值(参见图 7.35)。`(SRS_Diag_04068)`
⌈[SWS_Dem_00428]⌋ Dem 模块应在监视器报告 `DEM_EVENT_STATUS_PREFAILED` 时启动内部去抖计时器以将报告的事件限定为失败。`(SRS_Diag_04068)`
⌈[SWS_Dem_00429]⌋ 如果特定事件的内部去抖计时器已触发为 pre-failed 或事件被限定为失败,并且监视器再次连续报告 `DEM_EVENT_STATUS_PREFAILED`,则 Dem 模块不应重新启动内部去抖计时器。`(SRS_Diag_04068)`
注:Dem 模块提供配置参数 `DemDebounceTimeFailedThreshold` 用于定义指示失败状态(活动)的事件特定延迟。
⌈[SWS_Dem_00431]⌋ 如果监视器报告 `DEM_EVENT_STATUS_FAILED`,则 Dem 模块应将内部去抖计时器值设置为其配置的作为失败标准的阈值(参见 `DemDebounceTimeFailedThreshold`)。`(SRS_Diag_04067, SRS_Diag_04068)`
⌈[SWS_Dem_00432]⌋ Dem 模块应在监视器报告 `DEM_EVENT_STATUS_PREPASSED` 时启动内部去抖计时器以将报告的事件限定为通过。`(SRS_Diag_04068)`
⌈[SWS_Dem_00433]⌋ 如果特定事件的内部去抖计时器已触发为 pre-passed 或事件被限定为通过,并且监视器再次连续报告 `DEM_EVENT_STATUS_PREPASSED`,则 Dem 模块不应重新启动内部去抖计时器。`(SRS_Diag_04068)`
⌈[SWS_Dem_00434]⌋ Dem 模块应提供配置参数 `DemDebounceTimePassedThreshold` 用于定义指示通过状态(非活动)的事件特定延迟。`(SRS_Diag_04068)`
⌈[SWS_Dem_00435]⌋ 如果监视器报告 `DEM_EVENT_STATUS_PASSED`,则 Dem 模块应将内部去抖计时器值设置为其配置的作为通过标准的阈值(参见 `DemDebounceTimePassedThreshold`)。`(SRS_Diag_04068)`
```text
FAILED
PREFAILED
Reports
PREPASSED
PASSED
FDC max (+127)
Failed
Fault
0
Detection
Counter
Passed FDC min (-128)
t failed t passed t failed t failed t failed
t passed
Failed
Event
status
Passed
t
Figure 7.35: Example of time based debouncing
```
⌈[SWS_Dem_00685]⌋ 如果使用 `DEM_DEBOUNCE_STATUS_FREEZE` 调用 API `Dem_ResetEventDebounceStatus`,则它应冻结相关的内部去抖计时器。`(SRS_Diag_04068)`
`Dem_ResetEventDebounceStatus` 的动作 `DEM_DEBOUNCE_STATUS_RESET` 由 [SWS_Dem_00684] 涵盖。
⌈[SWS_Dem_00655]⌋ 如果配置参数 `DemDebounceBehavior` 设置为 `DEM_DEBOUNCE_STATUS_FREEZE`,则 Dem 模块应在相关事件的至少一个启用条件设置为未满足时冻结内部去抖计时器。`(SRS_Diag_04125)`
⌈[SWS_Dem_00678]⌋ 如果配置参数 `DemDebounceBehavior` 设置为 `DEM_DEBOUNCE_STATUS_FREEZE`,则 Dem 模块应在相关事件的 ControlDTCSetting 设置为禁用时冻结内部去抖计时器。`(SRS_Diag_04125)`
⌈[SWS_Dem_00656]⌋ 如果内部去抖计时器被冻结并且为此事件报告了新的(有效)(去抖)结果(根据 [SWS_Dem_00428] / [SWS_Dem_00432]),则 Dem 模块应继续运行内部去抖计时器(从当前值)。`(SRS_Diag_04125)`
`DemDebounceBehavior DEM_DEBOUNCE_RESET` 由 [SWS_Dem_00654] 和 [SWS_Dem_00677] 涵盖。
```text
DemDebounceBehavior = FREEZE
FAILED /
PASSED
PREFAILED /
PREPASSED
Reports
Failed / FDC max/min (+127/-128)
Passed
Enable Condition(s) not fulfilled OR
Fault ControlDTCSetting disabled
0
Detection
Counter
t
DemDebounceBehavior = RESET
FAILED /
PASSED
PREFAILED /
PREPASSED
Reports
Failed / FDC max/min (+127/-128)
Passed
Enable Condition(s) not fulfilled OR
Fault ControlDTCSetting disabled
0
Detection
Counter
t
Figure 7.36: Time based debouncing behavior on enable conditions
```
##### 7.7.3.3 监视器内部去抖算法
⌈[SWS_Dem_00437]⌋ 如果配置容器 `DemDebounceAlgorithmClass` 设置为 `DemDebounceMonitorInternal`,则 Dem 模块不应为每个单独的事件使用 Dem 内部去抖机制来限定报告的事件。`(SRS_Diag_04068)`
注:监视器不允许为监视器内部去抖报告事件状态 `DEM_EVENT_STATUS_PREFAILED` 和 `DEM_EVENT_STATUS_PREPASSED`。
```text
DemDebounceAlgorithmClass: DemDebounceMonitorInternal: DemCallbackGetFDC:
EcucChoiceContainerDef +choice EcucParamConfContainerDef +subContainer EcucParamConfContainerDef
lowerMultiplicity = 1 upperMultiplicity = 1 lowerMultiplicity = 0
upperMultiplicity = 1 lowerMultiplicity = 0 upperMultiplicity = 1
+parameter
DemCallbackGetFDCFnc:
EcucFunctionNameDef
lowerMultiplicity = 0
upperMultiplicity = 1
Figure 7.37: Monitor internal debounce algorithm
```
##### 7.7.3.4 去抖算法初始化和重置条件
⌈[SWS_Dem_00438]⌋ 如果配置了 Dem 内部去抖,则 Dem 模块应在调用 `Dem_PreInit` 时重置 Dem 内部去抖算法。`(SRS_Diag_04068)`
⌈[SWS_Dem_00343]⌋ 在接收到清除事件内存的命令(参见章节 7.7.2.2)之后,应重置 Dem 内部去抖算法,假设事件去抖由 Dem 内部处理。`(SRS_Diag_04117, SRS_Diag_04068)`
⌈[SWS_Dem_00684]⌋ 如果使用 `DEM_DEBOUNCE_STATUS_RESET` 调用 API `Dem_ResetEventDebounceStatus`,则它应重置相关的故障检测计数器。`(SRS_Diag_04068)`
注:内部去抖计数器重置为零。内部去抖计时器的重置也将停止此计时器。
⌈[SWS_Dem_00344]⌋ 如果配置了 Dem 内部去抖,则 Dem 模块应在启动新操作循环时重置 Dem 内部去抖算法(参见章节 7.6)。`(SRS_Diag_04068)`
注:重置去抖算法也将导致故障检测计数器值为 0(零)。
⌈[SWS_Dem_00654]⌋ 如果配置参数 `DemDebounceBehavior` 设置为 `DEM_DEBOUNCE_RESET` 且函数 `Dem_SetEnableCondition`(参见章节 7.7.6)将事件的已配置启用条件之一设置为未满足,则它应重置相关的故障检测计数器。`(SRS_Diag_04125)`
⌈[SWS_Dem_00677]⌋ 如果配置参数 `DemDebounceBehavior` 设置为 `DEM_DEBOUNCE_RESET`,则函数 `Dem_DisableDTCSetting`(参见章节 7.11.2.6)应重置相关的故障检测计数器。`(SRS_Diag_04125)`
##### 7.7.3.5 故障检测计数器检索
⌈[SWS_Dem_00204]⌋ 事件特定的故障检测计数器应可通过使用 API `Dem_GetFaultDetectionCounter` 进行访问。`(SRS_Diag_04068, SRS_Diag_04010)`
故障检测计数器可以是:
1. 位于 Dem 内部,如果配置了 Dem 内部去抖(参见章节 7.7.3.1 和章节 7.7.3.2)。
2. 位于监视器内部,如果由监视器执行去抖(参见 [SWS_Dem_00264]、[SWS_Dem_00439]、[SWS_Dem_00513])。
⌈[SWS_Dem_00264]⌋ 如果去抖由 SW-C 执行(非 Dem 内部处理),则 Dem 模块应通过使用 `DemCallbackGetFDC` 容器中定义的方法检索所请求事件的故障检测计数器的当前值。`(SRS_Diag_04068, SRS_Diag_04010)`
注:配置容器 `DemCallbackGetFDC`(在 `DemDebounceMonitorInternal` 中)用于指定每个事件的相关端口或 c-callback。
⌈[SWS_Dem_00439]⌋ 如果使用监视器内部去抖且配置了容器 `DemCallbackGetFDC` 且配置的回调函数返回除 `E_OK` 之外的值,则此返回值也应由 API `Dem_GetFaultDetectionCounter` 返回。`(SRS_Diag_04068, SRS_Diag_04010)`
注:要重置监视器中实现的故障检测计数器,Dem 模块使用回调函数 `InitMonitorForEvent`(参见章节 7.2)。
⌈[SWS_Dem_00671]⌋ 如果使用监视器内部去抖且未为给定事件配置容器 `DemCallbackGetFDC`,则 API `Dem_GetFaultDetectionCounter` 应返回 `DEM_E_NO_FDC_AVAILABLE`。`(SRS_Diag_04010)`
##### 7.7.3.6 故障检测计数器报告
DTC 故障检测计数器在当前操作循环期间已达到的最大值。
⌈[SWS_Dem_00788]⌋ 如果当前操作循环期间的最大 FDC 映射到扩展数据记录(`DemInternalDataElement` 设置为 `DEM_MAX_FDC_DURING_CURRENT_CYCLE`),则它应对引用 UDS DTC 的所有事件可用。`(SRS_Diag_04125)`
⌈[SWS_Dem_00789]⌋ 如果 [SWS_Dem_00788] 的 UDS DTC 由多个事件或合并 DTC 引用,则应使用具有最高最大 FDC 值的事件进行报告。`(SRS_Diag_04125)`
⌈[SWS_Dem_00790]⌋ 当前操作循环期间的最大 FDC 应在每次重启操作循环时重置为零(参见 `DemOperationCycleRef`)。`(SRS_Diag_04125)`
⌈[SWS_Dem_00791]⌋ 如果当前故障检测计数器值大于当前操作循环期间的最大 FDC 的当前值,则当前操作循环期间的最大 FDC 应更新。`(SRS_Diag_04125)`
自上次清除 DTC 信息以来 DTC 故障检测计数器已达到的最大值。
⌈[SWS_Dem_00792]⌋ 如果自上次清除以来的最大 FDC 映射到扩展数据记录(`DemInternalDataElement` 设置为 `DEM_MAX_FDC_SINCE_LAST_CLEAR`),则它应对引用 UDS DTC 的所有事件可用。`(SRS_Diag_04125)`
⌈[SWS_Dem_00793]⌋ 如果 [SWS_Dem_00792] 的 UDS DTC 由多个事件或合并 DTC 引用,则应使用具有最高最大 FDC 值的事件进行报告。`(SRS_Diag_04125)`
⌈[SWS_Dem_00794]⌋ 自上次清除以来的最大 FDC 应在每次影响此特定事件的 clear DTC 命令时重置为零。`(SRS_Diag_04125)`
⌈[SWS_Dem_00795]⌋ 如果当前故障检测计数器值大于自上次清除以来的最大 FDC 的当前值,则自上次清除以来的最大 FDC 应更新。`(SRS_Diag_04125)`
#### 7.7.4 故障确认
在报告故障并输入挂起状态后,故障确认过程在 Dem 内开始(参见图 7.27 一般诊断事件存储处理)。
此故障确认过程导致已确认状态。为此,指定了相应的计数器阈值和计数器类型。
⌈[SWS_Dem_00528]⌋ Dem 模块应为每个事件提供配置参数 `DemEventConfirmationThreshold`,定义在事件变为"已确认"(即进入已确认状态)之前测试和失败循环的最大数量。`c()`
⌈[SWS_Dem_00529]⌋ 配置参数 `DemOperationCycleRef`(参见 `DemEventParameter`)应用于根据 ISO14229-1 [2] 计算 trip counter(参见图 7.20)。`(SRS_Diag_04067)`
愈合确认过程(在章节 7.7.8 中描述)处理报告的 OK/已通过结果,这导致特定警告指示器的停用。为此,指定了相应的计数器阈值和计数器类型。
注:如果事件的故障确认被禁用,则其 UDS 状态位 3 在限定为失败期间被设置(根据 [SWS_Dem_00391])。
⌈[SWS_Dem_01242]⌋ Dem 应支持在 `Dem_PreInit` 之后调用 `Dem_SetEventFailureCycleCounterThreshold`。`(SRS_Diag_04161)`
⌈[SWS_Dem_01243]⌋ API `Dem_SetEventFailureCycleCounterThreshold` 的调用应设置新的故障确认阈值。`(SRS_Diag_04161)`
注:新的故障确认阈值将覆盖由 `DemEventConfirmationThreshold` 给出的默认值。
⌈[SWS_Dem_01244]⌋ 如果调用 `Dem_SetEventFailureCycleCounterThreshold` 且相应的事件已存储在事件内存中且新的故障阈值小于或等于当前故障计数器,则事件将被确认。这意味着事件相关数据也将根据其定义的触发器更新。`(SRS_Diag_04161)`
⌈[SWS_Dem_01245]⌋ 如果调用 `Dem_SetEventFailureCycleCounterThreshold` 且相应的事件已存储在事件内存中且已确认,则事件内存条目和确认状态将保持不变,即使新的阈值大于故障计数器。在新的错误状态报告之后,确认状态也将保持。`(SRS_Diag_04161)`
⌈[SWS_Dem_01246]⌋ 配置了 `DemMILIndicatorRef` 的 `DemIndicatorAttribute` 应使用 `DemEventConfirmationThreshold` 而不是 `DemIndicatorFailureCycleCounterThreshold` 来计算指示器 On 标准(`WarningIndicatorOnCriteriaFulfilled`)。`(SRS_Diag_04161)`
##### 7.7.4.1 用于 OBD 目的的事件关联分组方法
⌈[SWS_Dem_00965]⌋ Dem 模块应为每个事件提供配置参数 `DemOBDGroupingAssociativeEventsRef`,以引用一个事件到一个关联事件组的代表事件。`(SRS_Diag_04001)`
注:一个事件仅允许被引用到一个关联事件组。引用的事件必须引用自身。
⌈[SWS_Dem_00967]⌋ 对于一组事件中故障的每次报告,Dem 应通过处理公共循环计数器或通过计数引用计数器值"最接近 MIL ON"的事件的相应计数器来使循环计数器前进到 MIL 激活。`(SRS_Diag_04069)`
⌈[SWS_Dem_00968]⌋ 每个事件的愈合/老化应单独执行。`(SRS_Diag_04178)`
#### 7.7.5 事件合并
事件合并定义了 Dem 模块将多个事件合并到一个 DTC 的能力。它用于将不同监视器结果适配为一个可在服务站明确评估的重要故障。实现合并 DTC 的重要部分是计算其状态信息。合并 DTC 状态字节来自所有关联事件的按位逻辑运算。
⌈[SWS_Dem_00536]⌋ 支持以下事件合并类型:
1. **存储时合并**:配置参数 `DemEventCombinationSupport` 设置为 `DEM_EVCOMB_ONSTORAGE`。合并 DTC 存储在单个事件内存条目中并更新。
2. **检索时合并**:配置参数 `DemEventCombinationSupport` 设置为 `DEM_EVCOMB_ONRETRIEVAL`。每个事件存储在单独的事件内存位置。
3. **禁用**:配置参数 `DemEventCombinationSupport` 设置为 `DEM_EVCOMB_DISABLED` 且不使用事件合并
`(SRS_Diag_04073)`
⌈[SWS_Dem_00024]⌋ 如果 `DemEventCombinationSupport` 设置为 `DEM_EVCOMB_ONRETRIEVAL` 或 `DEM_EVCOMB_ONSTORAGE`,则多个事件到 DTC 的合并由从每个事件引用同一 DTC 来定义。`(SRS_Diag_04073)`
注:对于 OBD,也可以通过 `DemObdDTCRef` 多次分配相同的 DTC 编号。但与 UDS 和 J1939 DTC 不同,OBD DTC 会多次报告给 Dcm。
基于事件相关数据的配置,Dem 模块允许两种不同类型的事件合并(将事件相关数据分配给合并事件/DTC 或子事件)。
注:事件合并的主要用例是将多个事件(由 EventId 表示)映射到仅一个 DTC 编号。如果使用"存储时合并",则 Dem 模块对合并到 DTC 的所有事件仅使用一个事件内存条目及其相关数据。如果使用检索时合并,则每个事件存储在单独的事件内存位置中,并具有其自己的事件相关数据集。
Dem 模块考虑合并 DTC 的相关事件内存条目。
表 7.1 显示了包括合并 DTC 的 Dem 配置表示例。多个事件映射到同一 DTC。DTC[1] 表示存储时合并。DTC[2] 显示了检索时合并的示例。冻结帧数据为每个事件单独存储。
| 唯一 EventId | 监视器状态 | UDS 状态 | 分配的 DTC | 冻结帧 |
|---|---|---|---|---|
| Event[1] | S1 | S1\|S2\|S3 | DTC[1] | FF[28] |
| Event[2] | S2 | S1\|S2\|S3 | DTC[1] | FF[28] |
| Event[3] | S3 | S1\|S2\|S3 | DTC[1] | FF[28] |
| Event[4] | S4 | S4\|S5\|S6 | DTC[2] | FF[74] |
| Event[5] | S5 | S4\|S5\|S6 | DTC[2] | FF[77] |
| Event[6] | S6 | S4\|S5\|S6 | DTC[2] | FF[75] |
| Event[7] | S7 | S7 | DTC[3] | FF[89] |
| Event[8] | S8 | S8 | DTC[4] | FF[67] |
| .... | .... | .... | .... | .... |
**表 7.1:包括合并 DTC 的 Dem 配置表示例**
⌈[SWS_Dem_00441]⌋ Dem 模块应根据表 7.2 实现 UDS 状态字节的状态位计算。`(SRS_Diag_04073)`
| UDS 状态位描述 | 合并 UDS 状态信息逻辑等式 |
|---|---|
| 0 TestFailed | `CbDTCBit0 = Event[1]Bit0 \| Event[2]Bit0 \| ... \| Event[n]Bit0` |
| 1 TestFailedThisOperationCycle | `CbDTCBit1 = Event[1]Bit1 \| Event[2]Bit1 \| ... \| Event[n]Bit1` |
| 2 PendingDTC | `CbDTCBit2 = Event[1]Bit2 \| Event[2]Bit2 \| ... \| Event[n]Bit2` |
| 3 ConfirmedDTC | `CbDTCBit3 = Event[1]Bit3 \| Event[2]Bit3 \| ... \| Event[n]Bit3` |
| 4 TestNotCompletedSinceLastClear | `CbDTCBit4 = (Event[1]Bit4 \| Event[2]Bit4 \| ... \| Event[n]Bit4) & !CbDTCBit5` |
| 5 TestFailedSinceLastClear | `CbDTCBit5 = Event[1]Bit5 \| Event[2]Bit5 \| ... \| Event[n]Bit5` |
| 6 TestNotCompletedThisOperationCycle | `CbDTCBit6 = (Event[1]Bit6 \| Event[2]Bit6 \| ... \| Event[n]Bit6) & !CbDTCBit1` |
| 7 WarningIndicatorRequested | `CbDTCBit7 = Event[1]Bit7 \| Event[2]Bit7 \| ... \| Event[n]Bit7` |
**表 7.2:UDS 状态字节的计算**
在上表中,使用以下逻辑运算符:
- `!` = 逻辑否定(NOT)
- `|` = 逻辑按位 OR 运算
- `&` = 逻辑按位 AND 运算
⌈[SWS_Dem_00440]⌋ 如果请求 Dem 模块清除合并 DTC(参见 `Dem_ClearDTC`),则 Dem 模块应清除所有相关事件(参见 [SWS_Dem_01049] 和 [SWS_Dem_01050])。`(SRS_Diag_04073)`
⌈[SWS_Dem_01049]⌋ 如果请求 Dem 模块报告合并 DTC 的状态(例如 `Dem_GetStatusOfDTC` 或 `Dem_GetNextFilteredDTC`),则应根据 [SWS_Dem_00441] 执行状态字节的计算。`c()`
⌈[SWS_Dem_01050]⌋ 每次更新事件状态时,都应计算合并 DTC 状态。如果合并 DTC 状态已更改,则应调用相关回调;参见 [SWS_Dem_00284]、[SWS_Dem_00986]、[SWS_Dem_00987] 和 [SWS_Dem_00828]。`(SRS_Diag_04073)`
⌈[SWS_Dem_00672]⌋ 合并 DTC 的故障检测计数器应为子事件的最大故障检测计数器值。`(SRS_Diag_04073)`
注:合并故障检测计数器值是 `Dem_GetNextFilteredDTCAndFDC`(在 UDS 服务 0x19 14 中)所需的。
⌈[SWS_Dem_CONSTR_6103]⌋ 如果事件合并被禁用,则不允许从多个事件引用同一 dtc。`c()`
##### 7.7.5.1 存储时合并
以下部分描述在配置了存储时合并时 Dem 模块的行为。
⌈[SWS_Dem_00163]⌋ 如果请求 Dem 模块支持存储时合并,则合并 DTC 的 DTC 状态位转换(参见 [SWS_Dem_00441])应用作事件内存条目分配的触发源,以及其相关数据(冻结帧或扩展数据记录)的收集或更新。`(SRS_Diag_04073)`
⌈[SWS_Dem_01051]⌋ 对于存储时合并,分配(或重新分配)事件内存条目的事件应为唯一具有确认位设置的事件。`(SRS_Diag_04073)`
⌈[SWS_Dem_01052]⌋ 对于存储时合并,由于 [SWS_Dem_01051] 而无法设置确认位的事件仍应根据 [SWS_Dem_00501] 生成 warningIndicatorOnCriteria。`(SRS_Diag_04073)`
⌈[SWS_Dem_01053]⌋ 如果请求 Dem 模块支持存储时合并,则应根据合并 DTC 状态(参见 [SWS_Dem_00408])计算老化。`(SRS_Diag_04073)`
⌈[SWS_Dem_00442]⌋ 如果合并 DTC(存储时合并)已老化,则 Dem 模块应删除此事件内存条目并根据 [SWS_Dem_00823]、[SWS_Dem_00824] 和 [SWS_Dem_00498] 重置所有子事件的状态字节。`(SRS_Diag_04073, SRS_Diag_04133)`
⌈[SWS_Dem_00443]⌋ 如果合并 DTC(存储时合并)被替换,则 Dem 模块应删除此事件内存条目并根据 [SWS_Dem_00409] 和 [SWS_Dem_01186] 重置所有子事件的状态字节。`(SRS_Diag_04118)`
##### 7.7.5.2 检索时合并
下面的部分描述了检索时合并的行为。
⌈[SWS_Dem_00539]⌋ 如果请求 Dem 模块支持检索时合并,则每个事件的状态位转换应触发相关数据(冻结帧/扩展数据)的收集、更新和存储。`(SRS_Diag_04073, SRS_Diag_04067)`
⌈[SWS_Dem_00540]⌋ 如果请求 Dem 模块报告合并 DTC 的数据(检索时合并),则 Dem 模块应返回所有分配事件的事件相关数据。`(SRS_Diag_04073)`
⌈[SWS_Dem_00541]⌋ 应根据 [SWS_Dem_00493] 和 [SWS_Dem_00498] 单独处理合并 DTC(检索时合并)的每个事件的老化。`(SRS_Diag_04073)`
⌈[SWS_Dem_00542]⌋ 对于检索时合并,合并 DTC 的每个事件的位移算法应单独处理(参见 [SWS_Dem_00408])。`(SRS_Diag_04073)`
#### 7.7.6 诊断事件的启用和存储条件
在某些情况下,事件保留取决于操作系统级别的参数。这些参数被组合成组并定义了一定数量的检查(例如正确的电压范围),然后事件报告被接受或事件被限定。检查由软件组件完成。Dem 模块提供在事件处理期间考虑报告结果的能力(满足或未满足特定条件)。有两种不同类型的条件:启用条件和存储条件。
使用条件的策略(例如后续故障的抑制)以及特别是条件到事件的分配矩阵取决于 OEM。
启用条件被定义为一组参数,分配给特定条件。只要此条件未满足,事件报告(参见 `Dem_SetEventStatus`)就无效,因此不会被接受。它对 `Dem_ResetEventDebounceStatus`、`Dem_ResetEventStatus` 和 `Dem_ClearDTC` 没有影响。类似的功能用于功能抑制。与基于事件的 FiM 互斥矩阵相反,启用条件基于系统参数(例如点火状态、本地电压)。
存储条件被定义为一组参数,分配给特定条件。只要此条件未满足,Dem 模块就不会将事件存储到事件内存中。
以下需求介绍了启用条件的处理。
⌈[SWS_Dem_00202]⌋ 如果请求 Dem 模块支持启用条件,则 Dem 模块应提供 API `Dem_SetEnableCondition`,接收特定启用条件的当前状态(条件已满足或未满足)。`(SRS_Diag_04192)`
⌈[SWS_Dem_00446]⌋ 如果请求 Dem 模块支持启用条件,则 Dem 模块应提供将一个启用条件组(参见 `DemEnableConditionGroup`)分配给特定事件的能力,该组包括一个或多个启用条件(参见 `DemEnableCondition`)。`(SRS_Diag_04192)`
注:引入启用条件组以改进 Dem 模块的配置方法。如果大量事件始终依赖于相同的启用条件,则选择已定义的启用条件组之一比为每个事件分配多个启用条件工作量更少。
⌈[SWS_Dem_00447]⌋ 如果请求 Dem 模块支持启用条件,则 Dem 模块应在诊断监视器报告事件(已通过/失败或 pre-passed/pre-failed,参见 `Dem_SetEventStatus`)后检查分配的启用条件。`(SRS_Diag_04192)`
⌈[SWS_Dem_00449]⌋ 如果一个启用条件未满足,则 Dem 应忽略对分配给此条件的事件的所有 `Dem_SetEventStatus` 调用(事件状态字节无变化)。`(SRS_Diag_04192)`
注:在 Dem 内部去抖的情况下,相关的故障检测计数器将被冻结或重置(参见图 29 和图 32)。
⌈[SWS_Dem_00450]⌋ 如果所有事件特定的启用条件都已满足,则 Dem 从此时开始应接受来自 SW-C 和 BSW 模块通过 `Dem_SetEventStatus` 的所有状态报告。`(SRS_Diag_04192)`
```text
DemEventParameter: DemEnableConditionGroupRef:
EcucParamConfContainerDef +reference EcucReferenceDef
upperMultiplicity = 65535 lowerMultiplicity = 0
lowerMultiplicity = 1 upperMultiplicity = 1
+destination
DemGeneral: EcucParamConfContainerDef DemEnableConditionGroup: DemEnableConditionRef:
+subContainer EcucParamConfContainerDef +reference EcucReferenceDef
upperMultiplicity = 1
lowerMultiplicity = 1 upperMultiplicity = 255 lowerMultiplicity = 1
lowerMultiplicity = 0 upperMultiplicity = 255
+destination
DemEnableCondition: DemEnableConditionId:
EcucParamConfContainerDef EcucIntegerParamDef
upperMultiplicity = 255 +parameter max = 255
lowerMultiplicity = 0 min = 0
lowerMultiplicity = 1
+subContainer upperMultiplicity = 1
symbolicNameValue = true
DemEnableConditionStatus:
+parameter EcucBooleanParamDef
lowerMultiplicity = 1
upperMultiplicity = 1
Figure 7.38: Enable condition assignment configuration
```
以下需求介绍了存储条件的处理。
⌈[SWS_Dem_00543]⌋ 如果请求 Dem 模块支持存储条件,则 Dem 模块应提供 API `Dem_SetStorageCondition`,接收特定存储条件的当前状态(条件已满足或未满足)。`(SRS_Diag_04219)`
⌈[SWS_Dem_00453]⌋ 如果请求 Dem 模块支持存储条件,则 Dem 模块应提供将一个存储条件组(参见 `DemStorageConditionGroup`)分配给特定事件的能力,该组包括一个或多个存储条件(参见 `DemStorageConditionGroup`)。`(SRS_Diag_04219)`
注:引入存储条件组以改进 Dem 模块的配置方法。如果大量事件始终依赖于相同的存储条件,则选择已定义的存储条件组之一比为每个事件分配多个存储条件工作量更少。
⌈[SWS_Dem_00455]⌋ 如果请求 Dem 模块支持存储条件,则 Dem 模块应在事件被限定为失败(UDS 状态位 0 从 0 变为 1)后检查分配的存储条件。`(SRS_Diag_04219)`
⌈[SWS_Dem_01210]⌋ 如果请求 Dem 模块支持存储条件,则 Dem 模块应在事件报告 `DEM_EVENT_STATUS_FDC_THRESHOLD_REACHED` 后检查分配的存储条件(例如通过接口调用或在去抖算法中达到配置的阈值时)。`(SRS_Diag_04219)`
⌈[SWS_Dem_00458]⌋ 如果一个存储条件未满足且不存在相应的事件内存条目,则 Dem 模块不应将报告的事件输入到事件内存中。`(SRS_Diag_04219)`
⌈[SWS_Dem_00591]⌋ 如果一个存储条件未满足且存在相应的事件内存条目,则 Dem 模块不应更新报告的事件的事件内存。`(SRS_Diag_04219)`
⌈[SWS_Dem_01309]⌋ 如果分配给事件的至少一个存储条件未满足,则 Dem 应跳过相应事件状态字节和 UDS 状态字节中的以下位计算:
- 位 2(PendingDTC)和
- 位 3(ConfirmedDTC)。
`(SRS_Diag_04219)`
⌈[SWS_Dem_00459]⌋ 如果所有事件特定的存储条件都已满足,则 Dem 模块应允许存储报告的事件。`(SRS_Diag_04219)`
```text
DemGeneral: DemStorageCondition: DemStorageConditionId: EcucIntegerParamDef
EcucParamConfContainerDef EcucParamConfContainerDef
+parameter symbolicNameValue = true
upperMultiplicity = 1 upperMultiplicity = 255 min = 0
lowerMultiplicity = 1 lowerMultiplicity = 0 max = 255
DemStorageConditionStatus:
+subContainer +parameter EcucBooleanParamDef
upperMultiplicity = 1
lowerMultiplicity = 1
DemStorageConditionReplacementEventRef:
+reference EcucReferenceDef
lowerMultiplicity = 0
upperMultiplicity = 1
+destination
DemStorageConditionRef:
EcucReferenceDef
lowerMultiplicity = 1
upperMultiplicity = 255
+reference
DemStorageConditionGroup:
+subContainer EcucParamConfContainerDef
upperMultiplicity = 255
lowerMultiplicity = 0
DemStorageConditionGroupRef:
EcucReferenceDef
lowerMultiplicity = 0
upperMultiplicity = 1
+reference
DemEventParameter:
EcucParamConfContainerDef +destination
upperMultiplicity = 65535
lowerMultiplicity = 1
Figure 7.39: Storage condition assignment configuration
```
⌈[SWS_Dem_01085]⌋ 对于每个存储条件,可以定义一个替换事件(参见 `DemStorageConditionReplacementEventRef`)。此替换事件将用作替换故障信息。`(SRS_Diag_04219)`
⌈[SWS_Dem_01086]⌋ 当存储条件被禁用时,一旦报告故障并被存储条件过滤(存储条件未满足),则应设置替换事件(状态 FAILED)。注:只要存储条件未满足且没有分配给存储条件的事件报告 FAILED,替换事件就不应被设置。`(SRS_Diag_04219)`
⌈[SWS_Dem_01087]⌋ 替换错误具有与其他每个事件相同的 EventStatus(`Dem_UdsStatusByteType`)。`(SRS_Diag_04137)`
⌈[SWS_Dem_01088]⌋ 过滤事件(由存储条件过滤)的状态/行为不受替换事件的影响(这意味着:被存储条件过滤的故障在配置了替换事件或未为存储条件配置替换事件的情况下表现相同)。`(SRS_Diag_04219)`
⌈[SWS_Dem_01089]⌋ 当存储条件满足时(在启用存储条件时),替换事件被重置(状态 PASSED)。`(SRS_Diag_04137, SRS_Diag_04219)`
⌈[SWS_Dem_01090]⌋ 替换事件的约束:
- 不得映射到存储条件
- 不得配置为使用去抖
- 不得有 InitMForE 回调/clearEventAllowed
- 不得为 enableConditions 配置
- 必须配置为 `DEM_EVENT_KIND_BSW`
`(SRS_Diag_04137)`
⌈[SWS_Dem_01091]⌋ `Dem_SetEventStatus` 应忽略替换事件。`(SRS_Diag_04137)`
#### 7.7.7 事件相关数据
"事件相关数据"是附加数据,例如传感器值或时间戳/里程,在事件的情况下存储。ISO-14229-1 [2] 定义了两种不同类型的事件相关数据:快照数据(冻结帧)和扩展数据。存储的事件相关数据的数量或集合是强 OEM/故障特定的,因此是可配置的。此数据由 SW-C 或其他 BSW 模块提供。
⌈[SWS_Dem_00796]⌋ 每个事件内存条目应支持存储配置的"事件相关数据"(冻结帧数据(DTCSnapshot)或 DTCExtendedData,参见章节 7.7.7.4)的能力。`(SRS_Diag_04074)`
注:已确认 UDS 状态的存在不一定意味着"事件相关数据"也可用。
Dem 模块不负责事件相关数据的有效性。事件相关数据的时间一致性取决于数据源和存储时间。
Dem 模块提供配置表以将事件相关数据(冻结帧和扩展数据)与特定 DTC 编号等组合(参见章节 7.7.7.4)。
注:这并不定义特定的实现(例如查找表、矩阵等)。此外,它涉及配置数据之间的链接。事件由其事件 ID、DTC 值、配置的冻结帧和扩展数据记录等特征。
##### 7.7.7.1 冻结帧数据的存储
⌈[SWS_Dem_00039]⌋ Dem 模块应支持事件特定的冻结帧存储。`(SRS_Diag_04074)`
通常,冻结帧配置有两种选项:(1) 非排放相关冻结帧被配置为特定于一个特定事件。冻结帧记录可以通过使用相对编号(计算或配置的)来寻址,因此记录编号对于事件是唯一的(不是全局的)。(2) 排放相关冻结帧被配置为特定 ECU 的全局(OBD 法规仅要求一个单一的冻结帧类)。冻结帧记录可以通过使用值 0x00 按事件寻址。
⌈[SWS_Dem_00040]⌋ Dem 模块应支持存储由配置分配的每个冻结帧记录的一个或多个 DID(参见 `DemFreezeFrameClass`)。`(SRS_Diag_04074)`
注:冻结帧表示为 DID 列表(参见 `DemDidClass`)或 PID 列表(参见 `DemPidClass`)。
注:由于实现原因,Dem 通常需要为最大冻结帧大小乘以冻结帧数预留内存。
⌈[SWS_Dem_00337]⌋ 如果 `DemTypeOfFreezeFrameRecordNumeration` 设置为 `DEM_FF_RECNUM_CALCULATED`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则 Dem 应为此 DTC 存储 `DemMaxNumberFreezeFrameRecords` 个冻结帧。`(SRS_Diag_04127)`
⌈[SWS_Dem_00581]⌋ 如果 Dem 模块使用计算的记录编号,则 Dem 模块应根据其时间顺序从 1 开始连续为事件特定的冻结帧记录编号。`(SRS_Diag_04127)`
⌈[SWS_Dem_00582]⌋ 如果 `DemTypeOfFreezeFrameRecordNumeration` 设置为 `DEM_FF_RECNUM_CONFIGURED`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则 Dem 应为每个事件内存条目存储此 DTC 的所有配置的冻结帧记录。`(SRS_Diag_04074)`
⌈[SWS_Dem_00797]⌋ 如果 FreezeFrame 使用专用的配置的记录编号(参见 `DemFreezeFrameRecNumClassRef`)且存在事件内存条目,则 Dem 模块应在配置的触发器(参见 `DemFreezeFrameRecordTrigger`)上捕获 FreezeFrame 并将其存储到事件内存条目。`(SRS_Diag_04127)`
如果存储触发器由于事件保留而无法分配事件内存条目,则与此同时(由于老化)可能具有合适的内存条目。因此,FreezeFrame 触发器应再次尝试分配事件内存条目。
⌈[SWS_Dem_00798]⌋ 如果 FreezeFrame 使用专用的配置的记录编号(参见 `DemFreezeFrameRecNumClassRef`)且不存在事件内存条目,则 Dem 模块应首先尝试分配事件内存条目,如 [SWS_Dem_00783]、[SWS_Dem_00784]、[SWS_Dem_00785] 和 [SWS_Dem_00786] 中所述。之后应用需求 [SWS_Dem_00797]。`(SRS_Diag_04127)`
⌈[SWS_Dem_00799]⌋ 如果 `DemFreezeFrameRecordTrigger` 设置为 `DEM_TRIGGER_ON_FDC_THRESHOLD`,则应在每次达到配置的 FDC 阈值(参见 `DemCounterBasedFdcThresholdStorageValue` 或 `DemTimeBasedFdcThresholdStorageValue`)时(通过正增量)捕获 FreezeFrame(如 [SWS_Dem_00797] 所允许),但每个操作循环最多一次。`(SRS_Diag_04127)`
⌈[SWS_Dem_01068]⌋ 如果 `DemFreezeFrameRecordTrigger` 设置为 `DEM_TRIGGER_ON_FDC_THRESHOLD` 且事件报告 `DEM_EVENT_STATUS_FDC_THRESHOLD_REACHED`(监视器内部去抖事件),则应捕获 FreezeFrame(参见 [SWS_Dem_00797]),但每个操作循环最多一次。`(SRS_Diag_04127)`
⌈[SWS_Dem_00800]⌋ 如果 `DemFreezeFrameRecordTrigger` 设置为 `DEM_TRIGGER_ON_TEST_FAILED`,则应在每次设置 UDS 状态位 0 时(从 0 变为 1)捕获 FreezeFrame(如 [SWS_Dem_00797] 所允许)。`(SRS_Diag_04127)`
⌈[SWS_Dem_00801]⌋ 如果 `DemFreezeFrameRecordTrigger` 设置为 `DEM_TRIGGER_ON_PENDING`,则应在每次设置 UDS 状态位 2 时(从 0 变为 1)捕获 FreezeFrame(如 [SWS_Dem_00797] 所允许)。`(SRS_Diag_04127)`
⌈[SWS_Dem_00802]⌋ 如果 `DemFreezeFrameRecordTrigger` 设置为 `DEM_TRIGGER_ON_CONFIRMED`,则应在每次设置已确认的 UDS 状态位 3 时(从 0 变为 1)捕获 FreezeFrame(如 [SWS_Dem_00797] 所允许)。`(SRS_Diag_04127)`
⌈[SWS_Dem_01308]⌋ 冻结帧的连续触发条件:如果 `DemFreezeFrameRecordTrigger` 设置为 `DEM_TRIGGER_ON_EVERY_TEST_FAILED`,则每次将事件报告为 FAILED 时,或在可选去抖之后检测到限定的 FAILED 时,Dem 应捕获冻结帧。`(SRS_Diag_04127)`
⌈[SWS_Dem_00803]⌋ 如果 FreezeFrame 使用专用的配置的记录编号(参见 `DemFreezeFrameRecNumClass`)且 `DemFreezeFrameRecordUpdate` 设置为 `DEM_UPDATE_RECORD_NO`,则仅在 FreezeFrame 当前未存储在此事件内存条目中时才应存储 FreezeFrame。`(SRS_Diag_04127)`
⌈[SWS_Dem_00804]⌋ 如果 FreezeFrame 使用专用的配置的记录编号(参见 `DemFreezeFrameRecNumClass`)且 `DemFreezeFrameRecordUpdate` 设置为 `DEM_UPDATE_RECORD_YES`,则 FreezeFrame 应随每次触发器更新(参见 `DemFreezeFrameRecordTrigger`)。`(SRS_Diag_04127)`
⌈[SWS_Dem_00461]⌋ 如果配置参数 `DemEnvironmentDataCapture` 设置为 `DEM_CAPTURE_ASYNCHRONOUS_TO_REPORTING`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则事件特定的冻结帧数据应最迟在 `Dem_MainFunction` 的下一个周期内被捕获。`(SRS_Diag_04127)`
⌈[SWS_Dem_00805]⌋ 如果配置参数 `DemEnvironmentDataCapture` 设置为 `DEM_CAPTURE_SYNCHRONOUS_TO_REPORTING`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`)且 `DemDebounceTimeBasedSupport` 设置为 'false',则事件特定的冻结帧数据应在 reporting 函数内捕获(即在 `Dem_SetEventStatus` 的上下文中)。`(SRS_Diag_04127)`
注:[SWS_Dem_00461] 和 [SWS_Dem_00805] 不适用于可用的预存储冻结帧,另请参见 [SWS_Dem_00464]。
⌈[SWS_Dem_01081]⌋ 如果配置参数 `DemEnvironmentDataCapture` 设置为 `DEM_CAPTURE_ASYNCHRONOUS_TO_REPORTING`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则事件特定的扩展数据应最迟在 `Dem_MainFunction` 的下一个周期内被捕获。`(SRS_Diag_04127)`
⌈[SWS_Dem_01082]⌋ 如果配置参数 `DemEnvironmentDataCapture` 设置为 `DEM_CAPTURE_SYNCHRONOUS_TO_REPORTING`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则事件特定的扩展数据应在 `Dem_SetEventStatus` 的上下文中捕获。`(SRS_Diag_04127)`
如果 `DemEnvironmentDataCapture` 等于 `DEM_CAPTURE_SYNCHRONOUS_TO_REPORTING`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则可以使用队列存储环境数据,直到数据被传输到事件内存。为不丢失任何报告,队列大小需要配置为存储两个 `Dem_MainFunction` 周期之间的所有报告。
⌈[SWS_Dem_01083]⌋ 如果 `DemEnvironmentDataCapture` 等于 `DEM_CAPTURE_SYNCHRONOUS_TO_REPORTING`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则 Dem 模块应将来自 reporting 的环境数据排队(参见 [SWS_Dem_00805] 和 [SWS_Dem_01082])直到 `Dem_MainFunction` 的下一次调用。Dem 应至少排队配置的大小(参见 `DemMaxNumberEventEntryEventBuffer`)。如果队列已满,则 `Dem_SetEventStatus` 应返回 `E_NOT_OK`。`(SRS_Diag_04127)`
⌈[SWS_Dem_CONSTR_06121]⌋ `DemMaxNumberEventEntryEventBuffer` 的依赖性:`DemMaxNumberEventEntryEventBuffer` 仅在 `DemEnvironmentDataCapture` 设置为 `DEM_CAPTURE_SYNCHRONOUS_TO_REPORTING`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`)时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06122]⌋ `DemOccurrenceCounterProcessing` 的依赖性:`DemOccurrenceCounterProcessing`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`)仅在 `DemEnvironmentDataCapture` 设置为 `DEM_CAPTURE_SYNCHRONOUS_TO_REPORTING`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`)时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06123]⌋ `DemOperationCycleStatusStorage` 的依赖性:`DemOperationCycleStatusStorage` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06124]⌋ `DemPTOSupport` 的依赖性:`DemPTOSupport` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06125]⌋ `DemAgingCycleCounterThreshold` 的依赖性:`DemAgingCycleCounterThreshold` 仅在 `DemAgingAllowed` 设置为 TRUE 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06126]⌋ `DemAgingCycleCounterThresholdForTFSLC` 的依赖性:`DemAgingCycleCounterThresholdForTFSLC` 仅在 `DemStatusBitHandlingTestFailedSinceLastClear` 设置为 `DEM_STATUS_BIT_AGING_AND_DISPLACEMENT` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06127]⌋ `DemMaxNumberFreezeFrameRecords` 的依赖性:`DemMaxNumberFreezeFrameRecords` 仅在 `DemTypeOfFreezeFrameRecordNumeration` 设置为 `DEM_FF_RECNUM_CALCULATED` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06128]⌋ `DemAgingCycleRef` 的依赖性:`DemAgingCycleRef` 仅在 `DemAgingAllowed` 设置为 TRUE 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06129]⌋ `DemFreezeFrameRecNumClassRef` 的依赖性:`DemFreezeFrameRecNumClassRef` 仅在该 DTC 引用具有 `DemTypeOfFreezeFrameRecordNumeration` 设置为 `DEM_FF_RECNUM_CONFIGURED`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`)的故障内存时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06130]⌋ `DemReportBehavior` 的依赖性:`DemReportBehavior` 仅在 `DemEventKind` 设置为 `DEM_EVENT_KIND_SWC` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06131]⌋ `DemOBDGroupingAssociativeEventsRef` 的依赖性:`DemOBDGroupingAssociativeEventsRef` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06132]⌋ `DemOBDCentralizedPID21Handling` 的依赖性:`DemOBDCentralizedPID21Handling` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06133]⌋ `DemOBDCentralizedPID31Handling` 的依赖性:`DemOBDCentralizedPID31Handling` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06134]⌋ `DemOBDCompliancy` 的依赖性:`DemOBDCompliancy` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06135]⌋ `DemOBDEngineType` 的依赖性:`DemOBDEngineType` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06136]⌋ `DemOBDEventDisplacement` 的依赖性:`DemOBDEventDisplacement` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06137]⌋ `DemOBDInputAcceleratorPedalInformation` 的依赖性:`DemOBDInputAcceleratorPedalInformation` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06138]⌋ `DemOBDInputAmbientPressure` 的依赖性:`DemOBDInputAmbientPressure` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06139]⌋ `DemOBDInputAmbientTemperature` 的依赖性:`DemOBDInputAmbientTemperature` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06140]⌋ `DemOBDInputDistanceInformation` 的依赖性:`DemOBDInputDistanceInformation` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06141]⌋ `DemOBDInputEngineSpeed` 的依赖性:`DemOBDInputEngineSpeed` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06142]⌋ `DemOBDInputEngineTemperature` 的依赖性:`DemOBDInputEngineTemperature` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06143]⌋ `DemOBDInputProgrammingEvent` 的依赖性:`DemOBDInputProgrammingEvent` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06144]⌋ `DemOBDInputVehicleSpeed` 的依赖性:`DemOBDInputVehicleSpeed` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_CONSTR_06145]⌋ `DemConsiderPtoStatus` 的依赖性:`DemConsiderPtoStatus` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
快照记录数据通常从报告事件状态异步捕获。在某些情况下,捕获的数据需要与报告的事件状态对齐。为此,`Dem_SetEventStatusWithMonitorData` 提供了添加 2 个监视器数据的可能性。monitorData0 可以可选地传递给 `DataServices_{Data}` ReadData 操作,因此应用程序可以将数据捕获调用与启动的 `Dem_SetEventStatus` 函数调用对齐。
⌈[SWS_Dem_01330]⌋ 使用监视器数据捕获事件相关数据:如果 ReadData 操作配置为提供 monitorData0,则 Dem 应将 monitorData0 从 `Dem_SetEventStatusWithMonitorData` 添加到 ReadData 操作参数 monitorData0。`c()`
⌈[SWS_Dem_01331]⌋ 缺少 monitorData 的处理:如果数据捕获是从没有 monitorData 的 API 调用内触发的,则 Dem 应使用值 0 作为 monitorData。`c()`
⌈[SWS_Dem_00261]⌋ Dem 模块应使用 C-callback `DemRead` 或接口 `DataServices_{Data}` 的操作 `ReadData` 来收集相应冻结帧的所有配置的数据元素。`(SRS_Diag_04127)`
⌈[SWS_Dem_00806]⌋ Dem 模块可以从 `Dem_MainFunction` 而不是 reporting 函数内调用 [SWS_Dem_00261] 的数据收集。注:为了确保同步数据收集,应使用 prestore freeze frame 功能。`(SRS_Diag_04127)`
⌈[SWS_Dem_00463]⌋ 如果 SW-C 或 BSW 模块无法提供所请求的数据(`ReadDataElement` 返回除 `E_OK` 之外的值),则 Dem 应使用填充值 0xFF 填充缺失的数据,向 Det 报告运行时错误 `DEM_E_NODATAAVAILABLE` 并继续其正常操作。`(SRS_Diag_04085)`
⌈[SWS_Dem_00585]⌋ 如果 Dem 模块使用计算的记录编号,并且为特定事件配置了多个冻结帧记录,并且此事件在事件内存中更新,并且此事件的所有可用冻结帧记录槽都被占用,则 Dem 模块应更新最近的记录。`(SRS_Diag_04074)`
注:第一个冻结帧记录槽将始终表示第一次出现。
##### 7.7.7.2 冻结帧数据的预存储
冻结帧的预存储可用于具有高度易变冻结帧数据的事件。随着特定事件首次出现的指示,即使事件尚未去抖或限定,冻结帧数据也会被捕获(例如由于在运行故障监视阶段期间事件相关数据的快速变化)。预存储的冻结帧功能由监视器使用。
⌈[SWS_Dem_00002]⌋ Dem 模块应提供配置参数 `DemFFPrestorageSupported`(参见 `DemEventParameter`)以启用或禁用按事件的冻结帧预存储处理。`(SRS_Diag_04127)`
注:如果 `DemMaxNumberPrestoredFF` 设置为 0,则不能为任何 DTC 启用 `DemFFPrestorageSupported`。
⌈[SWS_Dem_00334]⌋ 如果任何事件配置为使用冻结帧的预存储(参见 `DemFFPrestorageSupported`),则 Dem 模块应提供 API `Dem_PrestoreFreezeFrame` 和 `Dem_ClearPrestoredFreezeFrame`。否则不提供它们。`(SRS_Diag_04127)`
⌈[SWS_Dem_00189]⌋ Dem 模块应提供 API `Dem_PrestoreFreezeFrame` 以捕获事件特定冻结帧的预存储数据,而与 UDS 状态位更改无关。`(SRS_Diag_04074)`
注:如果预存储冻结帧的请求(`Dem_PrestoreFreezeFrame`)被报告事件状态(`Dem_SetEventStatus`)或对同一 EventId 的 `Dem_ClearPrestoredFreezeFrame` 调用中断,则详细行为是特定于实现的。请求预存储的冻结帧可以立即使用,也可以存储并在下一个即将到来的事件报告中使用,反之亦然。
⌈[SWS_Dem_00807]⌋ 数据捕获(采样)(使用 [SWS_Dem_00261])应在 `Dem_PrestoreFreezeFrame` 的调用中同步。`(SRS_Diag_04074)`
⌈[SWS_Dem_00808]⌋ API `Dem_PrestoreFreezeFrame` 应在无可用内存时返回 `E_NOT_OK`(参见 `DemMaxNumberPrestoredFF`)。`(SRS_Diag_04127)`
⌈[SWS_Dem_00464]⌋ 如果预存储的冻结帧可用,则 Dem 模块应在捕获事件相关数据时使用预存储冻结帧的数据,而不是当前数据(参见 [SWS_Dem_00461])。`(SRS_Diag_04074)`
⌈[SWS_Dem_00969]⌋ 预存储的冻结帧应在存储到事件内存或被丢弃后释放。`(SRS_Diag_04074)`
注:如果事件保留成功,则预存储的冻结帧被视为已存储。如果事件保留失败,则预存储的冻结帧被丢弃。
⌈[SWS_Dem_00191]⌋ 如果没有预存储的冻结帧可用,则 Dem 模块应根据章节 7.7.7.1 "冻结帧数据的存储" 进行操作。`(SRS_Diag_04074)`
注:使用预存储冻结帧捕获的数据可能与使用 UDS 状态位转换作为触发器收集的数据不同。
注:为了确保对限定事件的已存储冻结帧没有反应,应使用额外的冻结帧缓冲区。由于硬件使用限制,可能的条目数可能会受到限制。因此,可能需要替换策略。
```text
Figure 7.40: Example to use Dem_PrestoreFreezeFrame to prestore freeze frame data
```
某些事件在一个操作循环中检测到故障,但仅在下一个操作循环中确定允许存储故障的条件。此类事件的冻结帧显示来自旧操作循环的值。为此,Dem 支持预存储冻结帧数据的非易失性存储。为了避免过度存储,可以通过配置 `DemFFPrestorageInNvm` 按事件单独启用/禁用存储。
⌈[SWS_Dem_01320]⌋ 预存储数据的非易失性存储:如果 `DemFFPrestorageInNvm` 设置为 TRUE,则 Dem 应在 Nvm 中为该事件存储预存储的冻结帧数据。`(SRS_Diag_04074)`
⌈[SWS_Dem_01321]⌋ 在非易失性内存中存储预存储数据的时间点:如果 Dem 配置为根据 [SWS_Dem_01320] 在非易失性内存中存储预存储的冻结帧数据,则 Dem 应在 `Dem_Shutdown` 期间一次存储数据,最迟在 `Dem_Shutdown` 期间。`(SRS_Diag_04074)`
⌈[SWS_Dem_01322]⌋ 从非易失性内存中检索预存储数据的时间点:如果 Dem 配置为根据 [SWS_Dem_01320] 在非易失性内存中存储预存储的冻结帧数据,则 Dem 应在 `Dem_Init` 返回之前恢复预存储数据。`(SRS_Diag_04074)`
⌈[SWS_Dem_01323]⌋ 非易失性存储的预存储数据的一致性:如果 Dem 根据 [SWS_Dem_01322] 恢复预存储数据,则 Dem 应仅在数据与当前配置一致时恢复此数据。如果在重新编程或标定之后数据布局已更改,则 Dem 应跳过预存储数据。`(SRS_Diag_04074)`
⌈[SWS_Dem_00050]⌋ Dem 模块应提供 API `Dem_ClearPrestoredFreezeFrame` 以释放特定事件的预存储冻结帧。`(SRS_Diag_04074)`
⌈[SWS_Dem_00465]⌋ 如果事件被限定为已通过(UDS 状态位 0 从 1 变为 0),则 Dem 模块应释放特定事件的预存储冻结帧。`(SRS_Diag_04074)`
##### 7.7.7.3 扩展数据的存储
扩展数据记录包含与冻结帧中未包含的特定事件关联的附加信息(扩展数据,例如频率计数器、老化计数器等)。根据冻结帧数据的 DID 或 PID 配置,扩展数据被划分为由其记录号定义的扩展数据记录。
⌈[SWS_Dem_00809]⌋ 如果事件内存条目存在,则 Dem 模块应在配置的触发器(参见 `DemExtendedDataRecordTrigger`)上捕获 `ExtendedDataRecord` 并将其存储到事件内存条目。`(SRS_Diag_04127)`
如果存储触发器由于事件保留而无法分配事件内存条目,则与此同时(由于老化)可能具有合适的内存条目。因此,`ExtendedDataRecord` 触发器应再次尝试分配事件内存条目。
⌈[SWS_Dem_00810]⌋ 如果不存在事件内存条目,则 Dem 模块应首先尝试分配事件内存条目,如 [SWS_Dem_00783]、[SWS_Dem_00784]、[SWS_Dem_00785] 和 [SWS_Dem_00786] 中所述。之后应用需求 [SWS_Dem_00809]。`(SRS_Diag_04127)`
⌈[SWS_Dem_00811]⌋ 如果 `DemExtendedDataRecordTrigger` 设置为 `DEM_TRIGGER_ON_FDC_THRESHOLD`,则应在每次达到配置的 FDC 阈值(参见 `DemCounterBasedFdcThresholdStorageValue` 或 `DemTimeBasedFdcThresholdStorageValue`)时(通过正增量)捕获 `ExtendedDataRecord`(如 [SWS_Dem_00810] 所允许),但每个操作循环最多一次。`(SRS_Diag_04127)`
⌈[SWS_Dem_01069]⌋ 如果 `DemExtendedDataRecordTrigger` 设置为 `DEM_TRIGGER_ON_FDC_THRESHOLD` 且事件报告 `DEM_EVENT_STATUS_FDC_THRESHOLD_REACHED`(监视器内部去抖事件),则应捕获 `ExtendedDataRecord`(参见 [SWS_Dem_00810]),但每个操作循环最多一次。`(SRS_Diag_04127)`
⌈[SWS_Dem_00812]⌋ 如果 `DemExtendedDataRecordTrigger` 设置为 `DEM_TRIGGER_ON_TEST_FAILED`,则应在每次设置 UDS 状态位 0 时(从 0 变为 1)捕获 `ExtendedDataRecord`(如 [SWS_Dem_00810] 所允许)。`(SRS_Diag_04127)`
⌈[SWS_Dem_00813]⌋ 如果 `DemExtendedDataRecordTrigger` 设置为 `DEM_TRIGGER_ON_PENDING`,则应在每次设置 UDS 状态位 2 时(从 0 变为 1)捕获 `ExtendedDataRecord`(如 [SWS_Dem_00810] 所允许)。`(SRS_Diag_04127)`
⌈[SWS_Dem_00814]⌋ 如果 `DemExtendedDataRecordTrigger` 设置为 `DEM_TRIGGER_ON_CONFIRMED`,则应在每次设置 UDS 状态位 3 时(从 0 变为 1)捕获 `ExtendedDataRecord`(如 [SWS_Dem_00810] 所允许)。`(SRS_Diag_04127)`
⌈[SWS_Dem_01070]⌋ 如果 `DemExtendedDataRecordTrigger` 设置为 `DEM_TRIGGER_ON_PASSED`,则应在 Testfailed UDS 状态位 0 重置时(从 1 变为 0)捕获 `ExtendedDataRecord`。如果不存在条目,则在 passed 报告时不应创建新条目。`(SRS_Diag_04127)`
⌈[SWS_Dem_01071]⌋ 如果 `DemExtendedDataRecordTrigger` 设置为 `DEM_TRIGGER_ON_MIRROR`,则应在将内存条目传输到镜像内存时捕获 `ExtendedDataRecord`。`(SRS_Diag_04127)`
⌈[SWS_Dem_CONSTR_6101]⌋ `DemExtendedDataRecordTrigger` 需要配置。除内部数据元素(例如发生计数器)外,`DemExtendedDataRecordTrigger` 应始终配置。`c()`
⌈[SWS_Dem_00815]⌋ 如果配置参数 `DemExtendedDataRecordUpdate` 设置为 `DEM_UPDATE_RECORD_NO`,则仅在 `ExtendedDataRecord` 当前未存储在此事件内存条目中时才应存储 `ExtendedDataRecord`。`(SRS_Diag_04127)`
⌈[SWS_Dem_00816]⌋ 如果配置参数 `DemExtendedDataRecordUpdate` 设置为 `DEM_UPDATE_RECORD_YES`,则 `ExtendedDataRecord` 应随每次触发器更新(参见 `DemExtendedDataRecordTrigger`)。`(SRS_Diag_04127)`
⌈[SWS_Dem_00282]⌋ Dem 模块应使用 C-callback `ReadDataElement` 或接口 `DataServices_{Data}` 的操作 `ReadData` 来收集未键入为内部数据元素(参见 `DemInternalDataElementClass`)的相应扩展数据记录的所有配置的数据元素。`(SRS_Diag_04074)`
⌈[SWS_Dem_00468]⌋ 如果事件被存储或在事件内存中更新,则 Dem 模块应将收集的扩展数据存储到事件内存条目。`(SRS_Diag_04127)`
⌈[SWS_Dem_01391]⌋ 将 DTC 优先级配置为扩展数据记录:如果 `DemInternalDataElement` 设置为 `DEM_DTC_PRIORITY`,则 Dem 应将此内部数据元素的值设置为 DemDTCPriority 为此 DTC 分配的 DTC 优先级。此内部数据元素的长度为一个字节。`(SRS_Diag_04134)`
##### 7.7.7.4 事件相关数据的配置
本节描述事件相关数据的配置以及从 SW-C/BSW 模块访问事件相关数据。
注:配置模型遵循灵活的配置过程,但不暗示任何明确的实现。
诊断事件的事件相关数据包含零个或一个扩展数据记录集(参见 `DemExtendedDataClass`),以及零个或一个冻结帧记录集(参见 `DemFreezeFrameClass`),其中包含其计算的或配置的记录号。因此,使用类概念(参见图 37)。
扩展数据记录、DID 或 PID 可以包含一个或多个数据元素(参见 `DemDataElementClass`)。
注:异步 DID 以及具有可变长度的 DID 不受 Dem 模块支持,因此不应连接到 Dem。
```text
DemGeneral: EcucParamConfContainerDef
upperMultiplicity = 1
lowerMultiplicity = 1
DemExtendedDataClassRef: DemFreezeFrameClassRef:
EcucReferenceDef EcucReferenceDef
upperMultiplicity = 1 upperMultiplicity = 1
lowerMultiplicity = 0 lowerMultiplicity = 0
+subContainer +destination +destination +subContainer
DemExtendedDataClass: DemFreezeFrameClass:
EcucParamConfContainerDef EcucParamConfContainerDef
lowerMultiplicity = 0 upperMultiplicity = 65535
upperMultiplicity = 65535 lowerMultiplicity = 0
+reference +reference
DemExtendedDataRecordClassRef: DemDidClassRef: EcucReferenceDef
EcucReferenceDef
lowerMultiplicity = 1
upperMultiplicity = 253 upperMultiplicity = 255
lowerMultiplicity = 1 requiresIndex = true
requiresIndex = true
+subContainer +destination +destination +subContainer
DemExtendedDataRecordClass: DemDataElementClassRef: DemDidClass:
EcucParamConfContainerDef +reference EcucReferenceDef EcucParamConfContainerDef
upperMultiplicity = 253 upperMultiplicity = 255 upperMultiplicity = 65535
lowerMultiplicity = 0 lowerMultiplicity = 1 lowerMultiplicity = 0
requiresIndex = true
+subContainer
+destination +reference
DemDataElementClass:
EcucChoiceContainerDef DemDidDataElementClassRef:
EcucReferenceDef
lowerMultiplicity = 0
upperMultiplicity = 65535 lowerMultiplicity = 1
+destination upperMultiplicity = 255
requiresIndex = true
DemInternalDataElementClass: EcucParamConfContainerDef
+choice
upperMultiplicity = 1
lowerMultiplicity = 0
+choice DemExternalCSDataElementClass: EcucParamConfContainerDef
upperMultiplicity = 1
lowerMultiplicity = 0
DemExternalSRDataElementClass: EcucParamConfContainerDef
+choice
upperMultiplicity = 1
lowerMultiplicity = 0
DemPidDataElementClassRef: EcucReferenceDef
+destination
lowerMultiplicity = 1
upperMultiplicity = 1
Figure 7.41: Event related data configuration
```
数据元素由 SW-C 或 BSW 模块提供,或由 Dem 内部计算。
对于每个外部数据元素,根据配置 `DemExternalCSDataElementClass` 和 `DemExternalSRDataElementClass` 生成相应的 require-port(参见 Service Interface `DataServices_`)或 C-callback(参见 `ReadDataElement`)。对于每个内部数据元素,映射相应的 Dem 内部值。
注:这些数据元素通常在诊断数据模板中指定。
```text
DemGeneral:
EcucParamConfContainerDef
upperMultiplicity = 1
lowerMultiplicity = 1
+subContainer
DemDataElementClass: DemInternalDataElementClass: DemDataElementDataSize:
EcucChoiceContainerDef EcucParamConfContainerDef EcucIntegerParamDef
lowerMultiplicity = 0 +parameter
upperMultiplicity = 1 min = 1
upperMultiplicity = 65535 lowerMultiplicity = 0 max = 255
lowerMultiplicity = 0
upperMultiplicity = 1
+choice
+parameter DemInternalDataElement:
EcucEnumerationParamDef
DemExternalCSDataElementClass: DemDataElementArraySize:
EcucParamConfContainerDef EcucIntegerParamDef
+parameter
upperMultiplicity = 1 min = 1
lowerMultiplicity = 0 max = 4294967295
lowerMultiplicity = 0
upperMultiplicity = 1
DemDataElementDataType:
+parameter EcucEnumerationParamDef
lowerMultiplicity = 1
upperMultiplicity = 1
+choice DemDataElementUsePort:
+parameter EcucBooleanParamDef
lowerMultiplicity = 1
upperMultiplicity = 1
DemDataElementReadFnc:
+parameter EcucFunctionNameDef
lowerMultiplicity = 0
upperMultiplicity = 1
DemDataElementProvideMonitorData:
EcucBooleanParamDef
+parameter
defaultValue = false
lowerMultiplicity = 1
upperMultiplicity = 1
DemExternalSRDataElementClass: DemDataElementArraySize:
EcucParamConfContainerDef EcucIntegerParamDef
+parameter
upperMultiplicity = 1 max = 4294967295
lowerMultiplicity = 0 min = 1
lowerMultiplicity = 0
upperMultiplicity = 1
+choice
DemSRDataElementClass:
+subContainer EcucChoiceContainerDef
lowerMultiplicity = 0
upperMultiplicity = 1
Figure 7.42: Data element configuration
```
⌈[SWS_Dem_CONSTR_06158]⌋ 容器 `DemExternalCSDataElementClass` 中的大小参数 `DemDataElementArraySize` [ECUC_Dem_00949] 应存在,如果同一容器中的 `DemDataElementDataType` [ECUC_Dem_00950] 设置为:UINT8_N、SINT8_N、UINT16_N、SINT16_N、UINT32_N、SINT32_N。`c()`
注:基本数据类型不需要容器 `DemExternalCSDataElementClass` 中的 `DemDataElementArraySize` [ECUC_Dem_00949]。
⌈[SWS_Dem_CONSTR_06159]⌋ 16 位数组的大小参数限制:如果值大于 2 且 `DemDataElementDataType` [ECUC_Dem_00950] 是 UINT16_N 或 SINT16_N,则 `DemDataElementArraySize` [ECUC_Dem_00949] 应是 2 的倍数。`c()`
⌈[SWS_Dem_CONSTR_06160]⌋ 32 位数组的大小参数限制:如果值大于 4 且 `DemDataElementDataType` [ECUC_Dem_00950] 是 UINT32_N 或 SINT32_N,则 `DemDataElementArraySize` [ECUC_Dem_00949] 应是 4 的倍数。`c()`
⌈[SWS_Dem_CONSTR_06161]⌋ 容器 `DemExternalSRDataElementClass` 中的大小参数 `DemDataElementArraySize` [ECUC_Dem_00967] 应存在,如果同一容器中的 `DemDataElementDataType` [ECUC_Dem_00840] 设置为:UINT8_N、SINT8_N、UINT16_N、SINT16_N、UINT32_N、SINT32_N。`c()`
注:基本数据类型不需要容器 `DemExternalSRDataElementClass` 中的 `DemDataElementArraySize` [ECUC_Dem_00967]。
⌈[SWS_Dem_CONSTR_06162]⌋ 16 位数组的大小参数限制:如果值大于 2 且 `DemDataElementDataType` [ECUC_Dem_00840] 是 UINT16_N 或 SINT16_N,则 `DemDataElementArraySize` [ECUC_Dem_00949] 应是 2 的倍数。`c()`
⌈[SWS_Dem_CONSTR_06163]⌋ 32 位数组的大小参数限制:如果值大于 4 且 `DemDataElementDataType` [ECUC_Dem_00840] 是 UINT32_N 或 SINT32_N,则 `DemDataElementArraySize` [ECUC_Dem_00949] 应是 4 的倍数。`c()`
⌈[SWS_Dem_00469]⌋ Dem 模块应提供将 Dem 内部数据值(例如老化计数器、发生计数器)映射到包含在扩展数据记录中的特定数据元素(参见 `DemDataElementClass` 中的 `DemInternalDataElement`)的能力。`(SRS_Diag_04189, SRS_Diag_04190)`
注:如果 Dem 内部数据元素映射到例如扩展数据记录(通过配置),则可以通过 UDS 服务 ReadDTCInformation - 子服务 reportDTCExtendedDataRecordByDTCNumber(0x19,06)简单地请求此信息。
⌈[SWS_Dem_00817]⌋ 内部数据元素(参见 `DemInternalDataElementClass`)不应存储,但应使用当前值。`(SRS_Diag_04127, SRS_Diag_04190)`
注:其他客户特定的 Dem 内部数据元素(根据 [SWS_Dem_00470])可以具有不同的语义(例如,Dem 内部数据元素可以冻结值或提供当前值)
⌈[SWS_Dem_00471]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_OCCCTR`,则发生计数器的 Dem 内部值(参见章节 7.3.2)应映射到相应的数据元素。`(SRS_Diag_04127, SRS_Diag_04190)`
⌈[SWS_Dem_00472]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_AGINGCTR_UPCNT` 或 `DEM_AGINGCTR_DOWNCNT`,则老化计数器的 Dem 内部值(参见章节 7.6.2)应映射到相应的数据元素(基于 [SWS_Dem_00643] 或 [SWS_Dem_00673])。`(SRS_Diag_04190)`
⌈[SWS_Dem_00643]⌋ 如果配置了数据元素 `DEM_AGINGCTR_UPCNT`,则老化计数器映射应基于从 0 到 `DemAgingCycleCounterThreshold` 的向上计数机制(参见 ISO-14229-1 [2] 附录 D)。`(SRS_Diag_04068, SRS_Diag_04190)`
⌈[SWS_Dem_00673]⌋ 如果配置了数据元素 `DEM_AGINGCTR_DOWNCNT`,则老化计数器映射应基于从 `DemAgingCycleCounterThreshold` 到 0 的向下计数机制(参见 ISO-14229-1 [2] 附录 D)。`(SRS_Diag_04178, SRS_Diag_04190)`
⌈[SWS_Dem_01043]⌋ 如果 `DemAgingAllowed` 设置为 'false',则内部数据元素 `DEM_AGINGCTR_DOWNCNT` 应为 `DemAgingCycleCounterThreshold`(如果已配置)或 '255'。`(SRS_Diag_04190)`
⌈[SWS_Dem_01044]⌋ 如果 `DemAgingAllowed` 设置为 'false',则内部数据元素 `DEM_AGINGCTR_UPCNT` 应为 '0'。`(SRS_Diag_04190)`
⌈[SWS_Dem_01219]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_AGINGCTR_UPCNT_FIRST_ACTIVE`,则该值应类似于 `DEM_AGINGCTR_UPCNT` 计算。区别在于,如果当前老化计数器的值为 0 且事件状态位 `TestFailedThisOperationCycle` 和 `TestNotCompletedThisOperationCycle` 设置为 False,则在读取 Dem 内部老化计数器时报告值 1。`(SRS_Diag_04133)`
⌈[SWS_Dem_00473]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_OVFLIND`,则溢出指示的 Dem 内部值(参见章节 7.7.2.3)应作为布尔值(0 = False,1 = True)映射到相应的数据元素。`(SRS_Diag_04190)`
⌈[SWS_Dem_00592]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_SIGNIFICANCE`,则 DTC 重要性的(静态)Dem 内部值(参见章节 7.4.6)应以 0 = OCCURRENCE 和 1 = FAULT 映射到相应的数据元素。`(SRS_Diag_04190)`
⌈[SWS_Dem_01084]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_CURRENT_FDC`,则当前故障检测计数器的 Dem 内部值(参见子章节 7.7.3.3 和子章节 7.7.3.4)应使用以下值转换映射到相应的数据元素:[0..127]->[0x00..0x7F] 和 [-1..-128]->[0xFF..0x80]。`(SRS_Diag_04190)`
⌈[SWS_Dem_00818]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_MAX_FDC_SINCE_LAST_CLEAR`,则自上次清除以来的最大故障检测计数器的 Dem 内部值(参见章节 7.7.3.6)应映射到相应的数据元素。`(SRS_Diag_04068, SRS_Diag_04190)`
⌈[SWS_Dem_00819]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_MAX_FDC_DURING_CURRENT_CYCLE`,则当前操作循环期间的最大故障检测计数器的 Dem 内部值(参见章节 7.7.3.6)应映射到相应的数据元素。`(SRS_Diag_04127, SRS_Diag_04190)`
⌈[SWS_Dem_00820]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_CYCLES_SINCE_LAST_FAILED`,则自上次失败以来的操作循环计数器的 Dem 内部值(参见章节 7.6.2.1)应映射到相应的数据元素。`(SRS_Diag_04127, SRS_Diag_04190)`
⌈[SWS_Dem_00821]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_CYCLES_SINCE_FIRST_FAILED`,则自第一次失败以来的操作循环计数器的 Dem 内部值(参见章节 7.6.2.2)应映射到相应的数据元素。`(SRS_Diag_04189, SRS_Diag_04190)`
⌈[SWS_Dem_00822]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_FAILED_CYCLES`,则失败操作循环计数器的 Dem 内部值(参见章节 7.6.2.3)应映射到相应的数据元素。`(SRS_Diag_04190)`
如果特定配置需要由 Dem 内部计算的特定数据值,则 Dem 模块可以扩展其他特定 Dem 内部数据元素。
⌈[SWS_Dem_00470]⌋ 如果 Dem 模块实现客户特定的 Dem 内部数据元素,则配置参数 `DemInternalDataElement` 应使用相应的枚举值进行扩展。`(SRS_Diag_04190)`
注:任何未配置为数据元素的 Dem 内部数据值的计算可以被丢弃(如果它对其他内部行为处理不是必需的)。
⌈[SWS_Dem_01045]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_CURRENT_FDC`,则故障检测计数器(参见章节 7.7.3)应映射到相应的数据元素。`(SRS_Diag_04190)`
⌈[SWS_Dem_01334]⌋ 内部数据中 monitorData0 的使用:如果 `DemInternalDataElement` 设置为 `DEM_MONITOR_DATA_0`,则 Dem 应使用 `Dem_SetEventStatusWithMonitorData` 调用的 monitorData0 参数值的 32 位值作为内部数据值。`c()`
⌈[SWS_Dem_01314]⌋ 内部数据中 monitorData1 的使用:如果 `DemInternalDataElement` 设置为 `DEM_MONITOR_DATA_1`,则 Dem 应使用 `Dem_SetEventStatusWithMonitorData` 调用的 monitorData1 参数值的 32 位值作为内部数据值。`c()`
⌈[SWS_Dem_00918]⌋ Dem 应将非整数数据类型 uint8[n] 视为匹配大小的整数数据类型,或者如果 `DemDataElementEndianness` 配置为 OPAQUE,则不解释内容。`(SRS_Diag_04074, SRS_Com_02041)`
⌈[SWS_Dem_00919]⌋ Dem 应将不透明数据解释为 uint8[n] 并且应始终将其映射到 n 字节大小的信号。`(SRS_Diag_04074, SRS_Com_02041)`
注:对于不透明数据字节序,转换必须配置为 OPAQUE。
⌈[SWS_Dem_00920]⌋ Dem 应将 [16] 第 2.4 章中定义的字节序转换扩展到有符号数据类型。`(SRS_Diag_04074, SRS_Com_02041)`
注:在 [16] 第 2.4 章中为无符号数据类型定义字节序转换。
⌈[SWS_Dem_01216]⌋ 为了将所需的有符号和无符号整数 AUTOSAR 数据类型序列化到 FreezeFrame/ExtendedRecord,应考虑在 `DemDataElementEndianness` 中配置的目标字节序。如果 `DemDataElementEndianness` 不存在,则应使用 `DemDataElementDefaultEndianness`。`(SRS_Diag_04189)`
##### 7.7.7.5 数据更改的通知
Dem 模块应通知其他 SW-C / BSW 模块有关事件内存中事件相关数据的更新(参见章节 8.4.3.8)。
每次完成新事件内存条目或更新现有条目时,都会发生事件相关数据的更新。
注:Dem 不评估此回调函数的返回值(例如,如果返回值不是 E_OK)。
注:配置容器 `DemCallbackEventDataChanged`(在 `DemEventParameter` 中)用于指定每个事件的相关端口或 c-callback。
⌈[SWS_Dem_00475]⌋ 如果事件内存条目的"事件相关数据"(扩展数据或冻结帧数据)被添加或更新 AND 通过 `DemCallbackEventDataChanged` 配置了数据更改的通知,则 Dem 应触发这些配置的事件特定通知以及一般通知 `GeneralCallbackEventDataChanged`。在事件报告为以下情况时,应触发 datachanged-callback:
- `DEM_EVENT_STATUS_PASSED`
- `DEM_EVENT_STATUS_PREPASSED`
- `DEM_EVENT_STATUS_FDC_THRESHOLD_REACHED`
`(SRS_Diag_04155)`
注:在以下情况下:
- 删除
- 位移(参见章节 7.7.2.4)
- 老化(参见章节 7.7.8)
Dem 不会触发 datachanged-callback。
⌈[SWS_Dem_01062]⌋ 函数 `Dem_GetEventExtendedDataRecordEx` 和 `Dem_GetEventFreezeFrameDataEx` 应仅考虑主要和用户定义内存。`(SRS_Diag_04074)`
注:事件的来源可以从 EventId(`DemMemoryDestinationRef`)派生。
⌈[SWS_Dem_00479]⌋ 函数 `Dem_GetEventFreezeFrameDataEx` 应报告所请求诊断事件(EventId)的所请求冻结帧记录(由参数 RecordNumber 定义,RecordNumber 等于 0xFF 除外)中 DID(由参数 DataId 定义)的数据。如果 RecordNumber 等于 0xFF 且参数 `DemTypeOfFreezeFrameRecordNumeration` 设置为 `DEM_FF_RECNUM_CALCULATED`(参见 `DemPrimaryMemory` 或 `DemUserDefinedMemory`),则应使用最近的记录,否则应返回 `E_NOT_OK`。`(SRS_Diag_04024)`
⌈[SWS_Dem_01194]⌋ 函数 `Dem_GetEventFreezeFrameDataEx` 应在使用 RecordNumber 0x00 调用时返回 WWH-OBD 冻结帧。如果不支持 WWH-OBD,则该函数应返回 `DEM_NO_SUCH_ELEMENT`(参见 `DemOBDSupport`)。`(SRS_Diag_04024)`
⌈[SWS_Dem_00991]⌋ 函数 `Dem_GetEventFreezeFrameDataEx` 的目标缓冲区(`DestBuffer`)中的数据格式是原始十六进制值,不包含 RecordNumber 或 DataId 等标头信息。缓冲区的大小等于所有相应数据元素的配置设置。`(SRS_Diag_04127)`
⌈[SWS_Dem_00477]⌋ 函数 `Dem_GetEventExtendedDataRecordEx` 应报告所请求诊断事件的扩展数据记录的数据。`(SRS_Diag_04195)`
⌈[SWS_Dem_00989]⌋ 函数 `Dem_GetEventExtendedDataRecordEx` 的目标缓冲区(`DestBuffer`)中的数据格式是原始十六进制值,不包含 RecordNumber 等标头信息。`(SRS_Diag_04074)`
注:Dcm 使用函数 `Dem_GetNextExtendedDataRecord` 而不是函数 `Dem_GetEventExtendedDataRecordEx`。
⌈[SWS_Dem_00995]⌋ 如果在 `GeneralCallbackEventDataChanged` 或 `CallbackEventDataChanged` 的上下文中调用接口 `Dem_GetEventFreezeFrameDataEx` 和 `Dem_GetEventExtendedDataRecordEx`,则触发事件的数据应可检索(不允许返回值 `E_NOT_OK`)。`(SRS_Diag_04074, SRS_Diag_04189)`
⌈[SWS_Dem_00996]⌋ `Dem_GetEventFreezeFrameDataEx` 应在所请求的 FreezeFrame 数据当前不可访问的情况下(例如在应用程序异步抢占数据检索的情况下)返回 `E_NOT_OK`。`(SRS_Diag_04074)`
⌈[SWS_Dem_00997]⌋ `Dem_GetEventExtendedDataRecordEx` 应在所请求的数据当前不可访问的情况下(例如在应用程序异步抢占数据检索的情况下)返回 `E_NOT_OK`。`(SRS_Diag_04074)`
#### 7.7.8 诊断事件的老化
Dem 模块提供在特定时间段(操作循环)内未满足其故障条件时从事件内存中删除特定事件的能力。此过程称为"老化"或"遗忘"。
```text
Operation Cycle completed
for at least one of the events
assigned to the indicator and
no other event is failed
[FALSE]
WarningIndicatorOn-
CriteriaFulfilled?
[TRUE]
[OCY completed && TFTOC==0 && TNCTOC==0]
HealingCounter-- Process healing
[TFTOC==1]
[HealingCounter==0]
WarningIndicatorOff-
CriteriaFulfilled!
try to allocate an
event memory entry
[FALSE] Event memory [TFTOC==1]
entry exists?
[TRUE]
[Aging cycle completed && TNCTOC==0]
count further AgingCounter
[TFTOC==1]
Process aging
[DemAgingCycleCounterThreshold reached]
Delete event
memory entry,
CDTC=0
Figure 7.43: General diagnostic event deletion processing
```
⌈[SWS_Dem_00698]⌋ 当愈合完成(WarningIndicatorRequested 位 == 0,参见图 7.43)时,老化过程(老化计数器计数)开始。`(SRS_Diag_04133, SRS_Diag_04178)`
⌈[SWS_Dem_00019]⌋ Dem 模块应至少为每个事件内存条目支持一个老化计数器。`(SRS_Diag_04133, SRS_Diag_04068, SRS_Diag_04178)`
⌈[SWS_Dem_00985]⌋ 老化计数器应基于引用的老化/操作循环(参见配置参数 `DemAgingCycleRef`)计算,如果为此事件启用了老化(参见 `DemAgingAllowed`)。`(SRS_Diag_04133, SRS_Diag_04068, SRS_Diag_04178)`
⌈[SWS_Dem_00492]⌋ Dem 模块应能够覆盖每个单独事件内存条目的当前老化计数器值,以支持输出。`c()`
注:对于扩展故障分析,可以将老化计数器的当前值映射到扩展数据记录的特定数据元素(参见章节 7.7.7.3 "扩展数据的存储")。
⌈[SWS_Dem_00493]⌋ `DemAgingCycleCounterThreshold` 或 `DemAgingCycleCounterThresholdForTFSLC`(取决于哪个值更高)定义完成的老化循环数,在此之后事件内存条目应从事件内存中删除(老化)。`c()`
注:已完成老化循环的定义参见 [SWS_Dem_00489]。
⌈[SWS_Dem_00823]⌋ 如果配置参数 `DemResetConfirmedBitOnOverflow` 设置为 false,且事件具有 UDS 状态位 3 设置并被限定为通过且未存储在事件内存条目中,则 Dem 模块应尝试分配事件内存条目以获取老化计数器。`(SRS_Diag_04067)`
注:如果无法分配事件内存条目,则老化延迟,直到事件内存条目变为可用。(通过 [SWS_Dem_00823] 或 [SWS_Dem_00824])。
⌈[SWS_Dem_00824]⌋ 如果配置参数 `DemResetConfirmedBitOnOverflow` 设置为 false 且发生事件内存条目老化,则 Dem 模块应检查其他具有 UDS 状态位 3 设置为 1 且 UDS 状态位 0 设置为 0 的事件。如果找到这样的事件,则 Dem 应分配事件内存位置以获取老化计数器。`(SRS_Diag_04133)`
注:选择哪个事件的优先级是特定于实现的。
⌈[SWS_Dem_00498]⌋ 在事件老化计数器达到阈值 `DemAgingCycleCounterThreshold` 时,UDS 状态位 3 应设置为 0。`(SRS_Diag_04133)`
注:所有其他 UDS 状态位都不会通过相应事件内存条目的老化进行修改。
⌈[SWS_Dem_00161]⌋ Dem 模块应按新事件处理重新出现的已学习事件,因为它们之前已通过老化从事件内存中删除。`(SRS_Diag_04195)`
⌈[SWS_Dem_00489]⌋ Dem 模块应仅在相关事件存储在事件内存中且被限定为通过的情况下,才允许处理(进一步计数)老化计数器的值。`(SRS_Diag_04133)`
注:老化独立于 UDS 状态位 3,因此独立于故障确认(参见章节 7.7.4)。
⌈[SWS_Dem_01054]⌋ 在事件老化计数器达到阈值 `DemAgingCycleCounterThresholdForTFSLC` 时,如果 `DemStatusBitHandlingTestFailedSinceLastClear` 设置为 `DEM_STATUS_BIT_AGING_AND_DISPLACEMENT`,则 UDS 状态位 5(`TestFailedSinceLastClear`)应设置为 0。如果未配置参数 `DemAgingCycleCounterThresholdForTFSLC`,则 `TestFailedSinceLastClear` 将不会老化。`(SRS_Diag_04133)`
⌈[SWS_Dem_01075]⌋ 在事件老化时,Dem 应从事件内存中删除事件相关的快照数据(冻结帧)和扩展数据记录。`(SRS_Diag_04065)`
⌈[SWS_Dem_01185]⌋ 如果没有内存位置可用或被单个事件占用,则此事件的 UDS 状态位 `TestFailedSinceLastClear` 将不会老化。`(SRS_Diag_04065, SRS_Diag_04133)`
⌈[SWS_Dem_00494]⌋ Dem 模块应提供配置参数 `DemAgingCycleRef`(参见 `DemDTCAttributes`),定义事件特定的操作/老化循环,其状态更改触发老化计数器值的处理(进一步计数)。`c()`
注:有关操作循环的处理,请参阅章节 7.6。
⌈[SWS_Dem_00490]⌋ 如果配置参数 `DemAgingRequiresTestedCycle` 设置为 False,则 Dem 模块应在相应老化循环结束/重新启动时处理(进一步计数)老化计数器值。`(SRS_Diag_04133)`
注:[SWS_Dem_00490] 中的老化计数器也会在相应老化循环中没有新的测试结果时处理。
⌈[SWS_Dem_00826]⌋ 如果配置参数 `DemAgingRequiresTestedCycle` 设置为 True,则 Dem 模块应在相应老化循环结束/重新启动且 UDS 状态位 6 设置为零时处理(进一步计数)老化循环计数器值。`(SRS_Diag_04178)`
⌈[SWS_Dem_01214]⌋ 如果配置参数 `DemAgingRequiresNotFailedCycle` 设置为 true,则老化计数器应仅在没有测试失败报告的操作循环中处理。`(SRS_Diag_04133)`
⌈[SWS_Dem_01215]⌋ 如果配置参数 `DemAgingRequiresNotFailedCycle` 设置为 false,则老化计数器行为不应受影响。`(SRS_Diag_04133)`
#### 7.7.9 诊断事件的愈合
Dem 模块提供按事件内存中存储的事件激活和停用指示器的能力。停用过程定义为诊断事件的愈合(参见图 7.43)。
⌈[SWS_Dem_01056]⌋ Dem 应仅使用当前操作循环 `DemOperationCycleRef` 处理已通过事件的愈合。`c()`
##### 7.7.9.1 警告指示器处理
Dem 内警告指示器处理的详细配置如图 7.44 所示。
```text
DemGeneral: +subContainer
EcucParamConfContainerDef DemOperationCycle:
EcucParamConfContainerDef
upperMultiplicity = 1 DemMILIndicatorRef: EcucReferenceDef
lowerMultiplicity = 1 upperMultiplicity = 256
lowerMultiplicity = 1
upperMultiplicity = 1
lowerMultiplicity = 0
+destination
DemIndicator: EcucParamConfContainerDef
upperMultiplicity = 255
lowerMultiplicity = 0
+destination
DemEventParameter:
EcucParamConfContainerDef
upperMultiplicity = 65535
lowerMultiplicity = 1
+subContainer
DemIndicatorAttribute:
EcucParamConfContainerDef DemIndicatorRef: EcucReferenceDef
+reference
upperMultiplicity = 255
lowerMultiplicity = 0
DemIndicatorFailureCycleCounterThreshold:
EcucIntegerParamDef
+parameter
max = 255
min = 1
lowerMultiplicity = 0
upperMultiplicity = 1
DemIndicatorHealingCycleCounterThreshold:
EcucIntegerParamDef
+parameter
max = 255
min = 0
lowerMultiplicity = 1
upperMultiplicity = 1
+literal
DemIndicatorBehaviour: DEM_INDICATOR_CONTINUOUS:
EcucEnumerationParamDef EcucEnumerationLiteralDef
+literal
DEM_INDICATOR_BLINK_CONT:
EcucEnumerationLiteralDef
+parameter +literal
DEM_INDICATOR_BLINKING:
EcucEnumerationLiteralDef
+literal
DEM_INDICATOR_SLOW_FLASH:
EcucEnumerationLiteralDef
+literal
DEM_INDICATOR_FAST_FLASH:
EcucEnumerationLiteralDef
Figure 7.44: Warning indicator configuration
```
Dem 模块支持事件特定的计数器以激活和停用指示器。这些计数器基于配置的故障和愈合循环计算(例如,在故障确认后打开 MIL,并在随后的三个 OBD 驾驶循环的愈合后关闭 MIL)。
注:在 Dem 模块的集成过程中,可以将不同的指示器和行为(例如指示灯、文本消息或图标)分配给事件。
⌈[SWS_Dem_00566]⌋ 如果为特定事件配置了多个指示器,则 Dem 模块应使用分配给此事件的所有合并警告指示器的逻辑 OR 运算来计算 UDS 状态位 7(WarningIndicator)。`(SRS_Diag_04067)`
⌈[SWS_Dem_00501]⌋ 条件 `WarningIndicatorOnCriteriaFulfilled` 应在至少一个相应事件指示器故障计数器达到其 `DemIndicatorFailureCycleCounterThreshold` 的测试和失败 `DemOperationCycles` 时满足。`(SRS_Diag_04069)`
⌈[SWS_Dem_00503]⌋ 如果配置了指示器(通过 `DemIndicatorAttribute`),则 Dem 模块应在操作循环结束时将 UDS 状态位 7(`WarningIndicatorRequested`)设置为 0,如果满足以下条件:
- 至少一个 `DemIndicatorHealingCycleCounterThreshold` 不等于 0
- 所有相应事件指示器愈合计数器已达到其测试和通过愈合 `DemOperationCycles` 的 `DemIndicatorHealingCycleCounterThreshold`(等于 `WarningIndicatorOffCriteriaFulfilled`)
- WIR 位未通过调用 API `Dem_SetWIRStatus` 启用
`(SRS_Diag_04069)`
⌈[SWS_Dem_01233]⌋ 如果配置了指示器(通过 `DemIndicatorAttribute`),则 Dem 模块应在事件报告/限定为 PASSED 时将 UDS 状态位 7(`WarningIndicatorRequested`)设置为 0,如果满足以下条件:
- 所有 `DemIndicatorHealingCycleCounterThreshold` 等于 0
- WIR 位未通过调用 API `Dem_SetWIRStatus` 启用
`(SRS_Diag_04069)`
##### 7.7.9.2 用户控制的 WarningIndicatorRequested 位
在某些情况下(例如控制应用程序中的故障安全反应),Dem 中相应事件的 WIR 位应由特殊的"故障安全 SW-C"设置/重置。
故障安全 SW-C 必须确保 WIR 位的正确状态(例如,根据 ISO-14229-1 [2] 或制造商特定要求)。因此,故障安全 SW-C 可以使用现有的 Dem 机制来获取有关 Dem 中事件状态更改的信息(例如 Callback `EventUdsStatusChanged`)。
故障安全 SW-C 应向 Dem 报告所需的 WIR 状态(通过 `Dem_SetWIRStatus`),并且必须确保事件的当前 WIR 状态(在 Dem 中)适合应用程序中的当前故障安全状态:
- 故障安全运行:WIR 位应设置为 "1"
- 故障安全未运行:WIR 位应设置为 "0"
故障安全 SW-C 必须在每次故障安全状态更改后报告状态。每次调用 `Dem_SetWIRStatus` 都会更新相应事件的 WIR 位(参见参数 EventId)。
由于在 ECU 关断时不存储 StatusOfDTC 位 7(WIR 位),故障安全 SW-C 必须确保在 `Dem_Init` 之后事件的 WIR 位适合当前的故障安全状态。
⌈[SWS_Dem_00831]⌋ Dem 应提供控制(设置/重置)已配置事件的 WarningIndicatorRequested 位的函数(例如,关于故障安全状态)。`(SRS_Diag_04128)`
⌈[SWS_Dem_00832]⌋ 事件的 WIR 位的设置可以通过 `Dem_SetWIRStatus` 或通过 Dem 内部 WIR 位处理控制。(OR 运算)。`(SRS_Diag_04128)`
注:例如,对于 OBD 系统,需要同时使用 `Dem_SetWIRStatus` 和 Dem 内部 WIR 位处理(同时),其中 WIR 位需要根据法规激活(Dem 内部),并且系统反应由同一事件控制。因此,WIR 位需要保持活动状态,直到系统反应被停用(`Dem_SetWIRStatus`)。
⌈[SWS_Dem_00833]⌋ 如果使用参数 `WIRStatus = TRUE` 调用 `Dem_SetWIRStatus`,则相应事件的 WIR 位应设置为 "1"。`(SRS_Diag_04128)`
⌈[SWS_Dem_00834]⌋ 如果使用 `WIRStatus = FALSE` 调用 `Dem_SetWIRStatus` 且未设置引用的 Dem 指示器,则相应事件的 WIR 位应设置为 "0"。`(SRS_Diag_04128)`
⌈[SWS_Dem_00836]⌋ 在 ControlDTCSettings 禁用期间,事件的 WIR 位不应通过 `Dem_SetWIRStatus` 更改,并且该函数应返回 `E_NOT_OK`。`(SRS_Diag_04128)`
注:如果故障安全应用程序无法设置 WIR 位(`Dem_SetWIRStatus` 返回 `E_NOT_OK`),则故障安全应用程序需要观察事件的一般状态并自行协调 `Dem_SetWIRStatus` 的重试,例如通过使用参数 `DEM_INIT_MONITOR_REENABLED` 的回调函数 `InitMonitorForEvent`。
⌈[SWS_Dem_01303]⌋ `Dem_SetWirStatus` 的异步行为:Dem 应异步处理 `Dem_SetWIRStatus` 的调用。这意味着最终结果在稍后的时间点可用。`(SRS_Diag_04069)`。稍后的时间点意味着特定于实现,它可以是下一个主函数并在 `Dem_SetWIRStatus` 返回之后。
##### 7.7.9.3 警告指示灯(MIL)的处理
⌈[SWS_Dem_00546]⌋ 对于 OBD 相关 ECU,Dem 模块应提供配置参数 `DemMILIndicatorRef` 以指示配置的指示器控制 MIL 的激活和停用。`(SRS_Diag_04110)`
⌈[SWS_Dem_00567]⌋ 如果为 OBD 相关 ECU 的 MIL 控制配置了指示器,则 Dem 模块应使用此事件的配置事件故障循环计数器(参见 0 故障确认)来定义测试和失败循环的最大数量,然后存储的事件激活相应的指示器。`(SRS_Diag_04069)`
注:对于 OBD 系统,故障指示灯(MIL)的激活与输入已确认状态相关联。因此,事件特定的故障确认计数器(参见配置参数 `DemEventConfirmationThreshold` 和 `DemOperationCycleRef`)必须与指示器故障循环计数器一致。
注:离开 Pending 状态和 MIL 的停用由指示器愈合循环计数器的配置控制。
⌈[SWS_Dem_00701]⌋ 如果 MIL 被停用且事件已确认,则应根据 [SWS_Dem_00567] 重新激活 MIL,即再次根据指示器故障循环计数器达到其阈值。`(SRS_Diag_04069)`
⌈[SWS_Dem_00535]⌋ 对于 OBD 相关事件,指示器循环应基于 OBD 法规定义的循环。`(SRS_Diag_04069)`
⌈[SWS_Dem_CONSTR_06165]⌋ `DemMILIndicatorRef` 的依赖性:`DemMILIndicatorRef` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
##### 7.7.9.4 警告指示器状态的通知和设置
⌈[SWS_Dem_00046]⌋ Dem 模块应提供 API `Dem_GetIndicatorStatus`,以便软件组件可以获取有关计算的指示器状态的信息。`(SRS_Diag_04069)`
### 7.8 BSW 错误处理
除应用软件组件外,基本软件(BSW)也可以检测错误(例如硬件驱动器故障),特别是在启动期间(有关详细信息,请参阅文档 [11])。对于这些错误(与应用特定事件相比只有少量),一些其他方面适用:
- 错误可以在 Dem 完全初始化之前的启动期间检测到
- 错误可以在启动期间报告,信息需要缓冲,直到 Dem 完全可用
- 错误可以在启动和关闭之间报告,信息需要缓冲并需要由 Dem 主函数处理(RTE 相关的调用树要求)
- 事件内存中的条目可以具有不同的配置(例如,不强调修理厂的冻结帧数据)
`Dem_SetEventStatus` 由 BSW 模块用于在 Dem 模块预初始化的时间点报告错误。在 `Dem_Init` 中,排队的 events 被处理。在正常操作期间(完全初始化之后),API `Dem_SetEventStatus` 的排队机制对于在 Dem 模块的主函数内处理报告的故障是必要的。
`Dem_SetEventStatus` 可由 BSW 模块用于在 Dem 模块预初始化的时间点报告错误。在 `Dem_Init` 中,排队的 events 被处理。
⌈[SWS_Dem_01212]⌋ 在 `Dem_PreInit` 之后,Dem 应支持通过使用 `EventStatus` 设置为 `DEM_EVENT_STATUS_PREPASSED` 或 `DEM_EVENT_STATUS_PREFAILED` 的 API `Dem_SetEventStatus` 进行去抖。`(SRS_BSW_00339)`
Fim 可以以触发或轮询模式运行。对于初始化序列,此模式并不重要,Dem 始终初始化 Fim。
⌈[SWS_Dem_01213]⌋ Dem 内部去抖(计数器和计时器)应通过调用 `Dem_PreInit` 进行初始化。`(SRS_Diag_04068)`
⌈[SWS_Dem_00167]⌋ Dem 模块应提供缓冲机制以对在 `Dem_Init` 之前通过 `Dem_SetEventStatus` 报告为限定为通过或失败或达到限定(去抖)的事件进行排队。不应对 `DEM_EVENT_STATUS_FDC_THRESHOLD_REACHED` 的报告进行排队。`(SRS_BSW_00339)`
⌈[SWS_Dem_00207]⌋ 在 Dem 未初始化时使用的 `Dem_SetEventStatus` 函数的队列大小可由配置参数 `DemBswErrorBufferSize` 配置。`(SRS_BSW_00339)`
⌈[SWS_Dem_01079]⌋ Dem 应根据在 `Dem_Init` 之前可报告的事件数确定队列大小,即具有未定义 `DemReportBehavior` 或 `DemReportBehavior = REPORT_BEFORE_INIT` 的事件。如果配置了 `DemBswErrorBufferSize`,它将覆盖队列的计算大小。`(SRS_BSW_00339)`
```text
BSW (below RTE) SW-C (above RTE)
Dem_SetEventStatus() Dem_SetEventStatus()
API Port
Available during startup
and normal operation
Available during
normal operation
Buffer
Dem_Init()
Dem_MainFunction()
Event Memory
Dem
Figure 7.45: Dem_SetEventStatus buffering behavior
```
⌈[SWS_Dem_01289]⌋ 在 `Dem_PreInit` 之后和 `Dem_Init` 之前通过 `Dem_SetEventStatus` 报告的所有事件不应触发任何监视器状态更改回调。`(SRS_BSW_00339)`
### 7.9 OBD 特定功能
#### 7.9.1 概述和限制
下面介绍了 AUTOSAR 中 OBD 处理的规范。此处,"OBD"用于指代针对不同目标市场的汽车 OBD。出于 SW 共享和分布式开发原因以及打包和发布责任的考虑,OBD 相关的信息/数据结构需要通过标准化的 AUTOSAR 接口进行报告。
在车辆中可以有 3 种不同类型的 OBD ECU:
- **Master ECU**(每辆车一个),在 WWH-OBD [3] 中引用为 VOBD
- **Primary ECU**(每辆车多个)
- **Dependent / Secondary ECUs**(每辆车多个)
从基础软件的角度来看,Dependent / Secondary ECU 不需要任何特定的 OBD 功能。在 Dependent / Secondary ECU 中始终与 Master 或 Primary ECU 相关。在 Dependent / Secondary ECU 中,OBD 相关信息不会存储在基础软件中(例如,OBD 事件将通过总线系统转发到相应的 Master 或 Primary ECU)。在 Dependent / Secondary ECU 中,"报告的错误"和其他 OBD 功能可能由 SW 组件处理。
下表概述了必须在 Master ECU、Primary ECU 或 Dependent / Secondary ECU 中支持哪些 OBD 功能:
| 功能 | Master ECU | Primary ECU | Dependent / Secondary ECU |
|---|---|---|---|
| OBD 事件内存 | 自有和 Dep./Sec ECU 的"报告错误" | 自有和 Dep./Sec ECU 的"报告错误" | 无 |
| MIL Master | 是 | 否 | 否 |
| 按车辆就绪状态(PID $90) | 是 | 否 | 否 |
| 按 ECU 就绪状态(PID $91) | 是 | 是 | 否 |
| 车辆 OBD 计数器(PID $93) | 是 | 否 | 否 |
| 一般信息的计算和提供(DYC、General Nominator、PFC cycle、..) | 是 | 否 | 否 |
| 一般信息的接收和执行(DYC、General Nominator、PFC cycle、..) | (是) | 是 | 否 |
| Continuous-MI 计数器 | 是 | 否 | 否 |
| Cumulative Continuous-MI 计数器 | 是 | 否 | 否 |
| 标定识别(CAL-ID) | 不在 BSW 中 | 不在 BSW 中 | 不在 BSW 中 |
| 标定验证号(CVN) | 不在 BSW 中 | 不在 BSW 中 | 不在 BSW 中 |
**表 7.3:不同 OBD ECU 中的 OBD 功能概述**
以下 OBD 需求仅对 Master 和 Primary ECU 有效。如有必要,OBD 需求区分 Master 和 Primary 需求。Master 和 Primary ECU 应具有与 SW-C 相同的接口。为了构建充分且精简的 Master ECU,没有强制使用这些接口。Dem 与特定 SW-C 之间交互的一些细节可能仍未公开,因为它们取决于 Dem 和 SW-C 实现。未定义以下功能:
- 故障指示灯(MIL)激活(Dem 到 MIL 处理程序的接口、MIL 灯泡检查、就绪闪烁、催化剂损坏失火时的闪烁、Continuous-MI、Short-MI、On-demand MI 等)
- 失火故障处理(公共去抖、过滤单个/多个失火故障)
但是,本 Dem SWS 未规定如何在 Dem 模块内实现 OBD 合规性的实现细节,例如关于状态处理。此外,Dem SWS 未规定实现 OBD 合规性所需的 SW-C 的诊断算法的实现细节(如何检测故障、何时触发 IUMPR-numerator 递增等)。
在以下章节中,描述了 OBD 相关功能和接口。重要的是要注意,独立于标准 Autosar 机制(例如通过 RTE 通信),响应代码和时序约束需要满足 OBD 要求(参见 [12] 和 [17])。
⌈[SWS_Dem_01248]⌋ 配置参数 `DemOBDEventMemorySetRef` 应用作引用包含 OBD 相关信息的唯一一个 `DemEventMemorySet`。Dem 的所有 OBD 操作应仅在此 `DemEventMemorySet` 上执行。`(SRS_Diag_04001)`
⌈[SWS_Dem_00584]⌋ 在应用标准机制(如 `Std_ReturnType`)时,Dem 模块应仅返回值,以确保 OBD 合规行为符合允许的响应代码和时序约束。`(SRS_Diag_04010)`
**一般信息数据的计算和提供:**
Master ECU 应通过总线系统向 Primary ECU 计算和提供以下一般信息数据:
- OBD 驾驶循环信息(DYC)
- General Nominator / 基于速率的监视 - 驾驶循环(RBM 循环)
- 暖机循环(WUC)
- 点火循环
- 限定的 OBD 驾驶循环
- 永久故障代码 - 驾驶循环(PFC 循环)
**OBD 驾驶循环信息(DYC):**
Master ECU 将通过总线系统提供驾驶循环信息(DYC)。驾驶循环信息(DYC)不应在 Primary ECU 内部计算。
**General Nominator / 基于速率的监视 - 驾驶循环(RBM 循环):**
包括在 IUMPR-Cycle Flag 中。
**暖机循环(WUC):**
暖机循环(WUC)是法定循环,由 Master ECU 计算。Master ECU 将通过总线系统提供暖机循环信息(WUC)。
**点火循环:**
点火循环描述"Terminal 15 on"状态和"Terminal 15 off"之间的循环,包括电子控制单元的关闭/余运行阶段(如果在"Terminal 15 on"之后满足发动机启动条件至少 2 秒)。Master ECU 将通过总线系统提供点火循环信息。
**限定的 OBD 驾驶循环:**
限定的 OBD 驾驶循环是法定循环,具有以下定义:对于燃烧发动机(非混合动力):驾驶循环从"点火开启"开始,并在下次"点火开启"时结束,如果发动机在此之间已达到第一次发动机启动条件至少 2 秒(+/- 1 秒)。并非由驾驶员或 ECU 引起的发动机停止不会结束驾驶循环。
对于混合动力和具有关闭策略的发动机,驾驶循环定义为"点火开启"与驾驶循环限定之后的下一个"点火开启"之间的时间。如果驾驶循环已限定,则每个"点火关闭 > 点火开启 - 事件"都会导致新驾驶循环的开始。此新驾驶循环应被限定。当发动机转速已超过发动机启动条件的最低转速至少 2 秒(+/- 1 秒)或驾驶准备条件至少 2 秒(+/- 1 秒)时,驾驶循环被限定。
**永久故障代码 - 驾驶循环(PFC 循环):**
(参见章节 7.9.5.8)
注:标定识别(CAL-ID)和标定验证号(CVN)
CAL-ID 和 CVN 的计算不是 BSW 任务,不会由 Dem 处理。
#### 7.9.2 Dem 提供的 PID
⌈[SWS_Dem_00293]⌋ 对于以下 PID,数据布局应符合 SAE J1979DA [18]。
- PID $01 自清除 DTC 以来的监视器状态(4 字节)
- PID $021 导致所需冻结帧存储的 DTC(2 字节)
- PID $1C 车辆或发动机认证的 OBD 要求(1 字节)
- PID $21 MIL 激活时所行驶的距离(2 字节)
- PID $30 自清除 DTC 以来的暖机次数(WUC)(1 字节)
- PID $31 自清除 DTC 以来的行驶距离(2 字节)
- PID $41 此驾驶循环的监视器状态(4 字节)
- PID $4D MIL 激活时的发动机运行时间(2 字节)
- PID $4E 自清除 DTC 以来的发动机运行时间(2 字节)
- PID $91 ECU OBD 系统信息(5 字节)
`c()`
注:PID $90 和 $93 在 VOBD 的应用程序中计算。Primary ECU 仅提供用于检索相关数据的接口。
```text
1
PID $02 is only required for service $02 and therefore no interface (like
Dem_DcmReadDataOfPID02) is necessary. Instead the API Dem_DcmGetDTCOfOBDFreezeFrame is
used (refer to[SWS_Dem_00623])
```
⌈[SWS_Dem_CONSTR_06150]⌋ 容器 `DemPidClass` 的依赖性:容器 `DemPidClass` 及其聚合子容器仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应存在。`c()`
⌈[SWS_Dem_00351]⌋ Dem 模块应计算并提供已确认故障的数量(PID $01,字节 A)。`(SRS_Diag_04141)`
⌈[SWS_Dem_01137]⌋ 对于 WWH-OBD,PID$01 不应提供已确认故障的数量。`(SRS_Diag_04141)`
⌈[SWS_Dem_01138]⌋ Dem 模块应计算并提供 ECU MIL 状态(PID $01,字节 A)。`(SRS_Diag_04141)`
⌈[SWS_Dem_01139]⌋ 对于 WWH-OBD,PID$01 不应提供 ECU MIL 状态。`(SRS_Diag_04141)`
⌈[SWS_Dem_00748]⌋ 函数 `Dem_DcmReadDataOfPID1C` 应根据相应标准 [12] 返回适当的值"车辆或发动机认证的 OBD 要求",例如 OBD、OBDII、JOBD 等。要返回的 `PID1Cvalue` 在配置参数 `DemOBDCompliancy` 中定义。`(SRS_Diag_04141)`
##### 7.9.2.1 集中式 PID $21 / $31 / $4D / $4E 处理
⌈[SWS_Dem_00703]⌋ Master ECU 的 Dem 应计算整个车辆的 PID $31 / $4D / $4E 信息。`c()`
不允许 Primary ECU 计算 PID $31 / $4D / $4E 的信息。
注:因此,Master ECU 的软件组件将使用 API `Dem_DcmReadDataOfPID`(其中 NN 是 31 / 4D / 4E)读出信息,并将 PID $31 / $4D / $4E 的里程/时间信息通过总线系统提供给 Primary ECU。
在 Primary ECU 的软件组件通过总线系统接收到 PID $31 / $4D / $4E 的信息后,软件组件将通过调用 Primary ECU 的 Dem 的 API `Dem_SetDataOfPID`(其中 NN 是 31 / 4D / 4E)来设置 PID $31 / 4D / 4E。
⌈[SWS_Dem_00704]⌋ 只有 Master ECU 允许向扫描工具报告 PID $31 / $4D / $4E 的信息。`c()`
不允许 Primary ECU 向扫描工具报告 PID $31 / $4D / $4E 的信息。
在 Primary ECU 的软件组件通过总线系统接收到 PID $21 的信息后,软件组件将通过调用 Primary ECU 的 Dem 的 API `Dem_SetDataOfPID21` 来设置 PID $21,以与 OBD Master ECU 同步值。
⌈[SWS_Dem_00346]⌋ Dem 模块应使用 PID $0D(参见章节 7.11.7)来计算 PID $21 和 PID $31。`c()`
⌈[SWS_Dem_00304]⌋ Dem 提供应提供到 Dcm 的函数调用接口以及相应的 ServiceNeeds,以向 Dcm 声明支持这些 PID。`c()`
⌈[SWS_Dem_00347]⌋ 如果支持 PID $1E(辅助输入状态),则应在 Dem 模块内实现 PTO(Power Take Off)相关的事件状态处理(参见 [19])。`c()`
⌈[SWS_Dem_00377]⌋ Dem 模块应提供接口 `Dem_SetPtoStatus`,允许实现 PTO 功能的 SWC 通知 Dem 模块 PTO 是活动还是非活动(参见章节 8)。`c()`
⌈[SWS_Dem_00378]⌋ Dem 模块应支持配置参数 `DemConsiderPtoStatus`,指示某个事件受 Dem PTO 处理的影响。`c()`
Dem 模块提供配置开关 `DemPTOSupport` 以启用或禁用 PID $1E 的使用。
对 PID $01 和 $41 的计算应用特殊配置:
⌈[SWS_Dem_00349]⌋ Dem 模块应支持 OBD 系统的配置参数 `DemEventOBDReadinessGroup`,以将各个事件分配给一个特定的就绪组。`c()`
根据 SAEJ1979 [17],AirCondition Component 组不再支持。但是,它仍包含在 ISO 15031-5 [12] 中。这些组区分火花点火发动机(spark)和压缩点火发动机(compr.)。但是,需要按事件配置监视器贡献的就绪组(如果有)。
**PID $21 处理**
PID $21 仅由 OBD Master ECU 报告,或由所有 OBD ECU 同步(集中式 PID 处理)。
如果配置开关 `DemOBDCentralizedPID21Handling` 启用:
OBD Master ECU 的软件组件可以通过 Dem 模块的接口 `GetDataOfPID21` 检索当前 PID $21 值,目的是将该值分发到车辆中的所有其他 Primary ECU。
通过总线系统在 OBD Primary ECU 的软件组件中接收 PID $21 的信息后,软件组件可以通过接口 `SetDataOfPID21` 将此信息转发到 Dem 模块,以与 OBD Master ECU 同步值。
⌈[SWS_Dem_01095]⌋ 在调用 `Dem_SetDataOfPID21` 时,内部 PID $21 值应更新。`c()`
注:AUTOSAR 定义 OBD Primary ECU 不计算 PID $21 值。
⌈[SWS_Dem_01096]⌋ OBD Master ECU 应自行计算 PID $21 值(考虑 [SWS_Dem_00346])。`c()`
⌈[SWS_Dem_01097]⌋ 在调用 `Dem_GetDataOfPID21` 时,应返回内部计算的 PID $21 值。`c()`
注:AUTOSAR 定义 OBD Primary ECU 不计算 PID $21 值。
⌈[SWS_Dem_01098]⌋ 在调用 `Dem_DcmReadDataOfPID21` 时,Dem 应返回 PID $21 的当前值。`c()`
⌈[SWS_Dem_01099]⌋ 如果在 `Dem_SetDataOfPID21` 之前调用 `Dem_DcmReadDataOfPID21`,则 Dem 应将 0xFFFF 作为 PID $21 值返回。`c()`
#### 7.9.3 就绪状态
⌈[SWS_Dem_00354]⌋ Dem 模块应计算 PID $01 的就绪状态(如果 `DemEventOBDReadinessGroup` 的所有事件自上次清除以来已报告为 OK 测试,或该事件已导致 MIL 开启)。应忽略此计算的抑制事件(参见章节 7.4.8)。`c()`
注:`DemEventOBDReadinessGroup` 具有法规背景,并且基于 ModelYear(MY)和 Market 的特殊计算。
⌈[SWS_Dem_CONSTR_06147]⌋ `DemEventOBDReadinessGroup` 的依赖性:`DemEventOBDReadinessGroup` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 时才应存在。`c()`
⌈[SWS_Dem_00355]⌋ Dem 模块应计算 PID $41 当前驾驶循环的就绪组完成(如果当前驾驶循环中组的所有事件都已测试)。应忽略此计算的 OBD 事件抑制(参见章节 7.4.8)。`c()`
注:为了计算组就绪状态,Dem 模块考虑分配给特定就绪组的所有事件。
⌈[SWS_Dem_00356]⌋ Dem 模块应计算就绪组禁用(如果监视器为任何组的事件报告禁用状态)。应忽略此计算的 OBD 事件抑制(参见章节 7.4.8)。`c()`
⌈[SWS_Dem_00348]⌋ Dem 模块应提供事件的禁用(参见 `Dem_SetEventDisabled`)。应忽略此计算的 OBD 事件抑制(参见章节 7.4.8)。`c()`
⌈[SWS_Dem_00294]⌋ 为了允许监视器报告事件在驾驶循环中无法计算(例如由于物理原因而被中止),Dem 应提供 API `Dem_SetEventDisabled`。`c()`
注:对于 PID $41 的计算,如果在此驾驶循环结束之前无法执行测试,则监视器必须将其事件报告为禁用。
注:`SetEventDisabled` 在当前驾驶循环中将事件报告为"无法完成"。它不会根据章节 7.4.8 将事件转为事件抑制。
```text
SW-C 1 SW-C 2 SW-C 3
[DiagnosticMonitor]
à SetEventDisabled()
[DiagnosticMonitor]
RTE -> SetEventStatus()
Dem_DcmReadDataOfPID01()
Dem Dcm
Dem_DcmReadDataOfPID41()
Figure 7.46: Dem calculates PID$01 and PID$41 data based on specific port operations
```
#### 7.9.4 在用监视器性能比(IUMPR)支持
在用监视器性能比(IUMPR)指示 OBD 系统监视特定组件的频率,与车辆操作量相比。它定义为可发现故障的次数(=numerator),除以车辆操作条件已满足的次数(=denominator),如相应 OBD 法规中所定义。
IUMPR 将在 ECU 内使用以下公式计算:在用监视器性能比 = NUMERATOR / DENOMINATOR
⌈[SWS_Dem_00709]⌋ 引用抑制事件的比率不应计算。`c()`
⌈[SWS_Dem_00710]⌋ 分子应在 ECU(Master 和 Primary)内计算。`c()`
⌈[SWS_Dem_00711]⌋ Master ECU 的 Dem 应计算 IUMPR-Cycle Flag。`c()`
⌈[SWS_Dem_00966]⌋ Dem 应提供 API `Dem_GetIUMPRDenCondition` 以使软件组件能够获取 General Denominator 状态信息。`c()`
Master ECU(软件组件)将通过总线系统提供 IUMPR-Cycle Flag(包括在 General Denominator 信号中)。
⌈[SWS_Dem_00712]⌋ 在 Master 和可选的 Primary OBD ECU 中,Dem 应根据分母 `DEM_IUMPR_GENERAL_OBDCOND`(如果可用)递增 ECU 全局内部通用分母。根据系统定义,全局通用分母(因此 `DEM_IUMPR_GENERAL_OBDCOND`)在某些或甚至所有 Primary ECU 中可能不需要。在这种情况下,永远不会设置 `DEM_IUMPR_GENERAL_OBDCOND`,并且通用分母停留在 0(在 Dcm 中禁用 InfoType $08 / $0B 的报告)。`c()`
⌈[SWS_Dem_01236]⌋ Dem 应根据 `DEM_IUMPR_GENERAL_INDIVIDUAL_DENOMINATOR` 以及在 `DemIUMPRDenGroup` 中配置的附加条件递增监视器内部分母,每个驾驶循环最多一次,并且应仅在调用 Release 操作的循环中考虑监视器特定条件。`c()`
⌈[SWS_Dem_00714]⌋ Dem 应提供 API `Dem_SetIUMPRDenCondition` 以使软件组件通知 IUMPR-Cycle Flag 状态。`c()`
注:Master 的 IUMPR-Cycle Flag / General Denominator 信号超时将导致 Primary ECU 中 COM 堆栈中的事件内存条目(信号超时)。
有关在用监视器性能比(IUMPR)的更多详细信息可在法规文档中找到。
**InfoType $08 / InfoType $0B 的区分**
收集的 IUMPR 数据需要在服务 $09 请求时提供。对于汽油发动机,使用 Info Type $08,对于柴油发动机,使用 Info Type $0B(参见 [12] 和 [17])。
⌈[SWS_Dem_00298]⌋ 为了支持上述服务 $09 中的数据请求,Dem 应向 Dcm 提供 API `Dem_DcmGetInfoTypeValue08` 或 `Dem_DcmGetInfoTypeValue0B`。`c()`
⌈[SWS_Dem_00357]⌋ 如果 `DemOBDEngineType` 设置为 `DEM_IGNITION_SPARK`,则 Dem 模块应提供 API `Dem_DcmGetInfoTypeValue08` 用于 InfoType $08 IUMPR 数据。`c()`
注:服务 `Dem_DcmGetInfoTypeValue08` 将由 Dcm 使用,以根据用于服务 $09 输出的 InfoType $08 数据格式请求 IUMPR 数据。
⌈[SWS_Dem_00358]⌋ 如果 `DemOBDEngineType` 设置为 `DEM_IGNITION_COMPRESSION`,则 Dem 模块应提供 API `Dem_DcmGetInfoTypeValue0B` 用于 Info Type $0B IUMPR 数据。`c()`
注:API `Dem_DcmGetInfoTypeValue0B` 将由 Dcm 使用,以根据用于服务 $09 输出的 InfoType $0B 数据格式请求 IUMPR 数据。
OBD 系统的类型通过使用配置开关 `DemOBDSupport`(参见 `DemGeneral`)定义。
**在用监视器性能比(IUMPR)组或组件**
Dem 中基于 FID 和事件分配相关的在用监视器性能比(IUMPR)数据记录。IUMPR 数据分别为不同的组或组件记录。
通常,一个或多个事件用于监视这些组件,例如氧传感器。因此,为了记录 OBD 系统的在用性能,需要记录所有 IUMPR 组的所有相关事件的测试性能。为此,需要由 Dem 配置某些数据结构。但是,为了在监视器由于另一个事件的发生而停止时停止分子和分母的递增,需要列出可能影响特定 IUMPR 相关事件计算的所有事件。但是,此信息已包含在表示服务的 FID 中(例如,FiM SWS)计算特定事件。FID 在某些事件的情况下被禁止,因此,此关系也可用于停止 IUMPR 记录。
这导致要记录的事件与主 FID(以及可选的多个辅助 FID)的组合,表示停止 IUMPR 事件计算的所有事件。为了将事件分类为组,IUMPR 组也是此组合的一部分。
对于按 EventId / FID(s) / IUMPR 组组合的数据结构配置,引入了一个新的数据对象,即 RatioId(参见 `DemRatioId`)。因此,容器 `DemRatio` 包含 EventId、主 FID、辅助 FID、IUMPR 组以及用于配置"API use"与"observer"的接口选项,接口选项将在下面更详细地解释。
此外,为了端口配置,向 SW-C 提供 `ObdRatioServiceNeeds`。如果 SW-C 是 IUMPR 相关的,则此 ServiceNeed 已填写。
如果监视器是"对称的",即在测试完成时,即使系统中当前没有故障,也可以发现故障,则仅通过观察分配事件的 TESTED 状态就可以递增分子。
⌈[SWS_Dem_00359]⌋ 仅对于配置有选项"observer"的监视器,如果分配的事件已测试/限定(通过或失败),则 Dem 模块应递增相应监视器的分子。`(SRS_Diag_04001)`
如果诊断是不对称的,并且检测故障比检测 OK 状态需要更多的工作,则监视器需要调用 API 以报告可以发现故障,因为这可能需要在监视器内进行一些模拟,因此不能纯粹从 TESTED 状态派生。
⌈[SWS_Dem_00360]⌋ 对于 OBD 相关系统,Dem 模块应提供 API `Dem_RepIUMPRFaultDetect`。`c()`
⌈[SWS_Dem_00296]⌋ Dem 模块应为非对称监视器提供 API `Dem_RepIUMPRFaultDetect` 以报告可以发现故障。`c()`
注:根据 IUMPR 法规,此服务应由监视器用于报告即使根据所有条件已满足故障检测也可以发现故障。
⌈[SWS_Dem_01188]⌋ Dem 应每个 OBD 驾驶循环最多递增一次比率个体 IUMPR-分子。`c()`
⌈[SWS_Dem_00361]⌋ Dem 模块应提供配置参数 `DemRatioKind`,以按 RatioId 指示分子是基于 TESTED 状态还是 API 调用计算的。`c()`
**附加分母条件:**
对于某些特定监视器(例如二次空气系统、综合组件),分母上定义了附加条件:仅在满足某些温度或活动条件时才递增其分母。然后,监视器需要在驾驶循环中满足附加条件时解锁(释放)分母。
在检测到阻止这些附加分母条件进一步计算的故障的情况下,还需要冻结分子。因此,如果适用,需要分配特定的分母条件。在报告特定分母条件的禁止计算时,受影响的比率设置为冻结。
为了在 Dem 内处理常用的分母条件,引入了进一步的接口和配置项。
⌈[SWS_Dem_00715]⌋ Dem 模块应提供配置参数 `DemIUMPRDenGroup` 以提供多个条件以应用于每个 RatioId 的分母。`c()`
⌈[SWS_Dem_00362]⌋ Dem 模块应提供用于在 `DemIUMPRDenGroup` 配置为 `DEM_IUMPR_DEN_PHYS_API` 时在特殊条件下释放(参见 `Dem_RepIUMPRDenRelease`)分母的 API。`c()`
⌈[SWS_Dem_00308]⌋ Dem 应向 IUMPR 相关 SW-C 提供 API `Dem_RepIUMPRDenRelease`,以控制特定于各自 RatioId 的分母。`c()`
注:此服务应由监视器用于报告特定监视器的分母(由 FID 和 EventId 表示)因物理原因而被释放。
在具有多个 OBD 相关甚至 IUMPR 相关 ECU 的系统中,需要传达附加分母条件的状态信息以同步计数器的行为。为此,引入了额外的接口以读出和报告各个分母条件的状态。
⌈[SWS_Dem_00716]⌋ Dem 应提供 API `Dem_GetIUMPRDenCondition` 以读出特定条件的状态。`(SRS_Diag_04001)`
⌈[SWS_Dem_00717]⌋ Dem 应提供 API `Dem_SetIUMPRDenCondition` 以设置特定条件的状态(主要在从属 ECU 中)。`c()`
注:为了传达接收到的一般分母状态,Primary ECU 应使用为 SWC 提供的现有 API。
法规要求,如果特定监视器被另一个服务 $07 可见故障禁止,则应停止 IUMPR 跟踪。
⌈[SWS_Dem_01392]⌋ 只要任何通过 `FunctionInhibitionConfiguration` 或通过 `SummaryEvents` 链接到 `DemFunctionIdRef` 引用的 FID 之一的事件处于 PENDING 状态,或与此事件因果相关的任何其他事件(根据组件依赖结构)处于 PENDING 状态(参见 `DemComponentClassRef` 引用的 `DemDiagnosticEventRef`),IUMPR 比率应被阻止。`c()`
⌈[SWS_Dem_00299]⌋ 只要事件具有 Pending 状态,Dem 模块应停止递增分子和分母。`(SRS_Diag_04001)`
基于相关的 FID(FiM 访问)和 RatioId,Dem 模块可以确定必须停止哪个分子和分母。
```text
SW-C 1 SW-C 2 SW-C 3
[IUMPRNumerator]
à RepIUMPRFaultDetect()
No API !
RTE Observe event status
Dem_DcmGetInfoTypeValue08()
Dcm
Dem
Exchange of inhibit matrix
FiM
Figure 7.47: Dem calculates IUMPR data based on specific interface operations
```
#### 7.9.5 轻型车 OBD(OBD2)
与 Dcm 一起,本 Dem SWS 提供标准化的 AUTOSAR 接口以支持 SAE J1979 [17] 中定义的 OBD 服务 $01 - $0A。借助这些服务,AUTOSAR OBD 功能应能够满足全球所有轻型车 OBD 法规(California OBDII、EOBD、Japan OBD 和所有其他)。
⌈[SWS_Dem_CONSTR_06148]⌋ 容器 `DemRation` 的依赖性:容器 `DemRatio` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 时才应可用。`c()`
##### 7.9.5.1 服务 $01 读取当前动力总成诊断数据
使用服务 $01,可以读取任何 PID(PID $02 除外)的当前值。对于 Dem 计算的每个 PID,提供专用的 API 函数 `Dem_DcmReadDataOfPID`,如章节 7.9.2 中所述。
##### 7.9.5.2 服务 $02 读取动力总成冻结帧数据
为了检索故障条目的相关数据,Dem 需要访问通过 PID 寻址的当前数据。为此,基于配置项分配客户端(=Dcm/Dem)/服务器(=SW-C)接口。
⌈[SWS_Dem_00291]⌋ Dem 模块应仅支持法定冻结帧(记录号 0)。这将是分配给此冻结帧的 PID 的单个列表(参见 `DemPidClass`)。`c()`
这意味着通用扫描工具对记录号 1 及以上的请求将被忽略。
在故障条目进入内存后,这些 PID/DID 的值通过 RTE 通过客户端服务器接口请求。
```text
SW-C 1 SW-C 2 SW-C 3
[CSDataServices_<...>]
RTE à ReadData()
Dem Dcm
Figure 7.48: Dem and Dcm module requests PID data elements of SW-C via ReadData
operation
```
⌈[SWS_Dem_00596]⌋ Dem 模块应向 Dcm 模块提供服务 $02 输出的最重要冻结帧(被选中用于 OBD 冻结帧的事件,导致 MIL 开启)的 PID 数据元素的访问(参见 `Dem_DcmReadDataOfOBDFreezeFrame`)。`c()`
注:Dem 仅处理和存储服务 $02 的原始数据。任何 PID 标头信息和填充字节都由 Dcm 添加。Dcm 配置定义各个 PID 布局,这也定义所包含数据元素的顺序。每个数据元素引用 Dem 配置中的链接元素(参见图 47)。
PID 的各个数据元素由 Dcm 通过索引选择。
⌈[SWS_Dem_00597]⌋ `Dem_DcmReadDataOfOBDFreezeFrame` 的索引值(参见 API 参数 `DataElementIndexOfPID`)应分配为零基和连续的。它们的顺序应从引用 DcmDspPidData 容器的数据元素的位置(参见 `DcmDspPidDataPos`)派生在 Dcm 的 PID 布局中。`c()`
注:此索引未明确配置(以便能够避免实现中例如映射表的资源开销)。
```text
DataElementIndexOfPID
DataElementIndexOfPID
(implicit index)
(implicit index)
Dem PID configuration Dcm PID configuration
DemPidClass DcmDspPid (PID layout)
DcmDspPidData/
DemPidDataElement/ DcmDspPidData/ DcmDspPidData/ DcmDspPidDataPos
ShortName DcmDspPidDataDemRef ShortName (Example)
0 DataElement M reference to DataElement M 8 result 0
3 DataElement P DataElement L 24 result 2
2 DataElement L DataElement O 16 result 1
1 DataElement O DataElement P 32 result 3
Figure 7.49: PID layout configuration within Dcm (master) and Dem
⌈[SWS_Dem_00623]⌋ 函数 `Dem_DcmGetDTCOfOBDFreezeFrame` 应返回与服务 $02(PID $02)输出所选的最重要冻结帧关联的 DTC。`c()`
##### 7.9.5.3 服务 $03 - 读取排放相关动力总成诊断故障代码
诊断服务提供当前设置了 UDS 状态位 3 的 OBD DTC。因此,Dcm 将使用章节 8.3.4.1 中描述的接口。
##### 7.9.5.4 服务 $04 - 清除重置排放相关诊断信息
⌈[SWS_Dem_00718]⌋ 在执行服务 $04 的 Master、Primary 和 Dependent / Secondary ECU 中,应按照 SAE J1979 [17] 中定义清除主要和用户定义(事件)内存中(如果已配置)的所有排放相关诊断信息。`c()`
⌈[SWS_Dem_00719]⌋ 执行服务 $04 应包括非排放相关诊断信息(例如去抖计数器、事件/DTC 相关状态信息,如 `TestFailedSinceLastClear`)中的主要和所有用户定义事件内存(如果已配置)在 Master、Primary 和 Dependent / Secondary ECU 中。`c()`
##### 7.9.5.5 服务 $06 - 支持中央 DTR 处理
使用服务 $06,外部测试工具可以请求排放相关 ECU 返回支持的 OBDMID("OBD Monitor Identifier")和/或与 OBDMID 关联的标准化诊断测试结果。
OBD 相关标准(参见 ISO 15031-5 [12] 和 SAE J1979 [17])为在车辆内获取支持的 OBDMID 列表的特殊目的保留了某些 OBDMID。这些 OBDMID 称为"availability OBDMIDs",编号为 $00、$20、$40、$60、$80、$A0、$C0 和 $E0。
与早期 Autosar 版本相反,Dem 此外还提供接口以报告按特定标识符处理的最新测试结果(DTR"诊断测试结果")为此目的引入。
在服务 $06 内,响应(除了支持信息)由数据三元组组成,包括测试结果、下限和上限,表示所进行的合格监视检查的最新结果。为了引用特定组件和特定认证测试,响应还包含 OBDMID 和 TID("Test Identifier")。对于数据的外部表示,所谓的 UnitandScalingID(UaSID)与响应一起传递到测试仪。从 OBD 法规的角度来看,要求在服务 $06 和服务 $07 中具有一致的数据。在这种情况下,如果测试结果小于下限或高于上限,则测试失败。除了阈值违反之外,还必须报告相应的事件,反之亦然。请注意,此一致性仅在首次检测故障时严格有效,因为从服务 $07 的愈合需要一个完整的循环,而服务 $06 的内容仅表示最新测试结果,没有检测到故障。
为了支持此一致性要求,Dem 提供了一个特定接口来报告每个 DTR 的结果,其中事件在配置级别上与 DTR 关联以引用。
请注意,事件用作主控,在其状态中会遇到其他效果,例如启用/存储条件。给定特定的 DTR 更新类型(通过配置),UDS 状态(Tested、Failed、去抖状态等)决定是否进一步处理或抑制/忽略正在报告的 DTR 结果。
Dem 提供转换服务以支持在 ECU 内部分辨率中报告测试结果和阈值。转换为目标格式(由 [17, 19] 标准化:uint16,根据 UaSID 的公式),包括在舍入效应情况下的校正,在 Dem 内完成。为此,配置包括类似于 RTE 用于描述物理数据的转换公式(但更简单),仅支持线性映射。请注意,转换不遵循 UaSId。SWC 的 DTR ServiceNeed 提供对物理单位的引用(参见 SWC Template 章节"Physical Units")和线性转换(参见 SWC Template 章节"Computation Methods"),其中 `CompuRationalCoeffs` 最多具有两个分子系数和一个分母系数,以及所需的 UaSId。在配置过程中,此信息被处理为单个线性转换,然后存储在 Dem 的 ECUC 中。
通过此中央数据处理,支持服务 $07 / $06 的数据一致性以及在故障清除时的重置。
⌈[SWS_Dem_00751]⌋ Dem 应提供数据结构和功能以持久接收、存储和报告服务 $06 测试结果。`(SRS_Diag_04001)`
⌈[SWS_Dem_00752]⌋ `DemDtrId` 由 Dem 在 BSW 配置步骤期间分配。`(SRS_Diag_04129)`
注:Dem 引用 BSW 配置 `DemDtr`,它将:
- `DemDtrId` 关联到 EventId
- 指示监视器是否提供最小限制、最大限制或两者的数据
- OBDMID
- TID
- UaSID
- `DemDtrUpdateKind`
- 线性转换的系数(类似于 SW-C 描述(章节 5.5))
⌈[SWS_Dem_00753]⌋ 为了确保数据一致性,EventId 最多只能由一个 DTR 引用。`(SRS_Diag_04001)`
⌈[SWS_Dem_00754]⌋ Dem 应使用 `DemDtrUpdateKind` 评估和处理报告的 DTR 值:
- `DEM_DTR_UPDATE_ALWAYS`:不考虑事件的状态(默认,如果未配置 `DemDtrEventRef`)。
- `DEM_DTR_UPDATE_STEADY`:仅当 Dem 中事件的预去抖"卡在"FAIL 或 PASS 限制时,并且最新结果与去抖方向匹配。
`c()`
⌈[SWS_Dem_00755]⌋ Dem 应仅支持线性映射,即仅支持系数 b、c 和 f 的值。`c()`
注:ASAM 公式系数:`(ax^2 + bx + c) / (dx^2 + ex + f)` 仅支持 b、c 和 f。
⌈[SWS_Dem_00756]⌋ Dem 应在接口 `DTRCentralReport` 中提供 API `Dem_SetDTR`,为 SWC 提供测试结果的报告机制。参数应为 `DemDtrId`、测试值、最小和最大限制,以及指示监视器是提供有效的最小限制、最大限制还是两者,或者报告的值是否应重置为零的状态。`(SRS_Diag_04179)`
⌈[SWS_Dem_00757]⌋ 如果 `DemDtrEventRef` 引用 `DemEventParameter`,则 Dem 应仅在引用事件的所有启用/存储条件都满足时处理报告的 DTR 值,独立于 `DemDtrUpdateKind`。如果引用事件的任何启用/存储条件未满足,则 Dem 应忽略报告的 DTR 值。`c()`
⌈[SWS_Dem_00758]⌋ Dem 应支持将 ECU 内部分辨率转换为根据配置和标准化的 UaSID 的标准化外部 uint16 大小和分辨率。`c()`
⌈[SWS_Dem_00759]⌋ Dem 应确保测试结果与阈值的有效性。如果 `Dem_SetDTR` 中传递的参数 `TestResult` 在由 `UpperLimit` 和 `LowerLimit` 给定的阈值内/外,则 `Dem_DcmGetDTRData` 的 `Testvalue` 也应在 `Upplimvalue` 和 `Lowlimvalue` 内/外。`(SRS_Diag_04179)`
⌈[SWS_Dem_00760]⌋ 计算可用的 OBD MID 值:如果 `Dem_DcmGetAvailableOBDMIDs` 使用 0x00、0x20、0x40、0x60、0x80、0xA0、0xC0 或 0xE0 的 "availability Obdmid" 值调用,并且 Dem 已配置 `DemDtrMid`,则 Dem 应计算并在输出参数 `Obdmidvalue` 中提供 "Supported-OBDMID" 信息并返回 `E_OK`。`c()`
⌈[SWS_Dem_01301]⌋ 无效 Obdmid 值的行为:如果 `Dem_DcmGetAvailableOBDMIDs` 使用无效的 Obdmid 值(不同于 0x00、0x20、0x40、0x60、0x80、0xA0、0xC0 或 0xE0)调用,则 Dem 应报告 Det 开发错误 `DEM_E_INVALID_OBDMID`。`c()`
⌈[SWS_Dem_00761]⌋ 在 Dcm 请求时,Dem 应使用 API `Dem_DcmGetNumTIDsOfOBDMID` 响应所请求 OBDMID 的 TID 数。`(SRS_Diag_04001)`
⌈[SWS_Dem_00762]⌋ 在 Dcm 请求时,Dem 应使用 API `Dem_DcmGetDTRData` 响应按所请求 OBDMID 的特定 OBDMID / TIDindex 可用的数据。`c()`
⌈[SWS_Dem_00763]⌋ 每当事件受到故障清除命令影响时,Dem 应使用每个 DTR 对事件的引用重置 DTR 数据。`(SRS_Diag_04001)`
⌈[SWS_Dem_00764]⌋ 如果每个 DTR 未分配事件,则 Dem 应在 Dcm 的服务 $04 清除命令时重置 DTR 数据。`c()`
⌈[SWS_Dem_CONSTR_06149]⌋ 容器 `DemDtr` 的依赖性:容器 `DemDtr` 仅在 `DemOBDSupport` 设置为 `DEM_OBD_MASTER_ECU` 或 `DEM_OBD_PRIMARY_ECU` 时才应可用。`c()`
##### 7.9.5.6 服务 $07 - 读取在当前或上一个完成的驾驶循环期间检测到的排放相关诊断故障代码
诊断服务提供 DTC 状态位 2(PendingDTC)当前设置的 OBD DTC。因此,Dcm 将使用章节 8.3.4.1 中描述的接口。
##### 7.9.5.7 服务 $0A - 读取具有永久状态的排放相关诊断故障代码
永久 DTC 存储在永久故障内存中。
OBD 相关 DTC 进入永久故障内存,点亮 MIL 并通过停用 MIL 离开。
⌈[SWS_Dem_00300]⌋ Dem 应能够在特定事件内存类型"permanent"内根据法规处理永久 DTC(参见 [20])。`c()`
⌈[SWS_Dem_00590]⌋ 已确认并激活 MIL 的事件应针对 ClearDTC 或断电(有关详细信息,请参阅 [20])鲁棒存储。`c()`
⌈[SWS_Dem_00301]⌋ Dem 应提供通过过滤永久 DTC 来访问非易失性存储的永久 DTC 的能力。`c()`
注:对于服务 $0A,Dcm 使用 `DTCOrigin DEM_DTC_ORIGIN_PERMANENT_MEMORY`。
⌈[SWS_Dem_01076]⌋ 当前驾驶循环的新永久故障应在下一个 OBD 驾驶循环开始后报告给 Dcm 服务 $0A 请求。`(SRS_Diag_04001)`
⌈[SWS_Dem_01077]⌋ 新永久故障应在 ECU 关闭之前存储在非易失性内存中。`(SRS_Diag_04001)`
##### 7.9.5.8 MIL 处理
通常,"MIL Master 功能"位于 OBD master ECU 中。只有 MIL master 功能允许将 MIL 请求发送到仪表板。
因此,在 Primary ECU 中,函数 `Dem_GetIndicatorStatus` 可用于轮询 MIL 指示器状态并将信息发送到"MIL Master 功能"(例如位于 master ECU 中)。
#### 7.9.6 WWH-OBD
##### 7.9.6.1 DTC WWHOBD 类
⌈[SWS_Dem_01140]⌋ Dem 应为每个 DTC 提供类值,根据 ISO 14229-1 [1] 附录 D.3"DTCSeverityMask 和 DTC class information bit definitions",仅在为至少一个 DTC 配置时。`(SRS_Diag_04141)`
⌈[SWS_Dem_CONSTR_6109]⌋ DTC 类仅适用于 ISO 14229-1 [1] DTC。可以按 DTC 可选配置(参见 `DemWWHOBDDTCClass`)。`c()`
⌈[SWS_Dem_CONSTR_6110]⌋ WWH-OBD DTC 优先级应符合表 7.4。`c()`
| WWH-OBD DTC 类 | 优先级 |
|---|---|
| A | > B1 DTC |
| B1 | > B2 DTC |
| B2 | > C DTC |
| C | > 无 OBD DTC |
**表 7.4:WWH-OBD DTC 优先级**
注:ISO 27145-3 [21] 定义了以下使用严重性级别的 DTC 类:无类、类 A、类 B1、类 B2 和类 C。
##### 7.9.6.2 Continuous-MI 计数器
计数器 Continuous-MI counter 表示 MIL 被持续命令点亮期间的引擎小时数。
⌈[SWS_Dem_01141]⌋ 如果 Activation Mode 4 变为活动状态,则计数器应重置为 0。`(SRS_Diag_04141)`
⌈[SWS_Dem_01142]⌋ 计数器应在检测到事件且 Continuous-MI 被命令点亮的每个引擎运行小时内递增。`(SRS_Diag_04141)`
⌈[SWS_Dem_01143]⌋ 当 Continuous-MI 不再被命令点亮时,计数器应停止其值。`(SRS_Diag_04141)`
⌈[SWS_Dem_01144]⌋ 如果在三个操作序列内再次命令点亮 Continuous-MI,则计数器应继续递增。`(SRS_Diag_04141)`
⌈[SWS_Dem_01145]⌋ 如果在三个以上操作序列之后再次命令点亮 Continuous-MI,则计数器应重置为零并开始递增其值。`(SRS_Diag_04141)`
⌈[SWS_Dem_01146]⌋ 如果在超过 40 个暖机循环之后或超过 200 个引擎运行小时之后或在 ClearDTC 请求之后 Continuous-MI 未被命令点亮,则计数器应重置为零。`(SRS_Diag_04141)`
⌈[SWS_Dem_01147]⌋ 计数器应报告为两字节值。`(SRS_Diag_04141)`
⌈[SWS_Dem_01148]⌋ 计数器应非易失性存储。`(SRS_Diag_04141)`
##### 7.9.6.3 Cumulative Continuous-MI 计数器(Master ECU)
⌈[SWS_Dem_01149]⌋ 计数器应在检测到事件且 Continuous-MI 被命令点亮的每个引擎运行小时内递增。`(SRS_Diag_04141)`
⌈[SWS_Dem_01150]⌋ 当 Continuous-MI 不再被命令点亮时,计数器应停止其值。`(SRS_Diag_04141)`
⌈[SWS_Dem_01151]⌋ 计数器永远不应被重置。`(SRS_Diag_04141)`
⌈[SWS_Dem_01152]⌋ 计数器应报告为两字节值。`(SRS_Diag_04141)`
⌈[SWS_Dem_01153]⌋ 计数器应非易失性存储。`(SRS_Diag_04141)`
##### 7.9.6.4 Class B1 计数器
⌈[SWS_Dem_01154]⌋ B1 计数器应在每个 1 小时引擎运行小时内递增。`(SRS_Diag_04141)`
⌈[SWS_Dem_01155]⌋ 当 Class B1 事件不再被检测为已确认且 TestFailed 时或在 ClearDTC 请求之后,B1 计数器应锁定其值。`(SRS_Diag_04141)`
⌈[SWS_Dem_01156]⌋ 在没有 Class B1 事件被检测的三个连续操作序列之后,B1 计数器应重置为零。`(SRS_Diag_04141)`
⌈[SWS_Dem_01157]⌋ 如果 B1 计数器超过 200 个引擎运行小时且没有 Class B1 事件被检测,则计数器应设置为 190。`(SRS_Diag_04141)`
⌈[SWS_Dem_01158]⌋ B1 计数器应报告为两字节值。`(SRS_Diag_04141)`
⌈[SWS_Dem_01159]⌋ B1 计数器应非易失性存储。`(SRS_Diag_04141)`
##### 7.9.6.5 激活模式
**激活模式升级**
⌈[SWS_Dem_01160]⌋ 如果 B1 计数器超过 200 个引擎运行小时,则 Activation Mode 4 应处于活动状态。`(SRS_Diag_04141)`
⌈[SWS_Dem_01161]⌋ 如果至少一个 Class A 事件已确认且 TestFailed,则 Activation Mode 4 应处于活动状态。`(SRS_Diag_04141)`
**激活模式降级/愈合**
⌈[SWS_Dem_01162]⌋ 如果 Activation Mode 4 处于活动状态且不再存在 Activation Mode 4 相关条件,则 Activation Mode 3 应被激活。`(SRS_Diag_04141)`
⌈[SWS_Dem_01163]⌋ 如果 Activation Mode 4 已降级为 Activation Mode 3 且 Activation Mode 4 相关事件已确认,则如果达到 `EventFailureCycleCounterThreshold` 的配置值,Activation Mode 4 应重新激活。`(SRS_Diag_04141)`
⌈[SWS_Dem_01164]⌋ 如果 Activation Mode 3 处于活动状态且不存在 Activation Mode 3 和 Activation Mode 4 相关条件,则 Activation Mode 1 应被设置。`(SRS_Diag_04141)`
⌈[SWS_Dem_01165]⌋ 如果 Class C 事件已确认且 TestFailed 且 Activation Mode 3 或 Activation Mode 4 未处于活动状态,则 Activation Mode 2 应设置为活动状态。`(SRS_Diag_04141)`
⌈[SWS_Dem_01166]⌋ 函数 `Dem_GetIndicatorStatus` 应返回由 `DemMILIndicatorRef` 引用的事件的当前"指示器状态"。激活模式的条件在表 7.5 中定义。`(SRS_Diag_04141)`
| 条件 | 激活模式 | 指示器状态 |
|---|---|---|
| 无 WWH-OBD 事件活动 | 1 | `DEM_INDICATOR_OFF` |
| Class C 事件活动 | 2 | `DEM_INDICATOR_ON_DEMAND` |
| Class B 事件活动且 B1 计数器 < 200h | 3 | `DEM_INDICATOR_SHORT` |
| Class A 事件活动或 B1 计数器 >= 200h | 4 | `DEM_INDICATOR_CONTINUOUS` |
**表 7.5:条件到激活模式的映射**
##### 7.9.6.6 冻结帧 0x00
⌈[SWS_Dem_01170]⌋ 法定冻结帧 0x00 应在 UDS 状态位 2 从 0 变为 1 时存储。`(SRS_Diag_04141)`
⌈[SWS_Dem_01171]⌋ 如果冻结帧 0x00 在 UDS 状态位 3 从 0 变为 1 时更新,则可以使用 `DemFreezeFrameRecordUpdate` 配置更新行为。`(SRS_Diag_04141)`
⌈[SWS_Dem_01172]⌋ 与 Class A 故障关联的冻结帧信息的存储/报告应优先于 Class B1 故障。`(SRS_Diag_04141)`
⌈[SWS_Dem_01173]⌋ 第一个检测到的故障应优先于最近的故障,除非最近的故障属于更高的类。`(SRS_Diag_04141)`
⌈[SWS_Dem_01174]⌋ 如果事件由于老化从故障内存中删除,则冻结帧 0x00 应被删除。`(SRS_Diag_04141)`
⌈[SWS_Dem_01175]⌋ 法定冻结帧 0x00 的配置类似于章节 7.7.7.1 中描述的非排放相关冻结帧。`(SRS_Diag_04141)`
##### 7.9.6.7 扩展数据记录 0x90
由于 Dem 仅支持单个 B1 计数器,因此不支持扩展数据记录 0x90。
##### 7.9.6.8 老化
⌈[SWS_Dem_01176]⌋ 除章节 7.7.8 中描述的事件老化外,事件应在满足老化条件的情况下在 200 小时引擎运行后老化。`(SRS_Diag_04141)`
⌈[SWS_Dem_CONSTR_6111]⌋ OBD 相关 DTC 应具有 40 的老化计数器阈值。`c()`
⌈[SWS_Dem_CONSTR_6112]⌋ OBD 相关 DTC 应将暖机循环作为老化循环。`c()`
##### 7.9.6.9 服务 $19 42 - 通过掩码记录读取 WWH-OBD DTC
⌈[SWS_Dem_01177]⌋ 接口 `Dem_GetDTCSeverityAvailabilityMask` 应向 DCM 提供 `DtcSeverityAvailabilityMask`。`(SRS_Diag_04141)`
##### 7.9.6.10 服务 $14 FFFF33 - 清除排放相关 DTC
⌈[SWS_Dem_01178]⌋ 除章节 7.7.2.2 外,Dem 应清除/重置以下值:
- 激活模式
- 就绪状态(PID $01、PID $41 和 PID $90)
- Continuous-MI 计数器
- 最高 ECU B1 计数器
- B1 计数器
- 法定冻结帧
`(SRS_Diag_04141)`
⌈[SWS_Dem_01179]⌋ 服务 $14 FFFF33 应清除所有 DTC(WWH-OBD DTC 和 UDS DTC)。`(SRS_Diag_04141)`
### 7.10 J1939 特定功能
Dem 模块能够支持 J1939 网络。在这些网络上,它使用 J1939 特定的 DTC。
⌈[SWS_Dem_00845]⌋ 如果配置容器 `DemGeneralJ1939`(参见 `DemGeneral`)存在,则 J1939 支持应可用。`(SRS_Diag_04112)`
注:Dem 被设计为区分"仅服务 DTC"和"所有其他 DTC",将 DTC 分配给某些事件内存。为了正确使用 J1939Dcm API,"仅服务 DTC"需要分配给用户定义内存。所有其他 DTC 需要分配给主要内存。
#### 7.10.1 读取 DTC
⌈[SWS_Dem_00855]⌋ 函数 `Dem_J1939DcmSetDTCFilter` 应设置用于后续调用的过滤器掩码属性,并将内部计数器重置为第一个事件。`(SRS_Diag_04112)`
⌈[SWS_Dem_00856]⌋ 通过 `Dem_J1939DcmSetDTCFilter` 设置的过滤器掩码属性应使用直到下一次 `Dem_J1939DcmSetDTCFilter` 调用或 Dem 初始化。`(SRS_Diag_04112)`
⌈[SWS_Dem_00857]⌋ 函数 `Dem_J1939DcmSetDTCFilter` 应返回 J1939 灯的当前组合状态。匹配过滤器标准在表 7.6 中定义。`c()`
| SetFilter 参数 | UDS 状态过滤器 | 进一步过滤器标准 | AllDTCs | EmissionDTCs |
|---|---|---|---|---|
| `DEM_J1939DTC_ACTIVE` | `(ConfirmedDTC == 1 AND TestFailed == 1) OR MIL_ON` | n/a | DM01 | DM12 |
| `DEM_J1939DTC_PREVIOUSLY_ACTIVE` | `ConfirmedDTC == 1 AND TestFailed == 0 AND MIL_OFF` | n/a | DM02 | DM23 |
| `DEM_J1939DTC_PENDING` | `PendingDTC == 1` | n/a | DM27 | DM06 |
| `DEM_J1939DTC_PERMANENT` | n/a | permanent memory entry available | n/a | DM28 |
| `DEM_J1939DTC_CURRENTLY_ACTIVE` | `TestFailed == 1` | n/a | DM35 | n/a |
**表 7.6:Dem 模块可检测的错误类型**
每次读取 DTC 返回以下灯的组合灯状态:
- a) Malfunction Indicator Lamp
- b) Red Stop Lamp
- c) Amber Warning Lamp
- d) Protect Lamp
##### 7.10.1.1 复合故障指示灯状态
⌈[SWS_Dem_00858]⌋ 如果 `DemMILIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_OFF`,则复合"故障指示灯"应设置为"Lamp Off"。所有其他 `IndicatorStatus` 状态应将复合故障指示灯设置为"Lamp On"。`(SRS_Diag_04110)`
⌈[SWS_Dem_00859]⌋ 如果 `DemMILIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_OFF` 或 `DEM_INDICATOR_CONTINUOUS`,则复合"Flash Malfunction Indicator Lamp"应设置为"Unavailable / Do Not Flash"(0x03)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00860]⌋ 如果 `DemMILIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_SLOW_FLASH`,则复合"Flash Malfunction Indicator Lamp"应设置为"Slow Flash"(0x00)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00861]⌋ 如果 `DemMILIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_FAST_FLASH`,则复合"Flash Malfunction Indicator Lamp"应设置为"Fast Flash"(0x01)。`(SRS_Diag_04110)`
##### 7.10.1.2 复合红色停车灯状态
⌈[SWS_Dem_00862]⌋ 如果 `DemRedStopLampIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_OFF`,则复合"Red Stop Lamp"应设置为"Lamp Off"。`(SRS_Diag_04110)`
⌈[SWS_Dem_00863]⌋ 如果 `DemRedStopLampIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_OFF` 或 `DEM_INDICATOR_CONTINUOUS`,则复合"Flash Red Stop Lamp"应设置为"Unavailable / Do Not Flash"(0x03)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00864]⌋ 如果 `DemRedStopLampIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_SLOW_FLASH`,则复合"Flash Red Stop Lamp"应设置为"Slow Flash"(0x00)。`(SRS_Diag_04112)`
⌈[SWS_Dem_00865]⌋ 如果 `DemRedStopLampIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_FAST_FLASH`,则复合"Flash Red Stop Lamp"应设置为"Fast Flash"(0x01)。`(SRS_Diag_04069)`
##### 7.10.1.3 复合琥珀色警告灯状态
⌈[SWS_Dem_00866]⌋ 如果 `DemAmberWarningLampIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_OFF`,则复合"Amber Warning Lamp"应设置为"Lamp Off"。`(SRS_Diag_04110)`
⌈[SWS_Dem_00867]⌋ 如果 `DemAmberWarningLampIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_OFF` 或 `DEM_INDICATOR_CONTINUOUS`,则复合"Flash Amber Warning Lamp"应设置为"Unavailable / Do Not Flash"(0x03)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00868]⌋ 如果 `DemAmberWarningLampIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_SLOW_FLASH`,则复合"Flash Amber Warning Lamp"应设置为"Slow Flash"(0x00)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00869]⌋ 如果 `DemAmberWarningLampIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_FAST_FLASH`,则复合"Flash Amber Warning Lamp"应设置为"Fast Flash"(0x01)。`(SRS_Diag_04110)`
##### 7.10.1.4 复合保护灯状态
⌈[SWS_Dem_00870]⌋ 如果 `DemProtectLampIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_OFF`,则复合"Protect Lamp"应设置为"Lamp Off"。`(SRS_Diag_04110)`
⌈[SWS_Dem_00871]⌋ 如果 `DemProtectLampIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_OFF` 或 `DEM_INDICATOR_CONTINUOUS`,则复合"Flash Protect Lamp"应设置为"Unavailable / Do Not Flash"(0x03)。`c()`
⌈[SWS_Dem_00872]⌋ 如果 `DemProtectLampIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_SLOW_FLASH`,则复合"Flash Protect Lamp"应设置为"Slow Flash"(0x00)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00873]⌋ 如果 `DemProtectLampIndicatorRef` 引用的指示器具有 `IndicatorStatus DEM_INDICATOR_FAST_FLASH`,则复合"Flash Protect Lamp"应设置为"Fast Flash"(0x01)。`(SRS_Diag_04110)`
##### 7.10.1.5 DTC 数据采集
⌈[SWS_Dem_00874]⌋ 函数 `Dem_J1939DcmGetNumberOfFilteredDTC` 应返回与 `Dem_J1939DcmSetDTCFilter` 函数调用为所请求 ClientId 的相应主要事件内存定义的表 7.6 过滤器标准匹配的 J1939 DTC 数。`(SRS_Diag_04112)`
⌈[SWS_Dem_00875]⌋ `Dem_J1939DcmGetNextFilteredDTC` 函数的每次调用应搜索下一个具有 J1939DTC 且与 `Dem_J1939DcmSetDTCFilter` 函数调用提供的节点的表 7.6 过滤器标准匹配的事件。`(SRS_Diag_04112)`
⌈[SWS_Dem_00877]⌋ 如果 `Dem_J1939DcmGetNextFilteredDTC` 函数已找到匹配过滤器标准的事件,则它应返回相应的 J1939DTC(参见 `DemDTCAttributes` 了解详细信息)和相应的事件计数器。返回值应为 `E_OK`。如果由于内部实现或限制需要中断搜索,则返回值可以设置为 `DEM_PENDING`。在这种情况下,输出参数不需要有效。`Dem_J1939DcmGetNextFilteredDTC` 的下一次调用应在中断的元素之后继续。如果事件计数器高于 +126(0x7F),则返回值应设置为 +126(0x7F)。`(SRS_Diag_04111)`
#### 7.10.2 清除 DTC
有关锁定清除过程的定义,请参阅章节 7.7.2.2。
⌈[SWS_Dem_00878]⌋ Dem 模块应向 J1939Dcm [7] 提供 `Dem_J1939DcmClearDTC`,用于从事件内存中删除所有活动或先前活动的 DTC。这也应触发根据 [SWS_Dem_00003] 初始化相关的 SW-C / BSW 模块。`c()`
当请求 SAE J1939-73 [14] 的诊断消息 DM03 和 DM11 之一时,所有活动(DM11)或先前活动(DM03)的 DTC 都必须与附加信息(如冻结帧)一起清除。
⌈[SWS_Dem_00879]⌋ 函数 `Dem_J1939DcmClearDTC` 应清除与指定 DTC 相关的所有事件的状态,以及这些事件的所有关联事件内存条目。`(SRS_Diag_04117)`
注:由于 [SWS_Dem_00515],例外可能适用。
#### 7.10.3 DM31
DM31 为每个单独的 DTC 提供适用的灯及其状态,因此需要通过函数 `Dem_J1939DcmFirstDTCwithLampStatus` 返回 DTC 特定的灯状态。
⌈[SWS_Dem_00880]⌋ 每次调用 `Dem_J1939DcmFirstDTCwithLampStatus` 应将内部计数器设置为第一个具有此特定"ClientId"分配 J1939DTC 的事件。`(SRS_Diag_04113)`
⌈[SWS_Dem_00881]⌋ 每次调用 `Dem_J1939DcmGetNextDTCwithLampStatus` 应在事件内存内搜索(由函数 `Dem_J1939DcmFirstDTCwithLampStatus` 设置)具有 J1939DTC 分配的下一个事件。如果没有更多具有 J1939DTC 分配的事件可用,则函数返回值应为 `DEM_NO_SUCH_ELEMENT`。在这种情况下,输出参数不需要有效。`(SRS_Diag_04113)`
⌈[SWS_Dem_00882]⌋ 如果 `Dem_J1939DcmGetNextDTCwithLampStatus` 已找到匹配过滤器标准的事件,则它应返回灯的 J1939DTC 特定状态(有关详细信息,请参阅以下部分),相应的 J1939DTC(参见 `DemDTCAttributes` 了解详细信息)和相应的事件计数器。返回值应为 `E_OK`。如果由于内部实现或限制需要中断搜索,则返回值可以设置为 `DEM_PENDING`。在这种情况下,输出参数不需要有效。`Dem_J1939DcmGetNextDTCwithLampStatus` 的下一次调用应在中断的元素之后继续。如果事件计数器高于 +126(0x7F),则返回值应设置为 +126(0x7F)。`(SRS_Diag_04113)`
##### 7.10.3.1 故障指示灯
⌈[SWS_Dem_00883]⌋ 在函数 `Dem_J1939DcmGetNextDTCwithLampStatus` 中返回的 DTC 特定的"故障指示灯"应在相应事件分配了 `DemMILIndicatorRef` 引用的指示器且 UDS 状态位 7(WarningIndicator)处于活动状态(设置为 1)时设置为"Lamp On",否则应设置为"Lamp Off"。`(SRS_Diag_04110)`
⌈[SWS_Dem_00884]⌋ DTC 特定的"Flash Malfunction Indicator Lamp"应在相应事件已设置"Lamp On"且 `DemMILIndicatorRef` 引用的指示器的 `DemIndicatorBehaviour` 设置为 `DEM_INDICATOR_CONTINUOUS` 时设置为"Unavailable / Do Not Flash"(0x03)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00885]⌋ DTC 特定的"Flash Malfunction Indicator Lamp"应在相应事件已设置"Lamp On"且 `DemMILIndicatorRef` 引用的指示器的 `DemIndicatorBehaviour` 设置为 `DEM_INDICATOR_SLOW_FLASH` 时设置为"Slow Flash"(0x00)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00886]⌋ DTC 特定的"Flash Malfunction Indicator Lamp"应在相应事件已设置"Lamp On"且 `DemMILIndicatorRef` 引用的指示器的 `DemIndicatorBehaviour` 设置为 `DEM_INDICATOR_FAST_FLASH` 时设置为"Fast Flash"(0x01)。`(SRS_Diag_04069)`
##### 7.10.3.2 红色停车灯
⌈[SWS_Dem_00887]⌋ 在函数 `Dem_J1939DcmGetNextDTCwithLampStatus` 中返回的 DTC 特定的"Red Stop Lamp"应在相应事件分配了 `DemRedStopIndicatorRef` 引用的指示器且 UDS 状态位 7(WarningIndicator)处于活动状态(设置为 1)时设置为"Lamp On",否则应设置为"Lamp Off"。`(SRS_Diag_04110)`
⌈[SWS_Dem_00888]⌋ DTC 特定的"Flash Red Stop Lamp"应在相应事件已设置"Lamp On"且 `DemRedStopIndicatorRef` 引用的指示器的 `DemIndicatorBehaviour` 设置为 `DEM_INDICATOR_CONTINUOUS` 时设置为"Unavailable / Do Not Flash"(0x03)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00889]⌋ DTC 特定的"Flash Red Stop Lamp"应在相应事件已设置"Lamp On"且 `DemRedStopIndicatorRef` 引用的指示器的 `DemIndicatorBehaviour` 设置为 `DEM_INDICATOR_SLOW_FLASH` 时设置为"Slow Flash"(0x00)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00890]⌋ DTC 特定的"Flash Red Stop Lamp"应在相应事件已设置"Lamp On"且 `DemRedStopIndicatorRef` 引用的指示器的 `DemIndicatorBehaviour` 设置为 `DEM_INDICATOR_FAST_FLASH` 时设置为"Fast Flash"(0x01)。`c()`
##### 7.10.3.3 琥珀色警告灯
⌈[SWS_Dem_00891]⌋ 在函数 `Dem_J1939DcmGetNextDTCwithLampStatus` 中返回的 DTC 特定的"Amber Warning Lamp"应在相应事件分配了 `DemAmberWarningIndicatorRef` 引用的指示器且 UDS 状态位 7(WarningIndicator)处于活动状态(设置为 1)时设置为"Lamp On",否则应设置为"Lamp Off"。`(SRS_Diag_04110)`
⌈[SWS_Dem_00892]⌋ DTC 特定的"Flash Amber Warning Lamp"应在相应事件已设置"Lamp On"且 `DemAmberWarningIndicatorRef` 引用的指示器的 `DemIndicatorBehaviour` 设置为 `DEM_INDICATOR_CONTINUOUS` 时设置为"Unavailable / Do Not Flash"(0x03)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00893]⌋ DTC 特定的"Flash Amber Warning Lamp"应在相应事件已设置"Lamp On"且 `DemAmberWarningIndicatorRef` 引用的指示器的 `DemIndicatorBehaviour` 设置为 `DEM_INDICATOR_SLOW_FLASH` 时设置为"Slow Flash"(0x00)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00894]⌋ DTC 特定的"Flash Amber Warning Lamp"应在相应事件已设置"Lamp On"且 `DemAmberWarningIndicatorRef` 引用的指示器的 `DemIndicatorBehaviour` 设置为 `DEM_INDICATOR_FAST_FLASH` 时设置为"Fast Flash"(0x01)。`(SRS_Diag_04110)`
##### 7.10.3.4 保护灯
⌈[SWS_Dem_00895]⌋ 在函数 `Dem_J1939DcmGetNextDTCwithLampStatus` 中返回的 DTC 特定的"Protect Lamp"应在相应事件分配了 `DemProtectLampIndicatorRef` 引用的指示器且 UDS 状态位 7(WarningIndicator)处于活动状态(设置为 1)时设置为"Lamp On",否则应设置为"Lamp Off"。`(SRS_Diag_04110)`
⌈[SWS_Dem_00896]⌋ DTC 特定的"Flash Protect Lamp"应在相应事件已设置"Lamp On"且 `DemProtectLampIndicatorRef` 引用的指示器的 `DemIndicatorBehaviour` 设置为 `DEM_INDICATOR_CONTINUOUS` 时设置为"Unavailable / Do Not Flash"(0x03)。`(SRS_Diag_04069)`
⌈[SWS_Dem_00897]⌋ DTC 特定的"Flash Protect Lamp"应在相应事件已设置"Lamp On"且 `DemProtectLampIndicatorRef` 引用的指示器的 `DemIndicatorBehaviour` 设置为 `DEM_INDICATOR_SLOW_FLASH` 时设置为"Slow Flash"(0x00)。`(SRS_Diag_04110)`
⌈[SWS_Dem_00898]⌋ DTC 特定的"Flash Protect Lamp"应在相应事件已设置"Lamp On"且 `DemProtectLampIndicatorRef` 引用的指示器的 `DemIndicatorBehaviour` 设置为 `DEM_INDICATOR_FAST_FLASH` 时设置为"Fast Flash"(0x01)。`(SRS_Diag_04110)`
##### 7.10.3.5 J1939 灯状态
⌈[SWS_Dem_01310]⌋ 如果配置参数 `DemInternalDataElement` 设置为 `DEM_J1939LAMP_STATUS`,则灯状态(参见章节 7.10.3)应以 `Dem_J1939DcmLampStatusType` 类型格式映射到相应的数据元素。`(SRS_Diag_04134, SRS_Diag_04190)`
⌈[SWS_Dem_01311]⌋ `DEM_J1939LAMP_STATUS` 的 `DemInternalDataElement` 应包含事件在 Dem 内部处理之前的灯状态。`(SRS_Diag_04134, SRS_Diag_04190)`
#### 7.10.4 冻结帧
⌈[SWS_Dem_00899]⌋ 函数 `Dem_J1939DcmSetFreezeFrameFilter` 应设置用于后续 `Dem_J1939DcmGetNextFreezeFrame` 调用的过滤器掩码属性,并将内部计数器重置为第一个冻结帧。过滤器掩码属性应使用直到下一次 `Dem_J1939DcmSetFreezeFrameFilter` 调用或 Dem 初始化。匹配过滤器标准是 `DEM_J1939DCM_FREEZEFRAME`(过滤 `DemJ1939FreezeFrameClassRef` 中的数据)或 `DEM_J1939DCM_EXPANDED_FREEZEFRAME`(过滤 `DemJ1939ExpandedFreezeFrameClassRef` 中的数据)。`(SRS_Diag_04111)`
⌈[SWS_Dem_00900]⌋ `Dem_J1939DcmGetNextFreezeFrame` 的每次函数调用应跳到由 `Dem_J1939DcmSetFreezeFrameFilter` 的过滤器标准(FreezeFrameKind 和 ClientId)定义的特定事件内存的下一个(扩展)冻结帧。如果没有更多(扩展)冻结帧匹配过滤器标准,则函数应返回 `DEM_NO_SUCH_ELEMENT`。在这种情况下,输出参数不需要有效。`(SRS_Diag_04111)`
⌈[SWS_Dem_00901]⌋ 函数 `Dem_J1939DcmGetNextFreezeFrame` 应在不支持的 FreezeFrameKind 情况下触发 Det 错误 `DEM_E_WRONG_CONDITION`。有效值为 `DEM_J1939DCM_FREEZEFRAME` 和 `DEM_J1939DCM_EXPANDED_FREEZEFRAME`。`(SRS_Diag_04111)`
⌈[SWS_Dem_00902]⌋ 如果 [SWS_Dem_00901] 的搜索由于内部实现或限制需要中断,则返回值可以设置为 `DEM_PENDING`。在这种情况下,输出参数不需要有效。`Dem_J1939DcmGetNextFreezeFrame` 的下一次调用应在中断的元素之后继续。`(SRS_Diag_04111)`
⌈[SWS_Dem_00903]⌋ 如果 `Dem_J1939DcmGetNextFreezeFrame` 函数已找到冻结帧,则 Dem 应:
- 检查 `BufSize` 参数中的缓冲区是否足够容纳(扩展)冻结帧。如果没有,应返回 `DEM_FILTERED_BUFFER_TOO_SMALL` 而不执行任何进一步操作。在这种情况下,输出参数不需要有效。
- 将(扩展)冻结帧数据复制到参数 `DestBuffer` 提供的缓冲区中(对于没有 SPN 信息的扩展冻结帧)。未使用的位应填充 "0"。
- 将参数 `J1939DTC` 设置为相应的 J1939DTC 值(参见 `DemDTCAttributes` 了解详细信息),并将参数 `OccurrenceCounter` 设置为相应的事件计数器值。
- 返回 `E_OK`。如果事件计数器高于 +126(0x7F),则返回值应设置为 +126(0x7F)。
`(SRS_Diag_04111)`
##### 7.10.4.1 扩展冻结帧中的 SPN
⌈[SWS_Dem_00904]⌋ 每次调用 `Dem_J1939DcmGetNextSPNInFreezeFrame` 应跳到此 `DemEventMemory` 的扩展冻结帧的下一个 SPN。如果扩展冻结帧定义中没有更多 SPN 可用,则函数返回值应为 `DEM_NO_SUCH_ELEMENT`。在这种情况下,输出参数不需要有效。`(SRS_Diag_04111)`
⌈[SWS_Dem_00905]⌋ 如果 [SWS_Dem_00904] 的搜索由于内部实现或限制需要中断,则返回值可以设置为 `DEM_PENDING`。在这种情况下,输出参数不需要有效。`Dem_J1939DcmGetNextSPNInFreezeFrame` 的下一次调用应在中断的元素之后继续。`(SRS_Diag_04111)`
⌈[SWS_Dem_00906]⌋ 函数 `Dem_J1939DcmGetNextSPNInFreezeFrame` 应在不支持的 FreezeFrameKind 情况下触发 Det 错误 `DEM_E_WRONG_CONDITION`。有效值是 `Dem_SPNsInExpandedFreezeFrame`。`(SRS_Diag_04057, SRS_Diag_04111)`
⌈[SWS_Dem_00907]⌋ 如果 `Dem_J1939DcmGetNextSPNInFreezeFrame` 已找到扩展冻结帧定义的 SPN,则 Dem 应:
- 检查 `BufSize` 参数中的缓冲区是否足够容纳(扩展)冻结帧。如果没有,应返回 `DEM_FILTERED_BUFFER_TOO_SMALL` 而不执行任何进一步操作。在这种情况下,输出参数不需要有效。
- 将(扩展)冻结帧数据复制到参数 `DestBuffer` 提供的缓冲区中(对于没有 SPN 信息的扩展冻结帧)。未使用的位应填充 "0"。
- 将参数 `J1939DTC` 设置为相应的 J1939DTC 值(参见 `DemDTCAttributes` 了解详细信息),并将参数 `OccurrenceCounter` 设置为相应的事件计数器值。
- 返回 `E_OK`。如果事件计数器高于 +126(0x7F),则返回值应设置为 +126(0x7F)。
`(SRS_Diag_04111)`
#### 7.10.5 诊断就绪
Dem 模块需要在内部计算(非)连续监视系统支持和状态,用于"Diagnostic Readiness 1"(DM05)、"Diagnostic Readiness 2"(DM21)和"Diagnostic Readiness 3"(DM26)。
⌈[SWS_Dem_00908]⌋ J1939 事件应使用配置参数 `DemEventOBDReadinessGroup`(参见 `DemObdDTC`)将各个事件分配给连续或非连续监视系统。`(SRS_Diag_04113)`
`Dem_J1939DcmReadDiagnosticReadiness1` 报告与根据 DM05 的诊断就绪状态相关的诊断信息。
⌈[SWS_Dem_00909]⌋ 调用 `Dem_J1939DcmReadDiagnosticReadiness1` 应基于 J1939-73 [14] DM05 定义报告响应消息:
- "Active Trouble Codes" 应报告与 `Dem_J1939DcmSetDTCFilter`(`Dem_Active`、`DEM_DTC_KIND_ALL_DTCS`)过滤的 DTC 数量相同的活动 DTC 数量。
- "Previously Active Diagnostic Trouble Codes" 应报告与 `Dem_J1939DcmSetDTCFilter`(`Dem_PreviouslyActive`、`DEM_DTC_KIND_ALL_DTCS`)过滤的 DTC 数量相同的先前活动 DTC 数量。
- "OBD Compliance" 应基于配置参数 `DemOBDCompliancy`(在 `DemGeneralOBD` 中)。对于非 OBD ECU,应报告值五(5)。
- 应根据 SAE J1939-73 章节 5.7.5.4 至 5.7.5.6 报告(非)连续监视系统支持和状态。计算应基于引用相应配置参数 `DemEventOBDReadinessGroup` 的那些事件。如果没有事件参数引用,则支持位应设置为零(0)。如果所有分配的事件参数的 `TestNotCompletedSinceLastClear` 状态位都设置为零(0),则"monitoring status"位应设置为"test complete"(0),否则应设置为"test not complete"(1)。
`(SRS_Diag_04113)`
`Dem_J1939DcmReadDiagnosticReadiness2` 报告与根据 DM21 的第二个 PGN 传达诊断就绪状态相关的诊断信息(另请参阅 DM05)。
⌈[SWS_Dem_00910]⌋ 调用 `Dem_J1939DcmReadDiagnosticReadiness2` 应基于 J1939-73 [14] DM21 定义报告响应消息:
- "Distance Traveled While MIL is Activated" 应与 PID 0x21 相同,最大值为 64255(所有超过 64255 的值应报告为 64255)。
- "Distance Since Diagnostic Trouble Codes Cleared" 应与 PID 0x31 相同,最大值为 64255(所有超过 64255 的值应报告为 64255)。
- "Minutes Run by Engine While MIL is Activated" 应与 PID 0x4D 相同,最大值为 64255(所有超过 64255 的值应报告为 64255)。
- "Time Since Diagnostic Trouble Codes Cleared" 应与 PID 0x4E 相同,最大值为 64255(所有超过 64255 的值应报告为 64255)。
`(SRS_Diag_04112)`
`Dem_J1939DcmReadDiagnosticReadiness3` 报告传达当前驾驶循环 OBD 系统监视器的挂起状态的诊断信息,根据 DM26(另请参阅 DM05 和 DM21)。
⌈[SWS_Dem_00911]⌋ 调用 `Dem_J1939DcmReadDiagnosticReadiness3` 应基于 J1939-73 [14] DM26 定义报告响应消息:
- "Time Since Engine Start" 应由 `DemOBDTimeSinceEngineStart`(在 `DemGeneralOBD` 中)检索
- "Number of Warmups Since DTCs Cleared" 应与 PID 0x30 相同,最大值为 250(所有超过 250 的值应报告为 250)。
- 应根据 SAE J1939-73 [14] 章节 5.7.26.3 至 5.7.26.5 报告(非)连续监视系统启用/完成状态。计算应基于引用相应配置参数 `DemEventOBDReadinessGroup` 的那些事件。如果没有事件参数引用,则应指示禁用和完成。否则,禁用状态应基于根据 [SWS_Dem_00356] 的就绪组禁用状态,并且如果所有分配的事件参数的 `TestNotCompletedSinceThisOperationCycle` 状态位都设置为零(0),则完成状态应设置为"monitor complete"(0);否则状态位应设置为"monitor not complete"(1)。
`(SRS_Diag_04112)`
#### 7.10.6 监视器性能比
对于 J1939,在用监视器性能比(IUMPR)要求仅为每个支持的适用系统监视器报告。
⌈[SWS_Dem_00912]⌋ 函数 `Dem_J1939DcmSetRatioFilter` 应将内部计数器重置为第一个有效的 SPN,定义为使用 `DemRatioId` 进行后续 `Dem_J1939DcmGetNextFilteredRatio` 调用。此外,它应根据 SAEJ193973 章节 5.7.20.1 返回"Ignition Cycle Counter",以及根据 SAEJ193973 章节 5.7.20.2 返回"OBD Monitoring Conditions Encountered"(CARB 将其定义为通用分母)。`(SRS_Diag_04112)`
⌈[SWS_Dem_00913]⌋ `Dem_J1939DcmGetNextFilteredRatio` 函数的每次调用应跳过具有 `DemRatioId` 定义的事件内存内的下一个有效 SPN。
- 通过 `DemRatioId` 引用此 SPN 的事件应用作计算返回值 SPN(用于"Applicable System Monitor 的 SPN")、Numerator(用于"Applicable System Monitor Numerator")和 Denominator(用于"Applicable System Monitor Denominator")。返回值应为 `E_OK`。
- 如果由于内部实现或限制需要中断计算,则返回值可以设置为 `DEM_PENDING`。在这种情况下,输出参数不需要有效。`Dem_J1939DcmGetNextFilteredRatio` 的下一次调用应在中断的元素之后继续。
- 如果没有更多 SPN 可用,则函数返回值应为 `DEM_NO_SUCH_ELEMENT`。在这种情况下,输出参数不需要有效。
`(SRS_Diag_04113)`
### 7.11 与其他软件模块的交互
#### 7.11.1 与软件组件(SW-C)的交互
在 AUTOSAR ECU 架构中,诊断事件管理器实现 AUTOSAR 服务。这意味着 Dem 模块不仅与其他 BSW 模块通信,还通过 RTE 与 SWC 通信(参见图 5.1)。
从 BSW"Cmodule"Dem 的角度来看,服务与 RTE 上方的 AUTOSAR 软件组件之间有三种依赖关系:
- 应用程序通过访问 API(实现为 C 函数)来访问 Dem(通过访问 Dem 服务组件)。
- 应用程序可选地在请求的异步活动的结果时被通知(通过 Dem 的直接/间接 RTE API)。
- SWC 的初始化函数由 Dem 调用。
这些依赖关系必须用 AUTOSAR 元模型描述,这将有助于应用程序组件的 SWC 描述以及 Dem 服务的服务组件描述。
Dem 服务的服务组件描述将定义 RTE 下方的端口。每个使用 Dem 服务的 SWC 必须在自身 SWC 描述中包含相应的端口,这些端口将由相同(或兼容的)接口定型,并且必须连接到 Dem 的端口,以便可以生成 RTE。这些 Dem 端口中使用的 ID 通过端口定义的参数进行抽象。
⌈[SWS_Dem_00512]⌋ Dem 服务组件的名称应为"Dem"。`(SRS_BSW_00300)`
对 SWC 的回调不使用端口定义参数机制。相反,Dem 配置机制必须确保回调传递到配置的端口,并使用 RTE(直接或间接)API 调用在此端口调用正确的操作。例如,EventId 不应作为操作的第一个参数传递,因为监视器(和其他 SW-C)不会显式处理 EventId。
相反,存在一些需要统一处理事件状态/数据更改的特殊 SWC。这些 SWC 由 Dem 通知,Dem 还为应用程序提供 EventId,以便能够从 Dem 请求相应的数据。因此,提供了一般接口(参见 `GeneralCallbackEventUdsStatusChanged`、`GeneralDiagnosticInfo` 和 `CallbackEventUdsStatusChanged`),这些接口只能以以下方式使用:SWC 不应以任何方式解释 Dem 给出的 EventIds,并且 SWC 用于请求事件特定数据的 EventId 值必须始终由 Dem 提供。这里仅允许 SWC 对 EventId 使用直通机制。
在当前的 Autosar 版本中,RTE 分析触发的 runnable 的完整调用树。因此,引入了一些 Dem API 中的限制,以避免 BSW 模块调用,这些调用依赖于通过 RTE 回调到 SWC。
#### 7.11.2 与诊断客户端的交互
Dem 模块为诊断客户端提供接口。诊断客户端是与处理诊断请求相关的 BSW 模块。最常见的诊断客户端是 Dcm。还有进一步的用例,其中诊断客户端是通过 RTE 接口与 Dem 交互的 SW-C。诊断客户端访问 Dem 模块以便委派与事件内存相关的诊断服务。
有关 Dcm 和 Dem 之间接口使用的详细说明,请参阅 Dcm SWS 文档 [9, SWS Dcm]。在那里,特别描述了冻结帧数据的处理。
⌈[SWS_Dem_00171]⌋ 如果 Dcm 请求了不可用的事件内存/DTC 来源,则 Dem 模块函数应返回 `DEM_<...>_WRONG_DTCORIGIN`。`(SRS_Diag_04058)`
⌈[SWS_Dem_00172]⌋ 如果 Dcm 请求了一个根本不可用或可用但事件内存/DTC 来源与请求的不同 DTC,则 Dem 模块函数应返回 `DEM_<...>_WRONG_DTC`。`(SRS_Diag_04010)`
⌈[SWS_Dem_00828]⌋ 如果 DTC 状态发生变化,Dem 应调用配置的 `DemCallbackDTCStatusChanged` 函数。`(SRS_Diag_04010)`
注:函数 `Dcm_DemTriggerOnDTCStatus`(SWS_Dcm_00614)使用与 `DemTriggerOnDTCStatus` 相同的原型。此配置参数为简单起见(因此不需要使用通用参数 `DemCallbackDTCStatusChangedFnc`)。
ClientID 还用于过滤特定内容(如 UDS 实例、J1939 节点、OBD 等)。
##### 7.11.2.1 并行事件内存访问
有多个客户端可以请求对故障内存的访问。为了允许客户端的并行访问,Dem 使用客户端 ID 的概念。客户端 ID 在容器 `DemClient` 中配置。每个请求对 Dem 故障内存访问的客户端都有一个分配的唯一客户端 ID。这些客户端的示例包括:
- 并行 OBD 和 UDS 通信,其中每个协议由自己的 Dcm 客户端处理
- 虚拟 ECU 中的多个 Dcm 实例,其中 Dcm 实例彼此独立
- SWC 或复杂设备驱动程序,作为 OBD 系统中辅助 ECU 的代理
- 不同客户端清除 DTC
Dem 在各种 API 中支持客户端 ID 作为参数 'ClientId':
- 访问故障内存信息
- 读取事件相关数据
- 清除 DTC 和故障内存
- 控制故障内存行为
⌈[SWS_Dem_01251]⌋ Dem 应确保具有不同客户端 ID 的客户端可以并行调用带有 'ClientId' 参数的所有 API。来自一个客户端的 API 调用应独立于来自具有不同 ID 的客户端的同一 API 的调用进行处理。例如,如果一个客户端正在设置过滤器以迭代扩展数据记录,则另一个客户端可以设置不同的过滤器并迭代扩展数据记录。`(SRS_Diag_04162)`
⌈[SWS_Dem_01252]⌋ Dem 应仅接受所有带有 'ClientId' 参数的 API 中与任何配置的 `DemClientId` 匹配的 ClientId 值。如果传递了未配置的 ClientId 值,则 Dem 应报告 Det 错误 `DEM_E_WRONG_CONFIGURATION`。`(SRS_Diag_04162)`
注:客户端是 BSW/SW-C 模块或 CDD,它处理诊断请求或用于支持分布式诊断环境,例如在 Primary ECU 上处理的辅助 ECU 的事件。客户端 ID 概念明确不设计为提供对故障内存的任何任意 BSW 模块访问,特别是如果模块的目的不是处理诊断请求。设计侧重于用于 OBD 和 UDS 处理的 Dcm,以及用于分布式 OBD 系统的远程事件通信模块。
对于将 `DemClientUsesRte` 参数设置为 TRUE 的每个 DemClient,Dem 将提供 C/S 接口 `ClearDTC` 和 `EvMemOverflowIndication`。
##### 7.11.2.2 访问诊断故障内存
Dem 提供了一系列 API,用于控制和访问事件内存及其行为或配置和状态。这些 API 中的许多遵循"select and request"机制。最初,客户端选择一个 DTC 或一组 DTC,然后调用在活动选择上工作的 API。选择是客户端本地的,并保持到进行新选择。
⌈[SWS_Dem_01253]⌋ 如果调用 API `Dem_SelectDTC`,则 Dem 应在所请求的 DTCOrigin 和 DTCFormat 中使用所选 DTC 或 DTC 组作为以下 API 调用的目标:
- `Dem_ClearDTC`
- `Dem_DisableDTCRecordUpdate`
- `Dem_EnableDTCRecordUpdate`
- `Dem_GetDTCSelectionResult`
- `Dem_GetFunctionalUnitOfDTC`
- `Dem_GetSeverityOfDTC`
- `Dem_GetStatusOfDTC`
- `Dem_SelectFreezeFrameData`
- `Dem_SelectExtendedDataRecord`
- `Dem_SetDTCSuppression`
- `Dem_GetDTCSuppression`
`(SRS_Diag_04010)`
⌈[SWS_Dem_01306]⌋ 如果一个客户端在之前的操作完成之前调用 `Dem_SelectDTC`:如果一个客户端调用 `Dem_SelectDTC` 且同一客户端再次调用 `Dem_SelectDTC`,并且 Dem 当前仍基于 [SWS_Dem_01253] 的 `Dem_SelectDTC` 处理之前的操作,则 Dem 应返回 `DEM_BUSY`。`(SRS_Diag_04010)`
⌈[SWS_Dem_01305]⌋ 如果一个客户端在之前的操作仍在运行时启动新操作:如果根据 [SWS_Dem_01253] 的任何 `Dem_SelectDTC` 相关 API 由一个客户端调用,且同一客户端已启动根据 [SWS_Dem_01253] 的另一个 `Dem_SelectDTC` 相关操作且此不同操作未完成,则 Dem 应返回 `DEM_BUSY`。`(SRS_Diag_04010)`
⌈[SWS_Dem_01304]⌋ `Dem_Select` 相关操作的生命周期:Dem 应独立地认为基于 `Dem_SelectDTC` 的操作根据 [SWS_Dem_01253] 完成,无论客户端是否已从 Dem 请求 `E_OK` 结果。`(SRS_Diag_04010)`
客户端在另一个客户端的操作仍在运行时调用 `Dem_SelectDTC`,将指示客户端不再对正在运行的操作的结果感兴趣。结果可以被丢弃,并且在 Dem 准备好之后可以处理新的选择。
⌈[SWS_Dem_01198]⌋ 为了寻址所有 DTC,Dem 应提供符号 `DEM_DTC_GROUP_ALL_DTCS`,它选择所有配置的 DTC(表示为 0xFFFFFF)。`(SRS_Diag_04065)`
⌈[SWS_Dem_01254]⌋ API `Dem_SelectDTC` 触发分配给 ClientId 的事件内存上的 Dem 内部 DTC 选择过程。选择的结果应反映在 `Dem_SelectDTC` 调用之后的 API 调用的返回值中,参见 [SWS_Dem_01253]。`(SRS_Diag_04010)`
⌈[SWS_Dem_01255]⌋ 如果任何需要 `Dem_SelectDTC` 的 API(参见 [SWS_Dem_01253])在没有先前调用 `Dem_SelectDTC` 的情况下被调用,则 Dem 应报告 Det 错误 `DEM_E_WRONG_CONDITION`。`(SRS_BSW_00369)`
注:`Dem_SelectDTC` 在内部选择 DTC 或 DTC 组。如果客户端只对选择的结果感兴趣而没有进一步操作,则可以使用 API `Dem_GetDTCSelectionResult`。此 API 的一个用例是 UDS 服务 0x14 ClearDTC 的 NRC 处理。Dcm 需要在选择和删除 DTC 之间执行进一步的 NRC 相关验证。
⌈[SWS_Dem_01261]⌋ 未定义的 DTC 或格式的 API 行为:如果根据 [SWS_Dem_01253] 的任何需要 `Dem_SelectDTC` 的 API 在 `Dem_SelectDTC` 的选择无效时被调用,则 Dem 应返回 `DEM_WRONG_DTC`。如果提供的 DTC 未在相应的 DTCFormat 中指定有效的 DTC 或 GroupOfDTCs,则选择无效。如果之前没有调用 `Dem_SelectDTC`,选择也无效。`(SRS_BSW_00369)`
⌈[SWS_Dem_01299]⌋ 在没有选定 DTC 的情况下的 API 行为:如果根据 [SWS_Dem_01253] 的任何需要 `Dem_SelectDTC` 的 API 在此客户端没有先前调用 `Dem_SelectDTC` 的情况下被调用,则 Dem 应报告 Det `DEM_E_WRONG_CONDITION`。`(SRS_BSW_00369)`
⌈[SWS_Dem_01262]⌋ 未定义 DTCOrigin 的 API 行为:如果任何需要 `Dem_SelectDTC`(参见 [SWS_Dem_01253])的 API 在不存在的所选 DTCOrigin 上被调用,则 Dem 应在此 API 上返回 `DEM_WRONG_DTCORIGIN`。`c()`
⌈[SWS_Dem_01256]⌋ API `Dem_GetDTCSelectionResult` 应返回 `E_OK`,如果 `Dem_SelectDTC` 的选择成功,并且 DTC 或 DTC 组已准备好进行进一步处理。`(SRS_Diag_04010)`
注:在 `Dem_SelectDTC` 之后调用 `Dem_GetDTCSelectionResult` 是可选的。依赖于 `Dem_SelectDTC` 的 API 的行为在有或没有调用 `Dem_GetDTCSelectionResult` 的情况下相同。
⌈[SWS_Dem_01257]⌋ 如果调用 API `Dem_GetDTCSelectionResult` 并且来自 `Dem_SelectDTC` 的 DTC 或 DTC 组无效,则 Dem 应返回 `DEM_WRONG_DTC`。`(SRS_Diag_04010)`
⌈[SWS_Dem_01258]⌋ 如果调用 API `Dem_GetDTCSelectionResult` 并且提供给 `Dem_SelectDTC` 的 Origin 无效,则 Dem 应返回 `DEM_WRONG_DTCORIGIN`。`(SRS_Diag_04010)`
⌈[SWS_Dem_01296]⌋ `Dem_GetDTCSelectionResultForClearDTC` 功能的定义:API `Dem_GetDTCSelectionResultForClearDTC` 应与 `Dem_GetDTCSelectionResult` 完全相同,唯一的区别是,在选择单个 DTC 且该客户端的 `DemClearDTCLimitation` 设置为 `DEM_ONLY_CLEAR_ALL_DTCS` 的情况下,返回 `DEM_WRONG_DTC`。`(SRS_Diag_04010)`
##### 7.11.2.3 访问 DTC 和状态信息
以下章节定义了应使用的 API,以访问 DTC 的数量、匹配特定过滤器条件的 DTC 以及相关的状态信息。
⌈[SWS_Dem_00231]⌋ API `Dem_GetTranslationType` 应返回 `DemTypeOfDTCSupported` 中配置的 `DemEventMemorySet` 的转换格式。`(SRS_Diag_04201)`
⌈[SWS_Dem_00060]⌋ 函数 `Dem_GetDTCStatusAvailabilityMask` 应提供 UDS 状态可用性掩码(参见 `DemGeneral` 中的 `DemDtcStatusAvailabilityMask`),这意味着 Dem 模块相对于 UDS 服务 0x19 的测试仪客户端支持的 UDS 状态信息(根据 ISO-14229-1 [2])。确定可用性掩码时不应评估 ClientID。`(SRS_Diag_04067, SRS_Diag_04010)`
⌈[SWS_Dem_01181]⌋ Dem 模块应能够根据 ISO 14229-1 [1] 返回 DTC 严重性可用性掩码(参见 `Dem_GetDTCSeverityAvailabilityMask`)。`(SRS_Diag_04141)`
⌈[SWS_Dem_01182]⌋ 函数 `Dem_GetDTCSeverityAvailabilityMask` 应根据每个支持的 DTC 的严重性配置,根据 ISO 14229-1 [1] 计算 DTC 严重性可用性掩码。`(SRS_Diag_04141)`
⌈[SWS_Dem_00657]⌋ Dem 模块应使用 DTC 状态可用性掩码屏蔽提供给 Dcm 的所有 DTC 状态字节(API 参数 DTCStatus)(通过执行按位 AND 运算)。`(SRS_Diag_04010)`
⌈[SWS_Dem_00059]⌋ 函数 `Dem_GetStatusOfDTC` 应将所选 DTC 的状态复制到参数 `DTCStatus`。`DTCStatus` 格式根据 ISO-14229-1 [2]。`(SRS_Diag_04067)`
⌈[SWS_Dem_01259]⌋ 如果对所选格式中不存在的所选 DTC 调用 API `Dem_GetStatusOfDTC`,或者如果所选 DTC 是一组 DTC 或未选择 DTC,则 Dem 应返回 `DEM_WRONG_DTC`。`c()`
⌈[SWS_Dem_01260]⌋ 如果对不存在的所选 DTCOrigin 调用 API `Dem_GetStatusOfDTC`,则 Dem 应返回 `DEM_WRONG_DTCORIGIN`。`c()`
⌈[SWS_Dem_01275]⌋ 如果对没有分配 DTC 状态的所选 DTC 调用 API `Dem_GetStatusOfDTC`,则 Dem 应返回 `DEM_NO_SUCH_ELEMENT`。`c()`
注:在镜像事件内存中,DTC 不一定分配有状态。可能存在具有不同状态的 DTC,具体取决于位置。如果镜像内存用作协议栈,提供已在主要内存上执行的服务的信息,则可能会出现不同的 DTC 状态(例如,DTC 已从主要内存中删除并以其最新状态写入镜像内存)。
⌈[SWS_Dem_00057]⌋ 函数 `Dem_SetDTCFilter` 应为具有相同客户端 ID 的客户端设置后续调用的过滤器条件:
- `Dem_GetNumberOfFilteredDTC`
- `Dem_GetNextFilteredDTC`
- `Dem_GetNextFilteredDTCAndFDC`
- `Dem_GetNextFilteredDTCAndSeverity`
过滤器条件属性应使用直到下一次 `Dem_SetDTCFilter` 调用或 Dem 初始化。`(SRS_Diag_04057)`
注:可以使用不同的 ClientID 并行调用 `Dem_SetDTCFilter`(参见 [SWS_Dem_01251]),而不会相互干扰。这样,多个客户端可以并行访问故障内存数据。
在图 7.50 中,显示了一种情况,其中两个客户端(例如 OBD 的 Dcm 和 UDS 的 Dcm)正在并行读取过滤的 DTC 数量。
```text
Client1 Client2 «Module»
:Dem
Dem_SetDTCFilter(Std_ReturnType, "Client1", uint8, Dem_DTCFormatType, Dem_DTCOriginType, boolean, Dem_DTCSeverityType, boolean)
Dem_SetDTCFilter(Std_ReturnType, "Client2", uint8, Dem_DTCFormatType, Dem_DTCOriginType, boolean, Dem_DTCSeverityType, boolean)
Dem_GetNumberOfFilteredDTC(Std_ReturnType, "Client1", uint16*)
Dem_GetNumberOfFilteredDTC(Std_ReturnType, "Client2", uint16*)
Dem_GetNumberOfFilteredDTC(Std_ReturnType, "Client1", uint16*)
Dem_GetNumberOfFilteredDTC(Std_ReturnType, "Client2", uint16*)
Figure 7.50: Multiple clients requesting event memory information in parallel
```
⌈[SWS_Dem_01300]⌋ 在没有设置 DTC 过滤器的情况下的 API 行为:如果根据 [SWS_Dem_00057] 的任何需要 `Dem_SetDTCFilter` 的 API 在此客户端没有先前调用 `Dem_SetDTCFilter` 的情况下被调用,则 Dem 应报告 Det `DEM_E_WRONG_CONDITION`。`(SRS_BSW_00369)`
⌈[SWS_Dem_01264]⌋ 如果使用无效的 DTCOrigin 调用 `Dem_SetDTCFilter`,则 Dem 应返回 `E_NOT_OK`。`c()`
⌈[SWS_Dem_01265]⌋ 如果使用无效的 DTCStatusMask 调用 `Dem_SetDTCFilter`,则 Dem 应返回 `E_NOT_OK`。`c()`
⌈[SWS_Dem_01266]⌋ 如果在初始 `Dem_SetDTCFilter` 未返回 `E_OK` 之后调用 `Dem_SetDTCFilter` 的任何后续函数(参见 [SWS_Dem_00057]),则 Dem 应在此后续函数调用上返回 `E_NOT_OK`。`c()`
⌈[SWS_Dem_01263]⌋ 对 `Dem_SetDTCFilter` 的调用会在调用的 ClientID 分配的事件内存上设置请求的过滤器。`(SRS_Diag_04162)`
⌈[SWS_Dem_00649]⌋ 每次调用 `Dem_SetDTCFilter` 应导致该客户端的序列重置。`(SRS_Diag_04057)`
⌈[SWS_Dem_01058]⌋ 函数 `Dem_SetDTCFilter` 应忽略在 `DTCStatusMask` 中检索的不支持的位(参见配置参数 `DemDtcStatusAvailabilityMask`)。`c()`
`Dem_SetDTCFilter` 的参数 `DTCFormat` 与决定特定协议特性(如 OBD 与 UDS 与 J1939)相关。`DTCOrigin` 仅引用故障内存位置。
⌈[SWS_Dem_01066]⌋ 如果使用配置不支持的参数 `DTCFormat` 值调用函数 `Dem_SetDTCFilter`(例如,如果传递了 `DTCFormat = DEM_DTC_FORMAT_OBD`,但配置不支持 OBD),则应报告 Det 错误 `DEM_E_WRONG_CONFIGURATION`。`(SRS_Diag_04057)`
⌈[SWS_Dem_01067]⌋ 如果使用配置不支持的参数 `DTCOrigin` 值调用函数 `Dem_SetDTCFilter`(例如,如果传递了 `DTCOrigin "DEM_DTC_ORIGIN_MIRROR_MEMORY"`,但未配置镜像内存),则应报告 Det 错误 `DEM_E_WRONG_CONFIGURATION`。`c()`
⌈[SWS_Dem_00061]⌋ 函数 `Dem_GetNumberOfFilteredDTC` 应获取与 `Dem_SetDTCFilter` [SWS_Dem_00057] 函数调用定义的过滤器条件匹配的 DTC 数。`c()`
⌈[SWS_Dem_01267]⌋ 如果在调用 `Dem_SetDTCFilter` 之前调用根据 [SWS_Dem_00057] 的任何需要 `Dem_SetDTCFilter` 的 API,则应为此 API 调用报告 Det 错误 `DEM_E_WRONG_CONDITION`。`c()`
⌈[SWS_Dem_00216]⌋ 每次调用函数 `Dem_GetNextFilteredDTC` 时,Dem 模块应返回与 `Dem_SetDTCFilter` [SWS_Dem_00057] 函数调用定义的过滤器条件匹配的下一个 DTC 及其关联状态。`(SRS_Diag_04010)`
Dcm 持续调用函数 `Dem_GetNextFilteredDTC`,直到函数的返回值为 `DEM_NO_SUCH_ELEMENT`,以接收所有匹配过滤器条件的 DTC。
⌈[SWS_Dem_00653]⌋ 当 `DTCFormat = DEM_DTC_FORMAT_OBD`(表示排放相关服务)时,API `Dem_GetNextFilteredDTC` 不应返回值 `DEM_PENDING`。`c()`
理由:API `Dem_GetNextFilteredDTC` 用于 UDS 服务 0x19 以及 OBD 服务 $03/$07/$0A(参见 [SWS_Dem_00301])。UDS 服务 0x19 允许以 NRC 0x78(响应挂起)响应测试仪,而 OBD 服务则不允许。
⌈[SWS_Dem_00228]⌋ 每次调用函数 `Dem_GetNextFilteredDTCAndFDC` 时,Dem 模块应返回与 `Dem_SetDTCFilter`(参见 [SWS_Dem_00057])函数调用定义的过滤器条件匹配的下一个 DTC 及其关联故障检测计数器(FDC,参见 [SWS_Dem_00264])。`(SRS_Diag_04010)`
⌈[SWS_Dem_00513]⌋ 如果回调函数 `Dem_GetFaultDetectionCounter` 返回除 `E_OK` 之外的值或未为由 `Dem_GetNextFilteredDTCAndFDC` 过滤的 DTC 配置,则此 FDC 值应返回为 0。`(SRS_Diag_04010)`
Dcm 持续调用函数 `Dem_GetNextFilteredDTCAndFDC`,直到函数的返回值为 `DEM_NO_SUCH_ELEMENT`,以接收所有匹配过滤器条件的 DTC。
注:非 Dem 内部计算的故障检测计数器通常通过 RTE 从 SWC 请求。为了为这些 runnable 指示等效的调用树,使用了一个变通方法:Dcm 主函数指定对 Dem 接口 `GeneralEvtInfo`(操作 `GetFaultDetectionCounter`)的触发器,该触发器触发相应的 runnable(参见 RunnableEntity `Dem_GetFaultDetectionCounter`)。
⌈[SWS_Dem_00287]⌋ 每次调用函数 `Dem_GetNextFilteredDTCAndSeverity` 时,Dem 模块应返回与 `Dem_SetDTCFilter`(参见 [SWS_Dem_00057])函数调用定义的过滤器条件匹配的下一个 DTC 及其关联故障严重性。`(SRS_Diag_04010)`
Dcm 持续调用函数 `Dem_GetNextFilteredDTCAndSeverity`,直到函数的返回值为 `DEM_NO_SUCH_ELEMENT`,以接收所有匹配过滤器条件的 DTC。
有关函数 `Dem_GetSeverityOfDTC` 和 `Dem_GetFunctionalUnitOfDTC` 的信息,请参阅章节 7.4。
⌈[SWS_Dem_00595]⌋ 函数 `Dem_SetFreezeFrameRecordFilter` 应设置静态过滤器条件属性"事件内存中当前存储的所有冻结帧记录",用于后续 `Dem_GetNextFilteredRecord` 和 `Dem_GetNumberOfFreezeFrameRecords` 调用。此过滤器始终属于主要内存。`(SRS_Diag_04074)`
⌈[SWS_Dem_00650]⌋ `Dem_SetFreezeFrameRecordFilter` 的过滤器条件属性应使用直到下一次 `Dem_SetFreezeFrameRecordFilter` 调用或 Dem 初始化。每次调用 `Dem_SetFreezeFrameRecordFilter` 应导致迭代冻结帧的序列重置。`(SRS_Diag_04204)`
⌈[SWS_Dem_01312]⌋ `Dem_GetNumberOfFreezeFrameRecords` 应检索主要内存中匹配当前过滤器的冻结帧记录数。`(SRS_Diag_04205)`
⌈[SWS_Dem_01313]⌋ 在没有设置 DTC 过滤器的情况下的 API 行为:如果任何需要 `Dem_SetFreezeFrameRecordFilter` 的 API 在此客户端没有先前调用 `Dem_SetFreezeFrameRecordFilter` 的情况下被调用,则 Dem 应报告 Det `DEM_E_WRONG_CONDITION`。`(SRS_BSW_00369)`
⌈[SWS_Dem_00225]⌋ 每次调用函数 `Dem_GetNextFilteredRecord` 时,Dem 模块应返回与 `Dem_SetFreezeFrameRecordFilter` 函数调用定义的过滤器条件匹配的下一个 DTC 及其关联的相对寻址冻结帧记录号。`(SRS_Diag_04074)`
客户端持续调用函数 `Dem_GetNextFilteredRecord`,直到函数的返回值为 `DEM_NO_SUCH_ELEMENT`,以接收所有匹配过滤器条件的记录。
⌈[SWS_Dem_00219]⌋ 函数 `Dem_GetDTCByOccurrenceTime` 应提供根据 API 参数 `DTCRequest` 获取存储在所寻址 `DemEventMemorySet` 的主要事件内存中的一个 DTC 的能力。`(SRS_Diag_04195)`
⌈[SWS_Dem_00221]⌋ 如果在参数 `DTCRequest` 中没有 DTC 匹配请求的发生时间,则 API `Dem_GetDTCByOccurrenceTime` 应返回 `DEM_NO_SUCH_ELEMENT`。`(SRS_Diag_04195)`
##### 7.11.2.4 访问事件相关数据
本节定义了 API,以通过诊断访问存储在 Dem 事件内存中的 DTC 的事件相关数据(参见章节 7.7.7.1 和章节 7.7.7.3)。此外,可以访问存储在冻结帧中的 WWH-OBD 相关 PID。有关冻结帧处理的详细信息,请参见 ISO-14229-1 [2] 和 ISO 27145-3 [21]。
PID 到 DID 的映射示例:PID $04 -> DID 0xF404
注:返回的数据包括 ISO-14229-1 [2] 中为服务 0x19 0x05 的响应消息定义的 `DTCSnapshotRecordNumberOfIdentifiers`(DID 数量)。
⌈[SWS_Dem_01268]⌋ 如果调用 API `Dem_SelectFreezeFrameData`,则 Dem 应将 `Dem_SelectDTC` 选择的 DTC 和 `RecordNumber` 用作以下 API 调用的目标:
- `Dem_GetNextFreezeFrameData`
- `Dem_GetSizeOfFreezeFrameSelection`
`(SRS_Diag_04074)`
⌈[SWS_Dem_01269]⌋ API `Dem_SelectFreezeFrameData` 触发分配给 ClientId 的事件内存上的 Dem 内部冻结帧选择过程。Dem 应在 `Dem_SelectFreezeFrameData` 调用之后的 API 调用的返回值中提供选择过程的结果,参见 [SWS_Dem_01268]。`(SRS_Diag_04010)`
⌈[SWS_Dem_01270]⌋ 如果根据 [SWS_Dem_01268] 的任何需要 `Dem_SelectFreezeFrameData` 的 API 在没有先前调用 `Dem_SelectFreezeFrameData` 的情况下被调用,则 Dem 应报告 Det 错误 `DET_E_WRONG_CONDITION`。`(SRS_BSW_00369)`
⌈[SWS_Dem_01271]⌋ 如果任何需要 `Dem_SelectFreezeFrameData` 的 API 在没有先前调用 `Dem_SelectFreezeFrameData` 的情况下被调用,则 Dem 应报告 Det 错误 `DEM_E_WRONG_CONDITION`。`(SRS_BSW_00369)`
⌈[SWS_Dem_00071]⌋ 函数 `Dem_GetNextFreezeFrameData` 应将由 API `Dem_SelectFreezeFrameData` 为指定 ClientId 选择的冻结帧记录的特定数据标识符(DID)复制到由 `DestBuffer` 参数提供的目标缓冲区。Dem 应使用图 7.51 所示的格式将这些数据作为完整记录传输。`(SRS_Diag_04074)`
⌈[SWS_Dem_00576]⌋ 如果由 API `Dem_SelectFreezeFrameData` 选择的 `RecordNumber` 设置为 0x00,则 `Dem_GetNextFreezeFrameData` 应提供事件/DTC 特定的 WWH-OBD 等效冻结帧记录。`(SRS_Diag_04074)`
注:仅当 Dem 模块支持 WWH-OBD(参见 `DemOBDSupport`)时,才支持使用 `Dem_SelectFreezeFrameData` 和 `Dem_GetNextFreezeFrameData` 检索记录 0x00。
```text
requested freeze frame record
calculated (e.g. 1), or configured
(e.g. first value from list)
RecordNum Num of DIDs 1st DID Data #1 ... Nth DID Data #N
Byte 0 Byte 1 Byte 2..3 Byte 4..j Byte j..k Byte k..(k+2) Byte (k+2)..n
Data element #1 ... Data element #N
Figure 7.51: Buffer format used by Dem_GetNextFreezeFrameData
```
注:返回的数据包括 ISO-14229-1 [2] 中为服务 0x19 0x04 的响应消息定义的 `DTCSnapshotRecordNumber`(`RecordNum`)和 `DTCSnapshotRecordNumberOfIdentifiers`(DID 数量)。与 Dcm PID 结构处理相反,DID 结构在 Dem 模块内处理。因此,Dem 已经根据响应布局返回完整的冻结帧记录。这导致优化的 Dem/Dcm 接口。
⌈[SWS_Dem_00630]⌋ 如果选择了单个 DTC,并且使用未存储的有效 `RecordNumber` 调用 API `Dem_SelectFreezeFrameData`,则 `Dem_GetNextFreezeFrameData` 应返回 `E_OK` 和 `BufSize` 0(空缓冲区)。`(SRS_Diag_04074)`
⌈[SWS_Dem_00074]⌋ 函数 `Dem_GetSizeOfFreezeFrameSelection` 应为指定 ClientId 返回由 `Dem_SelectFreezeFrameData` 请求的冻结帧记录的大小,它表示用户数据字节数,包括任何冻结帧标头信息(根据 [SWS_Dem_00071] 中定义的格式)。`(SRS_Diag_04204)`
注:如果请求记录号值 0xFF,则 Dem 根据 [SWS_Dem_00074] 考虑所有存储的冻结帧记录的大小。
⌈[SWS_Dem_01272]⌋ 如果调用 API `Dem_SelectExtendedDataRecord`,则 Dem 应将 `Dem_SelectDTC` 选择的 DTC 和 `ExtendedDataNumber` 用作以下 API 调用的目标:
- `Dem_GetNextExtendedDataRecord`
- `Dem_GetSizeOfExtendedDataRecordSelection`
`(SRS_Diag_04074)`
⌈[SWS_Dem_01273]⌋ API `Dem_SelectExtendedDataRecord` 触发分配给 ClientId 的事件内存上的 Dem 内部扩展数据记录选择过程。Dem 应在 `Dem_SelectExtendedDataRecord` 之后的 API 调用的返回值中提供选择过程的结果,参见 [SWS_Dem_01272]。`(SRS_Diag_04010)`
⌈[SWS_Dem_01274]⌋ 如果根据 [SWS_Dem_01272] 的任何需要 `Dem_SelectExtendedDataRecord` 的 API 在没有先前调用 `Dem_SelectExtendedDataRecord` 的情况下被调用,则 Dem 应报告 Det 错误 `DEM_E_WRONG_CONDITION`。`(SRS_BSW_00369)`
⌈[SWS_Dem_00075]⌋ API `Dem_GetNextExtendedDataRecord` 应将 `Dem_SelectExtendedDataRecord` API 为指定 ClientId 请求的扩展数据记录的完整数据复制到目标缓冲区(`DestBuffer`)。函数应使用图 7.52 所示的格式将这些数据作为完整记录传输。扩展数据记录号作为第一个字节放置在复制的数据中。`(SRS_Diag_04074)`
```text
Extended Data Record Buffer
ExtendedData
Data element #1 … Data element #n
RecordNumber
Byte 0 Byte 1 Byte n
Figure 7.52: Buffer format used by Dem_GetNextExtendedDataRecord
```
⌈[SWS_Dem_00631]⌋ 如果使用有效的 DTC 和未存储的有效扩展数据记录号调用 API `Dem_SelectExtendedDataRecord`,则该 API 应返回 `E_OK`,并且 `Dem_GetNextExtendedDataRecord` 应返回 `BufSize` 0(空缓冲区)。`(SRS_Diag_04074)`
⌈[SWS_Dem_00076]⌋ 函数 `Dem_GetSizeOfExtendedDataRecordSelection` 应返回由 `Dem_SelectExtendedDataRecord` 选择的所请求的扩展数据记录的大小,它表示存储在扩展数据记录中的用户数据字节数,包括任何扩展数据记录标头信息(即扩展数据记录号,与 [SWS_Dem_00075] 中定义的格式不同)。`(SRS_Diag_04074)`
注:如果请求记录号值 0xFE,则 Dem 根据 [SWS_Dem_00076] 考虑 0x90 到 0xEF 范围内所有存储的 OBD 扩展数据记录的大小。
注:如果请求记录号值 0xFF,则 Dem 根据 [SWS_Dem_00076] 考虑所有存储的扩展数据记录(0x01 到 0xEF 范围内)的大小。
如果特定 DTC 的冻结帧或扩展数据将由后续 API 调用访问,则 Dcm 使用函数 `Dem_DisableDTCRecordUpdate`。这样做是为了确保在 Dcm 通过多个 API 调用访问此 DTC 的请求数据时,这些数据不会更改。
⌈[SWS_Dem_00270]⌋ 函数 `Dem_DisableDTCRecordUpdate` 应保护所选 DTCOrigin 中所选 DTC 的事件相关数据免受更新或删除,以便为以下后续 API 调用提供一致的读取:
- `Dem_SelectFreezeFrameData`、`Dem_GetSizeOfFreezeFrameSelection` 和 `Dem_GetNextFreezeFrameData`
- `Dem_SelectExtendedDataRecord`、`Dem_GetSizeOfExtendedDataRecordSelection` 和 `Dem_GetNextExtendedDataRecord`
`c()`
只要空间可用,仍可以将新事件和其他事件及其关联的冻结帧和扩展数据记录添加到事件内存中并在其中进行更改。
注:事件相关数据可能仍会在后台更新(例如 Dem 内部数据元素)。
注:函数 `Dem_DisableDTCRecordUpdate` 不影响 UDS 状态信息更新。
⌈[SWS_Dem_00271]⌋ 函数 `Dem_EnableDTCRecordUpdate` 应释放当前由函数 `Dem_DisableDTCRecordUpdate` 保护的禁用 DTC,以便数据可以再次更新。`(SRS_Diag_04074)`
函数 `Dem_EnableDTCRecordUpdate` 是函数 `Dem_DisableDTCRecordUpdate` 的对应项。
Dcm 在特定 DTC 的冻结帧和扩展数据由函数 `Dem_DisableDTCRecordUpdate` 保护之后,后续 API 调用的访问完成后,调用函数 `Dem_EnableDTCRecordUpdate`。
⌈[SWS_Dem_00648]⌋ 如果启用开发错误检测,并且在同一客户端锁定了另一个 DTC 的同时调用函数 `Dem_DisableDTCRecordUpdate`,则 Dem 模块应报告 Det `DEM_E_WRONG_CONDITION`(另请参见 [SWS_Dem_00370])。`(SRS_Diag_04066)`
##### 7.11.2.5 清除诊断信息
Dem 为 Dcm 和其他诊断客户端提供清除 DTC 的功能。一般 DTC 清除过程在章节 7.7.2.2 中描述。
##### 7.11.2.6 控制 DTC 设置
⌈[SWS_Dem_01290]⌋ 受 `Dem_DisableDTCSetting` 和 `Dem_EnableDTCSetting` 影响的 DTC:API `Dem_DisableDTCSetting` 和 `Dem_EnableDTCSetting` 的调用对调用的 clientId 引用的 `DemEventMemorySet` 分配的所有事件和 UDS 状态字节有效。不受从此 `DemEventMemorySet` 引用的 DTC 影响。`(SRS_Diag_04010)`
⌈[SWS_Dem_00079]⌋ 如果调用函数 `Dem_DisableDTCSetting`,则 Dem 应禁用所有事件的存储和 UDS 状态字节更新。`(SRS_Diag_04010)`
函数 `Dem_DisableDTCSetting` 用于系统中的诱发故障情况,例如在网络中一个 ECU 的 flashreprogramming 期间。在这种情况下,所有 ECU 都通过诊断请求命令(通过使用 `Dem_DisableDTCSetting` / `Dem_EnableDTCSetting` 从 Dcm 转发)忽略 DTC 报告,因为闪存的 ECU 不再参与正常通信。
注:如果另一个联网的 ECU 需要一个现在缺失的信号,在这种情况下,故障安全反应不能分配给 UDS 状态字节更新,因为在 DTC 设置禁用期间这些也被抑制。
⌈[SWS_Dem_00080]⌋ 如果调用函数 `Dem_EnableDTCSetting`,则 Dem 应启用所有事件的存储和 UDS 状态字节。`(SRS_Diag_04115)`
⌈[SWS_Dem_00626]⌋ 当 DTC 设置被禁用时,对于分配给此特定 DTC 组的事件,来自 API `Dem_SetEventStatus` 的所有状态报告应被 Dem 忽略(UDS 状态字节无变化)。`(SRS_Diag_04115)`
注:这类似于启用条件处理(参见 [SWS_Dem_00449])。它对 `Dem_ResetEventDebounceStatus`、`Dem_ResetEventStatus` 和 `Dem_ClearDTC` 没有影响。在 Dem 内部去抖的情况下,相关的故障检测计数器将被冻结或重置(参见章节图 7.33 和图 7.36)。
##### 7.11.2.7 异步 Dcm 操作
Dem/Dcm 接口的大多数 API 依赖于 NVRAM 数据。因此,通过使用额外的 `DEM_PENDING` 返回值来实现这些 API 的异步处理。
#### 7.11.3 与 J1939 诊断管理器(J1939)的交互
⌈[SWS_Dem_00971]⌋ 如果主要事件内存内的事件的 TestFailed 位发生变化,并且 J1939 DTC 编号已分配给该事件,则应为引用此 `DemEventMemorySet` 的每个 DemClient 调用函数 `J1939Dcm_DemTriggerOnDTCStatus`。`(SRS_Diag_04112)`
#### 7.11.4 与功能抑制管理器(FIM)的交互
功能抑制管理器的目的是基于抑制条件(例如检测到的错误)控制(启用/禁用)软件组件内的功能实体。Dem 对此功能的贡献是向 FiM 提供监视状态更改和 DemComponent 信息。
⌈[SWS_Dem_00029]⌋ 如果将 `DemTriggerFiMReports` 设置为 True,则 Dem 模块应在监视状态发生每次更改时通知 FiM 模块(参见 [8]),通过在 `Dem_SetEventStatus` 的上下文中调用函数 `FiM_DemTriggerOnEventStatus`(与 `_DemTriggerOnMonitorStatus` 的语法相同)。`(SRS_Diag_04031)`
Fim 使用函数 `Dem_GetMonitorStatus` 进行可能的合理性检查、重新构建等抑制关系。
⌈[SWS_Dem_01325]⌋ Dem 应在监视器和组件状态初始化后调用 `FiM_DemInit`。`(SRS_Diag_04031)`
⌈[SWS_Dem_01189]⌋ 如果使用 Fim,则 Dem 应在 `Dem_Init` 期间调用 `FiM_DemInit` 以触发 Fim 内权限的初始化。`FiM_DemInit` 仅应在此时调用。`(SRS_Diag_04031)`
#### 7.11.5 与 NVRAM Manager(NvM)的交互
通常,Dem 模块使用非易失性内存块(大小由 NVRAM Manager [5] 配置)来实现 UDS 状态信息、事件相关数据和所需内部状态的永久存储(例如在启动时检索状态)。每个从 Dem 使用的非易失性内存块也需要配置(参见 `DemNvRamBlockId`)。使用的非易失性内存块的数量、类型和内容未指定。这些应以特定于实现的方式处理。
NvM 的使用也可以通过配置停用(参见 `DemNvRamBlockId` 的多重性),这样 Dem 将仅基于 RAM 工作。
⌈[SWS_Dem_00339]⌋ Dem 模块应验证其非易失性块的有效性(与块状态相关)、完整性(与 CRC 结果相关),以及一般的 NvM 读取错误(在使用相应数据之前)。`(SRS_Diag_04107)`
通常,此验证通过使用这些块的 API `NvM_GetErrorStatus` 在 API `Dem_Init` 中完成,这些块由 ECU State Manager(参见 API `NvM_ReadAll`)读取。
注:对于 Dem 模块的非易失性数据,建议在 NvM 中配置 CRC。
⌈[SWS_Dem_00578]⌋ 如果 NVM 模块无法读取 Dem 模块的某些非易失性数据,则 Dem 模块应使用其初始值初始化所有非易失性数据。`(SRS_Mem_08549)`
注:为避免可读块和错误块之间的不一致,初始化所有非易失性数据。初始化是为了允许 NvM 模块的故障检测机制将相应的读取错误报告给 Dem 模块(参见 `Dem_SetEventStatus`)。这些错误表示有缺陷的 NVRAM。
⌈[SWS_Dem_00340]⌋ 在 API `Dem_Init` 完成后,Dem 应完全可操作。`(SRS_BSW_00101)`
⌈[SWS_Dem_01237]⌋ 如果 DTC 被报告为失败(UDS 状态 testfailed 标志从 0->1 变化)并新存储到事件内存中(没有此 DTC 的条目),并且此 DTC 配置了 `DemNvStorageStrategy = IMMEDIATE_AT_FIRST_OCCURRENCE`,则 Dem 应触发立即存储到 NvM。`(SRS_Diag_04077)`
⌈[SWS_Dem_01238]⌋ 如果 DTC 配置了 `DemNvStorageStrategy = DURING_SHUTDOWN`,则其数据(DTC、UDS 状态、事件内存条目)的任何更改只能在关闭期间存储到 NvM。`(SRS_Diag_04077)`
⌈[SWS_Dem_00551]⌋ 如果为特定 DTC 启用了立即非易失性存储,则 Dem 模块应触发新事件内存条目以及事件相关数据每次更改后的存储。`(SRS_Diag_04077)`
注:对于立即存储的事件内存条目,必须确保在 `Dem_Init` 期间数据一致性(例如与 UDS 状态字节)。
注:如果禁用立即非易失性存储,则事件内存条目及其事件相关数据在关闭阶段持久存储(参见 [SWS_Dem_00102]、[SWS_Dem_00341] 和下面的注释)。
注:对 NVRAM 的写操作在任何情况下都会在 ECU 关闭时执行。
⌈[SWS_Dem_00102]⌋ API `Dem_Shutdown` 应完成 Dem 模块中的所有挂起操作,以准备内部状态和数据以便传输到 NVRAM。事件内存应被锁定,直到再次调用 API `Dem_Init` 时才能修改。`(SRS_BSW_00336)`
⌈[SWS_Dem_00341]⌋ 对于已更改的非易失性数据,Dem 模块应在 `Dem_Shutdown` 之前或期间触发到 NVRAM 的存储。`(SRS_BSW_00336)`
基于 Dem 配置和实现,由 ECU State Manager 调用的 API `NvM_WriteAll` 执行从 NVRAM 中要存储的 Dem 相关 NvM 块的复制过程。
如果在 NvM 完成将所有数据复制到 NVRAM 之前断开 ECU 电源,则这些数据将不完整/不一致或未存储。在下次启动时,可能找不到最后操作循环的事件。因此,NVRAM Manager 配置提供数据一致性机制,例如冗余数据块。
⌈[SWS_Dem_00164]⌋ Dem 模块应使用 NVRAM Manager 的 API `NvM_WriteBlock` 和 `NvM_ReadBlock`,如果需要在 `Dem_Init` 和 `Dem_Shutdown` 之间存储和恢复数据。`(SRS_Diag_04077)`
注:NvM 模块为块读取和写入实现重试机制。因此,Dem 模块不为非易失性块实现任何重试机制。
⌈[SWS_Dem_00579]⌋ 如果 NVM 模块无法写入 Dem 模块的某些非易失性数据,则 Dem 模块应忽略 NvM 报告的负返回值。`(SRS_BSW_00171)`
注:如果 Dem 非易失性数据的写入失败,则 Dem 模块无法执行任何适当的反应。
#### 7.11.6 与 Default Error Tracer(Det)的交互
与 Det 的交互在章节 7.13 中描述。
#### 7.11.7 Dem 模块所需的数据
Dem 模块需要不同的信息用于内部计算/处理。如果此信息由 SWC(作为 provide-ports)提供,则在相应的 ServiceNeeds(诊断功能)中描述。
Dem 模块所需的一种信息是事件相关数据(由冻结帧和扩展数据记录表示,参见章节 7.7.7)。
注:对于 OBD 相关 ECU,Dem 模块可以通过数据元素接口访问以下数据值:
- 发动机温度、发动机转速
- 车速(参见 [SWS_Dem_00346],PID $0D)
- 距离信息
- 编程事件
- 环境温度
- 环境压力
- 加速踏板信息
但是,数据元素及其所需大小和分辨率的列表是特定于实现的,将在 OBD 中配置并在集成过程中处理。例如,车速、加速踏板信息、环境温度等是评估 IUMPR 通用分母的循环条件所必需的。类似输入对于 PID 计算也是必需的(例如,用于计算暖机循环或暖机循环条件本身的发动机温度)。这些变量通常通过 RTE 访问。
#### 7.11.8 服务接口上的缩放信息
SoftwareComponentTemplate [22] 定义了元类 SwDataDefProps,它涵盖了在各个方面下特定数据对象的所有属性。本节描述了两种替代工作流,即 SwDataDefProps 属性(如 CompuMethod、DataContraints 和 Units)如何在 Dem 服务 SWC 内使用并通过 `DemExternalSRDataElementClass` 使其可用。
⌈[SWS_Dem_CONSTR_6117]⌋ `DemAlternativeDataType` 处的 `DemTextTableMapping` 的聚合仅在由 `DemApplicationDataType` 引用的 DataType 的 CompuMethod 的 category 设置为 `TEXTTABLE` 或 `SCALE_LINEAR_AND_TEXTTABLE` 时有效。`c()`
**工作流 1**
此工作流是在生成的 EcuC 值中使用 EcucForeignReference。在导入 DEXT [23] 信息时,导出 `DemDiagnosticDataElementRef` 并将 EcucForeignReference 保留到 DEXT [23] 文件中的 DiagnosticDataElement。此 EcucForeignReference 允许访问相应 DiagnosticDataElement 的所有 SwDataDefProps(BaseTyoe、CompuMethod、DatConstr 等)。容器 `DemAlternativeDiagnosticDataElement` 聚合此 EcucForeignReference。在生成相应服务 SWC 的过程中,所有需要的内容将基于来自 DEXT [23] 的 EcucForeignReference 直接复制到服务 SWC。在此工作流中,生成服务 SWC 时需要 DEXT 文件的存在。
```text
OEM Supplier
DEXT EcuC
DiagnosticDataIdentifier DEM Service
-> DiagnosticDataElement DemAlternativeDataType.Dem
-> SwDataDefProps ApplicationDataType SWC
-> CompuMethodRef
CompuMethod
-> ASCII_10Byte SWC DEXT based
depends on
EcuCValues
DEM
Internal Configuration
EcuCValues
* The DEXT importer generates one SWC which contains all SwDataDefProps and the ECUC parameter
(DemAlternativeDataType.DemApplicationDataType) refers to the SWC. Within the SWBuild processing this reference to SWC is
taken and the required contents (CompuMethod / DataContraints / Units) are included into the Dem SWCD.
Figure 7.53: Workflow 1
```
**工作流 2**
此工作流是,在导入 DEXT [23] 信息时,除了 EcuC 值之外,还会生成 SWC fragment。在此 SWC fragment 中,所有需要的 SwDataDefProps 直接从 DEXT [23] 文件复制。在生成的 EcuC 值中,EcuC 参数 `DemApplicationDataType` 引用 SWC fragment 并允许访问所有 SwDataDefProps(BaseTyoe、CompuMethod、DatConstr 等)。在生成相应服务 SWC 的过程中,所有需要的内容将基于从 `DemApplicationDataType` 到 SWC fragment 的引用包含在内。在此工作流中,生成服务 SWC 时不需要 DEXT [23] 文件的存在。
```text
OEM Supplier
DEXT EcuC
DiagnosticDataIdentifier DEM Service
-> DiagnosticDataElement DemAlternativeDataType.Dem
-> SwDataDefProps ApplicationDataType SWC
-> CompuMethodRef
CompuMethod
-> ASCII_10Byte SWC DEXT based
depends on
EcuCValues
DEM
Internal Configuration
EcuCValues
* The DEXT importer generates one SWC which contains all SwDataDefProps and the ECUC parameter
(DemAlternativeDataType.DemApplicationDataType) refers to the SWC. Within the SWBuild processing this reference to SWC is
taken and the required contents (CompuMethod / DataContraints / Units) are included into the Dem SWCD.
Figure 7.54: Workflow 2
```
### 7.12 版本检查
有关详细信息,请参阅 SWS_BSWGeneral 中的章节 5.1.8"Version Check"。
### 7.13 错误分类
#### 7.13.1 开发错误
⌈[SWS_Dem_00173]⌋ 表 7.7 中显示的错误应由 Dem 模块根据其配置(开发/生产模式)检测。`(SWS_BSW_00050, SWS_BSW_00212)`
| 错误类型 | 相关性 | 相关错误代码 | 值(十六进制) |
|---|---|---|---|
| 使用活动配置不允许的参数值调用 API 函数 | 开发 | `DEM_E_WRONG_CONFIGURATION` | 0x10 |
| 使用 NULL 指针调用 API 函数 | 开发 | `DEM_E_PARAM_POINTER` | 0x11 |
| 使用错误的参数值调用 API 函数 | 开发 | `DEM_E_PARAM_DATA` | 0x12 |
| 使用错误的长度参数值调用 API 函数 | 开发 | `DEM_E_PARAM_LENGTH` | 0x13 |
| Dem 初始化失败(参见 SWS_BSW_00151) | 开发 | `DEM_E_INIT_FAILED` | 0x14 |
| 在 Dem 模块完全初始化之前调用 API 函数(参见 [SWS_Dem_00124]、[SWS_Dem_00364])或在 Dem 模块已关闭之后调用(参见 [SWS_Dem_00368]) | 开发 | `DEM_E_UNINIT` | 0x20 |
| 各个 API 调用的所需条件未满足(例如,启动了无效的状态更改,或过滤器未正确设置等 - 参见 [SWS_Dem_00518]) | 开发 | `DEM_E_WRONG_CONDITION` | 0x40 |
| 使用无效的 OBDMID 调用 `Dem_DcmGetAvailableOBDMIDs` | 开发 | `DEM_E_INVALID_OBDMID` | 0x50 |
**表 7.7:Dem 模块可检测的错误类型**
⌈[SWS_Dem_00124]⌋ 如果 `DemDevErrorDetect` 设置为 TRUE 并且任何 Dem API 包括:
- `Dem_SetEventStatus`
- `Dem_ResetEventStatus`
- `Dem_SetEventAvailable`
- `Dem_ResetEventDebounceStatus`
- `Dem_GetVersionInfo`
- `Dem_MainFunction`
在 Dem 完全初始化之前被调用,则 Dem 模块应设置错误代码 `DEM_E_UNINIT`。`(SRS_BSW_00406)`
注:如果禁用开发错误检测且 Dem 未完全初始化,则 API 的行为是未定义的。
⌈[SWS_Dem_01324]⌋ 在 `Dem_Init` 期间,Dem 初始化监视器和组件状态。在此时间点之后,Dem 应在 API `Dem_GetMonitorStatus` 和 `Dem_GetComponentFailed` 上返回 `E_OK`。`c()`
⌈[SWS_Dem_00364]⌋ 如果启用开发错误检测,并且在 Dem 预初始化之前任何实例调用 `Dem_SetEventStatus` 或 `Dem_ResetEventDebounceStatus`,则 Dem 模块应设置错误代码 `DEM_E_UNINIT`。`(SRS_BSW_00406)`
注:如果禁用开发错误检测且 Dem 未预初始化,则这些 API 的行为是未定义的。
⌈[SWS_Dem_00368]⌋ 如果启用开发错误检测,并且在 `Dem_Shutdown` 被调用后任何实例调用任何 Dem API(不包括 `Dem_SetEventStatus`、`Dem_ResetEventDebounceStatus`、`Dem_GetVersionInfo` 和 `Dem_MainFunction`),则 Dem 模块应设置错误代码 `DEM_E_UNINIT`,直到再次调用 `Dem_Init`。`(SRS_BSW_00337)`
注:如果禁用开发错误检测且 Dem 已关闭,则这些 API 的行为是未定义的。
⌈[SWS_Dem_00518]⌋ 如果启用开发错误检测,并且 Dem 函数的调用未满足所需的先决条件,则 Dem 模块应设置错误代码 `DEM_E_WRONG_CONDITION`。`(SRS_Diag_04057)`
注:例如,在使用 `FilterForFaultDetectionCounter = FALSE` 调用 `Dem_SetDTCFilter` 之后调用 `Dem_GetNextFilteredDTCAndFDC`。
⌈[SWS_Dem_00370]⌋ 如果启用开发错误检测,且 Dem 函数检测到开发错误,则 Dem 函数应在报告开发错误后立即返回 `E_NOT_OK`(对于 `Std_ReturnType`)或适当的负返回值。`(SRS_Diag_04057)`
#### 7.13.2 运行时错误
| 错误类型 | 相关性 | 相关错误代码 | 值(十六进制) |
|---|---|---|---|
| 与已更改监视器状态对应的 UDS 状态无法处理 | 运行时 | `DEM_E_UDS_STATUS_PROCESSING_FAILED` | 0x21 |
| SW-C 或 BSW 调用没有可用数据元素的有效数据 | 运行时 | `DEM_E_NODATAAVAILABLE` | 0x30 |
**表 7.8:Dem 模块可检测的错误类型**
#### 7.13.3 瞬态故障
没有瞬态故障。
#### 7.13.4 生产错误
没有生产错误。
#### 7.13.5 扩展生产错误
没有扩展生产错误。
### 7.14 错误检测
有关详细信息,请参阅 SWS_BSWGeneral [6] 中的章节 7.2.2.3"Configuration"。
### 7.15 错误通知
有关详细信息,请参阅 SWS_BSWGeneral [6] 中的章节 7.2.2.4"Reporting"。
---
## 8 API 规范
下图显示了 Dem 与其周围的 SW-C 和 BSW 模块之间的接口。接口的描述应给出这些关系的简单概述。
```text
«module» «... «interface»
Dcm Dem Dem_Det_Optional «modu...
Det
«function»
«optional» ::Det_ReportError
«module» Det_ReportError(return, ModuleId, InstanceId, ApiId, ErrorId)
[BSW]
«interface»
«module» Dem_Fim_Optional
[SWC]
«function»
«optional» ::FiM_DemInit
FiM_DemInit()
::FiM_DemTriggerOnMonitorStatus
«interface» FiM_DemTriggerOnMonitorStatus(EventId)
SchM_Dem_Mandatory
«scheduled_function» «interface»
::Dem_MainFunction Fim_Dem_Mandatory «mandatory»
Dem_MainFunction()
«function» «modu...
::Dem_GetMonitorStatus FiM
Dem_GetMonitorStatus(return, EventID, MonitorStatus)
«optional»
«module» «module»
SchM EcuM «interface»
Dem_NvM_Optional
«function»
::NvM_GetErrorStatus
«optional» NvM_GetErrorStatus(return, BlockId, RequestResultPtr) «modu...
«optional»
::NvM_SetRamBlockStatus NvM
«interface» NvM_SetRamBlockStatus(return, BlockId, BlockChanged)
EcuM_Dem_Optional ::NvM_WriteBlock
NvM_WriteBlock(return, BlockId, NvM_SrcPtr)
«function» ::NvM_ReadBlock
::Dem_Init NvM_ReadBlock(return, BlockId, NvM_DstPtr)
Dem_Init(ConfigPtr)
::Dem_Shutdown
Dem_Shutdown()
::Dem_PreInit
Dem_PreInit()
Figure 8.1: Overview of interfaces between the Dem and other BSW modules
```
```text
«m... «interface» «m...
Dem BSW_Dem_Use [BSW]
«function»
::Dem_ClearDTC «use»
+ Dem_ClearDTC(Std_ReturnType, uint8)
::Dem_GetVersionInfo
+ Dem_GetVersionInfo(Std_VersionInfoType**)
«interface»
BSW/SWC_Dem_Use
«function»
::Dem_GetEventUdsStatus
+ Dem_GetEventUdsStatus(Std_ReturnType, Dem_EventIdType, Dem_UdsStatusByteType**)
::Dem_GetEventExtendedDataRecordEx
+ Dem_GetEventExtendedDataRecordEx(Std_ReturnType, Dem_EventIdType, uint8, uint8**, uint16**): void
::Dem_GetEventFreezeFrameDataEx
«use»
+ Dem_GetEventFreezeFrameDataEx(Std_ReturnType, Dem_EventIdType, uint8, uint16, uint8**, uint16**): void
::Dem_ResetEventDebounceStatus
+ Dem_ResetEventDebounceStatus(Std_ReturnType, Dem_EventIdType, Dem_DebounceResetStatusType)
::Dem_RepIUMPRFaultDetect
+ Dem_RepIUMPRFaultDetect(Std_ReturnType, Dem_RatioIdType)
::Dem_RepIUMPRDenRelease
+ Dem_RepIUMPRDenRelease(Std_ReturnType, Dem_RatioIdType)
::Dem_GetEventMemoryOverflow
+ Dem_GetEventMemoryOverflow(Std_ReturnType, uint8, Dem_DTCOriginType, boolean**): void
::Dem_SetEnableCondition
+ Dem_SetEnableCondition(Std_ReturnType, uint8, boolean)
::Dem_SetDTCSuppression
+ Dem_SetDTCSuppression(Std_ReturnType, uint8, boolean): void
::Dem_SetStorageCondition
+ Dem_SetStorageCondition(Std_ReturnType, uint8, boolean): void
::Dem_GetIndicatorStatus
+ Dem_GetIndicatorStatus(Std_ReturnType, uint8, Dem_IndicatorStatusType**) «m...
::Dem_GetDTCOfEvent [SWC]
+ Dem_GetDTCOfEvent(Std_ReturnType, Dem_EventIdType, Dem_DTCFormatType, uint32**)
::Dem_SetEventDisabled
«use»
+ Dem_SetEventDisabled(Std_ReturnType, Dem_EventIdType)
::Dem_SetPtoStatus
+ Dem_SetPtoStatus(Std_ReturnType, boolean)
«interface»
SWC_Dem_Use
«function»
::Dem_SetEventStatus
+ Dem_SetEventStatus(Std_ReturnType, Dem_EventIdType, Dem_EventStatusType)
::Dem_ResetEventStatus «use»
+ Dem_ResetEventStatus(Std_ReturnType, Dem_EventIdType)
::Dem_PrestoreFreezeFrame
+ Dem_PrestoreFreezeFrame(Std_ReturnType, Dem_EventIdType)
::Dem_ClearPrestoredFreezeFrame
+ Dem_ClearPrestoredFreezeFrame(Std_ReturnType, Dem_EventIdType)
::Dem_RestartOperationCycle
+ Dem_RestartOperationCycle(Std_ReturnType, uint8)
::Dem_GetFaultDetectionCounter
+ Dem_GetFaultDetectionCounter(Std_ReturnType, Dem_EventIdType, sint8**)
Figure 8.2: Overview of interfaces between the Dem and other BSW modules (in general)
```
```text
«mo... «interface»
Dem Dcm_Dem_Optional
«function»
::Dem_DcmReadDataOfOBDFreezeFrame
+ Dem_DcmReadDataOfOBDFreezeFrame(return, PID, DataElementIndexOfPID, DestBuffer, BufSize)
::Dem_DisableDTCRecordUpdate
+ Dem_DisableDTCRecordUpdate(return, ClientId)
::Dem_DisableDTCSetting
+ Dem_DisableDTCSetting(return, ClientId)
::Dem_EnableDTCRecordUpdate
+ Dem_EnableDTCRecordUpdate(return, ClientId)
::Dem_GetDTCByOccurrenceTime
+ Dem_GetDTCByOccurrenceTime(return, ClientId, DTCRequest, DTC)
::Dem_GetDTCStatusAvailabilityMask
+ Dem_GetDTCStatusAvailabilityMask(return, ClientId, DTCStatusMask)
::Dem_GetNextExtendedDataRecord
+ Dem_GetNextExtendedDataRecord(return, ClientId, DestBuffer, BufSize)
::Dem_GetNextFreezeFrameData
+ Dem_GetNextFreezeFrameData(return, ClientId, DestBuffer, BufSize)
::Dem_GetNextFilteredDTC
+ Dem_GetNextFilteredDTC(return, ClientId, DTC, DTCStatus)
::Dem_GetNextFilteredDTCAndFDC
+ Dem_GetNextFilteredDTCAndFDC(return, ClientId, DTC, DTCFaultDetectionCounter)
::Dem_GetNextFilteredDTCAndSeverity
+ Dem_GetNextFilteredDTCAndSeverity(return, ClientId, DTC, DTCStatus, DTCSeverity, DTCFunctionalUnit)
::Dem_GetNextFilteredRecord
+ Dem_GetNextFilteredRecord(return, ClientId, DTC, RecordNumber)
::Dem_GetNumberOfFilteredDTC
+ Dem_GetNumberOfFilteredDTC(return, ClientId, NumberOfFilteredDTC)
::Dem_GetSeverityOfDTC
+ Dem_GetSeverityOfDTC(return, ClientId, DTCSeverity)
::Dem_GetSizeOfExtendedDataRecordSelection
+ Dem_GetSizeOfExtendedDataRecordSelection(return, ClientId, SizeOfExtendedDataRecord)
::Dem_GetSizeOfFreezeFrameSelection
+ Dem_GetSizeOfFreezeFrameSelection(return, ClientId, SizeOfFreezeFrame)
::Dem_GetStatusOfDTC
+ Dem_GetStatusOfDTC(return, ClientId, DTCStatus)
::Dem_GetTranslationType
+ Dem_GetTranslationType(return, ClientId)
::Dem_SetDTCFilter
+ Dem_SetDTCFilter(return, ClientId, DTCStatusMask, DTCFormat, DTCOrigin, FilterWithSeverity, DTCSeverityMask, FilterForFaultDetectionCoun
::Dem_SetFreezeFrameRecordFilter
+ Dem_SetFreezeFrameRecordFilter(return, ClientId, DTCFormat)
«interface»
Dcm_Dem_Optional_via_Rte
«function»
::Dem_ClearDTC
+ Dem_ClearDTC(return, ClientId)
::Dem_EnableDTCSetting
+ Dem_EnableDTCSetting(return, ClientId)
«interface»
Dcm_Dem_Configurable
«function»
::Dem_DcmReadDataOfPID31
+ Dem_DcmReadDataOfPID31(return, PID31value)
::Dem_DcmReadDataOfPID30
+ Dem_DcmReadDataOfPID30(return, PID30value)
::Dem_DcmReadDataOfPID21
+ Dem_DcmReadDataOfPID21(return, PID21value)
::Dem_DcmReadDataOfPID1C
+ Dem_DcmReadDataOfPID1C(return, PID1Cvalue)
«realize» ::Dem_DcmReadDataOfPID01
+ Dem_DcmReadDataOfPID01(return, PID01value)
::Dem_DcmGetInfoTypeValue08
+ Dem_DcmGetInfoTypeValue08(return, OpStatus, Iumprdata08, Iumprdata08BufferSize)
::Dem_DcmGetInfoTypeValue0B
+ Dem_DcmGetInfoTypeValue0B(return, OpStatus, Iumprdata0B, Iumprdata0BBufferSize)
::Dem_DcmReadDataOfPID4E
+ Dem_DcmReadDataOfPID4E(return, PID4Evalue)
::Dem_DcmReadDataOfPID4D
+ Dem_DcmReadDataOfPID4D(return, PID4Dvalue)
::Dem_DcmReadDataOfPID41
+ Dem_DcmReadDataOfPID41(return, PID41value)
Figure 8.3: Overview of interfaces between the Dem and Dcm
```
### 8.1 导入类型
本节列出了从其他模块包含的所有类型。
⌈[SWS_Dem_00176]⌋
| 模块 | 头文件 | 导入类型 |
|---|---|---|
| Dcm | Rte_Dcm_Type.h | `Dcm_OpStatusType` |
| NvM | Rte_NvM_Type.h | `NvM_BlockIdType` |
| NvM | Rte_NvM_Type.h | `NvM_RequestResultType` |
| Std_Types | StandardTypes.h | `Std_ReturnType` |
| Std_Types | StandardTypes.h | `Std_VersionInfoType` |
**表 8.1:Dem_ImportedTypes**
`(SRS_BSW_00301)`
### 8.2 类型定义
以下数据类型应用于本规范中定义的函数。
#### 8.2.1 Dem 数据类型
##### 8.2.1.1 Dem_ComponentIdType
⌈[SWS_Dem_01114]⌋
| | |
|---|---|
| 名称 | `Dem_ComponentIdType` |
| 类型 | uint16 |
| 范围 | 1..65535 - 受监视组件的内部标识符。注:0 不是有效值 |
| 描述 | 通过分配的 ComponentId 标识 DemComponent。ComponentId 由 Dem 自动分配。 |
| 可通过 | Dem.h |
**表 8.2:Dem_ComponentIdType**
`(SRS_Diag_04142)`
##### 8.2.1.2 Dem_ConfigType
⌈[SWS_Dem_00924]⌋
| | |
|---|---|
| 名称 | `Dem_ConfigType` |
| 类型 | Structure |
| 元素 | implementation specific – |
| 描述 | 外部数据结构的此类型应包含 Dem 的 post build 初始化数据。 |
| 可通过 | Dem.h |
**表 8.3:Dem_ConfigType**
`c()`
##### 8.2.1.3 Dem_EventIdType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.8 中可用。
##### 8.2.1.4 Dem_EventStatusType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.9 中可用。
##### 8.2.1.5 Dem_DebouncingStateType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.5 中可用。
##### 8.2.1.6 Dem_DebounceResetStatusType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.6 中可用。
##### 8.2.1.7 Dem_UdsStatusByteType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.21 中可用。
##### 8.2.1.8 Dem_IndicatorStatusType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.17 中可用。
##### 8.2.1.9 Dem_MonitorDataType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.15 中可用。
##### 8.2.1.10 Dem_MonitorStatusType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.16 中可用。
##### 8.2.1.11 Dem_DTCKindType
⌈[SWS_Dem_00932]⌋
| | |
|---|---|
| 名称 | `Dem_DTCKindType` |
| 类型 | uint8 |
| 范围 | `DEM_DTC_KIND_ALL_DTCS` 0x01 选择所有 DTC;`DEM_DTC_KIND_EMISSION_REL_DTCS` 0x02 选择 OBD 相关 DTC |
| 描述 | 此类型用于按种类过滤 DTC。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.4:Dem_DTCKindType**
`(SRS_Diag_04129)`
##### 8.2.1.12 Dem_DTCFormatType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.10 中可用。
##### 8.2.1.13 Dem_DTCOriginType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.4 中可用。
##### 8.2.1.14 Dem_DTCRequestType
⌈[SWS_Dem_00935]⌋
| | |
|---|---|
| 名称 | `Dem_DTCRequestType` |
| 类型 | uint8 |
| 范围 | `DEM_FIRST_FAILED_DTC` 0x01 请求第一个失败 DTC;`DEM_MOST_RECENT_FAILED_DTC` 0x02 请求最近失败 DTC;`DEM_FIRST_DET_CONFIRMED_DTC` 0x03 请求第一个检测到的已确认 DTC;`DEM_MOST_REC_DET_CONFIRMED_DTC` 0x04 请求最近检测到的已确认 DTC |
| 描述 | 此类型用于请求具有特定属性的 DTC。 |
| 可通过 | Dem.h |
**表 8.5:Dem_DTCRequestType**
`(SRS_Diag_04102)`
##### 8.2.1.15 Dem_DTCTranslationFormatType
⌈[SWS_Dem_00936]⌋
| | |
|---|---|
| 名称 | `Dem_DTCTranslationFormatType` |
| 类型 | uint8 |
| 范围 | `DEM_DTC_TRANSLATION_ISO15031_6` 0x00;`DEM_DTC_TRANSLATION_ISO14229_1` 0x01;`DEM_DTC_TRANSLATION_SAEJ1939_73` 0x02;`DEM_DTC_TRANSLATION_ISO11992_4` 0x03;`DEM_DTC_TRANSLATION_J2012DA_FORMAT_04` 0x04 |
| 描述 | ISO14229-1 中定义的 DTC 转换格式。 |
| 可通过 | Dem.h |
**表 8.6:Dem_DTCTranslationFormatType**
`(SRS_Diag_04067)`
##### 8.2.1.16 Dem_DTCSeverityType
⌈[SWS_Dem_00937]⌋
| | |
|---|---|
| 名称 | `Dem_DTCSeverityType` |
| 类型 | uint8 |
| 范围 | `DEM_SEVERITY_NO_SEVERITY` 0x00;`DEM_SEVERITY_WWHOBD_CLASS_NO_CLASS` 0x01;`DEM_SEVERITY_WWHOBD_CLASS_A` 0x02;`DEM_SEVERITY_WWHOBD_CLASS_B1` 0x04;`DEM_SEVERITY_WWHOBD_CLASS_B2` 0x08;`DEM_SEVERITY_WWHOBD_CLASS_C` 0x10;`DEM_SEVERITY_MAINTENANCE_ONLY` 0x20;`DEM_SEVERITY_CHECK_AT_NEXT_HALT` 0x40;`DEM_SEVERITY_CHECK_IMMEDIATELY` 0x80 |
| 描述 | 类型定义 DTCSeverityMask / DTCSeverity 字节,包含根据 ISO 14229-1 附录 D.3 的 DTC 严重性和 DTC 类信息。上 3 位(位 7-5)用于表示 DTC 严重性信息。下 5 位(位 4-0)用于表示 DTC 类信息。 |
| 可通过 | Dem.h |
**表 8.7:Dem_DTCSeverityType**
`c()`
##### 8.2.1.17 Dem_RatioIdType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.20 中可用。
##### 8.2.1.18 Dem_DTRControlType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.7 中可用。
##### 8.2.1.19 Dem_InitMonitorReasonType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.11 中可用。
##### 8.2.1.20 Dem_IumprDenomCondIdType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.12 中可用。
##### 8.2.1.21 Dem_IumprDenomCondStatusType
此数据类型在 C-API 和服务接口中使用。它的定义在章节 8.6.1.13 中可用。
##### 8.2.1.22 Dem_J1939DcmDTCStatusFilterType
⌈[SWS_Dem_00945]⌋
| | |
|---|---|
| 名称 | `Dem_J1939DcmDTCStatusFilterType` |
| 类型 | uint8 |
| 范围 | `DEM_J1939DTC_ACTIVE` 0 活动 DTC;`DEM_J1939DTC_PREVIOUSLY_ACTIVE` 1 先前活动 DTC;`DEM_J1939DTC_PENDING` 2 待定 DTC;`DEM_J1939DTC_PERMANENT` 3 永久 DTC;`DEM_J1939DTC_CURRENTLY_ACTIVE` 4 当前活动 DTC |
| 描述 | 用于区分应过滤哪些 DTC 的类型。 |
| 可通过 | Dem.h |
**表 8.8:Dem_J1939DcmDTCStatusFilterType**
`(SRS_Diag_04112)`
##### 8.2.1.23 Dem_J1939DcmSetClearFilterType
⌈[SWS_Dem_00946]⌋
| | |
|---|---|
| 名称 | `Dem_J1939DcmSetClearFilterType` |
| 类型 | uint8 |
| 范围 | `DEM_J1939DTC_CLEAR_ACTIVE` 0 活动 DTC;`DEM_J1939DTC_CLEAR_PREVIOUSLY_ACTIVE` 1 先前活动 DTC;`DEM_J1939DTC_CLEAR_ACTIVE_AND_PREVIOUSLY_ACTIVE` 2 活动和先前活动 DTC |
| 描述 | 用于区分清除哪些 DTC 的类型 |
| 可通过 | Dem.h |
**表 8.9:Dem_J1939DcmSetClearFilterType**
`(SRS_Diag_04112)`
##### 8.2.1.24 Dem_J1939DcmSetFreezeFrameFilterType
⌈[SWS_Dem_00947]⌋
| | |
|---|---|
| 名称 | `Dem_J1939DcmSetFreezeFrameFilterType` |
| 类型 | uint8 |
| 范围 | `DEM_J1939DCM_FREEZEFRAME` 0 FreezeFrame(DM04);`DEM_J1939DCM_EXPANDED_FREEZEFRAME` 1 ExpandedFreezeFrame(DM25);`DEM_J1939DCM_SPNS_IN_EXPANDED_FREEZEFRAME` 2 扩展冻结帧中的 SPN(DM24) |
| 描述 | 用于区分清除哪些 DTC 的类型 |
| 可通过 | Dem.h |
**表 8.10:Dem_J1939DcmSetFreezeFrameFilterType**
`(SRS_Diag_04010)`
##### 8.2.1.25 Dem_J1939DcmLampStatusType
⌈[SWS_Dem_00948]⌋
| | |
|---|---|
| 名称 | `Dem_J1939DcmLampStatusType` |
| 类型 | Structure |
| 元素 | uint8 LampStatus 灯状态;uint8 FlashLampStatus 闪烁灯状态 |
| 描述 | 有关详细信息,请参阅 SAE J1939-73 |
| 可通过 | Dem.h |
**表 8.11:Dem_J1939DcmLampStatusType**
`(SRS_Diag_04110)`
##### 8.2.1.26 Dem_J1939DcmDiagnosticReadiness1Type
⌈[SWS_Dem_00949]⌋
| | |
|---|---|
| 名称 | `Dem_J1939DcmDiagnosticReadiness1Type` |
| 类型 | Structure |
| 元素 | uint8 ActiveTroubleCodes 活动 DTC 数;uint8 PreviouslyActiveDiagnosticTroubleCodes 先前活动 DTC 数;uint8 OBDCompliance OBD 合规性;uint8 ContinuouslyMonitoredSystemsSupport_Status 标识连续监视系统支持状态;uint8 NonContinuouslyMonitoredSystemsSupport5;uint8 NonContinuouslyMonitoredSystemsSupport6;uint8 NonContinuouslyMonitoredSystemsStatus7;uint8 NonContinuouslyMonitoredSystemsStatus8 |
| 描述 | 此结构表示 DM05 消息的所有数据元素。编码应按照 SAE J1939-73 完成 |
| 可通过 | Dem.h |
**表 8.12:Dem_J1939DcmDiagnosticReadiness1Type**
`(SRS_Diag_04113)`
##### 8.2.1.27 Dem_J1939DcmDiagnosticReadiness2Type
⌈[SWS_Dem_00950]⌋
| | |
|---|---|
| 名称 | `Dem_J1939DcmDiagnosticReadiness2Type` |
| 类型 | Structure |
| 元素 | uint16 DistanceTraveledWhileMILisActivated MIL 激活时累积的公里数;uint16 DistanceSinceDTCsCleared 自清除排放相关 DTC 以来累积的距离;uint16 MinutesRunbyEngineWhileMILisActivated MIL 激活时累积的计数(以分钟为单位);uint16 TimeSinceDiagnosticTroubleCodesCleared 自清除排放相关 DTC 以来累积的发动机运行时间 |
| 描述 | 此结构表示 DM21 消息的所有数据元素。编码应按照 SAE J1939-73 完成 |
| 可通过 | Dem.h |
**表 8.13:Dem_J1939DcmDiagnosticReadiness2Type**
`(SRS_Diag_04113)`
##### 8.2.1.28 Dem_J1939DcmDiagnosticReadiness3Type
⌈[SWS_Dem_00951]⌋
| | |
|---|---|
| 名称 | `Dem_J1939DcmDiagnosticReadiness3Type` |
| 类型 | Structure |
| 元素 | uint16 TimeSinceEngineStart 发动机自 key-on 以来的运行时间;uint8 NumberofWarmupsSinceDTCsCleared 自清除所有 DTC 以来的 OBD 暖机循环数;uint8 ContinuouslyMonitoredSystemsEnableCompletedStatus;uint8 NonContinuouslyMonitoredSystemsEnableStatus5;uint8 NonContinuouslyMonitoredSystemsEnableStatus6;uint8 NonContinuouslyMonitoredSystems7;uint8 NonContinuouslyMonitoredSystems8 |
| 描述 | 此结构表示 DM26 消息的所有数据元素。编码应按照 SAE J1939-73 完成 |
| 可通过 | Dem.h |
**表 8.14:Dem_J1939DcmDiagnosticReadiness3Type**
`(SRS_Diag_04113)`
### 8.3 函数定义
这是为上层模块提供的函数列表。
#### 8.3.1 Dem_GetVersionInfo
⌈[SWS_Dem_00177]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetVersionInfo` |
| 语法 | `void Dem_GetVersionInfo(Std_VersionInfoType* versioninfo)` |
| 服务 ID [十六进制] | 0x00 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `versioninfo` - 指向此模块版本信息存储位置的指针 |
| 返回值 | 无 |
| 描述 | 返回此模块的版本信息。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemVersionInfoApi)} == true)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.15:Dem_GetVersionInfo**
`(SRS_BSW_00402, SRS_BSW_00407)`
#### 8.3.2 接口 ECU State Manager <=> Dem
##### 8.3.2.1 Dem_PreInit
⌈[SWS_Dem_00179]⌋
| | |
|---|---|
| 服务名称 | `Dem_PreInit` |
| 语法 | `void Dem_PreInit(void)` |
| 服务 ID [十六进制] | 0x01 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | 无 |
| 描述 | 初始化处理 BSW 模块报告的事件所需的内部状态。 |
| 可通过 | Dem.h |
**表 8.16:Dem_PreInit**
`c()`
##### 8.3.2.2 Dem_Init
⌈[SWS_Dem_00181]⌋
| | |
|---|---|
| 服务名称 | `Dem_Init` |
| 语法 | `void Dem_Init(const Dem_ConfigType* ConfigPtr)` |
| 服务 ID [十六进制] | 0x02 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `ConfigPtr` - 在 VARIANT-POST-BUILD 中设置的配置集的指针 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | 无 |
| 描述 | 初始化或重新初始化此模块。 |
| 可通过 | Dem.h |
**表 8.17:Dem_Init**
`(SRS_BSW_00101)`
##### 8.3.2.3 Dem_Shutdown
⌈[SWS_Dem_00182]⌋
| | |
|---|---|
| 服务名称 | `Dem_Shutdown` |
| 语法 | `void Dem_Shutdown(void)` |
| 服务 ID [十六进制] | 0x03 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | 无 |
| 描述 | 关闭此模块。 |
| 可通过 | Dem.h |
**表 8.18:Dem_Shutdown**
`(SRS_BSW_00336)`
#### 8.3.3 接口 BSW modules / SW-Components <=> Dem
##### 8.3.3.1 Dem_ClearDTC
⌈[SWS_Dem_00665]⌋
| | |
|---|---|
| 服务名称 | `Dem_ClearDTC` |
| 语法 | `Std_ReturnType Dem_ClearDTC(uint8 ClientId)` |
| 服务 ID [十六进制] | 0x23 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID,分配给调用模块的实例 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:DTC 成功清除;`E_NOT_OK`:未选择 DTC;`DEM_WRONG_DTC`:所选格式中的所选 DTC 值不存在或配置将清除限制为仅 DTC 组;`DEM_WRONG_DTCORIGIN`:所选 DTCOrigin 不存在;`DEM_CLEAR_FAILED`:DTC 清除失败;`DEM_CLEAR_BUSY`:另一个客户端当前正在清除 DTC。请求的操作将不会启动,调用方应在稍后时刻重试;`DEM_CLEAR_MEMORY_ERROR`:在擦除内存位置期间发生错误;`DEM_PENDING`:DTC 清除当前正在进行中;`DEM_BUSY`:此客户端的另一个不同的 `Dem_SelectDTC` 相关操作正在进行中 |
| 描述 | 清除单个 DTC 以及 DTC 组。 |
| 可通过 | Dem.h |
**表 8.19:Dem_ClearDTC**
`(SRS_Diag_04122)`
##### 8.3.3.2 Dem_ClearPrestoredFreezeFrame
⌈[SWS_Dem_00193]⌋
| | |
|---|---|
| 服务名称 | `Dem_ClearPrestoredFreezeFrame` |
| 语法 | `Std_ReturnType Dem_ClearPrestoredFreezeFrame(Dem_EventIdType EventId)` |
| 服务 ID [十六进制] | 0x07 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 EventId 可重入,对于同一 EventId 不可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:清除预存储冻结帧成功;`E_NOT_OK`:清除预存储冻结帧失败 |
| 描述 | 清除特定事件的预存储冻结帧。此 API 只能通过 RTE 使用,因此没有声明通过 Dem.h 导出。API 可用性:仅当 `({ecuc(Dem/DemConfigSet/DemEventParameter.DemFFPrestorageSupported)} == true)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.20:Dem_ClearPrestoredFreezeFrame**
`(SRS_Diag_04074)`
##### 8.3.3.3 Dem_GetComponentFailed
⌈[SWS_Dem_01115]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetComponentFailed` |
| 语法 | `Std_ReturnType Dem_GetComponentFailed(Dem_ComponentIdType ComponentId, boolean* ComponentFailed)` |
| 服务 ID [十六进制] | 0x2a |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `ComponentId` - DemComponent 的标识 |
| 参数 (inout) | 无 |
| 参数 (out) | `ComponentFailed` - TRUE:失败;FALSE:未失败 |
| 返回值 | `Std_ReturnType` - `E_OK`:获取"ComponentFailed"成功;`E_NOT_OK`:获取"ComponentFailed"失败 |
| 描述 | 获取 DemComponent 的失败状态。 |
| 可通过 | Dem.h |
**表 8.21:Dem_GetComponentFailed**
`(SRS_Diag_04142)`
##### 8.3.3.4 Dem_GetDTCSelectionResult
⌈[SWS_Dem_91023]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetDTCSelectionResult` |
| 语法 | `Std_ReturnType Dem_GetDTCSelectionResult(uint8 ClientId)` |
| 服务 ID [十六进制] | 0xb8 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:DTC 选择参数检查成功;`E_NOT_OK`:未选择 DTC;`DEM_WRONG_DTC`:所选格式中的所选 DTC 值不存在;`DEM_WRONG_DTCORIGIN`:所选 DTCOrigin 不存在;`DEM_PENDING`:检查 SelectDTC 参数当前正在进行中;`DEM_BUSY`:此客户端的另一个不同的 `Dem_SelectDTC` 相关操作正在进行中 |
| 描述 | 提供有关最后一次调用 `Dem_SelectDTC` 是否已选择有效 DTC 或 DTC 组的信息。 |
| 可通过 | Dem.h |
**表 8.22:Dem_GetDTCSelectionResult**
`c()`
##### 8.3.3.5 Dem_GetDTCSelectionResultForClearDTC
⌈[SWS_Dem_91020]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetDTCSelectionResultForClearDTC` |
| 语法 | `Std_ReturnType Dem_GetDTCSelectionResultForClearDTC(uint8 ClientId)` |
| 服务 ID [十六进制] | 0xbb |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:DTC 选择参数检查成功;`DEM_WRONG_DTC`:所选格式中的所选 DTC 值不存在或选择了单个 DTC 且 Dem 仅支持清除所有 DTC;`DEM_WRONG_DTCORIGIN`:所选 DTCOrigin 不存在;`DEM_PENDING`:检查 SelectDTC 参数当前正在进行中;`DEM_BUSY`:此客户端的另一个不同的 `Dem_SelectDTC` 相关操作正在进行中 |
| 描述 | 提供有关最后一次调用 `Dem_SelectDTC` 是否已选择有效 DTC 或 DTC 组的信息,并考虑 Dem 是否应仅清除所有 DTC 的设置。 |
| 可通过 | Dem.h |
**表 8.23:Dem_GetDTCSelectionResultForClearDTC**
`c()`
##### 8.3.3.6 Dem_GetEventUdsStatus
⌈[SWS_Dem_91008]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetEventUdsStatus` |
| 语法 | `Std_ReturnType Dem_GetEventUdsStatus(Dem_EventIdType EventId, Dem_UdsStatusByteType* UDSStatusByte)` |
| 服务 ID [十六进制] | 0xb6 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件 |
| 参数 (inout) | 无 |
| 参数 (out) | `UDSStatusByte` - 所请求事件的 UDS DTC 状态字节(参见章节"状态位支持")。如果函数调用的返回值为 `E_NOT_OK`,则此参数不包含有效数据 |
| 返回值 | `Std_ReturnType` - `E_OK`:获取事件状态成功;`E_NOT_OK`:获取事件状态失败 |
| 描述 | 获取分配给事件的 DTC 的当前 UDS 状态字节。 |
| 可通过 | Dem.h |
**表 8.24:Dem_GetEventUdsStatus**
`(SRS_Diag_04067)`
##### 8.3.3.7 Dem_GetMonitorStatus
⌈[SWS_Dem_91007]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetMonitorStatus` |
| 语法 | `Std_ReturnType Dem_GetMonitorStatus(Dem_EventIdType EventID, Dem_MonitorStatusType* MonitorStatus)` |
| 服务 ID [十六进制] | 0xb5 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `EventID` - 通过分配的 EventId 标识事件 |
| 参数 (inout) | 无 |
| 参数 (out) | `MonitorStatus` - 所请求事件的监视器状态字节。如果函数调用的返回值为 `E_NOT_OK`,则此参数不包含有效数据 |
| 返回值 | `Std_ReturnType` - `E_OK`:获取监视器状态成功;`E_NOT_OK`:获取监视器状态失败(例如,提供了无效的事件 id) |
| 描述 | 获取事件的当前监视器状态。 |
| 可通过 | Dem.h |
**表 8.25:Dem_GetMonitorStatus**
`c()`
##### 8.3.3.8 Dem_GetDebouncingOfEvent
⌈[SWS_Dem_00730]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetDebouncingOfEvent` |
| 语法 | `Std_ReturnType Dem_GetDebouncingOfEvent(Dem_EventIdType EventId, Dem_DebouncingStateType* DebouncingState)` |
| 服务 ID [十六进制] | 0x9f |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件 |
| 参数 (inout) | 无 |
| 参数 (out) | `DebouncingState` - 位 0 暂时有缺陷(对应 0 < FDC < 127);位 1 最终有缺陷(对应 FDC = 127);位 2 暂时愈合(对应 -128 < FDC < 0);位 3 测试完成(对应 FDC = -128 或 FDC = 127);位 4 DTR 更新(= 测试完成 && 去抖完成 && 启用条件/存储条件满足) |
| 返回值 | `Std_ReturnType` - `E_OK`:按事件状态获取去抖状态成功;`E_NOT_OK`:按事件状态获取去抖失败 |
| 描述 | 获取事件的去抖状态。此函数不应用于在其函数中具有本地去抖的 EventId。它主要用于在 Dem 中使用去抖的 EventId。 |
| 可通过 | Dem.h |
**表 8.26:Dem_GetDebouncingOfEvent**
`(SRS_Diag_04068)`
##### 8.3.3.9 Dem_GetDTCOfEvent
⌈[SWS_Dem_00198]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetDTCOfEvent` |
| 语法 | `Std_ReturnType Dem_GetDTCOfEvent(Dem_EventIdType EventId, Dem_DTCFormatType DTCFormat, uint32* DTCOfEvent)` |
| 服务 ID [十六进制] | 0x0d |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件;`DTCFormat` - 定义所请求 DTC 值的输出格式 |
| 参数 (inout) | 无 |
| 参数 (out) | `DTCOfEvent` - 接收此函数返回的相应格式的 DTC 值。如果函数返回值不是 `E_OK`,则此参数不包含有效数据 |
| 返回值 | `Std_ReturnType` - `E_OK`:获取 DTC 成功;`E_NOT_OK`:调用未成功;`DEM_E_NO_DTC_AVAILABLE`:在所请求格式中未配置 DTC |
| 描述 | 获取事件的 DTC。 |
| 可通过 | Dem.h |
**表 8.27:Dem_GetDTCOfEvent**
`(SRS_Diag_04075)`
##### 8.3.3.10 Dem_GetDTCSuppression
⌈[SWS_Dem_91025]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetDTCSuppression` |
| 语法 | `Std_ReturnType Dem_GetDTCSuppression(uint8 ClientId, boolean* SuppressionStatus)` |
| 服务 ID [十六进制] | 0xbc |
| 同步/异步 | 异步 |
| 可重入性 | 可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `SuppressionStatus` - TRUE:DTC 被抑制;FALSE:DTC 未被抑制 |
| 描述 | 返回所请求 DTC 的当前抑制状态。 |
| 可通过 | Dem.h |
**表 8.28:Dem_GetDTCSuppression**
`(SRS_Diag_04154)`
##### 8.3.3.11 Dem_GetFaultDetectionCounter
⌈[SWS_Dem_00203]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetFaultDetectionCounter` |
| 语法 | `Std_ReturnType Dem_GetFaultDetectionCounter(Dem_EventIdType EventId, sint8* FaultDetectionCounter)` |
| 服务 ID [十六进制] | 0x3e |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件 |
| 参数 (inout) | 无 |
| 参数 (out) | `FaultDetectionCounter` - 此参数接收所请求 EventId 的故障检测计数器信息。如果函数调用的返回值不是 `E_OK`,则此参数不包含有效数据。-128dec...127dec 根据 ISO 14229-1 从 PASSED 到 FAILED |
| 返回值 | `Std_ReturnType` - `E_OK`:请求成功;`E_NOT_OK`:请求失败;`DEM_E_NO_FDC_AVAILABLE`:所请求事件没有可用的故障检测计数器 |
| 描述 | 获取事件的故障检测计数器。此 API 只能通过 RTE 使用,因此没有声明通过 Dem.h 导出。 |
| 可通过 | Dem.h |
**表 8.29:Dem_GetFaultDetectionCounter**
`c()`
##### 8.3.3.12 Dem_GetIndicatorStatus
⌈[SWS_Dem_00205]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetIndicatorStatus` |
| 语法 | `Std_ReturnType Dem_GetIndicatorStatus(uint8 IndicatorId, Dem_IndicatorStatusType* IndicatorStatus)` |
| 服务 ID [十六进制] | 0x29 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `IndicatorId` - 指示器编号 |
| 参数 (inout) | 无 |
| 参数 (out) | `IndicatorStatus` - 指示器状态,如关、开或闪烁 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:操作失败 |
| 描述 | 从 UDS 状态派生的指示器状态。API 可用性:仅当 `({ecuc(Dem/DemGeneral/DemEventMemorySet/DemIndicator)} != NULL)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.30:Dem_GetIndicatorStatus**
`c()`
##### 8.3.3.13 Dem_GetEventFreezeFrameDataEx
⌈[SWS_Dem_01191]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetEventFreezeFrameDataEx` |
| 语法 | `Std_ReturnType Dem_GetEventFreezeFrameDataEx(Dem_EventIdType EventId, uint8 RecordNumber, uint16 DataId, uint8* DestBuffer, uint16* BufSize)` |
| 服务 ID [十六进制] | 0x6e |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件;`RecordNumber` - ISO14229-1 中定义的冻结帧记录的唯一标识符。0xFF 表示返回最近冻结帧记录。0x00 仅在 Dem 模块支持 WWH-OBD 时支持;`DataId` - 此参数指定应复制到目标缓冲区的 DID |
| 参数 (inout) | `BufSize` - 调用此函数时,此参数包含可写入缓冲区的最大数据字节数。函数返回此参数中已写入数据字节的实际数量 |
| 参数 (out) | `DestBuffer` - 此参数包含一个字节指针,指向要写入冻结帧数据记录的缓冲区。格式是原始十六进制值,不包含标头信息 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:无法执行操作;`DEM_NO_SUCH_ELEMENT`:所请求的事件数据当前未存储或所请求的记录号不受事件支持或所请求的 DID 不受冻结帧支持;`DEM_BUFFER_TOO_SMALL`:提供的缓冲区大小太小 |
| 描述 | 按事件获取冻结帧的数据。 |
| 可通过 | Dem.h |
**表 8.31:Dem_GetEventFreezeFrameDataEx**
`c()`
##### 8.3.3.14 Dem_GetEventExtendedDataRecordEx
⌈[SWS_Dem_01190]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetEventExtendedDataRecordEx` |
| 语法 | `Std_ReturnType Dem_GetEventExtendedDataRecordEx(Dem_EventIdType EventId, uint8 RecordNumber, uint8* DestBuffer, uint16* BufSize)` |
| 服务 ID [十六进制] | 0x6d |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件;`RecordNumber` - 所请求的扩展数据记录的标识。有效值介于 0x01 和 0xEF 之间 |
| 参数 (inout) | `BufSize` - 调用此函数时,此参数包含可写入缓冲区的最大数据字节数。函数返回此参数中已写入数据字节的实际数量 |
| 参数 (out) | `DestBuffer` - 此参数包含一个字节指针,指向要写入扩展数据的缓冲区。格式是原始十六进制值,不包含标头信息 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:无法执行操作;`DEM_NO_SUCH_ELEMENT`:所请求的事件数据当前未存储或所请求的记录号不受事件支持;`DEM_BUFFER_TOO_SMALL`:提供的缓冲区大小太小 |
| 描述 | 按事件获取扩展数据记录的数据。 |
| 可通过 | Dem.h |
**表 8.32:Dem_GetEventExtendedDataRecordEx**
`(SRS_Diag_04205)`
##### 8.3.3.15 Dem_GetEventMemoryOverflow
⌈[SWS_Dem_00559]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetEventMemoryOverflow` |
| 语法 | `Std_ReturnType Dem_GetEventMemoryOverflow(uint8 ClientId, Dem_DTCOriginType DTCOrigin, boolean* OverflowIndication)` |
| 服务 ID [十六进制] | 0x32 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - DemClientID 标识 DemEventMemorySet,指示发生溢出的事件内存;`DTCOrigin` - 如果 Dem 支持多个事件内存,则此参数用于选择要从中读取溢出指示的源内存 |
| 参数 (inout) | 无 |
| 参数 (out) | `OverflowIndication` - 如果相应事件内存已溢出,则此参数返回 TRUE,否则返回 FALSE |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:操作失败或不支持 |
| 描述 | 获取事件内存溢出指示状态。 |
| 可通过 | Dem.h |
**表 8.33:Dem_GetEventMemoryOverflow**
`(SRS_Diag_04093)`
##### 8.3.3.16 Dem_GetNumberOfEventMemoryEntries
⌈[SWS_Dem_00652]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetNumberOfEventMemoryEntries` |
| 语法 | `Std_ReturnType Dem_GetNumberOfEventMemoryEntries(uint8 ClientId, Dem_DTCOriginType DTCOrigin, uint8* NumberOfEventMemoryEntries)` |
| 服务 ID [十六进制] | 0x35 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - DemClientID 标识所请求事件内存所属的 DemEventMemorySet;`DTCOrigin` - 如果 Dem 支持多个事件内存,则此参数用于选择要从中读取条目数的源内存 |
| 参数 (inout) | 无 |
| 参数 (out) | `NumberOfEventMemoryEntries` - 当前存储在所请求事件内存中的条目数 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:操作失败 |
| 描述 | 返回当前存储在所请求事件内存中的条目数。 |
| 可通过 | Dem.h |
**表 8.34:Dem_GetNumberOfEventMemoryEntries**
`(SRS_Diag_04109)`
##### 8.3.3.17 Dem_ResetEventDebounceStatus
⌈[SWS_Dem_00683]⌋
| | |
|---|---|
| 服务名称 | `Dem_ResetEventDebounceStatus` |
| 语法 | `Std_ReturnType Dem_ResetEventDebounceStatus(Dem_EventIdType EventId, Dem_DebounceResetStatusType DebounceResetStatus)` |
| 服务 ID [十六进制] | 0x09 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 EventId 可重入,对于同一 EventId 不可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件;`DebounceResetStatus` - 冻结或重置指定事件的内部去抖计数器/计时器 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:仅在开发错误时 |
| 描述 | 由 BSW 模块和 SW-C 控制内部去抖计数器/计时器。事件限定不会受这些去抖状态更改的影响。此 API 可用于 BSW 模块,只要 `Dem_PreInit` 已完成(参见 SWS_Dem_00438 和 SWS_Dem_00167)。 |
| 可通过 | Dem.h |
**表 8.35:Dem_ResetEventDebounceStatus**
`(SRS_Diag_04105)`
##### 8.3.3.18 Dem_ResetEventStatus
⌈[SWS_Dem_00185]⌋
| | |
|---|---|
| 服务名称 | `Dem_ResetEventStatus` |
| 语法 | `Std_ReturnType Dem_ResetEventStatus(Dem_EventIdType EventId)` |
| 服务 ID [十六进制] | 0x05 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 EventId 可重入,对于同一 EventId 不可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:重置事件状态的请求成功接受;`E_NOT_OK`:重置事件状态的请求失败或不允许,因为事件已在此操作循环中测试 |
| 描述 | 重置事件失败状态。此 API 只能通过 RTE 使用,因此没有声明通过 Dem.h 导出。 |
| 可通过 | Dem.h |
**表 8.36:Dem_ResetEventStatus**
`c()`
##### 8.3.3.19 Dem_RestartOperationCycle
⌈[SWS_Dem_00194]⌋
| | |
|---|---|
| 服务名称 | `Dem_RestartOperationCycle` |
| 语法 | `Std_ReturnType Dem_RestartOperationCycle(uint8 OperationCycleId)` |
| 服务 ID [十六进制] | 0x08 |
| 同步/异步 | 异步 |
| 可重入性 | 可重入 |
| 参数 (in) | `OperationCycleId` - 操作循环的标识,如电源循环、驾驶循环 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作循环集合已接受并将异步处理;`E_NOT_OK`:操作循环集合已被拒绝 |
| 描述 | 设置操作循环状态。此 API 只能通过 RTE 使用,因此没有声明通过 Dem.h 导出。接口具有异步行为,以避免在必须处理大量事件时超过 API 的典型时序要求,以及在相关监视器的重新初始化期间。异步确认是相关的 `InitMonitorForEvent` 回调。 |
| 可通过 | Dem.h |
**表 8.37:Dem_RestartOperationCycle**
`(SRS_Diag_04076)`
##### 8.3.3.20 Dem_PrestoreFreezeFrame
⌈[SWS_Dem_00188]⌋
| | |
|---|---|
| 服务名称 | `Dem_PrestoreFreezeFrame` |
| 语法 | `Std_ReturnType Dem_PrestoreFreezeFrame(Dem_EventIdType EventId)` |
| 服务 ID [十六进制] | 0x06 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 EventId 可重入,对于同一 EventId 不可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:冻结帧预存储成功;`E_NOT_OK`:冻结帧预存储失败 |
| 描述 | 捕获特定事件的冻结帧数据。此 API 只能通过 RTE 使用,因此没有声明通过 Dem.h 导出。API 可用性:仅当 `({ecuc(Dem/DemConfigSet/DemEventParameter.DemFFPrestorageSupported)} == true)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.38:Dem_PrestoreFreezeFrame**
`(SRS_Diag_04074)`
##### 8.3.3.21 Dem_SelectDTC
⌈[SWS_Dem_91016]⌋
| | |
|---|---|
| 服务名称 | `Dem_SelectDTC` |
| 语法 | `Std_ReturnType Dem_SelectDTC(uint8 ClientId, uint32 DTC, Dem_DTCFormatType DTCFormat, Dem_DTCOriginType DTCOrigin)` |
| 服务 ID [十六进制] | 0xb7 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID;`DTC` - 以相应格式定义要选择的 DTC。如果 DTC 与 DTC 组编号匹配,则选择 DTC 组;`DTCFormat` - 定义所提供 DTC 值的输入格式;`DTCOrigin` - 所请求 DTC 或 DTC 组的事件内存 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:DTC 成功选择;`DEM_BUSY`:此客户端的另一个 `Dem_SelectDTC` 或 `Dem_SelectDTC` 相关操作当前正在进行中 |
| 描述 | 选择 DTC 或 DTC 组作为进一步操作的目标。 |
| 可通过 | Dem.h |
**表 8.39:Dem_SelectDTC**
`c()`
##### 8.3.3.22 Dem_SetComponentAvailable
⌈[SWS_Dem_01117]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetComponentAvailable` |
| 语法 | `Std_ReturnType Dem_SetComponentAvailable(Dem_ComponentIdType ComponentId, boolean AvailableStatus)` |
| 服务 ID [十六进制] | 0x2b |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `ComponentId` - DemComponent 的标识;`AvailableStatus` - 此参数指定相应组件应可用(TRUE)还是不可用(FALSE) |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:操作失败 |
| 描述 | 设置特定 DemComponent 的可用性。 |
| 可通过 | Dem.h |
**表 8.40:Dem_SetComponentAvailable**
`(SRS_Diag_04142)`
##### 8.3.3.23 Dem_SetDTCSuppression
⌈[SWS_Dem_01047]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetDTCSuppression` |
| 语法 | `Std_ReturnType Dem_SetDTCSuppression(uint8 ClientId, boolean SuppressionStatus)` |
| 服务 ID [十六进制] | 0x33 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID;`SuppressionStatus` - 此参数指定相应 DTC 应禁用(TRUE)还是启用(FALSE) |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:DTC 的状态在 DTCStatus 参数中正确提供;`E_NOT_OK`:未选择 DTC;`DEM_WRONG_DTC`:所选格式中的所选 DTC 值不存在;`DEM_WRONG_DTCORIGIN`:所选 DTCOrigin 不存在 |
| 描述 | 设置特定 DTC 的抑制状态。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemSuppressionSupport)} == DEM_DTC_SUPPRESSION)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.41:Dem_SetDTCSuppression**
`c()`
##### 8.3.3.24 Dem_SetEnableCondition
⌈[SWS_Dem_00201]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetEnableCondition` |
| 语法 | `Std_ReturnType Dem_SetEnableCondition(uint8 EnableConditionID, boolean ConditionFulfilled)` |
| 服务 ID [十六进制] | 0x39 |
| 同步/异步 | 异步 |
| 可重入性 | 可重入 |
| 参数 (in) | `EnableConditionID` - 此参数标识启用条件;`ConditionFulfilled` - 此参数指定分配给 `EnableConditionID` 的启用条件是否满足(TRUE)或未满足(FALSE) |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 如果可以成功设置启用条件,则 API 调用返回 `E_OK`。如果设置启用条件失败,则函数的返回值是 `E_NOT_OK` |
| 描述 | 设置启用条件。API 可用性:仅当 `({ecuc(Dem/DemGeneral/DemEnableCondition)} != NULL)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.42:Dem_SetEnableCondition**
`(SRS_Diag_04192)`
##### 8.3.3.25 Dem_SetEventAvailable
⌈[SWS_Dem_01080]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetEventAvailable` |
| 语法 | `Std_ReturnType Dem_SetEventAvailable(Dem_EventIdType EventId, boolean AvailableStatus)` |
| 服务 ID [十六进制] | 0x37 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 EventId 可重入,对于同一 EventId 不可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件;`AvailableStatus` - 此参数指定相应事件应可用(TRUE)还是不可用(FALSE) |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:设置可用性状态的请求成功;`E_NOT_OK`:设置可用性状态的请求未被接受 |
| 描述 | 设置特定事件的可用状态。 |
| 可通过 | Dem.h |
**表 8.43:Dem_SetEventAvailable**
`(SRS_Diag_04126)`
##### 8.3.3.26 Dem_SetEventFailureCycleCounterThreshold
⌈[SWS_Dem_91004]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetEventFailureCycleCounterThreshold` |
| 语法 | `Std_ReturnType Dem_SetEventFailureCycleCounterThreshold(Dem_EventIdType EventId, uint8 FailureCycleCounterThreshold)` |
| 服务 ID [十六进制] | 0x57 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 EventId 可重入,对于同一 EventId 不可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件;`FailureCycleCounterThreshold` - 要设置事件的故障循环计数器阈值 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:阈值更改成功;`E_NOT_OK`:由于此事件的 `DemEventFailureCycleCounterThresholdAdaptable` 设置为 FALSE,阈值无法更改 |
| 描述 | 设置事件的故障确认阈值。 |
| 可通过 | Dem.h |
**表 8.44:Dem_SetEventFailureCycleCounterThreshold**
`c()`
##### 8.3.3.27 Dem_SetEventStatus
⌈[SWS_Dem_00183]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetEventStatus` |
| 语法 | `Std_ReturnType Dem_SetEventStatus(Dem_EventIdType EventId, Dem_EventStatusType EventStatus)` |
| 服务 ID [十六进制] | 0x04 |
| 同步/异步 | 同步/异步 |
| 可重入性 | 对于不同 EventId 可重入,对于同一 EventId 不可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件;`EventStatus` - 监视器测试结果 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:事件状态设置成功;`E_NOT_OK`:事件状态设置或处理失败或无法接受 |
| 描述 | 由 SW-C 或 BSW 模块调用以向 Dem 报告监视器状态信息。调用 `Dem_SetEventStatus` 的 BSW 模块可以安全地忽略返回值。 |
| 可通过 | Dem.h |
**表 8.45:Dem_SetEventStatus**
`c()`
##### 8.3.3.28 Dem_SetEventStatusWithMonitorData
⌈[SWS_Dem_91037]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetEventStatusWithMonitorData` |
| 语法 | `Std_ReturnType Dem_SetEventStatusWithMonitorData(Dem_EventIdType EventId, Dem_EventStatusType EventStatus, Dem_MonitorDataType monitorData0, Dem_MonitorDataType monitorData1)` |
| 服务 ID [十六进制] | 0xbd |
| 同步/异步 | 同步/异步 |
| 可重入性 | 对于不同 EventId 可重入,对于同一 EventId 不可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件;`EventStatus` - 监视器测试结果;`monitorData0` - ;`monitorData1` - |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:事件状态设置成功;`E_NOT_OK`:事件状态设置或处理失败或无法接受 |
| 描述 | – |
| 可通过 | Dem.h |
**表 8.46:Dem_SetEventStatusWithMonitorData**
`c()`
##### 8.3.3.29 Dem_SetStorageCondition
⌈[SWS_Dem_00556]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetStorageCondition` |
| 语法 | `Std_ReturnType Dem_SetStorageCondition(uint8 StorageConditionID, boolean ConditionFulfilled)` |
| 服务 ID [十六进制] | 0x38 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `StorageConditionID` - 此参数标识存储条件;`ConditionFulfilled` - 此参数指定分配给 `StorageConditionID` 的存储条件是否满足(TRUE)或未满足(FALSE) |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 如果可以成功设置存储条件,则 API 调用返回 `E_OK`。如果设置存储条件失败,则函数的返回值是 `E_NOT_OK` |
| 描述 | 设置存储条件。API 可用性:仅当 `({ecuc(Dem/DemGeneral/DemStorageCondition)} != NULL)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.47:Dem_SetStorageCondition**
`(SRS_Diag_04219)`
##### 8.3.3.30 Dem_SetWIRStatus
⌈[SWS_Dem_00839]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetWIRStatus` |
| 语法 | `Std_ReturnType Dem_SetWIRStatus(Dem_EventIdType EventId, boolean WIRStatus)` |
| 服务 ID [十六进制] | 0x7a |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 EventId 可重入,对于同一 EventId 不可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件。事件编号在 DEM 中配置。Min.: 1(0:表示无事件或失败);Max.: DEM 中事件编号配置的结果(Max 为 255 或 65535);`WIRStatus` - 事件相关 WIR 位的请求状态(关于当前功能抑制状态)。`WIRStatus = TRUE` -> WIR 位应设置为 "1";`WIRStatus = FALSE` -> WIR 位应设置为 "0" |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:设置 WIR 状态的请求成功;`E_NOT_OK`:设置 WIR 状态的请求未被接受(例如,禁用的 controlDTCSetting)并应重试 |
| 描述 | 通过故障安全 SW-C 设置 WIR 状态位。此 API 只能通过 RTE 使用,因此没有声明通过 Dem.h 导出。 |
| 可通过 | Dem.h |
**表 8.48:Dem_SetWIRStatus**
`c()`
#### 8.3.4 接口 Dcm <=> Dem
##### 8.3.4.1 访问 DTC 和状态信息
###### 8.3.4.1.1 Dem_GetTranslationType
⌈[SWS_Dem_00230]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetTranslationType` |
| 语法 | `Dem_DTCTranslationFormatType Dem_GetTranslationType(uint8 ClientId)` |
| 服务 ID [十六进制] | 0x3c |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Dem_DTCTranslationFormatType` - 返回配置的 DTC 转换格式。不可能组合不同的 DTC 格式 |
| 描述 | 获取 ECU 支持的 DTC 格式。支持的格式通过 `DemTypeOfDTCSupported` 配置。 |
| 可通过 | Dem.h |
**表 8.49:Dem_GetTranslationType**
`(SRS_Diag_04010)`
###### 8.3.4.1.2 Dem_GetDTCStatusAvailabilityMask
⌈[SWS_Dem_00213]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetDTCStatusAvailabilityMask` |
| 语法 | `Std_ReturnType Dem_GetDTCStatusAvailabilityMask(uint8 ClientId, Dem_UdsStatusByteType* DTCStatusMask)` |
| 服务 ID [十六进制] | 0x16 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `DTCStatusMask` - `DTCStatusMask` 值指示 Dem 支持的 DTC 状态位。所有受支持的信息通过将相应的状态位设置为 1 来指示。参见 ISO14229-1 |
| 返回值 | `Std_ReturnType` - `E_OK`:获取 DTC 状态掩码成功;`E_NOT_OK`:获取 DTC 状态掩码失败 |
| 描述 | 获取 DTC 状态可用性掩码。 |
| 可通过 | Dem.h |
**表 8.50:Dem_GetDTCStatusAvailabilityMask**
`(SRS_Diag_04067, SRS_Diag_04010)`
###### 8.3.4.1.3 Dem_GetStatusOfDTC
⌈[SWS_Dem_00212]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetStatusOfDTC` |
| 语法 | `Std_ReturnType Dem_GetStatusOfDTC(uint8 ClientId, uint8* DTCStatus)` |
| 服务 ID [十六进制] | 0x15 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `DTCStatus` - 此参数接收所请求 DTC 的状态信息。它遵循 ISO14229-1 中定义的格式。如果函数调用的返回值不是 `DEM_FILTERED_OK`,则此参数不包含有效数据 |
| 返回值 | `Std_ReturnType` - `E_OK`:DTC 的状态在 DTCStatus 参数中正确提供;`E_NOT_OK`:未选择 DTC;`DEM_WRONG_DTC`:所选格式中的所选 DTC 值不存在;`DEM_WRONG_DTCORIGIN`:所选 DTCOrigin 不存在;`DEM_PENDING`:检索 DTC 状态当前正在进行中;`DEM_NO_SUCH_ELEMENT`:所选 DTC 没有分配的 DTC 状态;`DEM_BUSY`:此客户端的另一个不同的 `Dem_SelectDTC` 相关操作正在进行中 |
| 描述 | 获取 DTC 的状态。对于大型配置和 DTC 校准,接口行为可以是异步的(将 DTC 搜索拆分为段)。OBD 事件抑制的 DTC 应报告为 `Dem_WRONG_DTC`。 |
| 可通过 | Dem.h |
**表 8.51:Dem_GetStatusOfDTC**
`(SRS_Diag_04066, SRS_Diag_04067)`
###### 8.3.4.1.4 Dem_GetSeverityOfDTC
⌈[SWS_Dem_00232]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetSeverityOfDTC` |
| 语法 | `Std_ReturnType Dem_GetSeverityOfDTC(uint8 ClientId, Dem_DTCSeverityType* DTCSeverity)` |
| 服务 ID [十六进制] | 0x0e |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `DTCSeverity` - 此参数包含根据 ISO 14229-1 的 DTCSeverity |
| 返回值 | `Std_ReturnType` - `E_OK`:DTC 严重性在 DTCSeverity 参数中正确提供;`E_NOT_OK`:未选择 DTC;`DEM_WRONG_DTC`:所选格式中的所选 DTC 值不存在;`DEM_WRONG_DTCORIGIN`:所选 DTCOrigin 不存在;`DEM_PENDING`:检索 DTC 当前正在进行中;`DEM_BUSY`:此客户端的另一个不同的 `Dem_SelectDTC` 相关操作正在进行中 |
| 描述 | 获取所请求 DTC 的严重性。对于大型配置和 DTC 校准,接口行为可以是异步的(将 DTC 搜索拆分为段)。 |
| 可通过 | Dem.h |
**表 8.52:Dem_GetSeverityOfDTC**
`(SRS_Diag_04071)`
###### 8.3.4.1.5 Dem_GetFunctionalUnitOfDTC
⌈[SWS_Dem_00594]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetFunctionalUnitOfDTC` |
| 语法 | `Std_ReturnType Dem_GetFunctionalUnitOfDTC(uint8 ClientId, uint8* DTCFunctionalUnit)` |
| 服务 ID [十六进制] | 0x34 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `DTCFunctionalUnit` - 此 DTC 的功能单元值 |
| 返回值 | `Std_ReturnType` - `E_OK`:DTC 功能单元在 DTCSeverity 参数中正确提供;`E_NOT_OK`:未选择 DTC;`DEM_WRONG_DTC`:所选格式中的所选 DTC 值不存在;`DEM_WRONG_DTCORIGIN`:所选 DTCOrigin 不存在;`DEM_PENDING`:检索 DTC 功能单元当前正在进行中;`DEM_BUSY`:此客户端的另一个不同的 `Dem_SelectDTC` 相关操作正在进行中 |
| 描述 | 获取所请求 DTC 的功能单元。 |
| 可通过 | Dem.h |
**表 8.53:Dem_GetFunctionalUnitOfDTC**
`(SRS_Diag_04156)`
###### 8.3.4.1.6 Dem_SetDTCFilter
⌈[SWS_Dem_00208]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetDTCFilter` |
| 语法 | `Std_ReturnType Dem_SetDTCFilter(uint8 ClientId, uint8 DTCStatusMask, Dem_DTCFormatType DTCFormat, Dem_DTCOriginType DTCOrigin, boolean FilterWithSeverity, Dem_DTCSeverityType DTCSeverityMask, boolean FilterForFaultDetectionCounter)` |
| 服务 ID [十六进制] | 0x13 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID;`DTCStatusMask` - DTC 状态字节过滤的状态字节掩码。值:0x00:AutOSAR 特定值,用于停用状态字节过滤(与 ISO 14229-1 中的含义不同)以报告所有支持的 DTC(用于服务 0x19 子功能 0x0A/0x15);0x01..0xFF:根据 ISO 14229-1 的状态字节掩码 `DTCStatusMask`(由 Dcm 直接从服务请求移交)以过滤至少有一个状态位设置匹配此状态字节掩码的 DTC;`DTCFormat` - 定义后续 API 调用的所请求 DTC 值的输出格式。如果传递的值不适合配置,则应报告 DET 错误 `DEM_E_WRONG_CONFIGURATION`,例如,如果传递了 `DTCFormat "DEM_DTC_FORMAT_OBD"`,但配置不支持 OBD;`DTCOrigin` - 如果 Dem 支持多个事件内存,则此参数用于选择要从中读取 DTC 的源内存。如果传递的值不适合配置,则应报告 DET 错误 `DEM_E_WRONG_CONFIGURATION`,例如,如果传递了 `DTCOrigin "DEM_DTC_ORIGIN_MIRROR_MEMORY"`,但未配置镜像内存;`FilterWithSeverity` - 此标志定义是否应使用严重性信息进行过滤。这允许具有和不具有严重性信息的 DTC 共存;`DTCSeverityMask` - 包含根据 ISO14229-1 的 `DTCSeverityMask`;`FilterForFaultDetectionCounter` - 此标志定义是否应使用故障检测计数器信息进行过滤。这允许具有和不具有故障检测计数器信息的 DTC 共存。如果故障检测计数器信息是过滤条件,则仅应报告故障检测计数器值介于 1 和 0x7E 之间的 DTC。注:如果事件未在 Dem 内部使用去抖,则 Dem 必须通过 `GetFaultDetectionCounter` 请求此信息 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_NOT_OK`:表示错误的 DTCOrigin 或 DTCFormat |
| 描述 | 设置 DTC 过滤器。服务器应在参数 `DTCStatusMask` 与服务器中的当前 UDS 状态之间执行按位逻辑 AND 运算。除了 `DTCStatusAvailabilityMask` 之外,服务器应返回所有 AND 运算结果非零的 DTC [即 `(statusOfDTC & DTCStatusMask) != 0`]。服务器应仅处理其支持的 DTC 状态位。应忽略此计算的 OBD 事件抑制。 |
应使用以下公式过滤 DTC:
```
(((statusOfDTC & DTCStatusMask) != 0) && ((severity & DTCSeverityMask) != 0)) == TRUE
```
| 可通过 | Dem.h |
**表 8.54:Dem_SetDTCFilter**
`(SRS_Diag_04205)`
###### 8.3.4.1.7 Dem_GetNumberOfFilteredDTC
⌈[SWS_Dem_00214]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetNumberOfFilteredDTC` |
| 语法 | `Std_ReturnType Dem_GetNumberOfFilteredDTC(uint8 ClientId, uint16* NumberOfFilteredDTC)` |
| 服务 ID [十六进制] | 0x17 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `NumberOfFilteredDTC` - 匹配定义状态掩码的 DTC 数 |
| 返回值 | `Std_ReturnType` - `E_OK`:获取过滤 DTC 数成功;`E_NOT_OK`:未设置 DTC 过滤器;`DEM_PENDING`:所请求的操作当前正在进行中 |
| 描述 | 获取过滤 DTC 的数量。 |
| 可通过 | Dem.h |
**表 8.55:Dem_GetNumberOfFilteredDTC**
`c()`
###### 8.3.4.1.8 Dem_GetNextFilteredDTC
⌈[SWS_Dem_00215]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetNextFilteredDTC` |
| 语法 | `Std_ReturnType Dem_GetNextFilteredDTC(uint8 ClientId, uint32* DTC, uint8* DTCStatus)` |
| 服务 ID [十六进制] | 0x18 |
| 同步/异步 | 同步或异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `DTC` - 接收此函数返回的过滤器的相应格式的 DTC 值。如果函数的返回值不是 `DEM_FILTERED_OK`,则此参数不包含有效数据;`DTCStatus` - 此参数接收所请求 DTC 的状态信息。它遵循 ISO14229-1 中定义的格式 |
| 返回值 | `Std_ReturnType` - `E_OK`:返回下一个过滤元素;`E_NOT_OK`:未设置 DTC 过滤器;`DEM_NO_SUCH_ELEMENT`:未找到更多匹配过滤条件的元素;`DEM_PENDING`:所请求的操作当前正在进行中 |
| 描述 | 获取下一个匹配过滤条件的过滤 DTC。对于 UDS 服务,接口具有异步行为,因为必须处理大量 DTC。 |
| 可通过 | Dem.h |
**表 8.56:Dem_GetNextFilteredDTC**
`c()`
###### 8.3.4.1.9 Dem_GetNextFilteredDTCAndFDC
⌈[SWS_Dem_00227]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetNextFilteredDTCAndFDC` |
| 语法 | `Std_ReturnType Dem_GetNextFilteredDTCAndFDC(uint8 ClientId, uint32* DTC, sint8* DTCFaultDetectionCounter)` |
| 服务 ID [十六进制] | 0x3b |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `DTC` - 接收此函数返回的过滤器的相应格式的 DTC 值;`DTCFaultDetectionCounter` - 此参数接收所请求 DTC 的故障检测计数器信息。-128dec...127dec 根据 ISO 14229-1 从 PASSED 到 FAILED |
| 返回值 | `Std_ReturnType` - `E_OK`:返回下一个过滤元素;`E_NOT_OK`:未设置 DTC 过滤器;`DEM_NO_SUCH_ELEMENT`:未找到更多匹配过滤条件的元素;`DEM_PENDING`:所请求的操作当前正在进行中 |
| 描述 | 获取下一个过滤 DTC 及其关联的故障检测计数器(FDC)匹配过滤条件。接口具有异步行为,因为必须处理大量 DTC,并且 FDC 也可能从 SW-C 异步接收。 |
| 可通过 | Dem.h |
**表 8.57:Dem_GetNextFilteredDTCAndFDC**
`c()`
###### 8.3.4.1.10 Dem_GetNextFilteredDTCAndSeverity
⌈[SWS_Dem_00281]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetNextFilteredDTCAndSeverity` |
| 语法 | `Std_ReturnType Dem_GetNextFilteredDTCAndSeverity(uint8 ClientId, uint32* DTC, uint8* DTCStatus, Dem_DTCSeverityType* DTCSeverity, uint8* DTCFunctionalUnit)` |
| 服务 ID [十六进制] | 0x3d |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `DTC` - 接收此函数返回的过滤器的相应格式的 DTC 值;`DTCStatus` - 此参数接收所请求 DTC 的状态信息;`DTCSeverity` - 接收函数返回的严重性值;`DTCFunctionalUnit` - 接收函数返回的功能单元值 |
| 返回值 | `Std_ReturnType` - `E_OK`:返回下一个过滤元素;`E_NOT_OK`:未设置 DTC 过滤器;`DEM_NO_SUCH_ELEMENT`:未找到更多匹配过滤条件的元素;`DEM_PENDING`:所请求的操作当前正在进行中 |
| 描述 | 获取下一个过滤 DTC 及其关联的严重性匹配过滤条件。接口具有异步行为,因为必须处理大量 DTC。 |
| 可通过 | Dem.h |
**表 8.58:Dem_GetNextFilteredDTCAndSeverity**
`(SRS_Diag_04010)`
###### 8.3.4.1.11 Dem_SetFreezeFrameRecordFilter
⌈[SWS_Dem_00209]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetFreezeFrameRecordFilter` |
| 语法 | `Std_ReturnType Dem_SetFreezeFrameRecordFilter(uint8 ClientId, Dem_DTCFormatType DTCFormat)` |
| 服务 ID [十六进制] | 0x3f |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID;`DTCFormat` - 定义所请求 DTC 值的输出格式 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - (重新)设置冻结帧记录过滤器的操作状态。`E_OK`:过滤器已接受;`E_NOT_OK`:选择了错误的过滤器 |
| 描述 | 设置冻结帧记录过滤器。 |
| 可通过 | Dem.h |
**表 8.59:Dem_SetFreezeFrameRecordFilter**
`c()`
###### 8.3.4.1.12 Dem_GetNextFilteredRecord
⌈[SWS_Dem_00224]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetNextFilteredRecord` |
| 语法 | `Std_ReturnType Dem_GetNextFilteredRecord(uint8 ClientId, uint32* DTC, uint8* RecordNumber)` |
| 服务 ID [十六进制] | 0x3a |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `DTC` - 接收此函数返回的过滤器的相应格式的 DTC 值。如果函数的返回值不是 `E_OK`,则此参数不包含有效数据;`RecordNumber` - 报告的 DTC 的冻结帧记录号(相对寻址)。如果函数的返回值不是 `E_OK`,则此参数不包含有效数据 |
| 返回值 | `Std_ReturnType` - 从 Dem 检索 DTC 及其关联的快照记录号的操作状态。`E_OK`:返回下一个过滤元素;`DEM_NO_SUCH_ELEMENT`:未找到更多匹配过滤条件的元素;`DEM_PENDING`:所请求的值是异步计算的且当前不可用。调用方可以稍后重试。仅由异步接口使用 |
| 描述 | 获取下一个冻结帧记录号及其关联的 DTC 存储在事件内存中。接口具有异步行为,因为可能需要 NvRAM 访问。 |
| 可通过 | Dem.h |
**表 8.60:Dem_GetNextFilteredRecord**
`c()`
###### 8.3.4.1.13 Dem_GetDTCByOccurrenceTime
⌈[SWS_Dem_00218]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetDTCByOccurrenceTime` |
| 语法 | `Std_ReturnType Dem_GetDTCByOccurrenceTime(uint8 ClientId, Dem_DTCRequestType DTCRequest, uint32* DTC)` |
| 服务 ID [十六进制] | 0x19 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID;`DTCRequest` - 此参数定义 DTC 的请求类型 |
| 参数 (inout) | 无 |
| 参数 (out) | `DTC` - 接收函数返回的 UDS 格式的 DTC 值。如果函数的返回值不是 `DEM_OCCURR_OK`,则此参数不包含有效数据 |
| 返回值 | `Std_ReturnType` - `E_OK`:获取 DTC 成功;`E_NOT_OK`:调用未成功;`DEM_NO_SUCH_ELEMENT`:所请求的元素未存储 |
| 描述 | 按发生时间获取 DTC。没有用于 DTC-origin 的显式参数,因为 origin 始终是 `DEM_DTC_ORIGIN_PRIMARY_MEMORY`。 |
| 可通过 | Dem.h |
**表 8.61:Dem_GetDTCByOccurrenceTime**
`(SRS_Diag_04072)`
##### 8.3.4.2 访问扩展数据记录和冻结帧数据
###### 8.3.4.2.1 Dem_DisableDTCRecordUpdate
⌈[SWS_Dem_00233]⌋
| | |
|---|---|
| 服务名称 | `Dem_DisableDTCRecordUpdate` |
| 语法 | `Std_ReturnType Dem_DisableDTCRecordUpdate(uint8 ClientId)` |
| 服务 ID [十六进制] | 0x1a |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:事件内存更新成功禁用;`E_NOT_OK`:未选择 DTC;`DEM_WRONG_DTC`:所选格式中的所选 DTC 值不存在或选择了 DTC 组;`DEM_WRONG_DTCORIGIN`:所选 DTCOrigin 不存在;`DEM_PENDING`:禁用 DTC 记录更新当前正在进行中;`DEM_BUSY`:此客户端的另一个不同的 `Dem_SelectDTC` 相关操作正在进行中 |
| 描述 | 禁用特定 DTC 的事件内存更新(一次仅一个)。 |
| 可通过 | Dem.h |
**表 8.62:Dem_DisableDTCRecordUpdate**
`(SRS_Diag_04095)`
###### 8.3.4.2.2 Dem_EnableDTCRecordUpdate
⌈[SWS_Dem_00234]⌋
| | |
|---|---|
| 服务名称 | `Dem_EnableDTCRecordUpdate` |
| 语法 | `Std_ReturnType Dem_EnableDTCRecordUpdate(uint8 ClientId)` |
| 服务 ID [十六进制] | 0x1b |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:DTC 记录成功更新;`E_NOT_OK`:未选择 DTC;`DEM_BUSY`:此客户端的另一个不同的 `Dem_SelectDTC` 相关操作正在进行中 |
| 描述 | 启用之前由 `Dem_DisableDTCRecordUpdate()` 禁用的 DTC 的事件内存更新。 |
| 可通过 | Dem.h |
**表 8.63:Dem_EnableDTCRecordUpdate**
`(SRS_Diag_04074)`
###### 8.3.4.2.3 Dem_GetSizeOfExtendedDataRecordSelection
⌈[SWS_Dem_00240]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetSizeOfExtendedDataRecordSelection` |
| 语法 | `Std_ReturnType Dem_GetSizeOfExtendedDataRecordSelection(uint8 ClientId, uint16* SizeOfExtendedDataRecord)` |
| 服务 ID [十六进制] | 0x21 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `SizeOfExtendedDataRecord` - 所请求的扩展数据记录的大小,包括记录号。单个 `ExtendedDataRecord` 的格式为:`{RecordNumber, data[1], ..., data[N]}` |
| 返回值 | `Std_ReturnType` - `E_OK`:大小返回成功;`E_NOT_OK`:未调用选择函数;`DEM_PENDING`:所请求的值是异步计算的且当前不可用;`DEM_WRONG_DTC`:DTC 值不存在;`DEM_WRONG_DTCORIGIN`:错误的 DTC 来源;`DEM_NO_SUCH_ELEMENT`:记录号不受配置支持,因此无效 |
| 描述 | 获取通过调用 `Dem_SelectExtendedDataRecord` 选择的 DTC 的扩展数据记录的大小。 |
| 可通过 | Dem.h |
**表 8.64:Dem_GetSizeOfExtendedDataRecordSelection**
`(SRS_Diag_04066)`
###### 8.3.4.2.4 Dem_GetSizeOfFreezeFrameSelection
⌈[SWS_Dem_00238]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetSizeOfFreezeFrameSelection` |
| 语法 | `Std_ReturnType Dem_GetSizeOfFreezeFrameSelection(uint8 ClientId, uint16* SizeOfFreezeFrame)` |
| 服务 ID [十六进制] | 0x1f |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `SizeOfFreezeFrame` - 所请求的冻结帧记录中的字节数 |
| 返回值 | `Std_ReturnType` - `E_OK`:大小返回成功;`E_NOT_OK`:未调用选择函数;`DEM_PENDING`:所请求的值是异步计算的且当前不可用;`DEM_WRONG_DTC`:DTC 值不存在;`DEM_WRONG_DTCORIGIN`:错误的 DTC 来源;`DEM_NO_SUCH_ELEMENT`:记录号不受配置支持,因此无效 |
| 描述 | 获取通过调用 `Dem_SelectFreezeFrameData` 选择的 DTC 的冻结帧数据的大小。 |
| 可通过 | Dem.h |
**表 8.65:Dem_GetSizeOfFreezeFrameSelection**
`(SRS_Diag_04066)`
###### 8.3.4.2.5 Dem_GetNextExtendedDataRecord
⌈[SWS_Dem_00239]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetNextExtendedDataRecord` |
| 语法 | `Std_ReturnType Dem_GetNextExtendedDataRecord(uint8 ClientId, uint8* DestBuffer, uint16* BufSize)` |
| 服务 ID [十六进制] | 0x20 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | `BufSize` - 调用此函数时,此参数包含可写入缓冲区的最大数据字节数。函数返回此参数中已写入数据字节的实际数量 |
| 参数 (out) | `DestBuffer` - 此参数包含一个字节指针,指向要写入扩展数据记录的缓冲区。格式为:`{ExtendedDataRecordNumber, data[0], data[1], ..., data[n]}` |
| 返回值 | `Std_ReturnType` - `E_OK`:大小和缓冲区成功返回;`E_NOT_OK`:未调用选择函数;`DEM_BUFFER_TOO_SMALL`:提供的缓冲区大小太小;`DEM_PENDING`:所请求的值是异步计算的且当前不可用;`DEM_WRONG_DTC`:DTC 值不存在;`DEM_WRONG_DTCORIGIN`:错误的 DTC 来源;`DEM_NO_SUCH_ELEMENT`:未找到(更多)匹配过滤条件的元素 |
| 描述 | 获取通过 `Dem_SelectExtendedDataRecord` 选择的 DTC 的扩展数据记录。函数将数据存储在提供的 `DestBuffer` 中。 |
| 可通过 | Dem.h |
**表 8.66:Dem_GetNextExtendedDataRecord**
`(SRS_Diag_04066)`
###### 8.3.4.2.6 Dem_GetNextFreezeFrameData
⌈[SWS_Dem_00236]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetNextFreezeFrameData` |
| 语法 | `Std_ReturnType Dem_GetNextFreezeFrameData(uint8 ClientId, uint8* DestBuffer, uint16* BufSize)` |
| 服务 ID [十六进制] | 0x1d |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | `BufSize` - 调用此函数时,此参数包含可写入缓冲区的最大数据字节数。函数返回此参数中已写入数据字节的实际数量 |
| 参数 (out) | `DestBuffer` - 此参数包含一个字节指针,指向要写入冻结帧数据记录的缓冲区。格式为:`{RecordNumber, NumOfDIDs, DID[1], data[1], ..., DID[N], data[N]}` |
| 返回值 | `Std_ReturnType` - `E_OK`:大小和缓冲区成功返回;`DEM_BUFFER_TOO_SMALL`:提供的缓冲区大小太小;`DEM_PENDING`:所请求的值是异步计算的且当前不可用;`DEM_WRONG_DTC`:DTC 值不存在;`E_NOT_OK`:未调用选择函数;`DEM_WRONG_DTCORIGIN`:错误的 DTC 来源;`DEM_NO_SUCH_ELEMENT`:未找到(更多)匹配过滤条件的元素 |
| 描述 | 获取通过 `Dem_SelectFreezeFrameData` 选择的 DTC 的冻结帧数据。函数将数据存储在提供的 `DestBuffer` 中。 |
| 可通过 | Dem.h |
**表 8.67:Dem_GetNextFreezeFrameData**
`(SRS_Diag_04066)`
###### 8.3.4.2.7 Dem_SelectExtendedDataRecord
⌈[SWS_Dem_91017]⌋
| | |
|---|---|
| 服务名称 | `Dem_SelectExtendedDataRecord` |
| 语法 | `Std_ReturnType Dem_SelectExtendedDataRecord(uint8 ClientId, uint8 ExtendedDataNumber)` |
| 服务 ID [十六进制] | 0xba |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID;`ExtendedDataNumber` - 所请求的扩展数据记录的标识/编号。此外,明确允许值 0xFE 和 0xFF 用于请求所有 OBD 记录/所有记录的总大小 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:扩展数据记录成功选择;`DEM_WRONG_DTC`:所选格式中的所选 DTC 值不存在;`DEM_WRONG_DTCORIGIN`:所选 DTCOrigin 不存在;`DEM_PENDING`:选择扩展数据记录当前正在进行中;`DEM_BUSY`:此客户端的另一个不同的 `Dem_SelectDTC` 相关操作正在进行中 |
| 描述 | 设置将由 `Dem_GetNextExtendedDataRecord` 和 `Dem_GetSizeOfExtendedDataRecordSelection` 使用的过滤器。 |
| 可通过 | Dem.h |
**表 8.68:Dem_SelectExtendedDataRecord**
`c()`
###### 8.3.4.2.8 Dem_SelectFreezeFrameData
⌈[SWS_Dem_91015]⌋
| | |
|---|---|
| 服务名称 | `Dem_SelectFreezeFrameData` |
| 语法 | `Std_ReturnType Dem_SelectFreezeFrameData(uint8 ClientId, uint8 RecordNumber)` |
| 服务 ID [十六进制] | 0xb9 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID;`RecordNumber` - ISO 14229-1 中定义的快照记录的唯一标识符。值 0xFF 是引用所寻址 DTC 的所有快照记录的占位符。值 0x00 指示 DTC 特定的 WWH-OBD 快照记录 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:冻结帧数据成功选择;`DEM_WRONG_DTC`:所选格式中的所选 DTC 值不存在;`DEM_WRONG_DTCORIGIN`:所选 DTCOrigin 不存在;`DEM_PENDING`:选择冻结帧当前正在进行中;`DEM_BUSY`:此客户端的另一个不同的 `Dem_SelectDTC` 相关操作正在进行中 |
| 描述 | 设置将由 `Dem_GetNextFreezeFrameData` 和 `Dem_GetSizeOfFreezeFrameSelection` 使用的过滤器。 |
| 可通过 | Dem.h |
**表 8.69:Dem_SelectFreezeFrameData**
`c()`
###### 8.3.4.2.9 Dem_GetNumberOfFreezeFrameRecords
⌈[SWS_Dem_91191]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetNumberOfFreezeFrameRecords` |
| 语法 | `Std_ReturnType Dem_GetNumberOfFreezeFrameRecords(uint8 ClientId, uint16* NumberOfFilteredRecords)` |
| 服务 ID [十六进制] | 0x5a |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `NumberOfFilteredRecords` - 当前存储在主要事件内存中的所有冻结帧记录数 |
| 返回值 | `Std_ReturnType` - 操作状态。`E_OK`:正确返回冻结帧记录数;`DEM_PENDING`:所请求的值是异步计算的且当前不可用 |
| 描述 | 此函数返回当前存储在主要事件内存中的所有冻结帧记录的数量。 |
| 可通过 | Dem.h |
**表 8.70:Dem_GetNumberOfFreezeFrameRecords**
`c()`
##### 8.3.4.3 DTC 存储
###### 8.3.4.3.1 Dem_DisableDTCSetting
⌈[SWS_Dem_00242]⌋
| | |
|---|---|
| 服务名称 | `Dem_DisableDTCSetting` |
| 语法 | `Std_ReturnType Dem_DisableDTCSetting(uint8 ClientId)` |
| 服务 ID [十六进制] | 0x24 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:返回下一个过滤元素;`DEM_PENDING`:所请求的操作当前正在进行中 |
| 描述 | 禁用分配给所寻址客户端的 `DemEventMemorySet` 的所有 DTC 的 DTC 设置。 |
| 可通过 | Dem.h |
**表 8.71:Dem_DisableDTCSetting**
`(SRS_Diag_04150)`
###### 8.3.4.3.2 Dem_EnableDTCSetting
⌈[SWS_Dem_00243]⌋
| | |
|---|---|
| 服务名称 | `Dem_EnableDTCSetting` |
| 语法 | `Std_ReturnType Dem_EnableDTCSetting(uint8 ClientId)` |
| 服务 ID [十六进制] | 0x25 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`DEM_PENDING`:启动的操作当前正在进行中 |
| 描述 | (重新)启用分配给所寻址客户端的 `DemEventMemorySet` 的所有 DTC 的 DTC 设置。 |
| 可通过 | Dem.h |
**表 8.72:Dem_EnableDTCSetting**
`(SRS_Diag_04095, SRS_Diag_04158, SRS_Diag_04150)`
#### 8.3.5 OBD 特定的 Dcm <=> Dem 接口
##### 8.3.5.1 Dem_DcmGetInfoTypeValue08
⌈[SWS_Dem_00316]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmGetInfoTypeValue08` |
| 语法 | `Std_ReturnType Dem_DcmGetInfoTypeValue08(Dcm_OpStatusType OpStatus, uint8* Iumprdata08, uint8* Iumprdata08BufferSize)` |
| 服务 ID [十六进制] | 0x6b |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `OpStatus` - 仅出现 `DCM_INITIAL`,因为此 API 表现为同步 |
| 参数 (inout) | `Iumprdata08BufferSize` - 可写入 `Iumprdata08` 缓冲区的最大数据字节数 |
| 参数 (out) | `Iumprdata08` - 包含数据元素数量(根据 ISO-15031-5 定义)和 InfoType $08 内容的缓冲区。缓冲区由 Dcm 提供 |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK` |
| 描述 | 用于根据 InfoType $08 请求 IUMPR 数据的服务。此接口源自 Dcm 定义的原型 `_GetInfotypeValueData()`。因此包含 `Dcm_OpStatusType` 和 `Std_ReturnType`。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.73:Dem_DcmGetInfoTypeValue08**
`c()`
##### 8.3.5.2 Dem_DcmGetInfoTypeValue0B
⌈[SWS_Dem_00317]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmGetInfoTypeValue0B` |
| 语法 | `Std_ReturnType Dem_DcmGetInfoTypeValue0B(Dcm_OpStatusType OpStatus, uint8* Iumprdata0B, uint8* Iumprdata0BBufferSize)` |
| 服务 ID [十六进制] | 0x6c |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `OpStatus` - 仅出现 `DCM_INITIAL`;`Iumprdata0BBufferSize` - 可写入 `Iumprdata0B` 缓冲区的最大数据字节数 |
| 参数 (out) | `Iumprdata0B` - 包含数据元素数量(根据 ISO-15031-5 定义)和 InfoType $0B 内容的缓冲区。缓冲区由 Dcm 提供 |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK` |
| 描述 | 用于根据 InfoType $0B 请求 IUMPR 数据的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.74:Dem_DcmGetInfoTypeValue0B**
`c()`
##### 8.3.5.3 Dem_DcmReadDataOfPID01
⌈[SWS_Dem_00318]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmReadDataOfPID01` |
| 语法 | `Std_ReturnType Dem_DcmReadDataOfPID01(uint8* PID01value)` |
| 服务 ID [十六进制] | 0x61 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `PID01value` - 包含 Dem 计算的 PID $01 内容的缓冲区。缓冲区由 Dcm 以适当的大小提供,即在配置期间,Dcm 从最大 PID 标识所需大小以配置 PIDBuffer |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK`,因为 `E_NOT_OK` 永远不会出现 |
| 描述 | 用于报告 Dem 计算的 PID $01 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.75:Dem_DcmReadDataOfPID01**
`c()`
##### 8.3.5.4 Dem_DcmReadDataOfPID1C
⌈[SWS_Dem_00325]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmReadDataOfPID1C` |
| 语法 | `Std_ReturnType Dem_DcmReadDataOfPID1C(uint8* PID1Cvalue)` |
| 服务 ID [十六进制] | 0x63 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `PID1Cvalue` - 包含 Dem 计算的 PID $1C 内容的缓冲区。PID$1C 的值在 `DemOBDCompliancy` 中配置。缓冲区由 Dcm 以适当的大小提供,即在配置期间,Dcm 从最大 PID 标识所需大小以配置 PIDBuffer |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK`,因为 `E_NOT_OK` 永远不会出现 |
| 描述 | 用于报告 Dem 计算的 PID $1C 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.76:Dem_DcmReadDataOfPID1C**
`(SRS_Diag_04082)`
##### 8.3.5.5 Dem_DcmReadDataOfPID21
⌈[SWS_Dem_00319]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmReadDataOfPID21` |
| 语法 | `Std_ReturnType Dem_DcmReadDataOfPID21(uint8* PID21value)` |
| 服务 ID [十六进制] | 0x64 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `PID21value` - 包含 Dem 计算的 PID $21 内容的缓冲区。缓冲区由 Dcm 以适当的大小提供,即在配置期间,Dcm 从最大 PID 标识所需大小以配置 PIDBuffer |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK`,因为 `E_NOT_OK` 永远不会出现 |
| 描述 | 用于报告 Dem 计算的 PID $21 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.77:Dem_DcmReadDataOfPID21**
`c()`
##### 8.3.5.6 Dem_DcmReadDataOfPID30
⌈[SWS_Dem_00320]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmReadDataOfPID30` |
| 语法 | `Std_ReturnType Dem_DcmReadDataOfPID30(uint8* PID30value)` |
| 服务 ID [十六进制] | 0x65 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `PID30value` - 包含 Dem 计算的 PID $30 内容的缓冲区。缓冲区由 Dcm 以适当的大小提供,即在配置期间,Dcm 从最大 PID 标识所需大小以配置 PIDBuffer |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK`,因为 `E_NOT_OK` 永远不会出现 |
| 描述 | 用于报告 Dem 计算的 PID $30 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.78:Dem_DcmReadDataOfPID30**
`c()`
##### 8.3.5.7 Dem_DcmReadDataOfPID31
⌈[SWS_Dem_00321]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmReadDataOfPID31` |
| 语法 | `Std_ReturnType Dem_DcmReadDataOfPID31(uint8* PID31value)` |
| 服务 ID [十六进制] | 0x66 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `PID31value` - 包含 Dem 计算的 PID $31 内容的缓冲区。缓冲区由 Dcm 以适当的大小提供,即在配置期间,Dcm 从最大 PID 标识所需大小以配置 PIDBuffer |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK`,因为 `E_NOT_OK` 永远不会出现 |
| 描述 | 用于报告 Dem 计算的 PID $31 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} == DEM_OBD_MASTER_ECU)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.79:Dem_DcmReadDataOfPID31**
`(SRS_Diag_04082)`
##### 8.3.5.8 Dem_DcmReadDataOfPID41
⌈[SWS_Dem_00322]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmReadDataOfPID41` |
| 语法 | `Std_ReturnType Dem_DcmReadDataOfPID41(uint8* PID41value)` |
| 服务 ID [十六进制] | 0x67 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `PID41value` - 包含 Dem 计算的 PID $41 内容的缓冲区。缓冲区由 Dcm 以适当的大小提供,即在配置期间,Dcm 从最大 PID 标识所需大小以配置 PIDBuffer |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK`,因为 `E_NOT_OK` 永远不会出现 |
| 描述 | 用于报告 Dem 计算的 PID $41 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.80:Dem_DcmReadDataOfPID41**
`c()`
##### 8.3.5.9 Dem_DcmReadDataOfPID4D
⌈[SWS_Dem_00323]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmReadDataOfPID4D` |
| 语法 | `Std_ReturnType Dem_DcmReadDataOfPID4D(uint8* PID4Dvalue)` |
| 服务 ID [十六进制] | 0x68 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `PID4Dvalue` - 包含 Dem 计算的 PID $4D 内容的缓冲区。缓冲区由 Dcm 以适当的大小提供,即在配置期间,Dcm 从最大 PID 标识所需大小以配置 PIDBuffer |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK`,因为 `E_NOT_OK` 永远不会出现 |
| 描述 | 用于报告 Dem 计算的 PID $4D 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} == DEM_OBD_MASTER_ECU)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.81:Dem_DcmReadDataOfPID4D**
`(SRS_Diag_04082)`
##### 8.3.5.10 Dem_DcmReadDataOfPID4E
⌈[SWS_Dem_00324]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmReadDataOfPID4E` |
| 语法 | `Std_ReturnType Dem_DcmReadDataOfPID4E(uint8* PID4Evalue)` |
| 服务 ID [十六进制] | 0x69 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `PID4Evalue` - 包含 Dem 计算的 PID $4E 内容的缓冲区。缓冲区由 Dcm 以适当的大小提供,即在配置期间,Dcm 从最大 PID 标识所需大小以配置 PIDBuffer |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK`,因为 `E_NOT_OK` 永远不会出现 |
| 描述 | 用于报告 Dem 计算的 PID $4E 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} == DEM_OBD_MASTER_ECU)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.82:Dem_DcmReadDataOfPID4E**
`c()`
##### 8.3.5.11 Dem_DcmReadDataOfPID91
⌈[SWS_Dem_01187]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmReadDataOfPID91` |
| 语法 | `Std_ReturnType Dem_DcmReadDataOfPID91(uint8* PID91value)` |
| 服务 ID [十六进制] | 0x6a |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `PID91value` - 包含 Dem 计算的 PID $91 内容的缓冲区。缓冲区由 Dcm 以适当的大小提供,即在配置期间,Dcm 从最大 PID 标识所需大小以配置 PIDBuffer |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK`,因为 `E_NOT_OK` 永远不会出现 |
| 描述 | 用于报告 Dem 计算的 PID $91 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.83:Dem_DcmReadDataOfPID91**
`(SRS_Diag_04082)`
##### 8.3.5.12 Dem_DcmReadDataOfOBDFreezeFrame
⌈[SWS_Dem_00327]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmReadDataOfOBDFreezeFrame` |
| 语法 | `Std_ReturnType Dem_DcmReadDataOfOBDFreezeFrame(uint8 PID, uint8 DataElementIndexOfPID, uint8* DestBuffer, uint16* BufSize)` |
| 服务 ID [十六进制] | 0x52 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `PID` - 此参数是 ISO15031-5 中定义的 PID 的标识符;`DataElementIndexOfPID` - 此 PID 的数据元素索引根据 Dcm 的服务 $02 配置。它是从零开始的、连续的,并按数据元素位置排序(在 Dcm 中配置,参见 SWS_Dem_00597) |
| 参数 (inout) | `DestBuffer` - 此参数包含一个字节指针,指向要写入 PID 数据元素的缓冲区。格式是原始十六进制值,不包含标头信息;`BufSize` - 调用此函数时,此参数包含可写入缓冲区的最大数据字节数。函数返回此参数中已写入数据字节的实际数量 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:冻结帧数据成功报告;`E_NOT_OK`:冻结帧数据未成功报告 |
| 描述 | 获取服务 $02 输出的最重要冻结帧的每个 PID 和索引的数据元素。函数将数据存储在提供的 `DestBuffer` 中。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.84:Dem_DcmReadDataOfOBDFreezeFrame**
`c()`
##### 8.3.5.13 Dem_DcmGetDTCOfOBDFreezeFrame
⌈[SWS_Dem_00624]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmGetDTCOfOBDFreezeFrame` |
| 语法 | `Std_ReturnType Dem_DcmGetDTCOfOBDFreezeFrame(uint8 FrameNumber, uint32* DTC, Dem_DTCFormatType DTCFormat)` |
| 服务 ID [十六进制] | 0x53 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `FrameNumber` - ISO 15031-5 中定义的冻结帧记录的唯一标识符。值 0x00 指示完整的 OBD 冻结帧。其他值保留供未来功能使用;`DTCFormat` - DTC 值的输出格式 |
| 参数 (inout) | 无 |
| 参数 (out) | `DTC` - OBD 格式的诊断故障代码。如果函数的返回值不是 `E_OK`,则此参数不包含有效数据 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:没有可用的 DTC |
| 描述 | 按冻结帧记录号获取 DTC。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.85:Dem_DcmGetDTCOfOBDFreezeFrame**
`(SRS_Diag_04010)`
##### 8.3.5.14 Dem_DcmGetAvailableOBDMIDs
⌈[SWS_Dem_00766]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmGetAvailableOBDMIDs` |
| 语法 | `Std_ReturnType Dem_DcmGetAvailableOBDMIDs(uint8 Obdmid, uint32* Obdmidvalue)` |
| 服务 ID [十六进制] | 0xa3 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `Obdmid` - 可用 OBDMID($00, $20, $40, ...) |
| 参数 (inout) | 无 |
| 参数 (out) | `Obdmidvalue` - 关于 OBDMID 支持的位编码信息 |
| 返回值 | `Std_ReturnType` - `E_OK`:DTR 结果报告成功 |
| 描述 | 在服务 $06 请求时向 DCM 报告所请求的"availability-OBDMID"的值。由此,测试仪显示机械师可以选择的受支持测试。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.86:Dem_DcmGetAvailableOBDMIDs**
`(SRS_Diag_04082)`
##### 8.3.5.15 Dem_DcmGetNumTIDsOfOBDMID
⌈[SWS_Dem_00767]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmGetNumTIDsOfOBDMID` |
| 语法 | `Std_ReturnType Dem_DcmGetNumTIDsOfOBDMID(uint8 Obdmid, uint8* numberOfTIDs)` |
| 服务 ID [十六进制] | 0xa4 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `Obdmid` - 请求以标识分配的 TID 数量的 OBDMID |
| 参数 (inout) | 无 |
| 参数 (out) | `numberOfTIDs` - 所请求 OBDMID 的已分配 TID 数。用于 DCM 检索所有 OBD/TID 结果数据的循环值 |
| 返回值 | `Std_ReturnType` - `E_OK`:获取 TID 数成功;`E_NOT_OK`:获取 TID 数失败 |
| 描述 | 获取每个(功能)OBDMID 的 TID 数。 DCM 可用于在 0....numberOfTIDs-1 循环内迭代请求 OBD/TID 结果数据。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.87:Dem_DcmGetNumTIDsOfOBDMID**
`c()`
##### 8.3.5.16 Dem_DcmGetDTRData
⌈[SWS_Dem_00768]⌋
| | |
|---|---|
| 服务名称 | `Dem_DcmGetDTRData` |
| 语法 | `Std_ReturnType Dem_DcmGetDTRData(uint8 Obdmid, uint8 TIDindex, uint8* TIDvalue, uint8* UaSID, uint16* Testvalue, uint16* Lowlimvalue, uint16* Upplimvalue)` |
| 服务 ID [十六进制] | 0xa5 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `Obdmid` - 通过分配的 DTRId 标识 DTR 元素;`TIDindex` - DEM 中 TID 的索引。从 0 运行到通过调用 `Dem_DcmGetNumTIDsOfOBDMID()` 获取的 `numberOfTIDs` |
| 参数 (inout) | 无 |
| 参数 (out) | `TIDvalue` - 放在测试仪响应上的 TID;`UaSID` - 放在测试仪响应上的 UaSID;`Testvalue` - 最新测试结果;`Lowlimvalue` - 与最新测试结果关联的下限值;`Upplimvalue` - 与最新测试结果关联的上限值 |
| 返回值 | `Std_ReturnType` - `E_OK`:DTR 结果报告成功;`E_NOT_OK`:DTR 结果报告失败 |
| 描述 | 报告 DTR 数据以及 TID 值、UaSID、测试结果和下限和上限。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem_Dcm.h |
**表 8.88:Dem_DcmGetDTRData**
`c()`
#### 8.3.6 接口 J1939Dcm <=> Dem
##### 8.3.6.1 访问 DTC 和状态信息
###### 8.3.6.1.1 Dem_J1939DcmSetDTCFilter
⌈[SWS_Dem_00970]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmSetDTCFilter` |
| 语法 | `Std_ReturnType Dem_J1939DcmSetDTCFilter(Dem_J1939DcmDTCStatusFilterType DTCStatusFilter, Dem_DTCKindType DTCKind, Dem_DTCOriginType DTCOrigin, uint8 ClientId, Dem_J1939DcmLampStatusType* LampStatus)` |
| 服务 ID [十六进制] | 0x90 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `DTCStatusFilter` - 以下类型可用:`DEM_J1939DTC_ACTIVE`、`DEM_J1939DTC_PREVIOUSLY_ACTIVE`、`DEM_J1939DTC_PENDING`、`DEM_J1939DTC_PERMANENT`、`DEM_J1939DTC_CURRENTLY_ACTIVE`;`DTCKind` - 定义要报告的 DTC 的功能组(例如,所有 DTC、OBD 相关 DTC);`DTCOrigin` - 此参数用于选择要从中读取/清除 DTC 的源内存;`ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | `LampStatus` - `E_OK`:操作成功;`DEM_NO_SUCH_ELEMENT`:所请求的元素不可用;`DEM_PENDING`:操作成功且结果待定;`DEM_BUFFER_TOO_SMALL`:提供的缓冲区太小 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:无法设置过滤器 |
| 描述 | 函数为特定节点设置 DTC 过滤器,并返回过滤 DTC 的组合灯状态。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.89:Dem_J1939DcmSetDTCFilter**
`(SRS_Diag_04112)`
###### 8.3.6.1.2 Dem_J1939DcmGetNumberOfFilteredDTC
⌈[SWS_Dem_00972]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmGetNumberOfFilteredDTC` |
| 语法 | `Std_ReturnType Dem_J1939DcmGetNumberOfFilteredDTC(uint16* NumberOfFilteredDTC, uint8 ClientId)` |
| 服务 ID [十六进制] | 0x91 |
| 同步/异步 | 异步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | `NumberOfFilteredDTC` - 匹配定义的状态掩码的 DTC 数 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`DEM_NO_SUCH_ELEMENT`:所请求的元素不可用;`DEM_PENDING`:操作成功且结果待定;`DEM_BUFFER_TOO_SMALL`:提供的缓冲区太小 |
| 描述 | 获取由函数 `Dem_J1939DcmSetDTCFilter` 设置的当前过滤 DTC 的数量。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.90:Dem_J1939DcmGetNumberOfFilteredDTC**
`c()`
###### 8.3.6.1.3 Dem_J1939DcmGetNextFilteredDTC
⌈[SWS_Dem_00973]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmGetNextFilteredDTC` |
| 语法 | `Std_ReturnType Dem_J1939DcmGetNextFilteredDTC(uint32* J1939DTC, uint8* OccurenceCounter, uint8 ClientId)` |
| 服务 ID [十六进制] | 0x92 |
| 同步/异步 | 异步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | `J1939DTC` - 接收 J1939DTC 值。如果函数的返回值不是 `DEM_FILTERED_OK`,则此参数不包含有效数据;`OccurenceCounter` - 此参数接收相应的事件计数器。如果函数调用的返回值不是 `DEM_FILTERED_OK`,则此参数不包含有效数据 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`DEM_NO_SUCH_ELEMENT`:所请求的元素不可用;`DEM_PENDING`:操作成功且结果待定;`DEM_BUFFER_TOO_SMALL`:提供的缓冲区太小 |
| 描述 | 获取下一个过滤的 J1939 DTC。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.91:Dem_J1939DcmGetNextFilteredDTC**
`c()`
###### 8.3.6.1.4 Dem_J1939DcmFirstDTCwithLampStatus
⌈[SWS_Dem_00974]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmFirstDTCwithLampStatus` |
| 语法 | `void Dem_J1939DcmFirstDTCwithLampStatus(uint8 ClientId)` |
| 服务 ID [十六进制] | 0x93 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | 无 |
| 描述 | 函数将过滤器设置为特定节点 DM31 响应的第一个适用 DTC。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.92:Dem_J1939DcmFirstDTCwithLampStatus**
`(SRS_Diag_04110)`
###### 8.3.6.1.5 Dem_J1939DcmGetNextDTCwithLampStatus
⌈[SWS_Dem_00975]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmGetNextDTCwithLampStatus` |
| 语法 | `Std_ReturnType Dem_J1939DcmGetNextDTCwithLampStatus(Dem_J1939DcmLampStatusType* LampStatus, uint32* J1939DTC, uint8* OccurenceCounter, uint8 ClientId)` |
| 服务 ID [十六进制] | 0x94 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | `LampStatus` - 接收此函数返回的灯状态。如果函数的返回值不是 `DEM_FILTERED_OK`,则此参数不包含有效数据;`J1939DTC` - 接收 J1939DTC 值。如果函数的返回值不是 `DEM_FILTERED_OK`,则此参数不包含有效数据;`OccurenceCounter` - 此参数接收相应的事件计数器。如果函数调用的返回值不是 `DEM_FILTERED_OK`,则此参数不包含有效数据 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`DEM_NO_SUCH_ELEMENT`:所请求的元素不可用;`DEM_PENDING`:操作成功且结果待定;`DEM_BUFFER_TOO_SMALL`:提供的缓冲区太小 |
| 描述 | 获取 DM31 的下一个过滤的 J1939 DTC,包括当前 LampStatus。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.93:Dem_J1939DcmGetNextDTCwithLampStatus**
`c()`
##### 8.3.6.2 DTC 存储
###### 8.3.6.2.1 Dem_J1939DcmClearDTC
⌈[SWS_Dem_00976]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmClearDTC` |
| 语法 | `Std_ReturnType Dem_J1939DcmClearDTC(Dem_J1939DcmSetClearFilterType DTCTypeFilter, Dem_DTCOriginType DTCOrigin, uint8 ClientId)` |
| 服务 ID [十六进制] | 0x95 |
| 同步/异步 | 异步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `DTCTypeFilter` - 定义要清除的 DTC 类型;`DTCOrigin` - 此参数用于选择要从中读取/清除 DTC 的源内存;`ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:DTC 成功清除;`DEM_WRONG_DTC`:所选格式中的所选 DTC 值不存在或配置将清除限制为仅 DTC 组;`DEM_WRONG_DTCORIGIN`:所选 DTCOrigin 不存在;`DEM_CLEAR_FAILED`:DTC 清除失败;`DEM_CLEAR_BUSY`:另一个客户端当前正在清除 DTC;`DEM_CLEAR_MEMORY_ERROR`:在擦除内存位置期间发生错误;`DEM_PENDING`:DTC 清除当前正在进行中 |
| 描述 | 清除与指定 DTC 相关的所有事件的状态,以及这些事件的所有关联事件内存条目。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.94:Dem_J1939DcmClearDTC**
`(SRS_Diag_04112)`
###### 8.3.6.2.2 Dem_J1939DcmSetFreezeFrameFilter
⌈[SWS_Dem_00977]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmSetFreezeFrameFilter` |
| 语法 | `Std_ReturnType Dem_J1939DcmSetFreezeFrameFilter(Dem_J1939DcmSetFreezeFrameFilterType FreezeFrameKind, uint8 ClientId)` |
| 服务 ID [十六进制] | 0x96 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `FreezeFrameKind` - 以下类型可用:`DEM_J1939DCM_FREEZEFRAME`、`DEM_J1939DCM_EXPANDED_FREEZEFRAME`、`DEM_J1939DCM_SPNS_IN_EXPANDED_FREEZEFRAME`;`ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:无法设置过滤器 |
| 描述 | 函数为特定节点设置 FreezeFrame 过滤器。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.95:Dem_J1939DcmSetFreezeFrameFilter**
`(SRS_Diag_04112)`
###### 8.3.6.2.3 Dem_J1939DcmGetNextFreezeFrame
⌈[SWS_Dem_00978]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmGetNextFreezeFrame` |
| 语法 | `Std_ReturnType Dem_J1939DcmGetNextFreezeFrame(uint32* J1939DTC, uint8* OccurenceCounter, uint8* DestBuffer, uint16* BufSize, uint8 ClientId)` |
| 服务 ID [十六进制] | 0x97 |
| 同步/异步 | 异步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | `DestBuffer` - 此参数包含一个字节指针,指向要写入冻结帧数据记录的缓冲区;`BufSize` - 调用此函数时,此参数包含可写入缓冲区的最大数据字节数。函数返回在 `DestBuffer` 中已写入数据字节的实际数量 |
| 参数 (out) | `J1939DTC` - 接收 J1939DTC 值。如果函数的返回值不是 `DEM_FILTERED_OK`,则此参数不包含有效数据;`OccurenceCounter` - 此参数接收相应的事件计数器。如果函数调用的返回值不是 `DEM_FILTERED_OK`,则此参数不包含有效数据 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`DEM_NO_SUCH_ELEMENT`:所请求的元素不可用;`DEM_PENDING`:操作成功且结果待定;`DEM_BUFFER_TOO_SMALL`:提供的缓冲区太小 |
| 描述 | 获取下一个冻结帧数据。函数将数据存储在提供的 `DestBuffer` 中。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.96:Dem_J1939DcmGetNextFreezeFrame**
`(SRS_Diag_04112)`
###### 8.3.6.2.4 Dem_J1939DcmGetNextSPNInFreezeFrame
⌈[SWS_Dem_00979]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmGetNextSPNInFreezeFrame` |
| 语法 | `Std_ReturnType Dem_J1939DcmGetNextSPNInFreezeFrame(uint32* SPNSupported, uint8* SPNDataLength, uint8 ClientId)` |
| 服务 ID [十六进制] | 0x98 |
| 同步/异步 | 异步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | `SPNSupported` - 此参数包含 ExtendedFreezeFrame 中的下一个 SPN;`SPNDataLength` - 此参数包含 SPN 的相应数据长度 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`DEM_NO_SUCH_ELEMENT`:所请求的元素不可用;`DEM_PENDING`:操作成功且结果待定;`DEM_BUFFER_TOO_SMALL`:提供的缓冲区太小 |
| 描述 | 获取下一个 SPN。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.97:Dem_J1939DcmGetNextSPNInFreezeFrame**
`(SRS_Diag_04112)`
##### 8.3.6.3 报告
###### 8.3.6.3.1 Dem_J1939DcmSetRatioFilter
⌈[SWS_Dem_00980]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmSetRatioFilter` |
| 语法 | `Std_ReturnType Dem_J1939DcmSetRatioFilter(uint16* IgnitionCycleCounter, uint16* OBDMonitoringConditionsEncountered, uint8 ClientId)` |
| 服务 ID [十六进制] | 0x99 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | `IgnitionCycleCounter` - 点火循环计数器;`OBDMonitoringConditionsEncountered` - 遇到的 OBD 监视条件 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:无法设置过滤器 |
| 描述 | 函数为特定节点设置比率过滤器,并返回相应的点火循环计数器和通用分母。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.98:Dem_J1939DcmSetRatioFilter**
`c()`
###### 8.3.6.3.2 Dem_J1939DcmGetNextFilteredRatio
⌈[SWS_Dem_00981]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmGetNextFilteredRatio` |
| 语法 | `Std_ReturnType Dem_J1939DcmGetNextFilteredRatio(uint32* SPN, uint16* Numerator, uint16* Denominator, uint8 ClientId)` |
| 服务 ID [十六进制] | 0x9a |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | `SPN` - 接收适用系统监视器的 SPN;`Numerator` - 接收适用系统监视器的分子;`Denominator` - 接收适用系统监视器的分母 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`DEM_NO_SUCH_ELEMENT`:所请求的元素不可用;`DEM_PENDING`:操作成功且结果待定;`DEM_BUFFER_TOO_SMALL`:提供的缓冲区太小 |
| 描述 | 获取下一个过滤的比率。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.99:Dem_J1939DcmGetNextFilteredRatio**
`(SRS_Diag_04112)`
###### 8.3.6.3.3 Dem_J1939DcmReadDiagnosticReadiness1
⌈[SWS_Dem_00982]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmReadDiagnosticReadiness1` |
| 语法 | `Std_ReturnType Dem_J1939DcmReadDiagnosticReadiness1(Dem_J1939DcmDiagnosticReadiness1Type* DataValue, uint8 ClientId)` |
| 服务 ID [十六进制] | 0x9b |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | `DataValue` - 包含 Dem 计算的诊断就绪状态 1(DM05)内容的 8 字节缓冲区 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:操作失败 |
| 描述 | 用于报告 Dem 计算的诊断就绪状态 1(DM05)值的服务。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.100:Dem_J1939DcmReadDiagnosticReadiness1**
`(SRS_Diag_04113)`
###### 8.3.6.3.4 Dem_J1939DcmReadDiagnosticReadiness2
⌈[SWS_Dem_00983]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmReadDiagnosticReadiness2` |
| 语法 | `Std_ReturnType Dem_J1939DcmReadDiagnosticReadiness2(Dem_J1939DcmDiagnosticReadiness2Type* DataValue, uint8 ClientId)` |
| 服务 ID [十六进制] | 0x9c |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | `DataValue` - 包含 Dem 计算的诊断就绪状态 2(DM21)内容的 8 字节缓冲区 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:操作失败 |
| 描述 | 用于报告 Dem 计算的诊断就绪状态 2(DM21)值的服务。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.101:Dem_J1939DcmReadDiagnosticReadiness2**
`(SRS_Diag_04113)`
###### 8.3.6.3.5 Dem_J1939DcmReadDiagnosticReadiness3
⌈[SWS_Dem_00770]⌋
| | |
|---|---|
| 服务名称 | `Dem_J1939DcmReadDiagnosticReadiness3` |
| 语法 | `Std_ReturnType Dem_J1939DcmReadDiagnosticReadiness3(Dem_J1939DcmDiagnosticReadiness3Type* DataValue, uint8 ClientId)` |
| 服务 ID [十六进制] | 0x9d |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 用于寻址 J1939 事件内存的 ClientId |
| 参数 (inout) | 无 |
| 参数 (out) | `DataValue` - 包含 Dem 计算的诊断就绪状态 3(DM26)内容的 8 字节缓冲区 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:操作失败 |
| 描述 | 用于报告 Dem 计算的诊断就绪状态 3(DM26)值的服务。 |
| 可通过 | Dem_J1939Dcm.h |
**表 8.102:Dem_J1939DcmReadDiagnosticReadiness3**
`(SRS_Diag_04113)`
#### 8.3.7 OBD 特定接口
##### 8.3.7.1 Dem_SetEventDisabled
⌈[SWS_Dem_00312]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetEventDisabled` |
| 语法 | `Std_ReturnType Dem_SetEventDisabled(Dem_EventIdType EventId)` |
| 服务 ID [十六进制] | 0x51 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 EventId 可重入,对于同一 EventId 不可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:将事件设置为禁用成功;`E_NOT_OK`:将事件设置为禁用失败 |
| 描述 | 用于将事件报告为禁用给 Dem 以进行 PID $41 计算的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.103:Dem_SetEventDisabled**
`c()`
##### 8.3.7.2 Dem_RepIUMPRFaultDetect
⌈[SWS_Dem_00313]⌋
| | |
|---|---|
| 服务名称 | `Dem_RepIUMPRFaultDetect` |
| 语法 | `Std_ReturnType Dem_RepIUMPRFaultDetect(Dem_RatioIdType RatioID)` |
| 服务 ID [十六进制] | 0x73 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 RatioID 可重入,对于同一 RatioID 不可重入 |
| 参数 (in) | `RatioID` - 比率标识符,报告相应监视器可能已发现故障 - 仅当选择接口选项"API"时使用 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:IUMPR 结果报告成功 |
| 描述 | 用于报告可能已发现故障的服务,因为所有条件都已满足。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.104:Dem_RepIUMPRFaultDetect**
`c()`
##### 8.3.7.3 Dem_SetIUMPRDenCondition
⌈[SWS_Dem_00733]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetIUMPRDenCondition` |
| 语法 | `Std_ReturnType Dem_SetIUMPRDenCondition(Dem_IumprDenomCondIdType ConditionId, Dem_IumprDenomCondStatusType ConditionStatus)` |
| 服务 ID [十六进制] | 0xae |
| 同步/异步 | 同步/异步 |
| 可重入性 | 可重入 |
| 参数 (in) | `ConditionId` - IUMPR 分母条件 ID 的标识(通用分母、冷启动、EVAP、500mi);`ConditionStatus` - IUMPR 分母条件的状态(未达到、达到、不可达/禁止) |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:设置 IUMPR 分母条件成功;`E_NOT_OK`:设置 IUMPR 分母条件失败或无法接受 |
| 描述 | 为了在 OBD 相关 ECU 之间传达(附加)分母条件的状态,API 用于将条件状态转发到特定 ECU 的 Dem。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.105:Dem_SetIUMPRDenCondition**
`(SRS_Diag_04095)`
##### 8.3.7.4 Dem_GetIUMPRDenCondition
⌈[SWS_Dem_00734]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetIUMPRDenCondition` |
| 语法 | `Std_ReturnType Dem_GetIUMPRDenCondition(Dem_IumprDenomCondIdType ConditionId, Dem_IumprDenomCondStatusType* ConditionStatus)` |
| 服务 ID [十六进制] | 0xaf |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `ConditionId` - IUMPR 分母条件 ID 的标识(通用分母、冷启动、EVAP、500mi) |
| 参数 (inout) | 无 |
| 参数 (out) | `ConditionStatus` - IUMPR 分母条件的状态(未达到、达到、不可达/禁止) |
| 返回值 | `Std_ReturnType` - `E_OK`:获取 IUMPR 分母条件状态成功;`E_NOT_OK`:获取条件状态失败 |
| 描述 | 为了在 OBD 相关 ECU 之间传达(附加)分母条件的状态,API 用于从计算条件的 ECU 的 Dem 中检索条件状态。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.106:Dem_GetIUMPRDenCondition**
`c()`
##### 8.3.7.5 Dem_RepIUMPRDenRelease
⌈[SWS_Dem_00315]⌋
| | |
|---|---|
| 服务名称 | `Dem_RepIUMPRDenRelease` |
| 语法 | `Std_ReturnType Dem_RepIUMPRDenRelease(Dem_RatioIdType RatioID)` |
| 服务 ID [十六进制] | 0x72 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `RatioID` - 比率标识符,报告特定分母已释放(出于物理原因 - 例如温度条件或最小活动) |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:IUMPR 分母状态报告成功;`E_NOK`:IUMPR 分母状态未成功报告 |
| 描述 | 用于释放特定监视器的分母的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.107:Dem_RepIUMPRDenRelease**
`(SRS_Diag_04082)`
##### 8.3.7.6 Dem_SetPtoStatus
⌈[SWS_Dem_00627]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetPtoStatus` |
| 语法 | `Std_ReturnType Dem_SetPtoStatus(boolean PtoStatus)` |
| 服务 ID [十六进制] | 0x79 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `PtoStatus` - 设置 PTO 的状态(TRUE==活动;FALSE==非活动) |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 当新 PTO 状态已被 Dem 接受时返回 `E_OK`;在所有其他情况下返回 `E_NOT_OK` |
| 描述 | 仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.108:Dem_SetPtoStatus**
`(SRS_Diag_04082)`
##### 8.3.7.7 Dem_ReadDataOfPID01
⌈[SWS_Dem_01167]⌋
| | |
|---|---|
| 服务名称 | `Dem_ReadDataOfPID01` |
| 语法 | `Std_ReturnType Dem_ReadDataOfPID01(uint8* PID01value)` |
| 服务 ID [十六进制] | 0xb3 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `PID01value` - 包含 Dem 计算的 PID $01 内容的缓冲区。缓冲区由应用程序提供,大小为 4 字节 |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK`,因为 `E_NOT_OK` 永远不会出现 |
| 描述 | 用于报告 Dem 计算的 PID $01 值的服务。仅在 OBD 相关 ECU 中需要此 API |
| 可通过 | Dem.h |
**表 8.109:Dem_ReadDataOfPID01**
`c()`
##### 8.3.7.8 Dem_GetDataOfPID21
⌈[SWS_Dem_01093]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetDataOfPID21` |
| 语法 | `Std_ReturnType Dem_GetDataOfPID21(uint8* PID21value)` |
| 服务 ID [十六进制] | 0xb1 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `PID21value` - PID $21 的内容作为原始十六进制值 |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK`,因为 `E_NOT_OK` 永远不会出现 |
| 描述 | 用于通过软件组件从 Dem 获取 PID $21 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral/DemGeneralOBD.DemOBDCentralizedPID21Handling)} == true) && ({ecuc(Dem/DemGeneral.DemOBDSupport)} == DEM_OBD_MASTER_ECU)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.110:Dem_GetDataOfPID21**
`c()`
##### 8.3.7.9 Dem_SetDataOfPID21
⌈[SWS_Dem_00735]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetDataOfPID21` |
| 语法 | `Std_ReturnType Dem_SetDataOfPID21(const uint8* PID21value)` |
| 服务 ID [十六进制] | 0xa6 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `PID21value` - 包含 PID $21 内容的缓冲区。缓冲区由 Dcm 以适当的大小提供 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK` |
| 描述 | 用于通过软件组件在 Dem 中设置 PID $21 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.111:Dem_SetDataOfPID21**
`(SRS_Diag_04082)`
##### 8.3.7.10 Dem_SetDataOfPID31
⌈[SWS_Dem_00736]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetDataOfPID31` |
| 语法 | `Std_ReturnType Dem_SetDataOfPID31(const uint8* PID31value)` |
| 服务 ID [十六进制] | 0xa7 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `PID31value` - 包含 PID $31 内容的缓冲区 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK` |
| 描述 | 用于通过软件组件在 Dem 中设置 PID $31 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.112:Dem_SetDataOfPID31**
`c()`
##### 8.3.7.11 Dem_SetDataOfPID4D
⌈[SWS_Dem_00737]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetDataOfPID4D` |
| 语法 | `Std_ReturnType Dem_SetDataOfPID4D(const uint8* PID4Dvalue)` |
| 服务 ID [十六进制] | 0xa8 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `PID4Dvalue` - 包含 PID $4D 内容的缓冲区 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK` |
| 描述 | 用于通过软件组件在 Dem 中设置 PID $4D 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.113:Dem_SetDataOfPID4D**
`c()`
##### 8.3.7.12 Dem_SetDataOfPID4E
⌈[SWS_Dem_00738]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetDataOfPID4E` |
| 语法 | `Std_ReturnType Dem_SetDataOfPID4E(const uint8* PID4Evalue)` |
| 服务 ID [十六进制] | 0xa9 |
| 同步/异步 | 异步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `PID4Evalue` - 包含 PID $4E 内容的缓冲区 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK` |
| 描述 | 用于通过软件组件在 Dem 中设置 PID $4E 值的服务。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.114:Dem_SetDataOfPID4E**
`(SRS_Diag_04082)`
##### 8.3.7.13 Dem_GetCycleQualified
⌈[SWS_Dem_00740]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetCycleQualified` |
| 语法 | `Std_ReturnType Dem_GetCycleQualified(uint8 OperationCycleId, boolean* isQualified)` |
| 服务 ID [十六进制] | 0xab |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `OperationCycleId` - 已配置 DemOperationCycle 的标识 |
| 参数 (inout) | 无 |
| 参数 (out) | `isQualified` - TRUE:依赖操作循环已限定;FALSE:依赖操作循环的限定条件未满足 |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK` |
| 描述 | 返回依赖操作循环的限定状态。API 可用性:仅当任何 `({ecuc(Dem/DemGeneral/DemOperationCycle.DemLeadingCycleRef)} != NULL)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.115:Dem_GetCycleQualified**
`c()`
##### 8.3.7.14 Dem_SetCycleQualified
⌈[SWS_Dem_91001]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetCycleQualified` |
| 语法 | `Std_ReturnType Dem_SetCycleQualified(uint8 OperationCycleId)` |
| 服务 ID [十六进制] | 0x56 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `OperationCycleId` - 已配置 DemOperationCycle 的标识 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK` |
| 描述 | 将依赖操作循环设置为限定,以便它可以与其前导循环一起处理。 |
| 可通过 | Dem.h |
**表 8.116:Dem_SetCycleQualified**
`c()`
##### 8.3.7.15 Dem_GetDTCSeverityAvailabilityMask
⌈[SWS_Dem_01168]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetDTCSeverityAvailabilityMask` |
| 语法 | `Std_ReturnType Dem_GetDTCSeverityAvailabilityMask(uint8 ClientId, Dem_DTCSeverityType* DTCSeverityMask)` |
| 服务 ID [十六进制] | 0xb2 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 ClientId 可重入,对于同一 ClientId 不可重入 |
| 参数 (in) | `ClientId` - 唯一客户端 ID |
| 参数 (inout) | 无 |
| 参数 (out) | `DTCSeverityMask` - `DTCSeverityMask` 值指示 Dem 支持的 DTC 严重性位。通过将相应的状态位设置为 1 来指示所有受支持的信息。参见 ISO14229-1 |
| 返回值 | `Std_ReturnType` - `E_OK`:获取 DTC 严重性掩码成功;`E_NOT_OK`:获取 DTC 严重性掩码失败 |
| 描述 | 获取 DTC 严重性可用性掩码。 |
| 可通过 | Dem.h |
**表 8.117:Dem_GetDTCSeverityAvailabilityMask**
`(SRS_Diag_04141)`
##### 8.3.7.16 Dem_GetB1Counter
⌈[SWS_Dem_01169]⌋
| | |
|---|---|
| 服务名称 | `Dem_GetB1Counter` |
| 语法 | `Std_ReturnType Dem_GetB1Counter(uint16* B1Counter)` |
| 服务 ID [十六进制] | 0xb4 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `B1Counter` - 包含 B1 计数器的缓冲区。缓冲区由应用程序提供,大小为 2 字节 |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK` |
| 描述 | 用于报告 Dem 计算的 B1 计数器值的服务。仅在 WWH-OBD 相关 ECU 中需要此 API |
| 可通过 | Dem.h |
**表 8.118:Dem_GetB1Counter**
`(SRS_Diag_04141)`
##### 8.3.7.17 Dem_SetDTR
⌈[SWS_Dem_00765]⌋
| | |
|---|---|
| 服务名称 | `Dem_SetDTR` |
| 语法 | `Std_ReturnType Dem_SetDTR(uint16 DTRId, sint32 TestResult, sint32 LowerLimit, sint32 UpperLimit, Dem_DTRControlType Ctrlval)` |
| 服务 ID [十六进制] | 0xa2 |
| 同步/异步 | 同步 |
| 可重入性 | 对于不同 DTRId 可重入,对于同一 DTRId 不可重入 |
| 参数 (in) | `DTRId` - 通过分配的 DTRId 标识 DTR 元素;`TestResult` - DTR 的测试结果;`LowerLimit` - DTR 的下限;`UpperLimit` - DTR 的上限;`Ctrlval` - DTR 的控制值以支持其内部 Dem 解释 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `E_OK`:DTR 结果报告成功;`E_NOT_OK`:DTR 结果报告失败 |
| 描述 | 报告 DTR 结果以及下限和上限。内部 eventstatus 作为主控,决定是否转发 DTR 值或忽略它,同时考虑 DTRUpdateKind。与 DTR 相关的 EventId 按配置分配(并从 ServiceNeeds 派生)。处理考虑启用/存储条件。仅在 OBD 相关 ECU 中需要此 API。API 可用性:仅当 `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` 时此 API 才可用 |
| 可通过 | Dem.h |
**表 8.119:Dem_SetDTR**
`(SRS_Diag_04181)`
### 8.4 期望接口
在本章中,列出了从其他模块所需的所有接口。
#### 8.4.1 强制性接口
本章定义了完成 Dem 模块核心功能所需的所有接口。
#### 8.4.2 可选接口
本章定义了完成 Dem 模块可选功能所需的所有接口。
⌈[SWS_Dem_00255]⌋
| API 函数 | 头文件 | 描述 |
|---|---|---|
| `Dcm_DemTriggerOnDTCStatus` | Dcm_Dem.h | 在 UDS 状态字节更改时触发。允许对子服务 OnDTCStatusChanged 的 ROE 事件进行触发。 |
| `Det_ReportError` | Det.h | 用于报告开发错误的服务。 |
| `FiM_DemInit` | FiM_Dem.h | 此服务重新初始化 FIM。 |
| `FiM_DemTriggerOnComponentStatus` | FiM_Dem.h | 在组件失败状态更改时触发。 |
| `FiM_DemTriggerOnMonitorStatus` | FiM_Dem.h | 提供此服务以供 Dem 调用,以便向 Fim 通知监视器状态更改。 |
| `J1939Dcm_DemTriggerOnDTCStatus` | J1939Dcm_Dem.h | DM01 消息的触发器,表示 UDS 状态更改已发生。 |
| `NvM_GetErrorStatus` | NvM.h | 用于读取块相关错误/状态信息的服务。 |
| `NvM_ReadBlock` | NvM.h | 用于将 NV 块的数据复制到其相应 RAM 块的服务。 |
| `NvM_SetRamBlockStatus` | NvM.h | 用于设置永久 RAM 块的 Ram 块状态或 NVRAM 块的显式同步状态的服务。 |
| `NvM_WriteBlock` | NvM.h | 用于将 RAM 块的数据复制到其相应 NV 块的服务。 |
**表 8.121:Dem 可选接口**
`(SRS_BSW_00171)`
注:根据实现策略,可以使用 `FiM_DemInit`(另请参见章节 7.11.3)。
注:根据实现策略,可以省略 `NvM_[Read|Write]Block` 或 `NvM_SetRamBlockStatus`,或者通过配置完全停用 NvM 使用(另请参见章节 7.11.5)。
#### 8.4.3 可配置接口
在本章中,列出了所有目标函数可以配置的接口。目标函数通常是回调函数。此类接口的名称不固定,因为它们是可配置的。
```text
«module» Dem_CallbackClearEventAllowed
Dem Dem_CallbackDemGeneralTriggerOnMonitorStatus
Dem_CallbackDemTriggerOnEventUdsStatus
Dem_CallbackDemTriggerOnMonitorStatus
Dem_CallbackDTCStatusChanged
Dem_CallbackEventDataChanged
Dem_CallbackEventStatusChanged
Dem_CallbackGetFaultDetectionCounter
Dem_CallbackInitMonitorForEvent
Dem_CallbackReadDataElement
Dem_ComponentFailedCallbackFnc
«interface»
Dem_Configurable
::Dem_CallbackDTCStatusChanged
«configurable»
_DemTriggerOnDTCStatus(return, DTC, DTCStatusOld, DTCStatusNew)
::Dem_CallbackEventStatusChanged
_DemGeneralTriggerOnEventUdsStatus(return, EventId, EventStatusByteOld, EventStatusByteNew)
::Dem_CallbackGetFaultDetectionCounter
_DemGetFaultDetectionCounter(return, FaultDetectionCounter)
::Dem_CallbackInitMonitorForEvent
_DemInitMonitorFor(return, InitMonitorReason)
::Dem_CallbackEventDataChanged
_DemTriggerOnEventData(return, EventId)
::Dem_CallbackClearEventAllowed
_DemClearEventAllowed(return, Allowed)
::Dem_CallbackReadDataElement
_DemRead(Buffer, return, monitorData0)
::Dem_ComponentFailedCallbackFnc
_DemTriggerOnComponentStatus(return, ComponentId)
::Dem_CallbackDemTriggerOnMonitorStatus
_DemTriggerOnMonitorStatus(return)
::Dem_CallbackDemGeneralTriggerOnMonitorStatus
_DemGeneralTriggerOnMonitorStatus(return, EventId)
::Dem_CallbackDemTriggerOnEventUdsStatus
_DemTriggerOnEventUdsStatus(return, EventStatusByteOld, EventStatusByteNew)
«realize» «realize»
«module» «module»
[SWC] [BSW]
Figure 8.4: Configuration interfaces of the Dem module
```
##### 8.4.3.1 接口 BSW modules / SW-Components <=> Dem
从 Dem 到 SW-Components 的回调接口通过 RTE 端口接口实现。以下回调描述涉及其他 BSW 模块的 c-callback。
###### 8.4.3.1.1 InitMonitorForEvent
⌈[SWS_Dem_00256]⌋
| | |
|---|---|
| 服务名称 | `_DemInitMonitorFor` |
| 语法 | `Std_ReturnType _DemInitMonitorFor(Dem_InitMonitorReasonType InitMonitorReason)` |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `InitMonitorReason` - 从监视器评估以识别要执行的初始化种类的特定(重新)初始化原因 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 返回值未使用 - 仅用于与相应 RTE 操作的兼容性 |
| 描述 | 初始化特定事件的诊断监视器。每个事件有一个单独的回调(如果已配置),如果 Dem 未提供端口接口。 |
| 可通过 | Dem_Externals.h |
**表 8.122:InitMonitorForEvent**
`(SRS_BSW_00310, SRS_BSW_00101)`
###### 8.4.3.1.2 DemTriggerOnComponentStatus
⌈[SWS_Dem_01116]⌋
| | |
|---|---|
| 服务名称 | `_DemTriggerOnComponentStatus` |
| 语法 | `Std_ReturnType _DemTriggerOnComponentStatus(Dem_ComponentIdType ComponentId)` |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `ComponentId` - DemComponent 的标识 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 返回值未使用 - 仅用于与相应 RTE 操作的兼容性 |
| 描述 | 在 DemComponent 失败状态更改时触发。 |
| 可通过 | Dem_Externals.h |
**表 8.123:DemTriggerOnComponentStatus**
`(SRS_Diag_04142)`
##### 8.4.3.2 ClearDtcNotification
⌈[SWS_Dem_91002]⌋
| | |
|---|---|
| 服务名称 | `_ClearDtcNotification` |
| 语法 | `Std_ReturnType _ClearDtcNotification(uint32 DTC, Dem_DTCFormatType DTCFormat, Dem_DTCOriginType DTCOrigin)` |
| 同步/异步 | 异步 |
| 可重入性 | 不可重入 |
| 参数 (in) | `DTC` - 被清除的 DTC 或 DTC 组;`DTCFormat` - DTC 值的格式;`DTCOrigin` - 由当前清除操作选择的事件内存 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 始终返回 `E_OK` |
| 描述 | Dem 在执行清除 DTC 操作时调用。 |
| 可通过 | Dem_Externals.h |
**表 8.124:_ClearDtcNotification**
`c()`
##### 8.4.3.3 DemGeneralTriggerOnMonitorStatus
⌈[SWS_Dem_91009]⌋
| | |
|---|---|
| 服务名称 | `_DemGeneralTriggerOnMonitorStatus` |
| 语法 | `Std_ReturnType _DemGeneralTriggerOnMonitorStatus(Dem_EventIdType EventId)` |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 返回值未使用 - 仅用于与相应 RTE 操作的兼容性 |
| 描述 | 在监视器状态更改时触发。在事件状态报告的上下文中同步调用。 |
| 可通过 | Dem_Externals.h |
**表 8.125:_DemGeneralTriggerOnMonitorStatus**
`c()`
##### 8.4.3.4 DemGeneralTriggerOnEventUdsStatus
⌈[SWS_Dem_00259]⌋
| | |
|---|---|
| 服务名称 | `_DemGeneralTriggerOnEventUdsStatus` |
| 语法 | `Std_ReturnType _DemGeneralTriggerOnEventUdsStatus(Dem_EventIdType EventId, Dem_UdsStatusByteType EventStatusByteOld, Dem_UdsStatusByteType EventStatusByteNew)` |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件;`EventStatusByteOld` - 更改前事件的 UDS DTC 状态字节(参见章节"状态位支持");`EventStatusByteNew` - 更改后事件的 UDS DTC 状态字节(参见章节"状态位支持") |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 返回值未使用 - 仅用于与相应 RTE 操作的兼容性 |
| 描述 | 在 UDS DTC 状态字节更改时触发。 |
| 可通过 | Dem_Externals.h |
**表 8.126:DemTriggerOnEventStatus**
`(SRS_Diag_04148)`
##### 8.4.3.5 DemTriggerOnEventUdsStatus
⌈[SWS_Dem_91006]⌋
| | |
|---|---|
| 服务名称 | `_DemTriggerOnEventUdsStatus` |
| 语法 | `Std_ReturnType _DemTriggerOnEventUdsStatus(Dem_UdsStatusByteType EventStatusByteOld, Dem_UdsStatusByteType EventStatusByteNew)` |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `EventStatusByteOld` - 更改前事件的 UDS DTC 状态字节(参见章节"状态位支持");`EventStatusByteNew` - 更改后事件的 UDS DTC 状态字节(参见章节"状态位支持") |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - `ReturnType` 返回值未使用 - 仅用于与相应 RTE 操作的兼容性 |
| 描述 | 在 UDS DTC 状态字节更改时触发。 |
| 可通过 | Dem_Externals.h |
**表 8.127:_DemTriggerOnEventUdsStatus**
`c()`
##### 8.4.3.6 DemTriggerOnDTCStatus
⌈[SWS_Dem_00260]⌋
| | |
|---|---|
| 服务名称 | `_DemTriggerOnDTCStatus` |
| 语法 | `Std_ReturnType _DemTriggerOnDTCStatus(uint32 DTC, Dem_UdsStatusByteType DTCStatusOld, Dem_UdsStatusByteType DTCStatusNew)` |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `DTC` - UDS 格式的诊断故障代码;`DTCStatusOld` - 更改前的 UDS 状态;`DTCStatusNew` - 更改后的 UDS 状态 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 返回值未使用 - 仅用于与相应 RTE 操作的兼容性 |
| 描述 | 在 UDS 状态字节更改时触发。 |
| 可通过 | Dem_Externals.h |
**表 8.128:DemTriggerOnDTCStatus**
`c()`
##### 8.4.3.7 DemTriggerOnMonitorStatus
⌈[SWS_Dem_91010]⌋
| | |
|---|---|
| 服务名称 | `_DemTriggerOnMonitorStatus` |
| 语法 | `Std_ReturnType _DemTriggerOnMonitorStatus(void)` |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 返回值未使用 - 仅用于与相应 RTE 操作的兼容性 |
| 描述 | 在监视器状态更改时触发。在事件状态报告的上下文中同步调用。 |
| 可通过 | Dem_Externals.h |
**表 8.129:_DemTriggerOnMonitorStatus**
`c()`
##### 8.4.3.8 EventDataChanged
⌈[SWS_Dem_00562]⌋
| | |
|---|---|
| 服务名称 | `_DemTriggerOnEventData` |
| 语法 | `Std_ReturnType _DemTriggerOnEventData(Dem_EventIdType EventId)` |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `EventId` - 通过分配的 EventId 标识事件 |
| 参数 (inout) | 无 |
| 参数 (out) | 无 |
| 返回值 | `Std_ReturnType` - 返回值未使用 - 仅用于与相应 RTE 操作的兼容性 |
| 描述 | 在事件内存中事件相关数据更改时触发。 |
| 可通过 | Dem_Externals.h |
**表 8.130:DemTriggerOnEventData**
`(SRS_Diag_04160)`
##### 8.4.3.9 ClearEventAllowed
⌈[SWS_Dem_00563]⌋
| | |
|---|---|
| 服务名称 | `_DemClearEventAllowed` |
| 语法 | `Std_ReturnType _DemClearEventAllowed(boolean* Allowed)` |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `Allowed` - TRUE:允许清除事件;FALSE:不允许清除事件 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:操作失败 |
| 描述 | 在 DTC 删除时触发,如果输出参数返回 FALSE,则不允许。每个条件都有一个单独的回调,可以分配给一个或多个事件,如果 Dem 未提供端口接口。返回 `E_NOT_OK` 时,参数 "Allowed" 将保持不变。 |
| 可通过 | Dem_Externals.h |
**表 8.131:DemClearEventAllowed**
`c()`
##### 8.4.3.10 ReadDataElement
⌈[SWS_Dem_00564]⌋
| | |
|---|---|
| 服务名称 | `_DemRead` |
| 语法 | `Std_ReturnType _DemRead(uint8* Buffer, [Dem_MonitorDataType monitorData0])` |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | `monitorData0` - 由 `Dem_SetEventStatusWithMonitorData` 提供的 MonitorData |
| 参数 (inout) | 无 |
| 参数 (out) | `Buffer` - 包含数据元素值的缓冲区 |
| 返回值 | `Std_ReturnType` - `E_OK`:操作成功;`E_NOT_OK`:操作失败 |
| 描述 | 请求数据元素的当前值。如果 Dem 未提供端口接口,则每个数据元素都有一个单独的回调。 |
| 可通过 | Dem_Externals.h |
**表 8.132:DemRead**
`(SRS_Diag_04074)`
注:方括号 [] 表示参数是可选的。
##### 8.4.3.11 GetFaultDetectionCounter
⌈[SWS_Dem_00263]⌋
| | |
|---|---|
| 服务名称 | `_DemGetFaultDetectionCounter` |
| 语法 | `Std_ReturnType _DemGetFaultDetectionCounter(sint8* FaultDetectionCounter)` |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 参数 (in) | 无 |
| 参数 (inout) | 无 |
| 参数 (out) | `FaultDetectionCounter` - 此参数接收所请求 EventId 的故障检测计数器信息。如果函数调用的返回值不是 `E_OK`,则此参数不包含有效数据。-128dec...127dec 根据 ISO 14229-1 从 PASSED 到 FAILED |
| 返回值 | `Std_ReturnType` - `E_OK`:请求成功;`E_NOT_OK`:请求失败 |
| 描述 | 获取当前故障检测计数器值。如果 Dem 未提供端口接口,则使用监视器内部去抖的每个事件都有一个 c-callback。 |
| 可通过 | Dem_Externals.h |
**表 8.133:GetFaultDetection**
`c()`
### 8.5 调度函数
这些函数由基本软件调度器直接调用。以下函数应没有返回值和参数。所有函数应为不可重入。
#### 8.5.1 Dem_MainFunction
⌈[SWS_Dem_00266]⌋
| | |
|---|---|
| 服务名称 | `Dem_MainFunction` |
| 语法 | `void Dem_MainFunction(void)` |
| 服务 ID [十六进制] | 0x55 |
| 描述 | 处理所有非基于事件的 Dem 内部函数。 |
| 可通过 | SchM_Dem.h |
**表 8.134:Dem_MainFunction**
`c()`
⌈[SWS_Dem_00125]⌋ 函数 `Dem_MainFunction` 应处理所有非基于事件的 Dem 模块内部函数。`(SRS_BSW_00373)`
有关详细信息,请参阅 SWS_BSWGeneral 中的章节 8.5"调度函数"。
#### 8.5.2 Runnable Entity MainFunction
```text
1 RunnableEntity MainFunction
2 symbol "Dem_MainFunction"
3 canbeInvokedConcurrently = FALSE
4 SSCP = port CBEventUdsStatusChanged_*,
CallbackEventUdsStatusChanged
5 SSCP = port GeneralCBStatusEvt,
GeneralCallbackEventUdsStatusChanged
6 SSCP = port CBStatusDTC_*, DTCStatusChanged
7 SSCP = port CBDataEvt_*, EventDataChanged
8 SSCP = port GeneralCBDataEvt, EventDataChanged
9 SSCP = port CBReadData_*, ReadData
```
### 8.6 服务接口
#### 8.6.1 实现数据类型
##### 8.6.1.1 Dem_DataType
⌈[SWS_Dem_91026]⌋
| | |
|---|---|
| 名称 | `Dem_DataType_{Data}` |
| 种类 | Type |
| 派生自 | `Dem_DataArrayType_{Data}` 或 `Dem_DataPrimitiveType_{Data}` |
| 描述 | 外部数据元素的数据类型定义 |
| 变体 | 取决于 `DemDataElementDataType` 配置 |
| 可通过 | Rte_Dem_Type.h |
**表 8.135:实现数据类型 Dem_DataType_{Data}**
`c()`
##### 8.6.1.2 Dem_DataPrimitiveType
⌈[SWS_Dem_91033]⌋
| | |
|---|---|
| 名称 | `Dem_DataPrimitiveType_{Data}` |
| 种类 | Type |
| 派生自 | boolean, sint8, sint16, sint32, uint8, uint16, uint32(取决于 `DemDataElementDataType`) |
| 描述 | -- |
| 变体 | Data = {ecuc(Dem/DemGeneral/DemDataElementClass.SHORT-NAME)} |
| 可通过 | Rte_Dem_Type.h |
**表 8.136:实现数据类型 Dem_DataPrimitiveType_{Data}**
`c()`
##### 8.6.1.3 Dem_DataArrayType
⌈[SWS_Dem_91034]⌋
| | |
|---|---|
| 名称 | `Dem_DataArrayType_{Data}` |
| 种类 | Array |
| 派生自 | sint8_N, sint16_N, sint32_N, uint8_N, uint16_N, uint32_N(取决于 `DemDataElementDataType`) |
| 描述 | 外部数据元素的数组数据类型定义 |
| 变体 | Data = {ecuc(Dem/DemGeneral/DemDataElementClass.SHORT-NAME)} |
| 可通过 | Rte_Dem_Type.h |
**表 8.137:实现数据类型 Dem_DataArrayType_{Data}**
`c()`
##### 8.6.1.4 Dem_DTCOriginType
⌈[SWS_Dem_00934]⌋
| | |
|---|---|
| 名称 | `Dem_DTCOriginType` |
| 种类 | Type |
| 派生自 | uint16 |
| 描述 | 此枚举用于定义事件的位置。不同内存类型的定义和使用是 OEM 特定的。 |
| 范围 | `DEM_DTC_ORIGIN_PRIMARY_MEMORY` 0x0001 事件信息位于主要内存;`DEM_DTC_ORIGIN_MIRROR_MEMORY` 0x0002 事件信息位于镜像内存;`DEM_DTC_ORIGIN_PERMANENT_MEMORY` 0x0003 事件信息位于永久内存;`DEM_DTC_ORIGIN_OBD_RELEVANT_MEMORY` 0x0004 选择所有存储 OBD 事件的内存(由配置指定);`DEM_DTC_ORIGIN_USERDEFINED_MEMORY_` 0x01XX 事件信息位于用户定义内存 |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.138:实现数据类型 Dem_DTCOriginType**
`(SRS_Diag_04066)`
##### 8.6.1.5 Dem_DebouncingStateType
⌈[SWS_Dem_01000]⌋
| | |
|---|---|
| 名称 | `Dem_DebouncingStateType` |
| 种类 | Bitfield |
| 派生自 | uint8 |
| 元素 | bit 0 `DEM_TEMPORARILY_DEFECTIVE` 0x01 位 0:暂时有缺陷(对应 0 < FDC < 127);bit 1 `DEM_FINALLY_DEFECTIVE` 0x02 位 1:最终有缺陷(对应 FDC = 127);bit 2 `DEM_TEMPORARILY_HEALED` 0x04 位 2:暂时愈合(对应 -128 < FDC < 0);bit 3 `DEM_TEST_COMPLETE` 0x08 位 3:测试完成(对应 FDC = -128 或 FDC = 127);bit 4 `DEM_DTR_UPDATE` 0x10 位 4:DTR 更新 |
| 描述 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.139:实现数据类型 Dem_DebouncingStateType**
`(SRS_Diag_04105)`
##### 8.6.1.6 Dem_DebounceResetStatusType
⌈[SWS_Dem_00927]⌋
| | |
|---|---|
| 名称 | `Dem_DebounceResetStatusType` |
| 种类 | Type |
| 派生自 | uint8 |
| 描述 | 此类型包含通过函数 `Dem_ResetEventDebounceStatus()` 控制内部去抖计数器/计时器的所有定义。 |
| 范围 | `DEM_DEBOUNCE_STATUS_FREEZE` 0x00 冻结内部去抖计数器/计时器;`DEM_DEBOUNCE_STATUS_RESET` 0x01 重置内部去抖计数器/计时器;0x02 - 0xFF 保留 |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.140:实现数据类型 Dem_DebounceResetStatusType**
`c()`
##### 8.6.1.7 Dem_DTRControlType
⌈[SWS_Dem_00941]⌋
| | |
|---|---|
| 名称 | `Dem_DTRControlType` |
| 种类 | Type |
| 派生自 | uint8 |
| 描述 | 用于解释报告的测试结果的控制参数。 |
| 范围 | `DEM_DTR_CTL_NORMAL` 0x00 值已报告并被视为有效测试结果;`DEM_DTR_CTL_NO_MAX` 0x01 值已报告但最大限制不可用;`DEM DTR_CTL_NO_MIN` 0x02 值已报告但最小限制不可用;`DEM_DTR_CTL_RESET` 0x03 值全部被忽略;`DEM DTR_CTL_INVISIBLE` 0x04 值全部被忽略 |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.141:实现数据类型 Dem_DTRControlType**
`c()`
##### 8.6.1.8 Dem_EventIdType
⌈[SWS_Dem_00925]⌋
| | |
|---|---|
| 名称 | `Dem_EventIdType` |
| 种类 | Type |
| 派生自 | uint16 |
| 描述 | 通过分配的 EventId 标识事件。EventId 由 Dem 分配。 |
| 范围 | 1..65535 诊断事件的内部标识符。注:0 不是有效值。 |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.142:实现数据类型 Dem_EventIdType**
`c()`
##### 8.6.1.9 Dem_EventStatusType
⌈[SWS_Dem_00926]⌋
| | |
|---|---|
| 名称 | `Dem_EventStatusType` |
| 种类 | Type |
| 派生自 | uint8 |
| 描述 | 此类型包含可通过 `Dem_SetEventStatus()` 报告的所有监视器测试结果值。 |
| 范围 | `DEM_EVENT_STATUS_PASSED` 0x00 监视器报告合格的测试结果通过;`DEM_EVENT_STATUS_FAILED` 0x01 监视器报告合格的测试结果失败;`DEM_EVENT_STATUS_PREPASSED` 0x02 监视器报告非合格测试结果 pre-passed(Dem 内部去抖);`DEM_EVENT_STATUS_PREFAILED` 0x03 监视器报告非合格测试结果 pre-failed;`DEM_EVENT_STATUS_FDC_THRESHOLD_REACHED` 0x04 监视器触发 ExtendedDataRecords 和 FreezeFrames 在 ON_FDC 阈值上的存储;0x05 - 0xFF 保留 |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.143:实现数据类型 Dem_EventStatusType**
`c()`
##### 8.6.1.10 Dem_DTCFormatType
⌈[SWS_Dem_00933]⌋
| | |
|---|---|
| 名称 | `Dem_DTCFormatType` |
| 种类 | Type |
| 派生自 | uint8 |
| 描述 | 此类型用于选择 DTC 值的格式。 |
| 范围 | `DEM_DTC_FORMAT_OBD` 0 选择 2 字节 OBD DTC 格式;`DEM_DTC_FORMAT_UDS` 1 选择 3 字节 UDS DTC 格式;`DEM_DTC_FORMAT_J1939` 2 选择合并的 SPN + FMI 到 3 字节 J1939 DTC 格式 |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.144:实现数据类型 Dem_DTCFormatType**
`(SRS_Diag_04082, SRS_Diag_04000, SRS_Diag_04112)`
##### 8.6.1.11 Dem_InitMonitorReasonType
⌈[SWS_Dem_00942]⌋
| | |
|---|---|
| 名称 | `Dem_InitMonitorReasonType` |
| 种类 | Type |
| 派生自 | uint8 |
| 描述 | 由回调 `_DemInitMonitorFor()` 返回的(重新)初始化原因。 |
| 范围 | `DEM_INIT_MONITOR_CLEAR` 0x01 事件被清除,所有内部值和状态都被重置;`DEM_INIT_MONITOR_RESTART` 0x02 事件的操作循环被重新启动;`DEM_INIT_MONITOR_REENABLED` 0x03 启用条件或 DTC 设置重新启用;`DEM_INIT_MONITOR_STORAGE_REENABLED` 0x04 存储条件重新启用 |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.145:实现数据类型 Dem_InitMonitorReasonType**
`(SRS_Diag_04063)`
##### 8.6.1.12 Dem_IumprDenomCondIdType
⌈[SWS_Dem_00943]⌋
| | |
|---|---|
| 名称 | `Dem_IumprDenomCondIdType` |
| 种类 | Type |
| 派生自 | uint8 |
| 描述 | 此类型包含要在 OBD 相关 ECU 之间广播的所有可能的附加 IUMPR 分母条件。 |
| 范围 | `DEM_IUMPR_DEN_COND_COLDSTART` 0x02 附加 IUMPR 分母条件"Cold Start";`DEM_IUMPR_DEN_COND_EVAP` 0x03 附加 IUMPR 分母条件"EVAP";`DEM_IUMPR_DEN_COND_500MI` 0x04 附加 IUMPR 分母条件"500 miles";`DEM_IUMPR_GENERAL_INDIVIDUAL_DENOMINATOR` 0x05 个体分母以支持与一般分母不同的条件;`DEM_IUMPR_GENERAL_OBDCOND` 0x06 IUMPR 分母条件"General Denominator",用于 Infotype $08/$0B 输出 |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.146:实现数据类型 Dem_IumprDenomCondIdType**
`c()`
##### 8.6.1.13 Dem_IumprDenomCondStatusType
⌈[SWS_Dem_00944]⌋
| | |
|---|---|
| 名称 | `Dem_IumprDenomCondStatusType` |
| 种类 | Type |
| 派生自 | uint8 |
| 描述 | 此类型包含要在 OBD 相关 ECU 之间广播的附加 IUMPR 分母条件的所有可能状态。 |
| 范围 | `DEM_IUMPR_DEN_STATUS_NOT_REACHED` 0x00 由 `IUMPRDenCondId` 给出的 IUMPR 分母条件尚未满足;`DEM_IUMPR_DEN_STATUS_REACHED` 0x01 由 `IUMPRDenCondId` 给出的 IUMPR 分母条件已满足;`DEM_IUMPR_DEN_STATUS_INHIBITED` 0x02 由 `IUMPRDenCondId` 给出的 IUMPR 分母条件被禁止且无法达到;0x03 - 0xFF 保留 |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.147:实现数据类型 Dem_IumprDenomCondStatusType**
`c()`
##### 8.6.1.14 Dem_MaxDataValueType
⌈[SWS_Dem_01072]⌋
| | |
|---|---|
| 名称 | `Dem_MaxDataValueType` |
| 种类 | Array 元素类型 uint8 |
| 大小 | 最大扩展数据类/冻结帧记录元素的大小 |
| 描述 | -- |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.148:实现数据类型 Dem_MaxDataValueType**
`c()`
##### 8.6.1.15 Dem_MonitorDataType
⌈[SWS_Dem_91036]⌋
| | |
|---|---|
| 名称 | `Dem_MonitorDataType` |
| 种类 | Type |
| 派生自 | uint32 |
| 描述 | 此类型用于将监视数据传递给 Dem。 |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.149:实现数据类型 Dem_MonitorDataType**
`c()`
##### 8.6.1.16 Dem_MonitorStatusType
⌈[SWS_Dem_91005]⌋
| | |
|---|---|
| 名称 | `Dem_MonitorStatusType` |
| 种类 | Bitfield |
| 派生自 | uint8 |
| 元素 | bit `DEM_MONITOR_STATUS_TF` 0x01 位 0:TestFailed;bit `DEM_MONITOR_STATUS_TNCTOC` 0x02 位 1:TestNotCompletedThisOperationCycle |
| 描述 | 此类型包含可能的监视器状态值。 |
| 可通过 | Rte_Dem_Type.h |
**表 8.150:实现数据类型 Dem_MonitorStatusType**
`c()`
##### 8.6.1.17 Dem_IndicatorStatusType
⌈[SWS_Dem_00930]⌋
| | |
|---|---|
| 名称 | `Dem_IndicatorStatusType` |
| 种类 | Type |
| 派生自 | uint8 |
| 描述 | 由 `Dem_GetIndicatorStatus()` 使用的指示器模式。 |
| 范围 | `DEM_INDICATOR_OFF` 0x00 指示器关闭模式;`DEM_INDICATOR_CONTINUOUS` 0x01 指示器持续开启模式;`DEM_INDICATOR_BLINKING` 0x02 指示器闪烁模式;`DEM_INDICATOR_BLINK_CONT` 0x03 指示器闪烁或持续开启模式;`DEM_INDICATOR_SLOW_FLASH` 0x04 指示器慢闪模式;`DEM_INDICATOR_FAST_FLASH` 0x05 指示器快闪模式;`DEM_INDICATOR_ON_DEMAND` 0x06 指示器按需模式;`DEM_INDICATOR_SHORT` 0x07 指示器短模式 |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.151:实现数据类型 Dem_IndicatorStatusType**
`c()`
##### 8.6.1.18 Dem_PID21valueType
⌈[SWS_Dem_01073]⌋
| | |
|---|---|
| 名称 | `Dem_PID21valueType` |
| 种类 | Array 元素类型 uint8 |
| 大小 | 2 元素 |
| 描述 | -- |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.152:实现数据类型 Dem_PID21valueType**
`(SRS_Diag_04082)`
##### 8.6.1.19 Dem_PID31valueType
⌈[SWS_Dem_01074]⌋
| | |
|---|---|
| 名称 | `Dem_PID31valueType` |
| 种类 | Array 元素类型 uint8 |
| 大小 | 2 元素 |
| 描述 | -- |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.153:实现数据类型 Dem_PID31valueType**
`c()`
##### 8.6.1.20 Dem_RatioIdType
⌈[SWS_Dem_00940]⌋
| | |
|---|---|
| 名称 | `Dem_RatioIdType` |
| 种类 | Type |
| 派生自 | uint16 或 uint8(可配置,大小取决于系统复杂性,参考配置参数 `DemRatioId` 的范围) |
| 描述 | OBD 特定比率 ID(与特定事件、FID 和 IUMPR 组相关)。此类型取决于 Dem 配置。 |
| 范围 | 0..255, 0..65535 可配置,大小取决于系统复杂性 |
| 变体 | -- |
| 可通过 | Rte_Dem_Type.h |
**表 8.154:实现数据类型 Dem_RatioIdType**
`c()`
##### 8.6.1.21 Dem_UdsStatusByteType
⌈[SWS_Dem_00928]⌋
| | |
|---|---|
| 名称 | `Dem_UdsStatusByteType` |
| 种类 | Bitfield |
| 派生自 | uint8 |
| 范围 | 0x00 - 0xFF |
| 元素 | bit 0 `DEM_UDS_STATUS_TF` 0x01 TestFailed;bit 1 `DEM_UDS_STATUS_TFTOC` 0x02 TestFailedThisOperationCycle;bit 2 `DEM_UDS_STATUS_PDTC` 0x04 PendingDTC;bit 3 `DEM_UDS_STATUS_CDTC` 0x08 ConfirmedDTC;bit 4 `DEM_UDS_STATUS_TNCSLC` 0x10 TestNotCompletedSinceLastClear;bit 5 `DEM_UDS_STATUS_TFSLC` 0x20 TestFailedSinceLastClear;bit 6 `DEM_UDS_STATUS_TNCTOC` 0x40 TestNotCompletedThisOperationCycle;bit 7 `DEM_UDS_STATUS_WIR` 0x80 WarningIndicatorRequested |
| 描述 | 在此数据类型中,每个位都有单独的含义。当条件成立时,该位设置为 1。 |
| 可通过 | Rte_Dem_Type.h |
**表 8.155:实现数据类型 Dem_UdsStatusByteType**
`c()`
##### 8.6.1.22 Dem_PID4DvalueType
⌈[SWS_Dem_91028]⌋
| | |
|---|---|
| 名称 | `Dem_PID4DvalueType` |
| 种类 | Array 元素类型 uint8 |
| 大小 | 2 元素 |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral.DemOBDSupport)} == DEM_OBD_MASTER_ECU)` |
| 可通过 | Rte_Dem_Type.h |
**表 8.156:实现数据类型 Dem_PID4DvalueType**
`c()`
##### 8.6.1.23 Dem_PID4EvalueType
⌈[SWS_Dem_91029]⌋
| | |
|---|---|
| 名称 | `Dem_PID4EvalueType` |
| 种类 | Array 元素类型 uint8 |
| 大小 | 2 元素 |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral.DemOBDSupport)} == DEM_OBD_MASTER_ECU)` |
| 可通过 | Rte_Dem_Type.h |
**表 8.157:实现数据类型 Dem_PID4EvalueType**
`c()`
#### 8.6.2 Sender-Receiver 接口
##### 8.6.2.1 DataServices_{Data}
⌈[SWS_Dem_00850]⌋
| | |
|---|---|
| 名称 | `DataServices_{Data}` |
| 注释 | -- |
| IsService | false |
| 变体 | `({ecuc(Dem/DemGeneral/DemDataElementClass)} instanceof {ecuc(Dem/DemGeneral/DemDataElementClass/DemExternalSRDataElementClass)})` Data = {ecuc(Dem/DemGeneral/DemDataElementClass.SHORT-NAME)} |
| 数据元素 | data |
|---|---|
| 类型 | `Dem_DataType_{Data}` |
| 变体 | Data = {ecuc(Dem/DemGeneral/DemDataElementClass.SHORT-NAME)} |
**表 8.158:服务接口 DataServices_{Data}**
`(SRS_Diag_04181)`
#### 8.6.3 Client-Server 接口
##### 8.6.3.1 CallbackClearEventAllowed
⌈[SWS_Dem_00620]⌋
| | |
|---|---|
| 名称 | `CallbackClearEventAllowed` |
| 注释 | 如果已配置,它从 SW-C 获取清除特定事件的权限。对于每个事件,可以有一个此接口类型的端口。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.159:服务接口 CallbackClearEventAllowed**
**操作**
**ClearEventAllowed**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `Allowed` - 注释:True - 允许清除事件;False - 不允许清除事件。类型:boolean;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.160:操作 ClearEventAllowed**
`(SRS_Diag_04117)`
##### 8.6.3.2 CallbackComponentStatusChanged
⌈[SWS_Dem_01195]⌋
| | |
|---|---|
| 名称 | `CallbackComponentStatusChanged` |
| 注释 | -- |
| IsService | true |
| 变体 | -- |
| 可能的错误 | -- |
**表 8.161:服务接口 CallbackComponentStatusChanged**
**操作**
**ComponentStatusChanged**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `ComponentFailedStatus` - 注释:--;类型:boolean;变体:--;方向:IN |
**表 8.162:操作 ComponentStatusChanged**
`(SRS_Diag_04142)`
##### 8.6.3.3 CallbackDTCStatusChange
⌈[SWS_Dem_00617]⌋
| | |
|---|---|
| 名称 | `CallbackDTCStatusChange` |
| 注释 | 如果已配置,它通过 `DemCallbackDTCStatusChanged`、`DemCallbackOBDDTCStatusChanged` 和/或 `DemCallbackJ1939DTCStatusChanged` 在 DTC 状态字节更改时触发 SW-C。可以有多个此接口类型的端口,由 Dem 服务组件全局提供。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.163:服务接口 CallbackDTCStatusChange**
**操作**
**DTCStatusChanged**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `DTC` - 注释:--;类型:uint32;变体:--;方向:IN;`DTCStatusOld` - 注释:--;类型:`Dem_UdsStatusByteType`;变体:--;方向:IN;`DTCStatusNew` - 注释:--;类型:`Dem_UdsStatusByteType`;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.164:操作 DTCStatusChanged**
`(SRS_Diag_04061)`
##### 8.6.3.4 CallbackEventDataChanged
⌈[SWS_Dem_00618]⌋
| | |
|---|---|
| 名称 | `CallbackEventDataChanged` |
| 注释 | 如果已配置,它在事件相关数据更改时触发 SW-C。对于每个事件,可以有一个此接口类型的端口。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | -- |
**表 8.165:服务接口 CallbackEventDataChanged**
**操作**
**EventDataChanged**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
**表 8.166:操作 EventDataChanged**
`(SRS_Diag_04155)`
##### 8.6.3.5 CallbackEventUdsStatusChanged
⌈[SWS_Dem_00615]⌋
| | |
|---|---|
| 名称 | `CallbackEventUdsStatusChanged` |
| 注释 | 如果已配置,它在事件状态字节更改时触发 SW-C。对于每个事件,可以有多个此接口类型的端口。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | -- |
**表 8.167:服务接口 CallbackEventUdsStatusChanged**
**操作**
**CallbackEventUdsStatusChanged**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `EventStatusByteOld` - 注释:--;类型:`Dem_UdsStatusByteType`;变体:--;方向:IN;`EventStatusByteNew` - 注释:--;类型:`Dem_UdsStatusByteType`;变体:--;方向:IN |
**表 8.168:操作 CallbackEventUdsStatusChanged**
`c()`
##### 8.6.3.6 CallbackGetFaultDetectCounter
⌈[SWS_Dem_00622]⌋
| | |
|---|---|
| 名称 | `CallbackGetFaultDetectCounter` |
| 注释 | 如果已配置,它从 SW-C 获取特定事件的监视器内部故障检测计数器值。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.169:服务接口 CallbackGetFaultDetectCounter**
**操作**
**GetFaultDetectionCounter**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `FaultDetectionCounter` - 注释:FaultDetectionCounter 的值;类型:sint8;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.170:操作 GetFaultDetectionCounter**
`(SRS_Diag_04025)`
##### 8.6.3.7 CallbackInitMonitorForEvent
⌈[SWS_Dem_00613]⌋
| | |
|---|---|
| 名称 | `CallbackInitMonitorForEvent` |
| 注释 | 如果已配置,它触发 SW-C 的事件特定监视器初始化。对于每个事件,可以有一个此接口类型的端口。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.171:服务接口 CallbackInitMonitorForEvent**
**操作**
**InitMonitorForEvent**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `InitMonitorReason` - 注释:--;类型:`Dem_InitMonitorReasonType`;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.172:操作 InitMonitorForEvent**
`(SRS_BSW_00457)`
##### 8.6.3.8 CallbackMonitorStatusChange
⌈[SWS_Dem_91011]⌋
| | |
|---|---|
| 名称 | `CallbackMonitorStatusChange` |
| 注释 | 如果已配置,它在监视器状态更改时触发 SW-C。对于每个事件,可以有多个此接口类型的端口。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | -- |
**表 8.173:服务接口 CallbackMonitorStatusChange**
**操作**
**MonitorStatusChanged**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
**表 8.174:操作 MonitorStatusChanged**
`c()`
##### 8.6.3.9 ClearDtcNotification
⌈[SWS_Dem_91003]⌋
| | |
|---|---|
| 名称 | `ClearDtcNotification` |
| 注释 | -- |
| IsService | true |
| 变体 | `(count({ecuc(Dem/DemGeneral/DemEventMemorySet/DemClearDTCNotification/DemClearDtcNotificationFnc)} == NULL) > 0)` |
| 可能的错误 | 0 `E_OK` |
**表 8.175:服务接口 ClearDtcNotification**
**操作**
**ClearDtcNotification**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `DTC` - 注释:--;类型:uint32;变体:--;方向:IN;`DTCFormat` - 注释:--;类型:`Dem_DTCFormatType`;变体:--;方向:IN;`DTCOrigin` - 注释:--;类型:`Dem_DTCOriginType`;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功 |
**表 8.176:操作 ClearDtcNotification**
`c()`
##### 8.6.3.10 ClearDTC
⌈[SWS_Dem_00666]⌋
| | |
|---|---|
| 名称 | `ClearDTC` |
| 注释 | 提供仅与复杂设备驱动程序相关的操作。此接口类型的一个端口由 Dem 服务组件全局提供。它将 `ClientId` 作为端口定义的参数。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK`;4 `DEM_PENDING`;5 `DEM_CLEAR_BUSY`;6 `DEM_CLEAR_MEMORY_ERROR`;7 `DEM_CLEAR_FAILED`;8 `DEM_WRONG_DTC`;9 `DEM_WRONG_DTCORIGIN`;22 `DEM_BUSY` |
**表 8.177:服务接口 ClearDTC**
**操作**
**ClearDTC**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 未选择 DTC;`DEM_PENDING` - 清除 DTC 当前正在进行中;`DEM_CLEAR_BUSY` - 另一个客户端当前正在清除 DTC;`DEM_CLEAR_MEMORY_ERROR` - 擦除内存位置期间发生错误;`DEM_CLEAR_FAILED` - DTC 清除失败;`DEM_WRONG_DTC` - 所选格式中的所选 DTC 值不存在;`DEM_WRONG_DTCORIGIN` - 所选 DTCOrigin 不存在;`DEM_BUSY` - 此客户端的另一个不同的 `Dem_SelectDTC` 相关操作正在进行中 |
**表 8.178:操作 ClearDTC**
**SelectDTC**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `DTC` - 注释:--;类型:uint32;变体:--;方向:IN;`DTCFormat` - 注释:--;类型:`Dem_DTCFormatType`;变体:--;方向:IN;`DTCOrigin` - 注释:--;类型:`Dem_DTCOriginType`;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 未选择 DTC |
**表 8.179:操作 SelectDTC**
`(SRS_Diag_04122)`
##### 8.6.3.11 DTCSuppression
⌈[SWS_Dem_00608]⌋
| | |
|---|---|
| 名称 | `DTCSuppression` |
| 注释 | 提供控制 DTC 抑制的能力。此接口类型的一个端口由 Dem 服务组件全局提供。 |
| IsService | true |
| 变体 | `({ecuc(Dem/DemGeneral.DemSuppressionSupport)} == DEM_DTC_SUPPRESSION)` |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK`;4 `DEM_PENDING`;8 `DEM_WRONG_DTC`;9 `DEM_WRONG_DTCORIGIN` |
**表 8.180:服务接口 DTCSuppression**
**操作**
**GetDTCSuppression**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `ClientID` - 注释:唯一客户端 ID;类型:uint8;变体:--;方向:IN;`SuppressionStatus` - 注释:定义相应 DTC 是否被抑制(TRUE)或启用(FALSE);类型:boolean;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 未选择 DTC;`DEM_PENDING` - 所请求的值是异步计算的且当前不可用;`DEM_WRONG_DTC` - 所选格式中的所选 DTC 值不存在;`DEM_WRONG_DTCORIGIN` - 所选 DTCOrigin 不存在 |
**表 8.181:操作 GetDTCSuppression**
**SetDTCSuppression**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `ClientID` - 注释:唯一客户端 ID;类型:uint8;变体:--;方向:IN;`SuppressionStatus` - 注释:--;类型:boolean;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 未选择 DTC;`DEM_WRONG_DTC` - 所选格式中的所选 DTC 值不存在;`DEM_WRONG_DTCORIGIN` - 所选 DTCOrigin 不存在 |
**表 8.182:操作 SetDTCSuppression**
`(SRS_Diag_04181)`
##### 8.6.3.12 DataServices_{Data}
⌈[SWS_Dem_00621]⌋
| | |
|---|---|
| 名称 | `DataServices_{Data}` |
| 注释 | 如果已配置,它通过客户端/服务器或发送者/接收者通信从相应 SW-C 获取包含在 DID、PID 或扩展数据记录中的数据元素值。 |
| IsService | true |
| 变体 | `(({ecuc(Dem/DemGeneral/DemDataElementClass)} instanceof {ecuc(Dem/DemGeneral/DemDataElementClass/DemExternalCSDataElementClass)}) && ({ecuc(Dem/DemGeneral/DemDataElementClass/DemExternalCSDataElementClass/DemDataElementUsePort)} == true))` Data = {ecuc(Dem/DemGeneral/DemDataElementClass.SHORT-NAME)} |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.183:服务接口 DataServices_{Data}**
**操作**
**ReadData**
| | |
|---|---|
| 注释 | 服务器不允许返回 `E_NOT_OK`,但应始终向 Dcm/Dem 提供有效数据值。 |
| 变体 | -- |
| 参数 | `Data` - 注释:--;类型:`Dem_DataType_{Data}`;变体:Data = {ecuc(Dem/DemGeneral/DemDataElementClass.SHORT-NAME)};方向:OUT;`monitorData0` - 注释:--;类型:`Dem_MonitorDataType`;变体:`({ecuc(Dem/DemGeneral/DemDataElementClass/DemExternalCSDataElementClass/DemDataElementProvideMonitorData)} == true))`;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.184:操作 ReadData**
`(SRS_Diag_04061)`
##### 8.6.3.13 DTRCentralReport
⌈[SWS_Dem_00769]⌋
| | |
|---|---|
| 名称 | `DTRCentralReport` |
| 注释 | 如果配置了 OBD 支持,则可用。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.185:服务接口 DTRCentralReport**
**操作**
**SetDTR**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `TestResult` - 注释:--;类型:sint32;变体:--;方向:IN;`LowerLimit` - 注释:--;类型:sint32;变体:--;方向:IN;`UpperLimit` - 注释:--;类型:sint32;变体:--;方向:IN;`Ctrlval` - 注释:--;类型:`Dem_DTRControlType`;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.186:操作 SetDTR**
`(SRS_Diag_04082)`
注:此类型的 Dem 和 Dcm 接口是兼容的,可以连接到应用程序的同一 provide-port。
注:Dem 服务组件仅支持同步客户端/服务器接口(由于事件内存使用的机制),并且与 Dcm 接口 `DataServices_` 兼容,其中设置了 `USE_DATA_SYNCH_CLIENT_SERVER`。Dcm 接口 `CSDataServices_` 中包含的所有进一步操作(如 `WriteData`、`ReadDataLength`、`ConditionCheckRead` 等)由 SW-C 提供并由 Dcm 使用,但 Dem 模块不需要/考虑。
注:Dem 服务组件与 Dcm 接口 `DataServices_` 兼容,其中设置了 `USE_DATA_SENDER_RECEIVER`。
##### 8.6.3.14 DiagnosticInfo
⌈[SWS_Dem_00599]⌋
| | |
|---|---|
| 名称 | `DiagnosticInfo` |
| 注释 | 提供获取事件信息的能力。Dem 服务组件为每个诊断事件提供此接口类型的一个端口。它将 `EventId` 作为端口定义的参数。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK`;10 `DEM_E_NO_DTC_AVAILABLE`;14 `DEM_E_NO_FDC_AVAILABLE`;21 `DEM_BUFFER_TOO_SMALL`;48 `DEM_NO_SUCH_ELEMENT` |
**表 8.187:服务接口 DiagnosticInfo**
**操作**
**GetDTCOfEvent**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `DTCFormat` - 注释:--;类型:`Dem_DTCFormatType`;变体:--;方向:IN;`DTCOfEvent` - 注释:--;类型:uint32;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败;`DEM_E_NO_DTC_AVAILABLE` - 在所请求格式中未配置 DTC |
**表 8.188:操作 GetDTCOfEvent**
**GetDebouncingOfEvent**
| | |
|---|---|
| 注释 | -- |
| 变体 | `(({ecuc(Dem/DemConfigSet/DemEventParameter/DemDebounceAlgorithmClass)} instanceof {ecuc(Dem/DemConfigSet/DemEventParameter/DemDebounceAlgorithmClass/DemDebounceCounterBased)}) || ({ecuc(Dem/DemConfigSet/DemEventParameter/DemDebounceAlgorithmClass)} instanceof {ecuc(Dem/DemConfigSet/DemEventParameter/DemDebounceAlgorithmClass/DemDebounceTimeBase)}))` |
| 参数 | `DebouncingState` - 注释:位 0 暂时有缺陷;位 1 最终有缺陷;位 2 暂时愈合;位 3 测试完成;位 4 DTR 更新;类型:`Dem_DebouncingStateType`;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.189:操作 GetDebouncingOfEvent**
**GetEventExtendedDataRecordEx**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `RecordNumber` - 注释:--;类型:uint8;变体:--;方向:IN;`DestBuffer` - 注释:--;类型:`Dem_MaxDataValueType`;变体:--;方向:OUT;`Bufsize` - 注释:--;类型:uint16;变体:--;方向:INOUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败;`DEM_BUFFER_TOO_SMALL` - 提供的缓冲区大小太小;`DEM_NO_SUCH_ELEMENT` - 所请求的事件数据当前未存储或所请求的记录号不受事件支持或所请求的 DID 不受冻结帧支持(`GetEventFreezeFrameDataEx`) |
**表 8.190:操作 GetEventExtendedDataRecordEx**
**GetEventFreezeFrameDataEx**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `RecordNumber` - 注释:--;类型:uint8;变体:--;方向:IN;`DataId` - 注释:--;类型:uint16;变体:--;方向:IN;`DestBuffer` - 注释:--;类型:`Dem_MaxDataValueType`;变体:--;方向:OUT;`BufSize` - 注释:--;类型:uint16;变体:--;方向:INOUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败;`DEM_BUFFER_TOO_SMALL` - 提供的缓冲区大小太小;`DEM_NO_SUCH_ELEMENT` - 所请求的事件数据当前未存储或所请求的记录号不受事件支持或所请求的 DID 不受冻结帧支持(`GetEventFreezeFrameDataEx`) |
**表 8.191:操作 GetEventFreezeFrameDataEx**
**GetEventUdsStatus**
| | |
|---|---|
| 注释 | 获取分配给事件的 DTC 的当前 UDS 状态字节。 |
| 变体 | -- |
| 参数 | `UDSStatusByte` - 注释:--;类型:`Dem_UdsStatusByteType`;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.192:操作 GetEventUdsStatus**
**GetFaultDetectionCounter**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `FaultDetectionCounter` - 注释:--;类型:sint8;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败;`DEM_E_NO_FDC_AVAILABLE` - 所请求事件没有可用的故障检测计数器 |
**表 8.193:操作 GetFaultDetectionCounter**
**GetMonitorStatus**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `MonitorStatus` - 注释:所请求事件的监视器状态字节。如果函数调用的返回值为 `E_NOT_OK`,则此参数不包含有效数据;类型:`Dem_MonitorStatusType`;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.194:操作 GetMonitorStatus**
`(SRS_Diag_04010)`
注:这些 DiagnosticInfo 端口也可用于每个 BSW 事件(以便 SW-C 也能访问)。
##### 8.6.3.15 DiagnosticMonitor
⌈[SWS_Dem_00598]⌋
| | |
|---|---|
| 名称 | `DiagnosticMonitor` |
| 注释 | 提供修改事件信息的能力。Dem 服务组件为每个应用程序相关的诊断事件提供此接口类型的一个端口。它将 `EventId` 作为端口定义的参数。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.195:服务接口 DiagnosticMonitor**
**操作**
**ClearPrestoredFreezeFrame**
| | |
|---|---|
| 注释 | -- |
| 变体 | `{ecuc(Dem/DemGeneral/DemMaxNumberPrestoredFF)} > 0` |
| 可能的错误 | `E_OK` - 重置事件状态的请求成功接受;`E_NOT_OK` - 重置事件状态的请求失败或不允许 |
**表 8.196:操作 ClearPrestoredFreezeFrame**
**PrestoreFreezeFrame**
| | |
|---|---|
| 注释 | -- |
| 变体 | `{ecuc(Dem/DemGeneral/DemMaxNumberPrestoredFF)} > 0` |
| 可能的错误 | `E_OK` - 重置事件状态的请求成功接受;`E_NOT_OK` - 重置事件状态的请求失败或不允许 |
**表 8.197:操作 PrestoreFreezeFrame**
**ResetEventDebounceStatus**
| | |
|---|---|
| 注释 | -- |
| 变体 | `({ecuc(Dem/DemGeneral/DemDebounceCounterBasedSupport)} == true) || ({ecuc(Dem/DemGeneral/DemDebounceTimeBasedSupport)} == true)` |
| 参数 | `DebounceResetStatus` - 注释:--;类型:`Dem_DebounceResetStatusType`;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 重置事件状态的请求成功接受;`E_NOT_OK` - 重置事件状态的请求失败或不允许 |
**表 8.198:操作 ResetEventDebounceStatus**
**ResetEventStatus**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 重置事件状态的请求失败或不允许 |
**表 8.199:操作 ResetEventStatus**
**SetEventDisabled**
| | |
|---|---|
| 注释 | -- |
| 变体 | `{ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT` |
| 可能的错误 | `E_OK` - 重置事件状态的请求成功接受;`E_NOT_OK` - 重置事件状态的请求失败或不允许 |
**表 8.200:操作 SetEventDisabled**
**SetEventStatus**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 重置事件状态的请求失败或不允许 |
**表 8.201:操作 SetEventStatus**
`(SRS_Diag_04061)`
注:`DiagnosticMonitor` 接口的每个端口仅连接到一个监视器端口。
警告:此客户端/服务器接口内的所有操作在每个服务器端口(相同的 eventId)上是互斥的。抢占的调用可能被忽略而不会被 Dem 处理。
##### 8.6.3.16 DiagnosticMonitor_MonitorData
⌈[SWS_Dem_91038]⌋
| | |
|---|---|
| 名称 | `DiagnosticMonitor_MonitorData` |
| 注释 | 提供报告带有监视器数据的诊断监视器状态的手段。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.202:服务接口 DiagnosticMonitor_MonitorData**
**操作**
**SetEventStatusWithMonitorData**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `EventStatus` - 注释:--;类型:`Dem_EventStatusType`;变体:--;方向:IN;`monitorData0` - 注释:--;类型:`Dem_MonitorDataType`;变体:--;方向:IN;`monitorData1` - 注释:--;类型:`Dem_MonitorDataType`;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.203:操作 SetEventStatusWithMonitorData**
`c()`
##### 8.6.3.17 EnableCondition
⌈[SWS_Dem_00604]⌋
| | |
|---|---|
| 名称 | `EnableCondition` |
| 注释 | 如果至少配置了一个启用条件,它提供设置启用条件的能力。Dem 服务组件为每个启用条件提供此接口类型的一个端口。它将 `EnableConditionId` 作为端口定义的参数。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.204:服务接口 EnableCondition**
**操作**
**SetEnablecondition**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `ConditionFulfilled` - 注释:--;类型:boolean;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.205:操作 SetEnablecondition**
`(SRS_Diag_04192)`
##### 8.6.3.18 EventAvailable
⌈[SWS_Dem_01193]⌋
| | |
|---|---|
| 名称 | `EventAvailable` |
| 注释 | -- |
| IsService | true |
| 变体 | `{ecuc(Dem/DemGeneral/DemAvailabilitySupport)} == DEM_EVENT_AVAILABILITY` |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.206:服务接口 EventAvailable**
**操作**
**SetEventAvailable**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `AvailableStatus` - 注释:--;类型:boolean;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 设置可用性状态的请求成功;`E_NOT_OK` - 设置可用性状态的请求未被接受 |
**表 8.207:操作 SetEventAvailable**
`c()`
##### 8.6.3.19 EventFailureCycleCounterThreshold
⌈[SWS_Dem_91018]⌋
| | |
|---|---|
| 名称 | `EventFailureCycleCounterThreshold` |
| 注释 | 提供故障循环阈值的动态适应能力。此接口的一个端口由每个具有 `EventId` 作为端口定义的参数的诊断事件提供。 |
| IsService | true |
| 变体 | `(count({ecuc(Dem/DemConfigSet/DemEventParameter/DemEventFailureCycleCounterThresholdAdaptable)} == TRUE) > 0)` |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.208:服务接口 EventFailureCycleCounterThreshold**
**操作**
**SetEventFailureCycleCounterThreshold**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `FailureCycleCounterThreshold` - 注释:要设置事件的故障循环计数器阈值;类型:uint8;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.209:操作 SetEventFailureCycleCounterThreshold**
`c()`
##### 8.6.3.20 EvMemOverflowIndication
⌈[SWS_Dem_00607]⌋
| | |
|---|---|
| 名称 | `EvMemOverflowIndication` |
| 注释 | 如果配置了相应的事件内存,它提供事件内存的状态。Dem 服务组件为每个支持的事件内存提供此接口类型的一个端口。它将 `DTCOrigin` 作为端口定义的参数。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.210:服务接口 EvMemOverflowIndication**
**操作**
**GetEventMemoryOverflow**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `OverflowIndication` - 注释:--;类型:boolean;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.211:操作 GetEventMemoryOverflow**
**GetNumberOfEventMemoryEntries**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `GetNumberOfEventMemoryEntries` - 注释:--;类型:uint8;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.212:操作 GetNumberOfEventMemoryEntries**
`(SRS_Diag_04105)`
##### 8.6.3.21 EventStatus
⌈[SWS_Dem_00838]⌋
| | |
|---|---|
| 名称 | `EventStatus` |
| 注释 | 提供修改事件状态的能力。Dem 服务组件为每个应用程序相关的诊断事件提供此接口类型的一个端口。它将 `EventId` 作为端口定义的参数。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.213:服务接口 EventStatus**
**操作**
**SetWIRStatus**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `WIRStatus` - 注释:--;类型:boolean;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 设置 WIR 状态的请求成功;`E_NOT_OK` - 设置 WIR 状态的请求未被接受(例如,禁用的 controlDTCSetting)并应重试 |
**表 8.214:操作 SetWIRStatus**
`(SRS_Diag_04128)`
注:`EventStatus` 接口的每个端口仅连接到故障安全 SW-C 的一个端口。
##### 8.6.3.22 GeneralCallbackEventDataChanged
⌈[SWS_Dem_00619]⌋
| | |
|---|---|
| 名称 | `GeneralCallbackEventDataChanged` |
| 注释 | -- |
| IsService | true |
| 变体 | -- |
| 可能的错误 | -- |
**表 8.215:服务接口 GeneralCallbackEventDataChanged**
**操作**
**EventDataChanged**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `EventId` - 注释:--;类型:`Dem_EventIdType`;变体:--;方向:IN |
**表 8.216:操作 EventDataChanged**
`(SRS_Diag_04155)`
##### 8.6.3.23 GeneralCallbackEventUdsStatusChanged
⌈[SWS_Dem_00616]⌋
| | |
|---|---|
| 名称 | `GeneralCallbackEventUdsStatusChanged` |
| 注释 | -- |
| IsService | true |
| 变体 | -- |
| 可能的错误 | -- |
**表 8.217:服务接口 GeneralCallbackEventUdsStatusChanged**
**操作**
**GeneralCallbackEventUdsStatusChanged**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `EventId` - 注释:--;类型:`Dem_EventIdType`;变体:--;方向:IN;`EventStatusByteOld` - 注释:--;类型:`Dem_UdsStatusByteType`;变体:--;方向:IN;`EventStatusByteNew` - 注释:--;类型:`Dem_UdsStatusByteType`;变体:--;方向:IN |
**表 8.218:操作 GeneralCallbackEventUdsStatusChanged**
`(SRS_Diag_04061)`
##### 8.6.3.24 GeneralCallbackMonitorStatusChanged
⌈[SWS_Dem_91013]⌋
| | |
|---|---|
| 名称 | `GeneralCallbackMonitorStatusChanged` |
| 注释 | -- |
| IsService | true |
| 变体 | -- |
| 可能的错误 | -- |
**表 8.219:服务接口 GeneralCallbackMonitorStatusChanged**
**操作**
**MonitorStatusChanged**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `EventId` - 注释:--;类型:`Dem_EventIdType`;变体:--;方向:IN |
**表 8.220:操作 MonitorStatusChanged**
`c()`
##### 8.6.3.25 GeneralDiagnosticInfo
⌈[SWS_Dem_00600]⌋
| | |
|---|---|
| 名称 | `GeneralDiagnosticInfo` |
| 注释 | -- |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK`;10 `DEM_E_NO_DTC_AVAILABLE`;14 `DEM_E_NO_FDC_AVAILABLE`;21 `DEM_BUFFER_TOO_SMALL`;48 `DEM_NO_SUCH_ELEMENT` |
**表 8.221:服务接口 GeneralDiagnosticInfo**
**操作**
**GetDTCOfEvent**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `EventId` - 注释:--;类型:`Dem_EventIdType`;变体:--;方向:IN;`DTCFormat` - 注释:--;类型:`Dem_DTCFormatType`;变体:--;方向:IN;`DTCOfEvent` - 注释:--;类型:uint32;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败;`DEM_E_NO_DTC_AVAILABLE` - 在所请求格式中未配置 DTC |
**表 8.222:操作 GetDTCOfEvent**
**GetDebouncingOfEvent**
| | |
|---|---|
| 注释 | -- |
| 变体 | `(({ecuc(Dem/DemConfigSet/DemEventParameter/DemDebounceAlgorithmClass)} instanceof {ecuc(Dem/DemConfigSet/DemEventParameter/DemDebounceAlgorithmClass/DemDebounceCounterBased)}) || ({ecuc(Dem/DemConfigSet/DemEventParameter/DemDebounceAlgorithmClass)} instanceof {ecuc(Dem/DemConfigSet/DemEventParameter/DemDebounceAlgorithmClass/DemDebounceTimeBase)}))` |
| 参数 | `EventId` - 注释:--;类型:`Dem_EventIdType`;变体:--;方向:IN;`DebouncingState` - 注释:位 0 暂时有缺陷;位 1 最终有缺陷;位 2 暂时愈合;位 3 测试完成;位 4 DTR 更新;类型:`Dem_DebouncingStateType`;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.223:操作 GetDebouncingOfEvent**
**GetEventExtendedDataRecordEx**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `EventId` - 注释:--;类型:`Dem_EventIdType`;变体:--;方向:IN;`RecordNumber` - 注释:--;类型:uint8;变体:--;方向:IN;`DestBuffer` - 注释:--;类型:`Dem_MaxDataValueType`;变体:--;方向:OUT;`Bufsize` - 注释:--;类型:uint16;变体:--;方向:INOUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败;`DEM_BUFFER_TOO_SMALL` - 提供的缓冲区大小太小;`DEM_NO_SUCH_ELEMENT` - 所请求的事件数据当前未存储或所请求的记录号不受事件支持或所请求的 DID 不受冻结帧支持(`GetEventFreezeFrameDataEx`) |
**表 8.224:操作 GetEventExtendedDataRecordEx**
**GetEventFreezeFrameDataEx**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `EventId` - 注释:--;类型:`Dem_EventIdType`;变体:--;方向:IN;`RecordNumber` - 注释:--;类型:uint8;变体:--;方向:IN;`DataId` - 注释:--;类型:uint16;变体:--;方向:IN;`DestBuffer` - 注释:--;类型:`Dem_MaxDataValueType`;变体:--;方向:OUT;`BufSize` - 注释:--;类型:uint16;变体:--;方向:INOUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败;`DEM_BUFFER_TOO_SMALL` - 提供的缓冲区大小太小;`DEM_NO_SUCH_ELEMENT` - 所请求的事件数据当前未存储或所请求的记录号不受事件支持或所请求的 DID 不受冻结帧支持(`GetEventFreezeFrameDataEx`) |
**表 8.225:操作 GetEventFreezeFrameDataEx**
**GetEventUdsStatus**
| | |
|---|---|
| 注释 | 获取分配给事件的 DTC 的当前 UDS 状态字节。 |
| 变体 | -- |
| 参数 | `EventId` - 注释:--;类型:`Dem_EventIdType`;变体:--;方向:IN;`UDSStatusByte` - 注释:--;类型:`Dem_UdsStatusByteType`;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.226:操作 GetEventUdsStatus**
**GetFaultDetectionCounter**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `EventId` - 注释:--;类型:`Dem_EventIdType`;变体:--;方向:IN;`FaultDetectionCounter` - 注释:--;类型:sint8;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败;`DEM_E_NO_FDC_AVAILABLE` - 所请求事件没有可用的故障检测计数器 |
**表 8.227:操作 GetFaultDetectionCounter**
**GetMonitorStatus**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `EventID` - 注释:通过分配的 EventId 标识事件;类型:`Dem_EventIdType`;变体:--;方向:IN;`MonitorStatus` - 注释:所请求事件的监视器状态字节。如果函数调用的返回值为 `E_NOT_OK`,则此参数不包含有效数据;类型:`Dem_MonitorStatusType`;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.228:操作 GetMonitorStatus**
`(SRS_Diag_04181)`
##### 8.6.3.26 GetDataOfPID21
⌈[SWS_Dem_01092]⌋
| | |
|---|---|
| 名称 | `GetDataOfPID21` |
| 注释 | -- |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.229:服务接口 GetDataOfPID21**
**操作**
**GetDataOfPID21**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `PID21value` - 注释:--;类型:`Dem_PID21valueType`;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.230:操作 GetDataOfPID21**
`(SRS_Diag_04061, SRS_Diag_04001)`
##### 8.6.3.27 IndicatorStatus
⌈[SWS_Dem_00606]⌋
| | |
|---|---|
| 名称 | `IndicatorStatus` |
| 注释 | Dem 服务组件为每个指示器提供此接口类型的一个端口。它将 `IndicatorId` 作为端口定义的参数。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.231:服务接口 IndicatorStatus**
**操作**
**GetIndicatorStatus**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `IndicatorStatus` - 注释:--;类型:`Dem_IndicatorStatusType`;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.232:操作 GetIndicatorStatus**
`(SRS_Diag_04128)`
##### 8.6.3.28 IUMPRDenominator
⌈[SWS_Dem_00611]⌋
| | |
|---|---|
| 名称 | `IUMPRDenominator` |
| 注释 | 如果配置了 OBD,它提供定义车辆操作已满足的次数的能力。Dem 服务组件为每个比率 ID 提供此接口类型的一个端口。它将 `RatioID` 作为端口定义的参数。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.233:服务接口 IUMPRDenominator**
**操作**
**RepIUMPRDenRelease**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.234:操作 RepIUMPRDenRelease**
`c()`
##### 8.6.3.29 IUMPRDenominatorCondition
⌈[SWS_Dem_00742]⌋
| | |
|---|---|
| 名称 | `IUMPRDenominatorCondition` |
| 注释 | 如果配置了 OBD,它在所有 OBD 相关 ECU 之间广播 General Denominator 和附加分母条件的状态信息。Dem 服务组件为每个分母条件 ID 提供此接口类型的一个端口。它将 `Dem_IumprDenomCondId` 作为端口定义的参数。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.235:服务接口 IUMPRDenominatorCondition**
**操作**
**GetIUMPRDenCondition**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `ConditionStatus` - 注释:--;类型:`Dem_IumprDenomCondStatusType`;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.236:操作 GetIUMPRDenCondition**
**SetIUMPRDenCondition**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `ConditionStatus` - 注释:--;类型:`Dem_IumprDenomCondStatusType`;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.237:操作 SetIUMPRDenCondition**
`(SRS_Diag_04082)`
##### 8.6.3.30 IUMPRNumerator
⌈[SWS_Dem_00610]⌋
| | |
|---|---|
| 名称 | `IUMPRNumerator` |
| 注释 | 如果配置了 OBD,它提供定义可以发现故障的次数的能力。Dem 服务组件为每个比率 ID 提供此接口类型的一个端口。它将 `RatioID` 作为端口定义的参数。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.238:服务接口 IUMPRNumerator**
**操作**
**RepIUMPRFaultDetect**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.239:操作 RepIUMPRFaultDetect**
`(SRS_Diag_04082)`
##### 8.6.3.31 OperationCycle
⌈[SWS_Dem_00601]⌋
| | |
|---|---|
| 名称 | `OperationCycle` |
| 注释 | 提供设置操作循环状态的能力。Dem 服务组件为每个操作循环提供此接口类型的一个端口。它将 `OperationCycleId` 作为端口定义的参数。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.240:服务接口 OperationCycle**
**操作**
**GetCycleQualified**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `isQualified` - 注释:--;类型:boolean;变体:--;方向:OUT |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.241:操作 GetCycleQualified**
**RestartOperationCycle**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.242:操作 RestartOperationCycle**
**SetCycleQualified**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.243:操作 SetCycleQualified**
`(SRS_Diag_04076)`
##### 8.6.3.32 PowerTakeOff
⌈[SWS_Dem_00612]⌋
| | |
|---|---|
| 名称 | `PowerTakeOff` |
| 注释 | 如果配置了 OBD 支持,则可用。Dem 服务组件提供此接口类型的一个端口。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.244:服务接口 PowerTakeOff**
**操作**
**SetPtoStatus**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `PtoStatus` - 注释:--;类型:boolean;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.245:操作 SetPtoStatus**
`(SRS_Diag_04082)`
##### 8.6.3.33 SetDataOfPID21
⌈[SWS_Dem_00745]⌋
| | |
|---|---|
| 名称 | `SetDataOfPID21` |
| 注释 | -- |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.246:服务接口 SetDataOfPID21**
**操作**
**SetDataOfPID21**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `PID21value` - 注释:--;类型:`Dem_PID21valueType`;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.247:操作 SetDataOfPID21**
`(SRS_Diag_04061, SRS_Diag_04001)`
##### 8.6.3.34 SetDataOfPID31
⌈[SWS_Dem_00746]⌋
| | |
|---|---|
| 名称 | `SetDataOfPID31` |
| 注释 | -- |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.248:服务接口 SetDataOfPID31**
**操作**
**SetDataOfPID31**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `PID31value` - 注释:--;类型:`Dem_PID31valueType`;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.249:操作 SetDataOfPID31**
`(SRS_Diag_04082)`
##### 8.6.3.35 SetDataOfPID4D
⌈[SWS_Dem_91027]⌋
| | |
|---|---|
| 名称 | `SetDataOfPID4D` |
| 注释 | -- |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.250:服务接口 SetDataOfPID4D**
**操作**
**SetDataOfPID4D**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `PID4Dvalue` - 注释:--;类型:`Dem_PID4DvalueType`;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.251:操作 SetDataOfPID4D**
`c()`
##### 8.6.3.36 SetDataOfPID4E
⌈[SWS_Dem_91031]⌋
| | |
|---|---|
| 名称 | `SetDataOfPID4E` |
| 注释 | -- |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.252:服务接口 SetDataOfPID4E**
**操作**
**SetDataOfPID4E**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `PID4Evalue` - 注释:--;类型:`Dem_PID4EvalueType`;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.253:操作 SetDataOfPID4E**
`c()`
##### 8.6.3.37 StorageCondition
⌈[SWS_Dem_00605]⌋
| | |
|---|---|
| 名称 | `StorageCondition` |
| 注释 | 如果至少配置了一个存储条件,则提供设置存储条件的能力。Dem 服务组件为每个存储条件提供此接口类型的一个端口。它将 `StorageConditionId` 作为端口定义的参数。 |
| IsService | true |
| 变体 | -- |
| 可能的错误 | 0 `E_OK`;1 `E_NOT_OK` |
**表 8.254:服务接口 StorageCondition**
**操作**
**SetStorageCondition**
| | |
|---|---|
| 注释 | -- |
| 变体 | -- |
| 参数 | `ConditionFulfilled` - 注释:此参数指定分配给 `EnableConditionID` 的启用条件是否满足(TRUE)或未满足(FALSE)。类型:boolean;变体:--;方向:IN |
| 可能的错误 | `E_OK` - 操作成功;`E_NOT_OK` - 操作失败 |
**表 8.255:操作 SetStorageCondition**
`(SRS_Diag_04219)`
#### 8.6.4 端口
##### 8.6.4.1 CBClrEvt
⌈[SWS_Dem_91024]⌋
| | |
|---|---|
| 名称 | `CBClrEvt_{Name}` |
| 种类 | RequiredPort |
| 接口 | `CallbackClearEventAllowed` |
| 描述 | -- |
| 变体 | `(({ecuc(Dem/DemConfigSet/DemEventParameter/DemCallbackClearEventAllowed)} != NULL) && ({ecuc(Dem/DemConfigSet/DemEventParameter/DemCallbackClearEventAllowed/DemCallbackClearEventAllowedFnc)} == NULL))` Name = {ecuc(Dem/DemConfigSet/DemEventParameter/DemCallbackClearEventAllowed.SHORT-NAME)} |
**表 8.256:端口 CBClrEvt_{Name}**
`c()`
##### 8.6.4.2 CBDataEvt
⌈[SWS_Dem_01003]⌋
| | |
|---|---|
| 名称 | `CBDataEvt_{Name}` |
| 种类 | RequiredPort |
| 接口 | `CallbackEventDataChanged` |
| 描述 | -- |
| 变体 | `(({ecuc(Dem/DemConfigSet/DemEventParameter/DemCallbackEventDataChanged)} != NULL) && ({ecuc(Dem/DemConfigSet/DemEventParameter/DemCallbackEventDataChanged/DemCallbackEventDataChangedFnc)} == NULL))` Name = {ecuc(Dem/DemConfigSet/DemEventParameter.SHORT-NAME)} |
**表 8.257:端口 CBDataEvt_{Name}**
`(SRS_Diag_04155)`
##### 8.6.4.3 CBFaultDetectCtr
⌈[SWS_Dem_01004]⌋
| | |
|---|---|
| 名称 | `CBFaultDetectCtr_{Name}` |
| 种类 | RequiredPort |
| 接口 | `CallbackGetFaultDetectCounter` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemConfigSet/DemEventParameter/DemDebounceAlgorithmClass/DemDebounceMonitorInternal/DemCallbackGetFDC/DemCallbackGetFDCFnc)} == NULL)` Name = {ecuc(Dem/DemConfigSet/DemEventParameter/DemDebounceAlgorithmClass/DemDebounceMonitorInternal/DemCallbackGetFDC.SHORT-NAME)} |
**表 8.258:端口 CBFaultDetectCtr_{Name}**
`(SRS_Diag_04125)`
##### 8.6.4.4 CBInitEvt
⌈[SWS_Dem_01005]⌋
| | |
|---|---|
| 名称 | `CBInitEvt_{Name}` |
| 种类 | RequiredPort |
| 接口 | `CallbackInitMonitorForEvent` |
| 描述 | -- |
| 变体 | `(({ecuc(Dem/DemConfigSet/DemEventParameter/DemCallbackInitMForE)} != NULL) && ({ecuc(Dem/DemConfigSet/DemEventParameter/DemCallbackInitMForE/DemCallbackInitMForEFnc)} == NULL))` Name = {ecuc(Dem/DemConfigSet/DemEventParameter.SHORT-NAME)} |
**表 8.259:端口 CBInitEvt_{Name}**
`(SRS_BSW_00457)`
##### 8.6.4.5 CBStatusDTC
⌈[SWS_Dem_01007]⌋
| | |
|---|---|
| 名称 | `CBStatusDTC_{Name}` |
| 种类 | RequiredPort |
| 接口 | `CallbackDTCStatusChange` |
| 描述 | -- |
| 变体 | Name = {ecuc(Dem/DemGeneral/DemClient/DemCallbackDTCStatusChanged.SHORT-NAME)} |
**表 8.260:端口 CBStatusDTC_{Name}**
`(SRS_Diag_04142)`
##### 8.6.4.6 CBEventUdsStatusChanged
⌈[SWS_Dem_01008]⌋
| | |
|---|---|
| 名称 | `CBEventUdsStatusChanged_{EventName}_{CallbackName}` |
| 种类 | RequiredPort |
| 接口 | `CallbackEventUdsStatusChanged` |
| 描述 | -- |
| 变体 | EventName = {ecuc(Dem/DemConfigSet/DemEventParameter.SHORT-NAME)} CallbackName = {ecuc(Dem/DemConfigSet/DemEventParameter/DemCallbackEventUdsStatusChanged.SHORT-NAME)} |
**表 8.261:端口 CBEventUdsStatusChanged_{EventName}_{CallbackName}**
`c()`
##### 8.6.4.7 CBMonitorStatusChanged
⌈[SWS_Dem_91012]⌋
| | |
|---|---|
| 名称 | `CBMonitorStatusChanged_{EventName}_{CallbackName}` |
| 种类 | RequiredPort |
| 接口 | `CallbackMonitorStatusChange` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemConfigSet/DemEventParameter.DemEventKind)} == DEM_EVENT_KIND_SWC)` EventName = {ecuc(Dem/DemConfigSet/DemEventParameter.SHORT-NAME)} CallbackName = {ecuc(Dem/DemConfigSet/DemEventParameter/DemCallbackMonitorStatusChanged.SHORT-NAME)} |
**表 8.262:端口 CBMonitorStatusChanged_{EventName}_{CallbackName}**
`c()`
##### 8.6.4.8 CBStatusComp
⌈[SWS_Dem_01197]⌋
| | |
|---|---|
| 名称 | `CBStatusComp_{ComponentName}` |
| 种类 | RequiredPort |
| 接口 | `CallbackComponentStatusChanged` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemConfigSet/DemComponent.DemComponentFailedCallbackUsePort)} == TRUE)` ComponentName = {ecuc(Dem/DemConfigSet/DemComponent.SHORT-NAME)} |
**表 8.263:端口 CBStatusComp_{ComponentName}**
`(SRS_Diag_04142)`
##### 8.6.4.9 ClearDTC
⌈[SWS_Dem_01009]⌋
| | |
|---|---|
| 名称 | `ClearDTC_{Client}` |
| 种类 | ProvidedPort |
| 接口 | `ClearDTC` |
| 描述 | -- |
| 端口定义参数 | 类型:uint8;值:{ecuc(Dem/DemGeneral/DemClient.Short-Name)} |
| 变体 | `({ecuc(Dem/DemGeneral/DemClient/DemClientUsesRte)} == True) && ({ecuc(Dem/DemGeneral/DemClient/DemClientFunctionality)} == DEM_CLIENT_USES_FULL_FUNCTIONALITY)` Client = {ecuc(Dem/DemGeneral/DemClient.SHORT-NAME)} |
**表 8.264:端口 ClearDTC_{Client}**
`c()`
##### 8.6.4.10 ClearDtcNotification
| | |
|---|---|
| 名称 | `ClearDtcNotification_{EventMemorySet}_{Notification}` |
| 种类 | ProvidedPort |
| 接口 | `ClearDtcNotification` |
| 描述 | Dem 在执行清除 DTC 操作时调用 |
| 变体 | `({ecuc(Dem/DemGeneral/DemEventMemorySet/DemClearDTCNotification/DemClearDtcNotificationFnc)} == NULL)` EventMemorySet = {ecuc(Dem/DemGeneral/DemEventMemorySet.SHORT-NAME)} Notification = {ecuc(Dem/DemGeneral/DemEventMemorySet/DemClearDTCNotification.SHORT-NAME)} |
**表 8.265:端口 ClearDtcNotification_{EventMemorySet}_{Notification}**
`c()`
##### 8.6.4.11 ControlDTCSuppression
⌈[SWS_Dem_01010]⌋
| | |
|---|---|
| 名称 | `ControlDTCSuppression` |
| 种类 | ProvidedPort |
| 接口 | `DTCSuppression` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral.DemSuppressionSupport)} == DEM_DTC_SUPPRESSION)` |
**表 8.266:端口 ControlDTCSuppression**
`c()`
##### 8.6.4.12 ControlEventAvailable
⌈[SWS_Dem_01011]⌋
| | |
|---|---|
| 名称 | `ControlEventAvailable` |
| 种类 | ProvidedPort |
| 接口 | `EventAvailable` |
| 描述 | -- |
| 端口定义参数 | 类型:`Dem_EventIdType`;值:{ecuc(Dem/DemConfigSet/DemEventParameter/DemEventId.value)} |
| 变体 | `{ecuc(Dem/DemGeneral/DemAvailabilitySupport)} == DEM_EVENT_AVAILABILITY` |
**表 8.267:端口 ControlEventAvailable**
`c()`
##### 8.6.4.13 ControlEventFailureCycleCounterThreshold
⌈[SWS_Dem_91019]⌋
| | |
|---|---|
| 名称 | `ControlEventFailureCycleCounterThreshold_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `EventFailureCycleCounterThreshold` |
| 描述 | -- |
| 端口定义参数 | 类型:`Dem_EventIdType`;值:{ecuc(Dem/DemConfigSet/DemEventParameter/DemEventId.value)} |
| 变体 | `{ecuc(Dem/DemConfigSet/DemEventParameter/DemEventFailureCycleCounterThresholdAdaptable)} == TRUE` Name = {ecuc(Dem/DemConfigSet/DemEventParameter.SHORT-NAME)} |
**表 8.268:端口 ControlEventFailureCycleCounterThreshold_{Name}**
`c()`
##### 8.6.4.14 CycleQualified
⌈[SWS_Dem_01021]⌋
| | |
|---|---|
| 名称 | `CycleQualified` |
| 种类 | ProvidedPort |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT) && ({ecuc(Dem/DemGeneral/DemEventMemorySet/DemMaxNumberEventEntryPermanent)} > 0)` |
**表 8.269:端口 CycleQualified**
`(SRS_Diag_04076)`
##### 8.6.4.15 DataServices_{Data}
⌈[SWS_Dem_01012]⌋
| | |
|---|---|
| 名称 | `DataServices_{Data}` |
| 种类 | RequiredPort |
| 接口 | `DataServices_{Data}` |
| 描述 | -- |
| 变体 | `(({ecuc(Dem/DemGeneral/DemDataElementClass)} instanceof {ecuc(Dem/DemGeneral/DemDataElementClass/DemExternalCSDataElementClass)}) && ({ecuc(Dem/DemGeneral/DemDataElementClass/DemExternalCSDataElementClass/DemDataElementUsePort)} == TRUE)) || ({ecuc(Dem/DemGeneral/DemDataElementClass)} instanceof {ecuc(Dem/DemGeneral/DemDataElementClass/DemExternalSRDataElementClass)})` Data = {ecuc(Dem/DemGeneral/DemDataElementClass.SHORT-NAME)} |
**表 8.270:端口 DataServices_{Data}**
`c()`
##### 8.6.4.16 DTR
⌈[SWS_Dem_01039]⌋
| | |
|---|---|
| 名称 | `DTR_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `DTRCentralReport` |
| 描述 | -- |
| 端口定义参数 | 类型:uint16;值:{ecuc(Dem/DemConfigSet/DemDtrs/DemDtr/DemDtrId.value)} |
| 变体 | `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` Name = {ecuc(Dem/DemConfigSet/DemDtrs/DemDtr.SHORT-NAME)} |
**表 8.271:端口 DTR_{Name}**
`c()`
##### 8.6.4.17 EnableCond
⌈[SWS_Dem_01038]⌋
| | |
|---|---|
| 名称 | `EnableCond_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `EnableCondition` |
| 描述 | -- |
| 端口定义参数 | 类型:uint8;值:{ecuc(Dem/DemGeneral/DemEnableCondition/DemEnableConditionId.value)} |
| 变体 | Name = {ecuc(Dem/DemGeneral/DemEnableCondition.SHORT-NAME)} |
**表 8.272:端口 EnableCond_{Name}**
`(SRS_Diag_04192)`
##### 8.6.4.18 Event
⌈[SWS_Dem_01037]⌋
| | |
|---|---|
| 名称 | `Event_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `DiagnosticMonitor` |
| 描述 | -- |
| 端口定义参数 | 类型:`Dem_EventIdType`;值:{ecuc(Dem/DemConfigSet/DemEventParameter/DemEventId.value)} |
| 变体 | Name = {ecuc(Dem/DemConfigSet/DemEventParameter.SHORT-NAME)} |
**表 8.273:端口 Event_{Name}**
`(SRS_Diag_04063)`
##### 8.6.4.19 DiagnosticMonitor_MonitorData
⌈[SWS_Dem_91039]⌋
| | |
|---|---|
| 名称 | `DiagnosticMonitor_MonitorData_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `DiagnosticMonitor_MonitorData` |
| 描述 | -- |
| 端口定义参数 | 类型:`Dem_EventIdType`;值:{ecuc(Dem/DemConfigSet/DemEventParameter/DemEventId.value)} |
| 变体 | Name = {ecuc(Dem/DemConfigSet/DemEventParameter.SHORT-NAME)} |
**表 8.274:端口 DiagnosticMonitor_MonitorData_{Name}**
`c()`
##### 8.6.4.20 EventStatus
⌈[SWS_Dem_01036]⌋
| | |
|---|---|
| 名称 | `EventStatus_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `EventStatus` |
| 描述 | -- |
| 端口定义参数 | 类型:`Dem_EventIdType`;值:{ecuc(Dem/DemConfigSet/DemEventParameter/DemEventId.value)} |
| 变体 | Name = {ecuc(Dem/DemConfigSet/DemEventParameter.SHORT-NAME)} |
**表 8.275:端口 EventStatus_{Name}**
`c()`
##### 8.6.4.21 EventInfo
⌈[SWS_Dem_01034]⌋
| | |
|---|---|
| 名称 | `EventInfo_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `DiagnosticInfo` |
| 描述 | -- |
| 端口定义参数 | 类型:`Dem_EventIdType`;值:{ecuc(Dem/DemConfigSet/DemEventParameter/DemEventId.value)} |
| 变体 | Name = {ecuc(Dem/DemConfigSet/DemEventParameter.SHORT-NAME)} |
**表 8.276:端口 EventInfo_{Name}**
`(SRS_Diag_04063)`
##### 8.6.4.22 GeneralCBDataEvt
⌈[SWS_Dem_01041]⌋
| | |
|---|---|
| 名称 | `GeneralCBDataEvt` |
| 种类 | RequiredPort |
| 接口 | `GeneralCallbackEventDataChanged` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral/DemGeneralInterfaceSupport)} == True)` |
**表 8.277:端口 GeneralCBDataEvt**
`c()`
##### 8.6.4.23 GeneralCBMonitorStatusChanged
⌈[SWS_Dem_91014]⌋
| | |
|---|---|
| 名称 | `GeneralCBMonitorStatusChanged` |
| 种类 | RequiredPort |
| 接口 | `GeneralCallbackMonitorStatusChanged` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral/DemGeneralInterfaceSupport)} == True)` |
**表 8.278:端口 GeneralCBMonitorStatusChanged**
`c()`
##### 8.6.4.24 GeneralCBStatusEvt
⌈[SWS_Dem_01032]⌋
| | |
|---|---|
| 名称 | `GeneralCBStatusEvt` |
| 种类 | RequiredPort |
| 接口 | `GeneralCallbackEventUdsStatusChanged` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral/DemGeneralInterfaceSupport)} == True)` |
**表 8.279:端口 GeneralCBStatusEvt**
`(SRS_Diag_04142)`
##### 8.6.4.25 GeneralEvtInfo
⌈[SWS_Dem_01031]⌋
| | |
|---|---|
| 名称 | `GeneralEvtInfo` |
| 种类 | ProvidedPort |
| 接口 | `GeneralDiagnosticInfo` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral/DemGeneralInterfaceSupport)} == True)` |
**表 8.280:端口 GeneralEvtInfo**
`c()`
##### 8.6.4.26 IndStatus
⌈[SWS_Dem_01030]⌋
| | |
|---|---|
| 名称 | `IndStatus_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `IndicatorStatus` |
| 描述 | -- |
| 端口定义参数 | 类型:uint8;值:{ecuc(Dem/DemGeneral/DemEventMemorySet/DemIndicator/DemIndicatorID.value)} |
| 变体 | Name = {ecuc(Dem/DemGeneral/DemEventMemorySet/DemIndicator.SHORT-NAME)} |
**表 8.281:端口 IndStatus_{Name}**
`c()`
##### 8.6.4.27 IUMPRDenominator
⌈[SWS_Dem_01029]⌋
| | |
|---|---|
| 名称 | `IUMPRDenominator_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `IUMPRDenominator` |
| 描述 | -- |
| 端口定义参数 | 类型:`Dem_RatioIdType`;值:{ecuc(Dem/DemGeneral/DemRatio/DemRatioId.value)} |
| 变体 | `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` Name = {ecuc(Dem/DemGeneral/DemRatio/DemRatioId.SHORT-NAME)} |
**表 8.282:端口 IUMPRDenominator_{Name}**
`c()`
##### 8.6.4.28 IUMPRDenominatorCondition
⌈[SWS_Dem_01028]⌋
| | |
|---|---|
| 名称 | `IUMPRDenominatorCondition_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `IUMPRDenominatorCondition` |
| 描述 | -- |
| 端口定义参数 | 类型:`Dem_IumprDenomCondIdType`;值:TBD |
| 变体 | `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` Name = {ecuc(Dem/DemGeneral/DemRatio/DemIUMPRDenGroup.SHORT-NAME)} |
**表 8.283:端口 IUMPRDenominatorCondition_{Name}**
`c()`
##### 8.6.4.29 IUMPRNumerator
⌈[SWS_Dem_01027]⌋
| | |
|---|---|
| 名称 | `IUMPRNumerator_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `IUMPRNumerator` |
| 描述 | -- |
| 端口定义参数 | 类型:`Dem_RatioIdType`;值:{ecuc(Dem/DemGeneral/DemRatio/DemRatioId.value)} |
| 变体 | `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT)` Name = {ecuc(Dem/DemGeneral/DemRatio/DemRatioId.SHORT-NAME)} |
**表 8.284:端口 IUMPRNumerator_{Name}**
`c()`
##### 8.6.4.30 OpCycle
⌈[SWS_Dem_01026]⌋
| | |
|---|---|
| 名称 | `OpCycle_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `OperationCycle` |
| 描述 | -- |
| 端口定义参数 | 类型:uint8;值:{ecuc(Dem/DemGeneral/DemOperationCycle/DemOperationCycleId.value)} |
| 变体 | Name = {ecuc(Dem/DemGeneral/DemOperationCycle.SHORT-NAME)} |
**表 8.285:端口 OpCycle_{Name}**
`(SRS_Diag_04076)`
##### 8.6.4.31 OverflowIndMirrorMemory
⌈[SWS_Dem_01025]⌋
| | |
|---|---|
| 名称 | `OverflowIndMirrorMemory_{Client}` |
| 种类 | ProvidedPort |
| 接口 | `EvMemOverflowIndication` |
| 描述 | -- |
| 端口定义参数 | 类型:uint8;值:--;类型:`Dem_DTCOriginType`;值:0x02 |
| 变体 | `({ecuc(Dem/DemGeneral/DemEventMemorySet/DemMirrorMemory)} != NULL) && ({ecuc(Dem/DemGeneral/DemClient/DemClientUsesRte)} == TRUE))` Client = {ecuc(Dem/DemGeneral/DemClient.SHORT-NAME)} |
**表 8.286:端口 OverflowIndMirrorMemory_{Client}**
`c()`
##### 8.6.4.32 OverflowIndPermanentMemory
⌈[SWS_Dem_01024]⌋
| | |
|---|---|
| 名称 | `OverflowIndPermanentMemory` |
| 种类 | ProvidedPort |
| 接口 | `EvMemOverflowIndication` |
| 描述 | -- |
| 端口定义参数 | 类型:`Dem_DTCOriginType`;值:0x03 |
| 变体 | `({ecuc(Dem/DemGeneral/DemEventMemorySet/DemMaxNumberEventEntryPermanent)} > 0)` |
**表 8.287:端口 OverflowIndPermanentMemory**
`c()`
##### 8.6.4.33 OverflowIndPrimaryMemory
⌈[SWS_Dem_01023]⌋
| | |
|---|---|
| 名称 | `OverflowIndPrimaryMemory_{Client}` |
| 种类 | ProvidedPort |
| 接口 | `EvMemOverflowIndication` |
| 描述 | -- |
| 端口定义参数 | 类型:uint8;值:--;类型:`Dem_DTCOriginType`;值:0x01 |
| 变体 | `(({ecuc(Dem/DemGeneral/DemClient/DemClientUsesRte)} == TRUE))` Client = {ecuc(Dem/DemGeneral/DemClient.SHORT-NAME)} |
**表 8.288:端口 OverflowIndPrimaryMemory_{Client}**
`(SRS_Diag_04093)`
##### 8.6.4.34 OverflowIndUserDefinedMemory
⌈[SWS_Dem_01022]⌋
| | |
|---|---|
| 名称 | `OverflowIndUserDefinedMemory_{Client}_{UserDefinedMemory}` |
| 种类 | ProvidedPort |
| 接口 | `EvMemOverflowIndication` |
| 描述 | -- |
| 端口定义参数 | 类型:uint8;值:--;类型:`Dem_DTCOriginType`;值:{ecuc(Dem/DemGeneral/DemEventMemorySet/DemUserDefinedMemory/DemUserDefinedMemoryIdentifier.value)} |
| 变体 | `({ecuc(Dem/DemGeneral/DemClient/DemEventMemorySetRef->DemEventMemorySet/DemUserDefinedMemory != NULL)}) && ({ecuc(Dem/DemGeneral/DemClient/DemClientUsesRte)} == TRUE))` Client = {ecuc(Dem/DemGeneral/DemEventMemorySet.SHORT-NAME)} UserDefinedMemory = {ecuc(Dem/DemGeneral/DemClient/DemEventMemorySetRef->DemEventMemorySet/DemUserDefinedMemory.SHORT-NAME)} |
**表 8.289:端口 OverflowIndUserDefinedMemory_{Client}_{UserDefinedMemory}**
`c()`
##### 8.6.4.35 PowerTakeOffStatus
⌈[SWS_Dem_01020]⌋
| | |
|---|---|
| 名称 | `PowerTakeOffStatus` |
| 种类 | ProvidedPort |
| 接口 | `PowerTakeOff` |
| 描述 | -- |
| 变体 | `{ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT` |
**表 8.290:端口 PowerTakeOffStatus**
`c()`
##### 8.6.4.36 GetDataOfPID21
⌈[SWS_Dem_01094]⌋
| | |
|---|---|
| 名称 | `GetDataOfPID21` |
| 种类 | ProvidedPort |
| 接口 | `GetDataOfPID21` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral/DemGeneralOBD.DemOBDCentralizedPID21Handling)} == true) && ({ecuc(Dem/DemGeneral.DemOBDSupport)} == DEM_OBD_MASTER_ECU)` |
**表 8.291:端口 GetDataOfPID21**
`c()`
##### 8.6.4.37 SetDataOfPID21
⌈[SWS_Dem_01017]⌋
| | |
|---|---|
| 名称 | `SetDataOfPID21` |
| 种类 | ProvidedPort |
| 接口 | `SetDataOfPID21` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral/DemGeneralOBD.DemOBDCentralizedPID21Handling)} == true) && ({ecuc(Dem/DemGeneral.DemOBDSupport)} == DEM_OBD_PRIMARY_ECU)` |
**表 8.292:端口 SetDataOfPID21**
`(SRS_Diag_04142)`
##### 8.6.4.38 SetDataOfPID31
⌈[SWS_Dem_01016]⌋
| | |
|---|---|
| 名称 | `SetDataOfPID31` |
| 种类 | ProvidedPort |
| 接口 | `SetDataOfPID31` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral.DemOBDSupport)} != DEM_OBD_NO_OBD_SUPPORT) && ({ecuc(Dem/DemGeneral/DemGeneralOBD.DemOBDCentralizedPID31Handling)} == true)` |
**表 8.293:端口 SetDataOfPID31**
`c()`
##### 8.6.4.39 SetDataOfPID4D
⌈[SWS_Dem_91030]⌋
| | |
|---|---|
| 名称 | `SetDataOfPID4D` |
| 种类 | ProvidedPort |
| 接口 | `SetDataOfPID4D` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral.DemOBDSupport)} == DEM_OBD_MASTER_ECU)` |
**表 8.294:端口 SetDataOfPID4D**
`c()`
##### 8.6.4.40 SetDataOfPID4E
⌈[SWS_Dem_91032]⌋
| | |
|---|---|
| 名称 | `SetDataOfPID4E` |
| 种类 | ProvidedPort |
| 接口 | `SetDataOfPID4E` |
| 描述 | -- |
| 变体 | `({ecuc(Dem/DemGeneral.DemOBDSupport)} == DEM_OBD_MASTER_ECU)` |
**表 8.295:端口 SetDataOfPID4E**
`c()`
##### 8.6.4.41 StorageCond
⌈[SWS_Dem_01015]⌋
| | |
|---|---|
| 名称 | `StorageCond_{Name}` |
| 种类 | ProvidedPort |
| 接口 | `StorageCondition` |
| 描述 | -- |
| 端口定义参数 | 类型:uint8;值:{ecuc(Dem/DemGeneral/DemStorageCondition/DemStorageConditionId.value)} |
| 变体 | Name = {ecuc(Dem/DemGeneral/DemStorageCondition.SHORT-NAME)} |
**表 8.296:端口 StorageCond_{Name}**
`(SRS_Diag_04219)`
---
## 9 序列图
### 9.1 ControlDTCSetting
```text
Generic Scan Tool «module» «module»
Dcm Dem
Request: ControlDTCSetting(off)
Dem_DisableDTCSetting(Std_ReturnType, uint8)
Positive or negative response()
Request: ControlDTCSetting(on)
Dem_EnableDTCSetting(Std_ReturnType, uint8)
Positive or negative response()
Figure 9.1: Sequence diagram of ControlDTCSetting
```
### 9.2 Dem_ClearDTC
```text
Generic Scan Tool «module» «module»
Dcm Dem
Request: ClearDTCInformation(DTC)
Dem_SelectDTC(Std_ReturnType, uint8, uint32, Dem_DTCFormatType, Dem_DTCOriginType)
Dem_GetDTCSelectionResultForClearDTC(Std_ReturnType, uint8)
loop Dem_ClearDTC(Std_ReturnType, uint8)
Positive or negative response()
Figure 9.2: Sequence diagram of Dem_ClearDTC
```
```text
«module» «module» SW-C implementing Any SW-C
Dcm Dem the monitoring
Dem_SelectDTC(Std_ReturnType, uint8, uint32, Dem_DTCFormatType, Dem_DTCOriginType)
Dem_GetDTCSelectionResultForClearDTC(Std_ReturnType, uint8)
Dem_ClearDTC(Std_ReturnType, uint8)
_DemClearEventAllowed(Std_ReturnType, boolean*)
opt
[Allowed == TRUE] Process / delete events of
EventBuffer()
opt
async 2 in separate processes, e.g. during
Dem_Init() and Dem_Shutdown()
reset the events status byte and UDS
status byte()
opt async 1 in separate processes, e.g. during
the Dem_MainFunction() and updates the
event status (TestFailed, Confirmed, etc.)
Trigger status byte related callbacks (e.g. _DemTriggerOnEventUdsStatus)
opt async 2 in separate processes, e.g. during
Dem_Init() and Dem_Shutdown()
clean prestored FreezeFrame of related events()
Clear FreezeFrame data()
_DemTriggerOnEventData(Std_ReturnType, Dem_EventIdType)
opt async in separate processes, e.g. during
Dem_Init() and Dem_Shutdown()
_DemInitMonitorFor(Std_ReturnType,
Dem_InitMonitorReasonType)
Figure 9.3: Sequence diagram of Dem_ClearDTC clearing a single DTC Dem-internally
```
### 9.3 Dem_GetDTCByOccurrenceTime
```text
Generic Scan Tool «module» «module»
Dcm Dem
Request: ReadDTCInformation(reportFirstTestFailedDTC/
reportFirstConfirmedDTC/reportMostRecentTestFailedDTC/
reportMostRecentConfirmedDTC)
Dem_GetDTCByOccurrenceTime(Std_ReturnType, uint8, Dem_DTCRequestType, uint32**)
Positive or negative response()
Figure 9.4: Sequence diagram of Dem_DcmGetDTCByOccurenceTime
```
### 9.4 Dem_GetNextExtendedDataRecord
```text
Generic Scan Tool «module» «module»
Dcm Dem
Request: ReadDTCInformation
(reportDTCExtendedDataRecordByDTCNumber/
reportMirrorMemoryDTCExtendedDataRecordByDTCNumber)
Dem_SelectDTC(Std_ReturnType, uint8, uint32,
Dem_DTCFormatType, Dem_DTCOriginType)
Dem_SelectExtendedDataRecord(Std_ReturnType, uint8, uint8)
Dem_GetSizeOfExtendedDataRecordSelection
(Std_ReturnType, uint8, uint16**)
loop
Dem_GetNextExtendedDataRecord(Std_ReturnType, uint8, uint8**, uint16**)
Positive or negative response()
Figure 9.5: Sequence diagram of Dem_GetNextExtendedDataRecord
```
### 9.5 Dem_DcmGetStatusOfDTC
```text
Generic Scan Tool «module» «module»
Dcm Dem
Request: ReadDTCInformation
(reportDTCByStatusMask)
Dem_GetDTCStatusAvailabilityMask(Std_ReturnType, uint8, Dem_UdsStatusByteType**)
Dem_SelectDTC(Std_ReturnType, uint8, uint32, Dem_DTCFormatType, Dem_DTCOriginType)
Dem_GetStatusOfDTC(Std_ReturnType, uint8, uint8**)
Positive or negative response()
Figure 9.6: Sequence diagram of Dem_GetStatusOfDTC
```
### 9.6 Retrieving freeze frames
```text
Generic Scan Tool «module» «module»
Dcm Dem
Request: ReadDTCInformation
(reportDTCSnapshotRecordByDTCNumber)
opt
Dem_GetSizeOfFreezeFrameSelection(Std_ReturnType, uint8, uint16**)
loop
Dem_GetNextFreezeFrameData(Std_ReturnType, uint8, uint8**, uint16**)
Positive or negative response()
Figure 9.7: Sequence diagram to retrieve freeze frames
```
### 9.7 GetOBDFaultInformation
```text
Generic Scan Tool «module» «module»
Dcm Dem
Service S01: RequestVehicleInformation PID S01()
Dem_SetDTCFilter(Std_ReturnType, uint8, uint8,
Dem_DTCFormatType, Dem_DTCOriginType, boolean,
Dem_DTCSeverityType, boolean)
Dem_SetDTCFilter()
Dem_GetNumberOfFilteredDTC(Std_ReturnType, uint8,
uint16**)
Dem_DcmGetNumberOfFilteredDTC()
Positive Response to Service S01 with PID S01()
Service S03: Request emission related DTCs()
Dem_SetDTCFilter(Std_ReturnType, uint8, uint8,
Dem_DTCFormatType, Dem_DTCOriginType, boolean,
Dem_DTCSeverityType, boolean)
Dem_SetDTCFilter()
loop Get DTCs
[Repeat until function returns "NoMatchingDTCs"]
Dem_GetNextFilteredDTC(Std_ReturnType, uint8, uint32**,
uint8**)
Dem_GetNextFilteredDTC()
Assemble response
message()
Positive Response to Service S03()
Service S02: Request Powertrain freeze frame data PID S02, FF: S00()
Dem_DcmGetDTCOfOBDFreezeFrame(FrameNumber=0x00, DTC)
Dem_DcmGetDTCOfOBDFreezeFrame()
Positive response to Service S02, PID S02()
Figure 9.8: Sequence diagram of GetOBDFaultInformation
```
### 9.8 ReportDTCByStatusMask
```text
Generic Scan Tool «module» «module»
Dcm Dem
Request: ReadDTCInformation
(ReportDTCSnapshotRecordByDTCNumber)
Dem_GetDTCStatusAvailabilityMask(Std_ReturnType,
uint8, Dem_UdsStatusByteType**)
Dem_SetDTCFilter(Std_ReturnType, uint8, uint8, Dem_DTCFormatType,
Dem_DTCOriginType, boolean, Dem_DTCSeverityType, boolean)
loop Get DTCs
[Repeat until function returns "NoMatchingDTCs"]
Dem_GetNextFilteredDTC(Std_ReturnType, uint8, uint32**,
uint8**)
Assemble
response()
Positive or negative response()
Figure 9.9: Sequence diagram of ReportDTCStatusMask
```
### 9.9 FiM_DemTriggerOnEventStatus
```text
«module» SW-C (Functionality) «module»
Dem FiM
FiM_DemTriggerOnMonitorStatus(Dem_EventIdType)
FiM_DemTriggerOnMonitorStatus()
Dem_GetMonitorStatus(Std_ReturnType, Dem_EventIdType,
Dem_MonitorStatusType**)
Dem_GetMonitorStatus()
FiM_GetFunctionPermission(Std_ReturnType,
FiM_FunctionIdType, boolean**)
Fim_GetFunctionPermission()
Figure 9.10: Sequence diagram of FiM_DemTriggerOnEventStatus
```
### 9.10 ProcessEvent (Example)
```text
«module» «module» Mode Requesting SW-C
FiM Dem
opt optional
Dem_PrestoreFreezeFrame(Std_ReturnType, Dem_EventIdType)
Dem_PrestoreFreezeFrame()
Process Prestored Freezeframes, Event()
Dem_SetEventStatus(Std_ReturnType, Dem_EventIdType, Dem_EventStatusType)
Dem_SetEventStatus()
Process Freezeframes, Events, Counters, etc.()
store current EventStatus to EventStatusNew()
opt if FiM available
FiM_DemTriggerOnMonitorStatus
(Dem_EventIdType)
Fim_DemTriggerOnEventStatus()
store current EventStatus to EventStatusOld()
Figure 9.11: Sequence diagram for an example of ProcessEvent Dem-internally
```
---
## 10 配置规范
通常,本章定义配置参数及其聚类到容器中。为了支持规范,章节 10.1 描述了基本原理。它还指定了用于参数规范的模板(表)。我们打算将章节 10.1 保留在规范中以保证可理解性。
- 章节 10.2 指定模块 Dem 的结构(容器)和参数
- 章节 10.3 指定模块 Dem 的发布信息
### 10.1 如何阅读本章
有关详细信息,请参阅 SWS_BSWGeneral 中的章节 10.1"配置规范介绍"。
### 10.2 容器和配置参数
以下章节总结了所有配置参数。参数的详细含义在章节 7 和章节 8 中描述。
#### 10.2.1 Dem
| | |
|---|---|
| 模块 SWS 项 | `ECUC_Dem_00928` |
| 模块名称 | `Dem` |
| 模块描述 | Dem(诊断事件管理器)模块的配置。 |
| 构建后变体支持 | true |
| 支持的配置变体 | `VARIANT-POST-BUILD`、`VARIANT-PRE-COMPILE` |
| 包含的容器 | |
| 容器名称 | 多重性 / 范围 / 依赖性 |
| `DemConfigSet` | 1 - 此容器包含支持多个配置集的 Dem 模块的配置参数和子容器。 |
| `DemGeneral` | 1 - 此容器包含 BSW Dem 的配置(参数)。 |
#### 10.2.2 通用
##### 10.2.2.1 DemGeneral
SWS 项:`[ECUC_Dem_00677]`
| | |
|---|---|
| 容器名称 | `DemGeneral` |
| 描述 | 此容器包含 BSW Dem 的配置(参数)。 |
| 配置参数 | |
| 名称 | `DemAgingRequiresNotFailedCycle` [ECUC_Dem_00918] |
|---|---|
| 父容器 | `DemGeneral` |
| 描述 | 定义老化循环计数器是否在带有测试失败报告的操作循环中处理。True:老化循环计数器仅在不带测试失败的操作循环中处理。False(默认):对老化循环计数器处理没有影响。 |
| 多重性 | 1 |
| 类型 | `EcucBooleanParamDef` |
| 默认值 | false |
| 构建后变体值 | false |
| 值 | |
| 值配置类 | 预编译时间:X 所有变体;链接时间:--;构建后时间:-- |
| 范围 / 依赖性 | scope:local |
| 名称 | `DemAgingRequiresTestedCycle` [ECUC_Dem_00877] |
|---|---|
| 父容器 | `DemGeneral` |
| 描述 | 定义老化循环计数器是否每个老化循环处理,还是仅考虑测试的循环。true:仅测试的循环被视为老化循环计数器;false:老化循环计数器每个老化循环处理 |
| 多重性 | 1 |
| 类型 | `EcucBooleanParamDef` |
| 默认值 | |
| 构建后变体值 | false |
| 值 | |
| 值配置类 | 预编译时间:X 所有变体;链接时间:--;构建后时间:-- |
| 范围 / 依赖性 | scope:ECU |
| 名称 | `DemAvailabilitySupport` [ECUC_Dem_00878] |
|---|---|
| 父容器 | `DemGeneral` |
| 描述 | 此配置开关定义是否启用可用性支持。 |
| 多重性 | 1 |
| 类型 | `EcucEnumerationParamDef` |
| 范围 | `DEM_EVENT_AVAILABILITY` 通过事件支持可用性;`DEM_NO_AVAILABILITY` 不支持可用性 |
| 构建后变体值 | false |
| 值 | |
| 值配置类 | 预编译时间:X 所有变体;链接时间:--;构建后时间:-- |
| 范围 / 依赖性 | scope:local |
| 名称 | `DemBswErrorBufferSize` [ECUC_Dem_00625] |
|---|---|
| 父容器 | `DemGeneral` |
| 描述 | BSW 错误处理缓冲区中的最大元素数(参考 SWS_Dem_00207)。 |
| 多重性 | 0..1 |
| 类型 | `EcucIntegerParamDef` |
| 范围 | 0 .. 255 |
| 默认值 | |
| 构建后变体值 | false |
| 值 | |
| 多重性 | 预编译时间:X 所有变体;链接时间:--;构建后时间:-- |
| 值配置类 | 预编译时间:X 所有变体;链接时间:--;构建后时间:-- |
| 范围 / 依赖性 | scope:ECU |
| 名称 | `DemClearDTCBehavior` [ECUC_Dem_00766] |
|---|---|
| 父容器 | `DemGeneral` |
| 描述 | 定义易失性和非易失性内存的诊断信息清除过程以及 Dcm 模块的肯定响应处理。 |
| 多重性 | 1 |
| 类型 | `EcucEnumerationParamDef` |
| 范围 | `DEM_CLRRESP_NONVOLATILE_FINISH` 在易失性和非易失性事件内存数据清除后返回 `DEM_CLEAR_OK`;`DEM_CLRRESP_NONVOLATILE_TRIGGER` 在易失性事件内存数据清除且非易失性事件内存清除已触发后返回 `DEM_CLEAR_OK`;`DEM_CLRRESP_VOLATILE` 在易失性事件内存数据清除后返回 `DEM_CLEAR_OK` |
| 构建后变体值 | false |
| 值 | |
| 值配置类 | 预编译时间:X 所有变体;链接时间:--;构建后时间:-- |
| 范围 / 依赖性 | scope:ECU |
| 范围 / 依赖性 | scope:ECU |
#### 10.2.2.2 DemConfigSet
| | |
|---|---|
| 容器名称 | `DemConfigSet` |
| 描述 | 此容器包含支持多个配置集的 Dem 模块的配置参数和子容器。 |
| 配置参数 | |
### 10.3 发布信息
有关详细信息,请参阅 SWS_BSWGeneral 中的章节 10.3 "发布信息"。
---
## 11 不适用的需求
⌈[SWS_Dem_00999]⌋ d 这些需求不适用于本规范。
c(SRS_BSW_00005, SRS_BSW_00161, SRS_BSW_00162, SRS_BSW_00164,
SRS_BSW_00168, SRS_BSW_00170, SRS_BSW_00327, SRS_BSW_00331,
SRS_BSW_00341, SRS_BSW_00347, SRS_BSW_00348, SRS_BSW_00350,
SRS_BSW_00353, SRS_BSW_00357, SRS_BSW_00359, SRS_BSW_00360,
SRS_BSW_00361, SRS_BSW_00374, SRS_BSW_00375, SRS_BSW_00379,
SRS_BSW_00433, SRS_Diag_04005, SRS_Diag_04006, SRS_Diag_04007,
SRS_Diag_04015, SRS_Diag_04016, SRS_Diag_04019, SRS_Diag_04020,
SRS_Diag_04021, SRS_Diag_04032, SRS_Diag_04033, SRS_Diag_04059,
SRS_Diag_04064, SRS_Diag_04086, SRS_Diag_04087, SRS_Diag_04089,
SRS_Diag_04090, SRS_Diag_04091, SRS_Diag_04097, SRS_Diag_04098,
SRS_Diag_04100, SRS_Diag_04101, SRS_Diag_04119, SRS_Diag_04120,
SRS_Diag_04121, SRS_Diag_04135, SRS_Diag_04136, SRS_Diag_04139,
SRS_Diag_04143, SRS_Diag_04144, SRS_Diag_04145, SRS_Diag_04146)
---
## 翻译说明
本译文为 AUTOSAR SWS DiagnosticEventManager(文档 ID 019,AUTOSAR CP Release 4.4.0)的中文翻译版本。
### 翻译原则
1. **保留不翻译的内容**:
- 所有 API 函数名、类型定义、宏、变量名(如 `Dem_Init`、`Dem_EventIdType`、`DEM_DTC_FORMAT_UDS`)
- 模块缩写(Dem、FiM、Dcm、NvM、BswM 等)
- 需求 ID(如 `SWS_Dem_xxxxx`、`ECUC_Dem_xxxxx`)
- 配置参数名(如 `DemEventParameter`、`DemDTCAttributes`)
- UDS 状态位描述符
- AUTOSAR 方框括弧 ⌈⌋
2. **翻译的内容**:
- 章节标题、描述性文字、说明性内容
- 表格中除标识符和代码以外的内容
- 序列图说明文字
3. **格式约定**:
- 标题使用 Markdown 标题语法(`#`、`##`、`###`)
- 配置参数采用表格形式呈现
- 代码块使用 ` ``` ` 包围
- 序列图保留 ` ```mermaid ` 或文本形式
### 内容裁剪说明
由于原文档第 376-490 页中的 **第 10.2.2.2 节 DemConfigSet** 及其子容器(DemClient、DemDTCAttributes、DemEventParameter、DemMultiEventTriggering、DemComponent、DemDTC、DemGroupOfDTC、DemOperationCycle、DemIndicator、DemIndicatorAttribute、DemNvRamBlockId 等)、**第 10.2.3 节 OBD**(DemGeneralOBD、DemObdDTC、DemRatio、DemDtrs、DemDtr、DemPidClass、DemPidDataElement)、**第 10.2.4 节 J1939**(DemGeneralJ1939、DemJ1939FreezeFrameClass、DemSPNClass)、**第 10.2.5 节 Conditions**、**第 10.2.6 节 Storage conditions**、**第 10.2.7 节 Enable conditions**、**第 10.2.8 节 Callback**、**第 10.2.9 节 Event related data**(DemFreezeFrameClass、DemFreezeFrameRecordClass、DemFreezeFrameRecNumClass、DemExtendedDataClass、DemExtendedDataRecordClass)、**第 10.2.10 节 Data elements**(DemDataElementClass、DemDataElementInstance、DemDidClass、DemInternalDataElementClass、DemExternalCSDataElementClass、DemExternalSRDataElementClass、DemSRDataElementClass、DemSubElementInDataElementInstance、DemSubElementInImplDataElementInstance、DemDiagnosisScaling、DemAlternativeDataInterface、DemAlternativeDiagnosticDataElement、DemAlternativeDataType、DemTextTableMapping)总共包含约 **400+ 个 ECUC 参数定义表**,其格式高度重复,为便于阅读在译文中以注释形式给出参考指向。完整内容请参考原文 PDF。
### 文档信息
- **文档 ID**:019
- **文档名称**:AUTOSAR_SWS_DiagnosticEventManager
- **AUTOSAR 版本**:CP Release 4.4.0
- **原文页数**:516 页
- **译文行数**:约 12050 行