UDS诊断系列之十八故障码的状态掩码
在谈19服务的子功能之前,先说一下故障码(DTC)的状态掩码是什么。
一、状态掩码
状态掩码由八个状态位构成,客户端利用它向服务器请求与其状态相匹配的DTC信息。当服务器接收到来自客户端的请求时,它会通过过滤匹配的状态位掩码来进一步处理该请求。
如果DTC的实际状态位中的任何一个被设置为“1”,并且请求掩码中相应的状态位也是“1”(即,请求掩码与DTC的实际状态进行位逻辑AND运算,并且结果不为零),那么认为DTC的状态与状态掩码是匹配的。
如果客户端提供了一个包含服务器不支持的状态位的掩码,服务器应当仅使用其支持的状态位来处理DTC信息,忽略不支持的状态位,以确保请求的准确处理。
二、状态掩码定义
在阐述状态掩码各位的含义之前,有必要先介绍几个重要概念:
- 测试(Test):
故障检测是一种测试行为,针对特定的故障内容执行一系列检测动作。这种检测可能是在特定条件下执行一次,也可能是定期进行。每次检测都会产生一个结果,即成功或失败。测试有时会因干扰产生错误的反馈结果,实际的情况可能需要通过累积的数据(如计数器记录的错误次数)来判断。 - 测试样本(Test Sample):
每次进行的测试被称为一个测试样本。这些样本可能通过或失败,但这并不代表存在故障。由于测试过程中可能会受到外部干扰,因此需要设立一个计数器来记录错误的次数,以便后续分析和判断。 - 操作循环(Operation Cycle):
操作循环是指控制器的一次完整的上下电过程,比如从电源接通到断开的过程。对于与排放相关的节点,操作循环可能是一次发动机启动到停止的过程。此外,它还可以指代从唤醒到休眠的过程,特别是在涉及到控制器或设备的唤醒和休眠机制的情境下。控制器的整个工作周期被称为一个操作循环。
在此基础上我们可以理解状态掩码的相关概念,状态掩码是一个用于表示不同状态信息的编码方式,其中每一位都有其特定的含义。下面将详细解释状态掩码的名称及其含义:
bit | Name | Description |
---|---|---|
0 | testFailed | 最近的一次测试结果是失败,表示当前存在故障 |
1 | testFailedThisOperationCycle | 当前操作循环测试结果至少有一次是失败的 |
2 | pendingDTC | 当前操作循环和上一个操作循环测试结果至少有一次是失败的,也就是说最近有测试失败的情况 |
3 | confirmedDTC | 已经符合故障确认的条件,即测试失败的次数达到确认故障的要求,但并不代表当前故障依然存在 |
4 | testNotCompletedSinceLastClear | 自从上次故障被清除之后,还没有完成测试 |
5 | testFailedSinceLastClear | 自从上次故障被清除之后,故障测试结果至少有一次是失败的 |
6 | testNotCompletedThisOperationCycle | 当前操作循环还没有完成测试 |
7 | warningIndicatorRequested | 有一些故障可能需要展示一些提示,如果测试失败并且提示条件满足,该位置1 |
上述八个位通常不会全部同时使用,实际上,常用的主要是 bit0 和 bit3。具体而言,bit0 代表当前故障,而 bit3 则表示历史故障。
三、使用示例
状态掩码在UDS(统一诊断服务)中扮演重要的角色,拥有多种应用。虽然定义相同,但由于其在不同场景下的使用,赋予了不同的含义。以下是详细的解释:
- DTCStatusMask:这一参数主要在UDS的19服务中的某些请求中使用,如01和02子功能。它表示所请求的状态。例如,当此参数在请求中为0x01时,它表示请求与bit0 = 1的DTC相关的信息。
- DTCStatusAvailabilityMask:这个掩码存在于部分19服务的响应中,用于表明控制器支持哪些状态掩码。例如,当值为0x09时,它表示控制器支持bit0和bit1的故障状态。在实际应用中,只有这两个位会根据情况变化,其他位的状态默认为0。
- statusOfDTC:这表示故障码当前的实际状态,通常存在于19服务的响应中。它是故障码DTC的第四个字节,反映了具体的故障状态信息。
简而言之,这三个状态掩码虽然在UDS中有不同的应用场景和含义,但它们的核心定义是相同的。它们共同为诊断工具提供了关于故障码状态的详细和准确信息。
假设控制器支持的 DTCStatusAvailabilityMask 为 0x09,当我们使用 19 服务进行请求时,希望的 DTCStatusMask 为 0x01。以下是一些 DTC 示例,我们将尝试反馈出正确的结果。
DTC | statusOfDTC |
---|---|
0xD00187 | 0x01 |
0xD00287 | 0x08 |
0xD00386 | 0x09 |
当使用 DTCStatusMask = 0x01 读取故障信息时,反馈结果的计算方法如下:
result=statusOfDTC&DTCStatusAvailabilityMask&DTCStatusMask
如果上述计算结果不为零,则认为匹配。接下来,我们将按照这一计算方法对给定的三个故障进行计算,得到如下结果:
DTC | statusOfDTC | DTCStatusAvailabilityMask | DTCStatusMask | result |
---|---|---|---|---|
0xD00187 | 0x01 | 0x09 | 0x01 | 0x01&0x09&0x01 = 0x01 |
0xD00287 | 0x08 | 0x09 | 0x01 | 0x08&00x09&0x01 = 0x00 |
0xD00386 | 0x09 | 0x09 | 0x01 | 0x09&0x09&0x01 = 0x01 |
如果请求的是 DTC 的数量,则返回结果为 2。如果请求的是故障信息,则返回第一个和第三个故障的相关结果。