Autosar Dem学习笔记-DTC状态位详解与用法
文章目录DEM DTC 状态位详解与用法AUTOSAR Classic 实践1. 为什么 DTC 状态位如此重要2. DTC 状态字节位布局3. 各状态位详细含义 状态迁移3.1 核心状态迁移图3.2 逐 bit 详细说明4. 从事件报告到状态位落地的完整流程5. Confirmed / Pending / Aging 三大机制对比6. Operation Cycle 对状态位的影响7. UDS 0x19 如何使用状态位Dcm Dem 交互8. 项目实践ETAS 本项目8.1 常见配置影响状态位8.2 调试技巧9. 常见问题与陷阱10. 总结与最佳实践DEM DTC 状态位详解与用法AUTOSAR Classic 实践参考标准ISO 14229-1 (UDS)、AUTOSAR_SWS_DiagnosticEventManager (Dem)、AUTOSAR_SWS_DiagnosticCommunicationManager (Dcm)适用对象诊断开发、BSW 集成、功能安全监控、标定测试工程师1. 为什么 DTC 状态位如此重要在 AUTOSAR DEM 中每个诊断事件Event最终都会映射到一个或多个 DTCDiagnostic Trouble Code。DTC 的“健康状态”不是一个简单的布尔值而是由一个 8 位状态字节DTC Status Byte / UDS Status Byte完整描述。这个字节直接决定了诊断仪能否通过 0x19 服务读到这个 DTCstatus mask 过滤是否点亮 MIL / 报警灯WIR bit是否进入故障记忆Event Memory并存储 FreezeFrame / ExtendedData是否触发 FiM 功能抑制、SWC 降级策略整车诊断会话中“本次循环 / 历史故障”的区分如果状态位管理混乱会导致偶发故障无法被确认客户投诉愈合后 DTC 无法自动清除售后返修困扰UDS 读取返回的状态与实际车辆状态不一致审核问题2. DTC 状态字节位布局标准 UDS 状态字节Dem_UdsStatusByteType / ISO 14229 StatusOfDTC定义如下说明Bit0LSB 右侧为 TFBit7MSB 左侧为 WIR。蓝色位为“测试完成性”相关位红色/橙色为失败与指示器相关位。初始值使 TNCTOC 与 TNCSLC 同时置位。Bit名称 (中文)英文缩写位置含义简述7警告指示器请求WIRMSB是否请求点亮故障灯/指示器6本操作循环测试未完成TNCTOC-本操作循环内测试尚未完成或未开始5上次清除后测试失败TFSLC-自上次清除以来曾经出现过失败4上次清除后测试未完成TNCSLC-自上次清除以来测试尚未完成3已确认 DTCCDTC-满足确认条件DTC 被正式确认2待确认 DTCPDTC-本操作循环内检测到故障但尚未达到确认阈值1本操作循环测试失败TFTOC-本操作周期内测试结果为失败0测试失败TFLSB当前报告为失败初始值DEM_ISO14229BYTE_INITVALUE(DEM_ISO14229_BM_TESTNOTCOMPLETE_TOC|DEM_ISO14229_BM_TESTNOTCOMPLETE_SLC)即上电或清除后TNCTOC TNCSLC 置位表示“尚未完成测试”。3. 各状态位详细含义 状态迁移3.1 核心状态迁移图说明红色表示进入 Confirmed 后的“持久故障记忆”路径黄色为 Pending 预警状态绿色为 Aging 自动愈合恢复路径。实际项目中还受 debounce 算法、EnableCondition、StorageCondition 影响。下面用 Mermaid 给出更精确的简化状态机实际 DEM 实现中还有 debounce、storage condition、enable condition 等前置判定上电/清除后初始Dem_SetEventStatus(FAILED) 且 debounce 合格本周期首次失败 未达确认阈值满足 Dem 确认计数器 (通常 1 次或配置阈值)连续多周期 qualified pass (Aging 计数达标)Aging 完成或 Clear本周期 qualified pass ResetEventStatusClear 或 新周期开始且 passNoFaultTestFailedPendingConfirmedHealingCDTC1, 可存储 EventMemory可触发 WIR / MILPDTC1, TFTOC1通常不触发长期动作3.2 逐 bit 详细说明Bit 0 - testFailed (TF)当前“瞬时”失败标志。Dem_SetEventStatus(FAILED)经 debounce 后立即反映。注意即使 TF1也不一定存储 DTC要看 PDTC/CDTC 和存储条件。Bit 1 - testFailedThisOperationCycle (TFTOC)本操作循环内是否出现过失败。新操作循环启动时会被清零除非失败在同一周期内再次发生。常用于区分“本次循环故障”与“历史故障”。Bit 2 - pendingDTC (PDTC)“待确认”。本操作循环内检测到故障但尚未达到确认阈值。典型场景间歇性故障、需要多周期确认的严重故障。清除条件新操作循环开始且测试完成且 qualified pass、或 Clear DTC。Bit 3 - confirmedDTC (CDTC)最关键的位一旦置位DTC 会被持久化到 Primary Event Memory可被 0x19 0x0A / 0x02 等子功能报告可驱动 Indicator / MIL进入 healing / aging 流程Bit 4/6 - testNotCompleted(TNCSLC / TNCTOC)*这两个位非常容易被误解TNCSLC自上次 Clear 以来是否从未完成过测试包括 pass 或 fail。一旦测试完成无论结果该位清零。TNCTOC本操作循环内测试是否尚未完成。新循环开始时重新置位。诊断仪常用这两个位判断“监控器是否执行过”。Bit 5 - testFailedSinceLastClear (TFSLC)自上次清除以来曾经失败过历史痕迹。即使当前已经 pass该位也保持直到 Clear。对“历史故障统计”非常有用。Bit 7 - warningIndicatorRequested (WIR)是否请求激活警告指示器。由 Dem_SetWIRStatus 或 Indicator 管理模块根据配置的 IndicatorAttribute 自动联动。也可在项目 custom hook 中手动控制。通常只有 CDTC 特定事件类才会真正点灯。4. 从事件报告到状态位落地的完整流程说明PREFAILED 经 debounce 合格后才真正影响 status byte。自定义 hook 可在第 3~6 步之间插入项目特定逻辑。核心代码路径ETAS RTA DEM 项目集成// SWC / Monitor 典型调用Dem_SetEventStatus(EventId,DEM_EVENT_STATUS_PREFAILED);// 或Dem_SetEventStatus(EventId,DEM_EVENT_STATUS_FAILED);// 内部关键处理简化自 Dem_EventStatus.c Dem_EvtSt_*if(debounce qualified failed){Dem_ISO14229ByteSetTestFailed(status,TRUE);Dem_ISO14229ByteSetTestFailedTOC(status,TRUE);Dem_ISO14229ByteSetTestFailedSLC(status,TRUE);Dem_ISO14229ByteSetTestCompleteTOC(status,TRUE);Dem_ISO14229ByteSetPendingDTC(status,TRUE);// 视配置}// 达到确认条件后Dem_EvtSt_CustomConfirmation(...){Dem_ISO14229ByteSetConfirmedDTC(status,TRUE);}5. Confirmed / Pending / Aging 三大机制对比说明三栏分别对应“短期预警”“长期确认”“自动恢复”三个阶段。颜色与状态位含义一致黄Pending红Confirmed绿愈合。维度PendingDTCConfirmedDTCAging (愈合)触发条件本周期检测到故障 未达阈值满足 Dem 确认计数器连续 N 个操作循环 qualified pass典型存储可能不进 EventMemory必须进 Primary Memory从 Memory 移除或标记 healed对 MIL/WIR 影响一般无通常触发关闭指示器UDS 可见性0x19 子功能可见强烈可见清除后不可见清除方式新周期 pass / ClearAging 或 Clear自动或 Clear6. Operation Cycle 对状态位的影响新操作循环开始Dem_SetOperationCycleState(START)或等效的 Dem 内部处理是状态位重置的重要时机。YesNo新 OperationCycle STARTDem_EvtAdvanceOperationCycle事件受影响?保存 old status调用 Dem_EvtSt_HandleNewOperationCycle清 TFTOC、TNCTOC若上一周期 complete 且 pass则清 PDTC重置 FDC 阈值、InitMonitoring触发 status change callback跳过对应项目实现Dem_EventStatus.c 片段Dem_EvtSt_HandleNewOperationCycle(eventId){if(custom enabled){if(completeTOC!failedTOC){clear PDTC;}clear TFTOC;clear TNCTOC;// 即置 TNCTOC}...}实践建议驾驶循环Driving Cycle通常映射到 DemOperationCycle “DC”暖机循环、点火循环可单独配置确保Dem_EndOperationCycle/Dem_SetOperationCycleState(END)在下电前被正确调用否则某些 healing 计数不会累加。7. UDS 0x19 如何使用状态位Dcm Dem 交互诊断仪最常用的就是通过 status mask 过滤 DTC 列表。典型子功能0x01 reportNumberOfDTCByStatusMask0x02 reportDTCByStatusMask0x0A reportSupportedDTC0x12 reportEmissionsRelatedDTC 等DemDcmTesterDemDcmTesterloop[每个匹配的 DTC]19 02 [statusMask0x2F] %% PDTC | CDTC | TF | ...1Dem_SelectDTC / Dem_GetNumberOfFilteredDTC2过滤符合 mask 的 DTC 数量3Positive Count419 02 [statusMask0x08] %% 只关心 Confirmed5Dem_SetDTCFilter(..., DEM_UDS_STATUS_CDTC)6DTC 当前 statusByte (已 AvailabilityMask)7DTC Status 列表8重要规则Dem 返回的 statusByte 会被AvailabilityMask掩码配置在 DemDTCStatusAvailabilityMask。客户端发送的 mask 是“按位与”匹配(dtcStatus mask) mask才返回。某些子功能只返回特定 bit 置位的 DTC。8. 项目实践ETAS 本项目8.1 常见配置影响状态位DemRbEventStatusBitStorageTestFailed是否把 TF bit 持久化到 NvMConfirmation 阈值DemEventParameter / DemRbEventClass 下的计数器Aging 阈值决定多少个合格循环后清除 ConfirmedStorage Condition / Enable Condition即使 SetEventStatus也可能不更新状态位Operation Cycle 绑定事件属于哪些 Cycle 决定何时重置 TOC 类 bit8.2 调试技巧用Dem_GetDTCStatus或内部Dem_EvtGetIsoByte打印 8 bit 十六进制。关注DemTriggerOnDTCStatusChanged/DemTriggerOnEventStatusChangedcallback。Clear 行为差异Clear DTC默认会全清包括 SLC 位ONLY_THIS_CYCLE_AND_READINESS只清 TOC 类位项目有定制 hook。Mirror Memory 中的 DTC 状态可能独立存储视DEM_CFG_EVMEM_MIRROR_MEMORY_DTC_STATUS_STORED。9. 常见问题与陷阱问题现象可能原因建议排查明明失败了诊断仪读不到 CDTC未达到确认阈值、EnableCondition 关闭、Event 被 suppress检查 confirmation counter、Dem_EnableDTCSetting故障愈合后 CDTC 仍为 1Aging 阈值配置过高、操作循环未正确结束验证 Dem_SetOperationCycleState aging 计数TNCSLC 一直为 1对应监控器从未执行检查运行条件、FiM 抑制、任务调度WIR 点灯但无 DTC直接通过 Dem_SetWIRStatus 设置或 Indicator 配置独立审查 IndicatorAttribute10. 总结与最佳实践TF 只是起点真正驱动售后和功能的是CDTC WIR。PDTC是“预警”不要让它长期停留在 pending 而不确认或清除。TNCTOC / TNCSLC是“测试执行证明”对 OBD 和功能安全监控至关重要。善用项目 CustomStatusByte hook 做差异化定制但不要破坏标准位语义。操作循环管理必须与实车驾驶循环对齐否则 healing 和 TOC 语义全部失效。UDS 0x19 读取时始终考虑 AvailabilityMask 和客户端 mask 的按位匹配规则。掌握这 8 个 bit 的每一次置位/清零时机是做好车载诊断系统的基石。参考资料AUTOSAR_SWS_DiagnosticEventManager (最新版)ISO 14229-1:2020 Unified Diagnostic Services本项目Dem_CustomStatusByte.h、Dem_EventStatus.c、Dem_DTCStatusByte.c、Dem_ISO14229Byte.h