在上一篇文章《ISO 14229标准讲解:UDS简介》中,我们对汽车诊断、UDS协议的概念和其在OSI基础参考模型上的应用有了一个简单的认识,而本篇文章以ISO 14229-1标准为指导,聚焦于UDS协议本身,讲解其定义的诊断服务、诊断流程和通用化诊断数据格式。
目录
1 诊断服务
UDS诊断服务实际就是各种诊断功能和操作的集合,旨在为车辆提供执行诊断、编程、配置和控制的能力。
在ISO 14229-1-2020版标准中,一共定义了26种UDS诊断服务,并为这些服务提供了标准化的接口和使用方法。每个UDS诊断服务都有唯一的服务标识符,即ServiceID(SID),其用于在诊断流程中标识要执行或响应的诊断服务。部分UDS诊断服务还提供对子功能(sub-function)的支持。子功能是对诊断服务功能的细化和补充,其为Tester与ECU的交互提供了更详细的诊断指令集。Tester在请求诊断服务时,通过子功能可以更精细地控制诊断过程,使得诊断过程更加精确和高效。
在ISO 14229-1-2020版标准中定义的所有UDS诊断服务都被划分到六大功能单元,由下表分别可见,其中标绿的诊断服务为常用的诊断服务,需要重点关注和学习。
1.1 诊断和通信管理功能单元
SID | Service | 诊断服务名称 | 功能简述 | 子功能 |
---|---|---|---|---|
0x10 | DiagnosticSessionControl | 诊断会话控制 | Tester向目标ECU请求控制诊断会话状态 | 有 |
0x11 | ECUReset | ECU复位 | Tester向目标ECU请求强制执行复位操作 | 有 |
0x27 | SecurityAccess | 安全访问 | Tester向目标ECU请求解锁安全访问 | 有 |
0x28 | CommunicationControl | 通讯控制 | Tester向目标ECU请求控制通信行为 | 有 |
0x29 | Authentication | 身份认证 | Tester向目标ECU请求身份认证 | 有 |
0x3E | TesterPresent | 待机握手 | Tester向目标ECU指示它仍在线 | 有 |
0x84 | SecuredDataTransmission | 安全数据传输 | Tester向目标ECU请求进行具有拓展数据链路安全性的数据传输 | |
0x85 | ControlDTCSetting | 控制DTC的设置 | Tester向目标ECU请求控制DTC的设置 | 有 |
0x86 | ResponseOnEvent | 事件响应 | Tester向目标ECU请求设置和控制特定的事件机制 | 有 |
0x87 | LinkControl | 链路控制 | Tester向目标ECU请求控制通信波特率 | 有 |
1.2 数据传输功能单元
SID | Service | 诊断服务名称 | 功能简述 | 子功能 |
---|---|---|---|---|
0x22 | ReadDataByIdentifier | 通过DID读数据 | Tester向目标ECU请求读取指定DID的当前值 | |
0x23 | ReadMemoryByAddress | 通过地址读内存 | Tester向目标ECU请求读取指定内存范围的当前值 | |
0x24 | ReadScalingDataByIdentifier | 通过DID读缩放数据/换算信息 | Tester向目标ECU请求读取指定DID的缩放数据 | |
0x2A | ReadDataByPeriodicIdentifier | 周期性读DID数据 | Tester向目标ECU请求周期性读取指定DID的当前值 | |
0x2C | DynamicallyDefineDataIdentifier | 动态定义DID | Tester向目标ECU请求动态定义DID | 有 |
0x2E | WriteDataByIdentifier | 通过DID写数据 | Tester向目标ECU请求写入指定数据给指定的DID | |
0x3D | WriteMemoryByAddress | 通过地址写内存 | Tester向目标ECU请求写入指定数据到指定的内存范围 |
1.3 存储数据传输功能单元
SID | Service | 诊断服务名称 | 功能简述 | 子功能 |
---|---|---|---|---|
0x14 | ClearDiagnosticInformation | 清除诊断信息 | Tester向目标ECU请求清除诊断信息 | |
0x19 | ReadDTCInformation | 读取故障码信息 | Tester向目标ECU请求读取诊断信息 | 有 |
1.4 输入输出控制功能单元
SID | Service | 诊断服务名称 | 功能简述 | 子功能 |
---|---|---|---|---|
0x2F | InputOutputControlByIdentifier | 通过ID控制输入输出 | Tester向目标ECU请求控制特定的输入/输出 |
1.5 例程控制功能单元
SID | Service | 诊断服务名称 | 功能简述 | 子功能 |
---|---|---|---|---|
0x31 | RoutineControl | 例程控制 | Tester向目标ECU请求启动、停止例程或查询例程结果 | 有 |
1.6 上传下载功能单元
SID | Service | 诊断服务名称 | 功能简述 | 子功能 |
---|---|---|---|---|
0x34 | RequestDownload | 请求下载 | Tester向目标ECU请求从Tester到目标ECU的数据传输 | |
0x35 | RequestUpload | 请求上传 | Tester向目标ECU请求从目标ECU到Tester的数据传输 | |
0x36 | TransferData | 数据传输 | Tester向目标ECU发送数据(下载)或请求数据(上传) | |
0x37 | RequestTransferExit | 请求退出传输 | Tester向目标ECU请求终止数据传输 | |
0x38 | RequestFileTransfer | 请求文件传输 | Tester向目标ECU请求在Tester和目标ECU之间进行文件传输 |
2 诊断流程
我们知道,在进行车辆诊断的时候,Tester与ECU是采用一问一答的形式进行通信。Tester首先向ECU发送诊断请求报文,在该诊断请求报文里,会包含一些必要的诊断信息,例如需要执行的诊断服务和执行诊断服务所需的参数。当ECU收到诊断请求报文后,会去解析诊断请求报文,并根据诊断请求的要求执行对应的诊断服务。若诊断服务执行成功,则将执行后的诊断结果数据打包到诊断响应报文并发送给Tester,这种诊断响应一般被称为肯定响应或正响应;若诊断服务执行失败,则将执行诊断服务失败的原因打包到诊断响应报文发送给Tester,这种诊断响应一般被称为否定响应或负响应。
车辆诊断具体流程如下所示:
- 第一步,Tester与车辆建立通信连接
- 第二步,Tester向ECU发送诊断请求报文
- 第三步,ECU接收诊断请求报文并解析
- 第四步,ECU执行诊断服务
- 第五步
- 若执行成功,ECU向Tester发送诊断肯定响应报文
- 若执行失败,ECU向Tester发送诊断否定响应报文
- 第六步,Tester接收诊断响应报文并解析
在肯定响应报文里,可能会包含车辆状态信息、ECU状态信息、故障码等关键数据,而在否定响应报文里,则会包含诊断服务执行失败的原因,汽车工程师可以利用这些数据对车辆做进一步分析。
3 诊断数据格式
虽然在ISO 14229-1标准中定义的诊断服务多达26种,但是,所有诊断服务的诊断请求数据格式和诊断响应数据格式都被UDS协议统一定义。
3.1 诊断请求数据格式
诊断请求用于Tester向车辆请求某个ECU或整车ECU执行某种诊断服务,要进行车辆诊断,必须先发起诊断请求。UDS诊断请求数据格式由三个参数组成,详细可见下表:
字节序 | #Byte1 | #Byte2 | #Byte3 – #ByteN |
参数 | ServiceID(SID) | sub-function (bit7: SPR + bit0-6: sub-function parameter value) | diagnostic request data |
说明 | 必选 | 可选 | 可选 |
- ServiceID(SID):诊断服务标识符,用于标识请求执行的诊断服务,其类型为1byte无符号整型
- 对于所有的诊断请求,SID字节的bit6 = 0
- sub-function:子功能,用于标识诊断服务执行的具体细节,其类型为1byte无符号整型
- 该参数为可选参数,某些诊断服务不支持子功能,因此也就不需要这个参数
- 该1byte参数由bit7正响应抑制位(suppressPosRspMsgIndicationBit, SPR)和bit0-6子功能参数(sub-function parameter value)构成
- SPR = 0,用于指示ECU需要给出正响应。若某个诊断服务不支持子功能,即没有本字节时,则默认需要ECU给出正响应
- SPR = 1,用于指示ECU不要给出正响应。其目的在于减少ECU非必要响应的发送,从而节约系统通信资源
- diagnostic request data:诊断请求数据,其应包含执行诊断服务所需的所有数据
- 该参数为可选参数,某些诊断服务的正常执行不需要该参数
UDS协议定义了两种不同寻址方式的诊断请求,分别为:物理寻址(physical addressing)和功能寻址(function addressing)
- 物理寻址:采用端对端的通信方式,Tester发送诊断请求给某个ECU
- 功能寻址:采用广播的通信方式,Tester发送诊断请求给整车ECU1
3.2 诊断响应数据格式
当车辆ECU收到来自Tester的诊断请求后,会去执行对应的诊断服务,若诊断服务执行成功,则会向Tester回复肯定响应(Positive Response),反之,则向Tester回复否定响应(Negative Response),这两种诊断响应,都有统一的数据格式。
3.2.1 肯定响应
UDS诊断肯定响应数据格式由三个参数组成,详细可见下表:
字节序 | #Byte1 | #Byte2 | #Byte3 – #ByteN |
参数 | ServiceID(SID) + 0x40 | sub-function | diagnostic response data |
说明 | 必选 | 可选 | 可选 |
- ServiceID(SID):诊断服务标识符,用于标识肯定响应对应的诊断服务,其类型为1byte无符号整型
- 对于所有的诊断肯定响应,SID字节的bit6 = 1,这也就是诊断肯定响应中SID参数值等于对应诊断请求中SID参数值加0x40的原因
- sub-function:子功能,回显对应诊断请求的sub-function参数,其类型为1byte无符号整型
- diagnostic response data:诊断响应数据,其应包含执行诊断服务成功后的所有诊断结果数据
- 该参数为可选参数,某些诊断服务的正常执行不存在诊断结果数据
3.2.2 否定响应
诊断否定响应数据格式由三个参数组成,详细可见下表:
字节序 | #Byte1 | #Byte2 | #Byte3 |
参数 | Negative Response SID(0x7F) | ServiceID(SID) | Negative Response Code |
说明 | 必选 | 必选 | 必选 |
- Negative Response SID:诊断否定响应的特定标识符,其值为固定值:0x7F
- ServiceID(SID):诊断服务标识符,用于标识否定响应对应的诊断服务,其类型为1byte无符号整型
- Negative Response Code(NRC):诊断否定响应码,用于指示诊断请求否定响应的原因,其类型为1byte无符号整型
3.2.3 NRC
在UDS协议中,NRC码用于指示诊断服务执行失败(否定响应)的具体原因,其大小为一个字节,不同取值对应不同的否定响应原因。在ISO 14229-1-2020版标准中,NRC码的取值范围从0x00 — 0xFF被分成了三个部分:
- 0x00:positiveResponse参数,为ECU内部实现所保留,不能在否定响应中使用
- 0x01 — 0x7F:与通信相关的否定响应码
- 0x80 — 0xFF:指示不满足执行诊断服务特定条件的具体原因的否定响应码,这些NRC可以附加在NRC 0x22(conditionsNotCorrect)的后面,用于更加详细的解释为什么诊断请求无法被执行。
在ISO 14229-1-2020版标准中定义的所有NRC码可参见下表:
NRC | NRC define | 描述 |
---|---|---|
0x00 | positiveResponse | 为ECU内部实现所保留,不能在否定响应中使用 |
0x01 – 0x0F | ISOSAEReserved | ISO保留 |
0x10 | generalReject | 未定义的否定响应 |
0x11 | serviceNotSupported | ECU不支持该诊断请求服务 |
0x12 | sub-functionNotSupported | ECU不支持该诊断请求服务的子功能 |
0x13 | incorrectMessageLengthOrInvalidFormat | 诊断请求指令的长度或格式不对 |
0x14 | responseTooLong | 诊断响应数据过长,超过网络层支持的最大字节数 |
0x15 – 0x20 | ISOSAEReserved | ISO保留 |
0x21 | busyRepeatRequest | 当前ECU诊断在忙,拒绝诊断请求 |
0x22 | conditionsNotCorrect | 执行诊断的条件不满足 |
0x23 | ISOSAEReserved | ISO保留 |
0x24 | requestSequenceError | 诊断请求的发送顺序不正确 |
0x25 | noResponseFromSubnetComponent | ECU响应超时 |
0x26 | FailurePreventsExecutionOfRequestedAction | 某DTC阻止了该诊断请求 |
0x27 – 0x30 | ISOSAEReserved | ISO保留 |
0x31 | requestOutOfRange | 诊断请求参数超出范围或DID/RID不支持 |
0x32 | ISOSAEReserved | ISO保留 |
0x33 | securityAccessDenied | 不满足安全策略 |
0x34 | ISOSAEReserved | ISO保留 |
0x35 | invalidKey | 钥匙不匹配($27服务使用) |
0x36 | exceedNumberOfAttempts | 尝试解锁次数达上限($27服务使用) |
0x37 | requiredTimeDelayNotExpired | 请求解锁的重试延时未到($27服务使用) |
0x38 | secureDataTransmissionRequired | 需要安全的数据传输 |
0x39 | secureDataTransmissionNotAllowed | 不允许安全数据传输 |
0x3A | secureDataVerificationFailed | 安全数据验证失败 |
0x3B – 0x4F | reservedByExtendedDataLinkSecurityDocument | 数据链路安全性拓展保留 |
0x50 | Certificate verification failed – Invalid Time Period | 证书验证失败-时间段无效 |
0x51 | Certificate verification failed – Invalid Signature | 证书验证失败-签名无效 |
0x52 | Certificate verification failed – Invalid Chain of Trust | 证书验证失败-证书链无效 |
0x53 | Certificate verification failed – Invalid Type | 证书验证失败-类型无效 |
0x54 | Certificate verification failed – Invalid Format | 证书验证失败-格式无效 |
0x55 | Certificate verification failed – Invalid Content | 证书验证失败-内容无效 |
0x56 | Certificate verification failed – Invalid Scope | 证书验证失败-作用域无效 |
0x57 | Certificate verification failed – Invalid Certificate (revoked) | 证书验证失败-证书无效(已吊销) |
0x58 | Ownership verification failed | 所有权验证失败 |
0x59 | Challenge calculation failed | 挑战计算失败 |
0x5A | Setting Access Rights failed | 设置访问权限失败 |
0x5B | Session key creation/derivation failed | 会话密钥创建/派生失败 |
0x5C | Configuration data usage failed | 配置数据使用失败 |
0x5D | DeAuthentication failed | 取消身份验证失败 |
0x5E – 0x6F | ISOSAEReserved | ISO保留 |
0x70 | uploadDownloadNotAccepted | 不允许上传/下载($34服务使用) |
0x71 | transferDataSuspended | 数据传输操作由于某些故障而中止 |
0x72 | generalProgrammingFailure | 擦除或刷写内存时错误 |
0x73 | wrongBlockSequenceCounter | 块序列计数错误 |
0x74 – 0x77 | ISOSAEReserved | ISO保留 |
0x78 | requestCorrectlyReceived-ResponsePending | 已收到诊断请求,但会晚些响应 |
0x79 – 0x7D | ISOSAEReserved | ISO保留 |
0x7E | sub-functionNotSupportedInActiveSession | 当前会话下,该子功能不支持 |
0x7F | serviceNotSupportedInActiveSession | 当前会话下,该服务不支持 |
0x80 | ISOSAEReserved | ISO保留 |
0x81 | rpmTooHigh | 转速过高 |
0x82 | rpmTooLow | 转速过低 |
0x83 | engineIsRunning | 发动机正在运行中 |
0x84 | engineIsNotRunning | 发动机未在运行 |
0x85 | engineRunTimeTooLow | 发动机运行时间太短 |
0x86 | temperatureTooHigh | 温度过高 |
0x87 | temperatureTooLow | 温度过低 |
0x88 | vehicleSpeedTooHigh | 车速过高 |
0x89 | vehicleSpeedTooLow | 车速过低 |
0x8A | throttle/PedalTooHigh | 节气门/油门踏板过高 |
0x8B | throttle/PedalTooLow | 节气门/油门踏板过低 |
0x8C | transmissionRangeNotInNeutral | 变速箱未在空挡 |
0x8D | transmissionRangeNotInGear | 变速箱不在挡位 |
0x8E | ISOSAEReserved | ISO保留 |
0x8F | brakeSwitch(es)NotClosed (Brake Pedal not pressed or not applied) | 未踩制动踏板 |
0x90 | shifterLeverNotInPark | 换挡杆不在P挡 |
0x91 | torqueConverterClutchLocked | TCC锁止 |
0x92 | voltageTooHigh | 电压过高 |
0x93 | voltageTooLow | 电压过低 |
0x94 | ResourceTemporarilyNotAvailable | 资源暂时不可用 |
0x95 – 0xEF | reservedForSpecificConditionsNotCorrect | 其他特殊的不满足诊断执行条件保留 |
0xF0 – 0xFE | vehicleManufacturerSpecificConditionsNotCorrect | 车辆制造商指定不满足诊断执行条件保留 |
0xFF | ISOSAEReserved | ISO保留 |
- OEM会定义一个特殊的地址用于指示功能寻址,例如:吉利汽车的功能寻址地址即为0x1FFF。 ↩︎