【UDS】诊断故障代码老化机制


->返回总目录<-

简介

诊断故障代码(DTC)一旦生成,将会一直保留,直到通过发送诊断指令清除,或者诊断故障代码老化机制确定此故障不复存在。如果故障不复存在,则诊断故障代码的老化用于确保任何关联的诊断故障代码和除已老去计数器之外所有相关的信息都被清除,以确保不至于招致不必要的维护成本。

整个老化机制过程可参考下图
请添加图片描述


相关术语

1. 老化计数器 Ageing counter

老化计数器用于特定诊断故障代码的测试都没有失效的连续操作循环的计数。该数值应存储于非易失性存储器。
如果在一个操作循环(见后面的术语解释)中有任何已失效的测试结果出现, 则其将重置为“0”。

Such As:
1)操作循环:以KL15点火线上下电作为一个操作循环。
2)转向灯开关在第二次操作循环(如下截图位置)出现一次电路故障,ECU记录了DTC故障码:900112。 并同时存储故障发生时的快照数据,扩展数据至NVM(非易失性存储器)。最重要的点在: 故障发生后,测试失败(位0)置为1
在这里插入图片描述
3)在第三个操作循环检测,发现该故障已经恢复,变成了历史故障,即:测试失败(位0)置为0。此时,老化计数器会加1。
当此历史故障状态保持了40个操作循环,老化计数器会加到40。之后ECU会清除该故障信息(包含相应的快照数据等)。

~

2. 诊断故障代码已老去 DTC aged

诊断故障代码已老去用于表征诊断故障代码因已充分老去而从电控单元中移除的现象。

~

3. 已老去计数器 Aged counter

已老去计数器用于自上次清除诊断故障代码后,诊断故障代码已老去次数的计数。该数值应存储于非易失性存储器。 如果数值溢出,则其应保持在 255(十六进制0xFF)

~

4. 操作循环 Operation cycle

什么是Operation Cycle?关于Operation Cycle的定义,Autosar的DEM(Specifification of Diagnostic Event Manager)解释如下:
每个事件被分配到一个操作周期,例如点火周期。可以使用Dem_SetOperationCycleState()函数启动和停止操作周期。只有当相应的操作周期启动时,才可能向Dem报告事件,否则报告将被丢弃。在这方面,操作周期充当了无法规避的附加启用条件。
在这里插入图片描述
种类:标准中给了四个操作循环类型。一般常使用 IGNITION,POWER
1,IGNITION:就是KL15点火线上下电
2,OBD_DCY:OBD Driving cycle主要由Master ECU提供,Primary ECUs使用(一般没用过)
3,WARMUP:Warm up cycle,字面意思温升。可以理解成发动机启动水箱的温升。
4,POWER:可以理解为ECU从完全断电到供电的过程。与IGNITION有什么不同呢?点火循环中,ECU未必断电。
在这里插入图片描述
下面代码段是基于AutoSar开发中,运用的操作循环启动关闭方法:

/* Operation Cycle process */
  (void)Rte_Read_PwrM_IgnPwrState(&AppDiagVal.IgnPwrSts);

  if( AppDiagVal.IgnPwrSts != AppDiagVal.lstIgnPwrSts )
  {
    if( AppDiagVal.IgnPwrSts == PWRM_STATE_EN_IGN_ON)
    {
      /* Start Operation Cycle : Ign cycle */
      (void)Dem_GetOperationCycleState(DemConf_DemOperationCycle_IgnitionCycle, &DemOperationCycleState);
      if( DemOperationCycleState != DEM_CYCLE_STATE_START )
      {
        (void)Dem_SetOperationCycleState(DemConf_DemOperationCycle_IgnitionCycle, DEM_CYCLE_STATE_START);
      }
    }
    else
    {
      /* End Operation Cycle : Ign cycle */
      (void)Dem_GetOperationCycleState(DemConf_DemOperationCycle_IgnitionCycle, &DemOperationCycleState);
      if( DemOperationCycleState != DEM_CYCLE_STATE_END )
      {
        (void)Dem_SetOperationCycleState(DemConf_DemOperationCycle_IgnitionCycle, DEM_CYCLE_STATE_END);
      }
    }
  }
  else
  {
    /* do nothing */
  }
  
  AppDiagVal.lstIgnPwrSts = AppDiagVal.IgnPwrSts;

5. 诊断故障代码老化机制 DTC aging mechanism

如果之前 40 个连续的操作循环期间, 每个操作循环的测试都没有失效,则允许相应的诊断故障代码老去。 具体参见简介中的图 。如果某操作循环的测试已完成且没有失效,则“未确认的诊断故障代码”位重置为“0”(简介中图关键点 a),故障待定计数器也重置为“0”,并且老化计数器加 1(简介中图 的关键点 b 和 c)。由于在连续的操作循环内,测试没有失效,故老化计数器持续增加(简介中图 的关键点 d)。如果老化计数器到达最大值(即 40)(简介中图 的关键点 f),则此时“已确认的诊断故障代码”位重置为“0”(简介中图 的关键点 e)。

~

总结

可能描述的还不够清晰,欢迎大佬前来指点下,共同学习哈~

->返回总目录<-

  • 11
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论
汽车 UDS 诊断协议是一种用于汽车电子控制单元(ECU)之间通信的标准化协议。实现 UDS 诊断的 C 代码主要包括以下几个部分: 1. 建立连接:UDS 协议使用一种称为“诊断会话”的机制来管理诊断请求和响应消息。在建立诊断会话之前,需要与 ECU 建立物理连接。建立连接的过程包括初始化通信参数、发送身份验证请求等。 2. 发送诊断请求:UDS 协议定义了一系列标准化的诊断服务,如读取故障码、清除故障码、读取实时数据等。发送诊断请求时,需要指定所需的服务以及服务相关的参数。 3. 处理诊断响应:ECU 收到诊断请求后,会返回相应的诊断响应。诊断响应包括响应码和响应数据。处理诊断响应的过程包括解析响应码和响应数据,并根据需求进行相应的处理。 以下是一个简单的示例代码,实现了 UDS 协议中的读取故障码服务: ```c #include <stdio.h> // UDS 服务标识符 #define UDS_SERVICE_READ_DTC 0x19 // UDS 响应码 #define UDS_RESPONSE_OK 0x00 #define UDS_RESPONSE_GENERAL_REJECT 0x10 #define UDS_RESPONSE_SERVICE_NOT_SUPPORTED 0x11 // 模拟 ECU 返回的故障码数据 uint8_t dtc_data[] = {0x01, 0x02, 0x03}; // 发送 UDS 诊断请求 int send_uds_request(uint8_t service_id, uint8_t* data, uint16_t size) { // TODO: 实现发送 UDS 请求的代码 return 0; } // 处理 UDS 诊断响应 int handle_uds_response(uint8_t* data, uint16_t size) { uint8_t response_code = data[0]; if (response_code == UDS_RESPONSE_OK) { // 解析故障码数据 uint8_t dtc_count = data[1]; uint16_t dtc_index = 2; for (int i = 0; i < dtc_count; i++) { uint32_t dtc = (dtc_data[dtc_index] << 16) | (dtc_data[dtc_index + 1] << 8) | dtc_data[dtc_index + 2]; printf("DTC: %06X\n", dtc); dtc_index += 3; } return 0; } else if (response_code == UDS_RESPONSE_GENERAL_REJECT) { printf("UDS response: general reject\n"); return -1; } else if (response_code == UDS_RESPONSE_SERVICE_NOT_SUPPORTED) { printf("UDS response: service not supported\n"); return -1; } else { printf("UDS response: unknown response code %02X\n", response_code); return -1; } } int main() { // 发送读取故障码服务请求 uint8_t request_data[] = {UDS_SERVICE_READ_DTC, 0x00, 0x00}; if (send_uds_request(UDS_SERVICE_READ_DTC, request_data, sizeof(request_data)) < 0) { printf("Failed to send UDS request\n"); return -1; } // 处理 UDS 响应 uint8_t response_data[256]; int response_size = 0; // TODO: 实现接收 UDS 响应的代码 if (handle_uds_response(response_data, response_size) < 0) { printf("Failed to handle UDS response\n"); return -1; } return 0; } ``` 这只是一个简单的示例,实际实现中还需要考虑更多细节,如安全访问、数据加密等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&春风有信

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值