2

我试图从 CAPL 脚本中读取 DTC。我正在使用“(0x19) ReadDtcInformation - 按 DTC 编号报告 DTC 快照记录”协议服务。我的 DTC 号码是 0x062003。我能够正确设置 DTC 编号。但是,我无法设置 DTC 状态位。

1. diagRequest FR_Diagnostic.FaultMemory_ReadEnvironmentData PWM_Status; // 0x19 0x94
2. diagSetParameter(PWM_Status,"DTC",0x062003);  // 0x06 0x20 0x03
3. diagSetParameter(PWM_Status,"DtcSnapshotRecordNumber",0xFF); 
4. DiagSendRequest(PWM_Status);

第 3 行没有将 DtcSnapshotRecordNumber 设置为 0xFF。我在跟踪中将此字段视为 0x00。

问题:1. 我在第 3 行中使用了正确的 API 吗?如何设置 DtcSnapshotRecordNumber 以读取所有状态位?(有 8 个状态位需要监控,因此应该设置为 0xFF)。

4

2 回答 2

0

回答我自己:

  1. 是的,我使用了正确的 API。
  2. 由于数据库 (.cdd) 文件中使用的数据类型错误,因此未正确设置。

我本可以将 .cdd 文件转换为模板并编辑模板并使用更新的 .cdd 文件,但我选择使用新的模板副本来解决它。

于 2018-05-21T19:35:32.190 回答
0

通常,您调用服务 0x19(诊断)然后调用子函数,然后您提供一个位掩码,其中包含您正在搜索的信息。

因此,您需要的一切都在 ISO 14229 公路车辆中定义。

大多数有关 DTC 和 OBD 的服务在所有 OEM 中都是相同的。每个 OEM 通常都有一个诊断规范补充,其中描述了 OEM 特定的诊断服务等。

在 CAPL 中,通常有一种读取 DTC 的简单方法。您不需要手动操作,因为它由 CDD 文件提供。您可以在右侧的 CAPL 浏览器的对象浏览器中看到它。

所以对于你的鸡蛋情况。检索与您的掩码匹配的 DTC 数量:

子功能报告 DTCByStatusMask 0x02

0x1902

作为您的搜索过滤器的掩码将像这样构建:

bit # 十六进制状态描述 0 0x01 testFailed DTC 在请求时失败 1 0x02 testFailedThisOperationCycle DTC 在当前操作周期失败 2 0x04 pendingDTC 在当前或上一个操作周期失败 3 0x08 confirmDTC 在请求时确认 DTC 4 0x10 testNotCompletedSinceLastClear 自上次代码清除以来 DTC 测试未完成 5 0x20 testFailedSinceLastClear 自上次代码清除以来 DTC 测试至少失败一次 6 0x40 testNotCompletedThisOperationCycle DTC 测试未完成此操作周期 7 0x80 warningIndicatorRequested 服务器正在请求激活warningIndicator

因此,如果您只想读取已确认(存储)的 DTC,而不是发送:

0x190208

如果您得到肯定的响应,则 DTC 将以十六进制格式检索。您需要一个 HEX->SAE 转换器,它将检索到的 DTC 转换为常规已知格式。无论如何,您可以通过诊断控制台对其进行测试。

于 2018-05-21T19:22:50.270 回答