AUTOSAR DEM (二):DTC
在章节一中提到了事件对应的DTC的状态变化。DTC是一种用来记录当某ECU发生或检测到某种故障时所呈现在大家目前的标识码,通过DTC便可以查表的方式获得该故障信息,如故障触发条件、故障解除条件、系统功能表现等。
在ISO-15031-6这个标准中规定了dtc的基本组成,DTC如何命名等信息。
DTC与故障事件
DTC(Diagnostic Trouble Code):
- 定义:DTC是一种标准化的诊断故障码,用于识别和报告车辆或系统中的故障。每个DTC都有一个唯一的标识符,表示特定的故障类型。
- 功能:DTC用于诊断系统中的故障,并提供关于故障的信息,如故障类型、严重程度、发生条件等。DTC可以通过诊断工具或故障指示灯等方式进行读取和显示。
故障事件(Fault Event)
- 定义:故障事件是指系统中发生的故障或错误事件。它可以是由硬件故障、软件错误、传感器故障等引起的异常情况。
- 功能:故障事件用于通知系统中的其他模块或外部设备发生了故障或错误。它可以触发相关的故障处理流程,如生成DTC、记录故障信息、通知用户等。
两者区别和联系
- DTC是一种标准化的故障码,用于诊断和报告故障。它提供了关于故障类型和属性的信息。
- 故障事件是指系统中发生的故障或错误事件,它可以触发相关的故障处理流程。
- DTC通常与故障事件相关联。当发生故障事件时,DEM模块可以生成相应的DTC,并将其报告给其他模块或外部设备。
- DTC可以用于故障诊断和故障排查,而故障事件可以用于故障处理和故障通知。
- DTC是某类故障的统称,能够大体定位到某个模块的故障,而event则是故障监控的基本单元,能够定位某个模块中的某个具体故障;
- 多个event可以mapping 同一个DTC;而同一个event不能mapping 多个DTC;
- DTC可以直接可见,但Event需通过进一步手段才能看到,有时仅对ECU供应商可见;
- DTC代表某类event集中表现,而event则是某个DTC的具体实例;
- event的优先级决定了DTC的优先级;
- event之间的依赖关系决定了DTC的依赖关系;
- DTC的状态位是其map的所有event的状态位的或集;
以下是一个示意图,展示了DTC和故障事件之间的关系:
+------------------+ +-----------------+
| DTC | | 故障事件 |
| | | |
| - 唯一标识符 | | - 发生条件 |
| - 故障类型 | | - 故障处理流程 |
| - 严重程度 | | - 通知其他模块 |
| - 发生条件 | | - 生成DTC |
| | | |
+------------------+ +-----------------+
需要注意的是,具体的DTC和故障事件的定义和属性可以根据系统设计和应用需求进行配置和扩展。在实际应用中,需要根据具体情况进行选择和配置,以满足系统的故障诊断和处理要求。
DTC基本组成
ISO 14229-1的故障诊断码格式规定,故障码信息由四字节组成
DTCHighByte,DTCMiddleByte,DTCLowByte表示服务中的故障诊断码,是高16位、中8位,和DTC code & 0xFF生成的;
StatusOfDTC表示故障码状态。
DTCHighByte,DTCMiddleByte两字节表示故障内码,对应5位标准故障码
第1位是字母,后面4位是数字,如P0120
第一位字母表示故障所属系统,我们把汽车系统分为四大类。分别是动力,底盘,车身,网络通信,分别用PCBU表示。
第二位数字是0、1、2或3表示故障类型,意义如下:“0”代表SAE(美国汽车工程师协会)定义的通用故障码;“1”代表汽车厂家定义的扩展故障码;“2”或“3”表示预留故障码 。
第三位字符表示故障所属的子系统。
最后两位数字表示具体故障对象和类型。
DTCLowByte描述故障种类和子类型,该部分内容描述需遵循ISO 15031-6。对于不需要该字节信息的DTC,该字节填充为0x00。
DTC状态掩码
基础概念
- Test:在线诊断算法,该算法决定系统的故障状态。一个算法对应于一个唯一DTC,非连续性测试在一个监控周期内仅运行一次,连续测试在每次循环中进行调用,可以是毫秒级的;
- Failure:系统不能满足功能,则为一个故障。
- Monitor:可以是一个test也可由多个test组成,用于决定系统故障状态;
- Monitoring cycle:由设备制造商定义,在这个周期下Test可以运行。当然制造商也可定义其它的周期,只要这个定义满足法规要求;
- Complete:在当前监控周期内,test决定是否有故障存在的一种指示。(不仅指failed);
- Operation Cycle:操作循环定义了从监控运行的开始和结束条件。一个操作循环内,监控循环可能运行多次;一个ECU可能支持多个操作循环;对于车身、底盘相关ECU,由制造商定义一个操作循环(如power up到power down或ignition on到ignition off);排放相关的ECU使用engine-running or engine-off时间周期来定义一个操作循环(也称作driving cycle),其由法规来定义
- Pending:Failure的pending状态定义为:在当前操作循环或上一个完成的操作循环内,测试结果为"Failed"; 一旦该故障在一个完整操作循环内测试结果为"Passed", 则复位;
- Aging Threshold:老化阈值,测试未报Failed的操作循环次数;满足某个标准,如warm-up cycles, 老化计数器开始计数,达到阈值后将DTC从non-volatile内存中清除,confirmed位从1变为0;
DTC状态位定义
bit | DTC状态 | 描述 |
---|---|---|
0 | TestFailed | 最近执行测试的结果,Failed则置"1";最近测试通过(pass)或发送清故障码(14)服务则置"0"。 |
1 | TestFailedThisOperationCycle | 在当前操作循环内的测试结果,该操作循环内只要发生过Failed,则置"1"; 开始新的操作循环或发送清故障码服务后,置"0"; |
2 | PendingDTC | 在当前操作循环或上一个完成的操作循环内,测试是否报告过"Failed"; 该状态位只在测试运行和操作循环完成且在该操作循环内从未"Failed"过或发送清故障码(14)服务后才置0;如果在当前操作循环内未完成测试,则状态不变。例如,若设定确认DTC后监测程序停止运行,则pendingDTC(待定DTC)须保持为’1’。对于OBDDTC,在第一个行驶循环检测到故障后,需将其保存为待定DTC。 |
3 | ConfirmedDTC | 表示故障是否检测到了足够的故障次数让DTC存储到long-term memory,若足够,则置"1"; 其为1的时候并不意味着此刻故障存在;发送清除故障码或达到老化阈值则置"0"; |
4 | TestNotCompletedSinceLastClear | 表示一个DTC测试从上次清故障码开始,是否运行过或完成过测试;若没有,则置"1";否则置"0";清故障码置"1"; |
5 | TestFailedSinceLastClear | 表示一个DTC测试从上次清故障码开始,是否测试失败过;若没有,则置"0";否则置"1";清故障码置"0"; |
6 | TestNotCompletedThisOperationCycle | 表示一个DTC测试在当前操作循环内是否运行完成;若没完成,置"1";否则,置"0"; 开始新的操作循环或清故障码后则置"1"; |
7 | WarningIndicatorRequested | 报告与特定DTC相关的任何警告指示器的状态;没有警告,则置"0",有警告,则置"1";如果有警告,则confirmedDTC也应设置为1;清故障码或满足制造商定义的要求,则置"0"; |
上图解释:
- 0 发送清故障码服务后,各状态位进行初始化;
- 1, 2 在完成测试时,bit6,4状态均由1变为0;
- 3, 4, 5, 6 测试结果Failed时,bit0,1,2,5状态均从0变为1;
- 7, 8 测试结果Failed时,bit0为1,测试结果Passed时,bit0为1;
- 9, 10, 12 开始一个新的操作循环,bit1变为0;bit5先变成1,待测试完成再变成0;
- 11 开始下一个操作循环时,该位是否保持上一个操作循环的结果由制造商定义;
- 13, 14, 15 在第二个循环中再次测试Failed,bit0,1,3变为1
autosar 协议中dtc的状态位
监视器与dtc 状态
-
[SWS_Dem_01276] Dem_GetEventUdsStatus:如果调用API Dem_GetEventUdsStatus,且参数EventId中的事件存在并且可用,Dem应将UDS状态字节复制到输出参数UdsStatus字节中,并返回E_OK。
-
[SWS_Dem_01277] API Dem_GetEventUdsStatus:调用API Dem_GetEventUdsStatus,来自参数EventId的事件不存在或不可用,Dem应返回E_NOT_OK。
-
[SWS_Dem_01279] Dem应在调用Dem_SetEventStatus函数的上下文中同步执行基于计数器的事件去抖动。
-
[SWS_Dem_01280] 在调用Dem_SetEventStatus和解除抖动后,Dem应以与UDS状态相同的方式处理监视器状态: Bit0(测试失败)、Bit1(TestNotCompleteThisOperationCycle)
监视器状态字节处理应在调用Dem_SetEventStatus函数的上下文中同步完成 -
[SWS_Dem-01281] 如果配置了参数DemGeneralCallbackMonitorStatusChangedFnc,则Dem应调用此配置的C函数,其签名为<Module>_DemTriggerOnMonitorStatus。
-
[SWS_Dem_01182] 在处理监视器状态时,每当监视器状态发生更改时, Dem应调用监视器状态更改回调函数:_DemTriggerOnMonitorStatus。
-
[SWS_Dem-01283] 当DemEventKind=Dem_event_KIND_SWC处理报告事件的监视器状态时,只要监视器状态发生变化,并且为该事件配置了一个C/S接口,Dem就应调用监视器状态已更改的回调C/S接口CallbackMonitorStatusChange。
-
[SWS_Dem_CONCON_06120]DemGeneralCallbackMonitorStatusChangedFnc的依赖关系
只有当DemGeneralInterfaceSupport设置为TRUE时,DemGeneralCallback MonitorStatus ChangedFNC才会出现。" () -
[SWS_Dem_01278] Dem应提供每个事件的监视器状态,以存储当前监视器状态信息。监视器状态包含Dem_MonitorStatusType中定义的信息。
-
[SWS_Dem_CONSTR_6116] 仅限使用针对SW-Cs报告的事件的监视器状态更改回调:如果从Cdd或BSW模块调用Dem_SetEventAvailable,则相应的监视器状态更改回调只能用作C函数,而不能通过RTE接口。
-
[SWS_Dem-01284] 在处理清除DTC命令时,Dem应将分配给已清除DTC的监视器状态设置为0x04。
-
[SWS_Dem-01285] Dem应异步处理UDS状态。
-
[SWS_Dem.01286] 如果调用API Dem_SetEventStatus,并且Dem已根据[SW_Dem.01280]同步处理了报告的监视器状态,并且无法处理相应的UDS状态(请参见[SW_Dem.01285]),则Dem应报告开发错误Dem_E_UDS_SATATUS_PROCESSING_FAILED。
-
[SWS_Dem_01064] 镜像内存与UDS状态的计算无关。
-
[SWS_DM_1287] 如果调用API Dem_GetMonitorStatus,Dem应将当前监视器状态复制到输出参数MonitorStatus中,并返回E_OK。
-
[SWS_DM_1128] 如果调用API Dem_GetMonitorStatus时使用无效 EventId,Dem应返回E_NOT_OK。
-
[SWS_Dem_01326] 监视器状态应在Dem_Init内初始化。如果监视器状态未初始化,则对Dem_GetMonitorStatus的任何调用都应返回E_NOT_OK。
限制
- 通过RTE使用monitorStatus Change仅限于SWC监控。通过RTE的回调无法覆盖所有基本软件监控。要获得SW-C中所有监控器的完整状态更改信息,应使用eventStatusChange回调。
- 通过RTE更改的CallbackMonitorStatusChange和GeneralCallbackMonitorsChanged仅限于在已知上下文中专门更改其状态的监控器。例如,如果监视器状态从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不是通过RTE作为C/S提供的,因为此回调只能针对SW-C报告的事件而不能针对BSW模块报告的事件进行调用。这显然会导致混乱。
- 如果需要在SW-C监视器状态更改回调中进行一般同步反应,则可以在CDD范围内使用Module_DemGeneralTriggerOnMonitorStatus或Module_DemTriggerOnMonitoringStatus处理同步。
bit位变化说明
- [SWS_Dem_00385] 将清除命令应用于特定DTC后,Dem模块应将UDS状态字节设置为0x50(就绪位4和6设置为1,其他所有位设置为零)。
- [SWS_Dem_00387] Dem模块应支持配置参数DemStatusBitStorageTestFailed(参考DemGeneral),以确定UDS状态位0的信息存储为易失性还是非易失性。
DemStatusBitStorageTestFailed
是DEM模块的一个配置参数,用于配置是否存储测试失败状态位的信息。
参数类型:DemStatusBitStorageTestFailed
是一个布尔类型的配置参数。
参数作用:该参数用于指示DEM模块是否应该存储测试失败状态位的信息。测试失败状态位是用于表示一个事件是否经历了测试失败的状态,这个状态对于诊断和故障处理非常重要。
参数取值:
TRUE:表示DEM应该存储测试失败状态位的信息。当事件发生测试失败时,DEM会记录下该事件的测试失败状态,以便后续的诊断和故障处理。
FALSE:表示DEM不需要存储测试失败状态位的信息。如果该参数被配置为FALSE,DEM将不会记录事件的测试失败状态,可能会导致一些诊断功能不可用。
- [SWS_Dem_00388] 如果用户配置参数DemStatusBitStorageTestFailed设置为False,则Dem模块不应在电源循环期间保留UDS状态位0的信息。
- [SWS_Dem_CONSTR_6113] 测试失败状态位存储器的配置:对于WWH-OBD ECU DemStatusBitStorageTestFailed应设置为True。
- [SWS_Dem_00525]如果配置参数DemStatusBitStorageTest Failed设置为True,则Dem模块应在电源循环期间保留UDS状态位0的信息。
- [SWS_Dem_00389] 如果使用了PendingDTC位,或者如果Dem模块支持操作循环而非电源循环,则事件状态位1(TestFailedThisOperationCycle)的信息是非易失性的
- [SWS_Dem_01183] UDS状态位2的信息需要非易失性存储
- 事件状态位3(ConfirmedDTC)的信息是非易失性的(但也可以根据相应的事件存储器条目进行计算)。
- 事件状态位4(TestNotCompletedSinceLastClear)的信息是非易失性的。
- 事件状态位5(TestFailedSinceLastClear)的信息是非易失性的。
- 如果使用了PendingDTC位,或者如果Dem模块支持操作循环而非电源循环,则UDS状态位6(TestNotCompleteThisOperationCycle)的信息需要非易失性存储。
- UDS状态位7(WarningIndicatorRequested)的信息可能是不稳定的(因为它是基于分配的警告指示器状态计算的)。