type
status
date
slug
summary
tags
category
icon
password
一、UDS简介
统一诊断服务(英语:Unified Diagnostic Services,简称UDS)是车用电子的通信协议,是电子控制器(ECU)中设备诊断用的网络传输协议,对应的标准是ISO 14229-1[1]。此标准是派生自ISO 14230-3(KWP2000)以及目前已不使用的ISO 15765-3 (控制器局域网上的诊断通信,DoCAN[2])。“统一诊断服务”中的“统一”是指此标准是国际性标准,不是特定公司的专用标准。目前所有一阶供应商新生产的ECU都已支持此通信协议,也已集成到其他标准中,例如AUTOSAR。现代汽车中的电子控制器控制了非常多的机能,包括燃料喷射设备(EFI)、发动机控制器、传动、防锁死刹车系统(ABS)、门锁、刹车、窗户动作等。
诊断工具可以连接车上所有支持统一诊断服务功能的电子控制器。车上常用的控制器局域网只用到OSI模型的第一层及第二层,而统一诊断服务集成了OSI模型的第五层及第七层。服务标识符(Service ID、SID)及服务相关的参数都放在8个字节的消息框内。
现今的车辆有配合离线诊断的诊断接口,让电脑或是诊断工具(作为测试设备)可以连接到汽车上的通信系统。因此可以发送统一诊断服务的请求到控制器,控制器必须回复(可能是正面或是负面的回复),这样可以确认个别控制单元中的故障存储器、更新控制单元的固件、和硬件进行低端的交互(例如开启或关闭特定的输出)、或是进行特定的机能,目的是了了解电子控制器的环境或是操作条件,以诊断故障或是不希望出现的行为。
二、UDS所包含的常用的服务
功能群 | 请求 SID | 回复 SID | 服务 | 说明 |
ㅤ | ㅤ | 0x7F | 否定回应Negative Response | 此回应会在服务无法进行时回复,例如不支持的资料识别符。此时会加上否定的回应码。 |
存储资料发送 | 0x14 | 0x54 | 清除诊断信息Clear Diagnostic Information | 清除已存储的诊断问题码(Diagnostic Trouble Code,简称DTC) |
存储资料发送 | 0x19 | 0x59 | 读取DTC信息Read DTC Information | DTC是诊断问题码。每一个DTC对应一个控制单元的故障,会以其编码存储在错误存储器中,可以在任意时候读取。除了错误外,也可能会记录一些相关的信息,也可以一并读取。 |
上传/下载 | 0x34 | 0x74 | 请求下载Request Download | 利用“请求下载”服务,可以下载新的软件或是其他资料到控制单元内。需标示资料的位置以及长度,因此,控制器可以知道数据包的大小。 |
上传/下载 | 0x35 | 0x75 | 请求上传Request Upload | “请求上传”服务和“请求下载”服务是类似的,此服务可以将控制单元的软件发送给测试者。也需标示资料的位置以及长度,测试者需指定数据包的大小。 |
上传/下载 | 0x36 | 0x76 | 发送资料Transfer Data | 在真正发送资料时,会用到此一服务,不论是上传或是下载都是使用此一服务。发送的方向则视之前是“请求上传”服务或“请求下载”服务而不同。此一服务会用之前指定的最大数据包长度发送资料,若资料长度超过最大数据包长度,需要用数个数据包来发送,直到发送完成为止。 |
上传/下载 | 0x37 | 0x77 | 请求结束发送Request Transfer Exit | 可以用此服务中止资料发送。此服务用在测试着和控制单元比较时。在执行时,控制单元可以负面回应来中止资料发送请求。若指定的资料量还没发送完,也可以用此服务中止发送。 |
上传/下载 | 0x38 | 0x78 | 请求文件发送Request File Transfer | 此服务用来启始客户端到服务器的文件下载,或是服务器到客户端的文件上传。也可以提供一些文件系统的相关信息。 |
输入/输出控制 | 0x2F | 0x6F | 根据标识符的输入/输出控制Input Output Control By Identifier | 此服务可以让外部系统接口透过诊断接口控制输入/输出信号
透过设置选择字节,可以设置有关请求的特殊条件,可以设置以下的值: ReturnControlToECU:设备需将信号的控制权送回
ResetToDefault:测试者试图重置信号,回到系统的默认值 Freeze Current State:设备需冻结目前的信号,不允许变化
ShortTermAdjustment:设备需使用目前提供的信号值 |
远程启动程序 | 0x31 | 0x71 | 远程控制Routine Control | 此控制服务程序可以进行各种的服务,有三种不同的信息种类:
配合启始信息,可以开始服务。可以定义此信息来确认要执行各动作,或是提示服务已经完成。 配合停止信息,运行中的服务可以在任何时间下中断。
第三个选项是查询服务状态的信息 可以特别标示启始及结束的信息参数,因此可以实现每一种项目特定的服务。 |
诊断及通信管理 | 0x10 | 0x50 | 诊断会话控制Diagnostic Session Control | UDS会使用不同的会话(session),可以用诊断会话控制(Diagnostic
Session Control)来切换。可用的服务会依照目前有效的会话而不同。在一开始,控制单元默认是在“默认会话”(Default
Session),有定义其他的会话,需要实现的会话会依照设备的种类而不同。 “程序会话”(Programming
Session)可以用来上传固件到设备,并更新设备的固件。 “扩展诊断会话”(Extended Diagnostic
Session)可解锁特定的诊断功能,例如调整传感器等。 “安全系统诊断会话”(Safety system diagnostic
session)用来测试安全相关的诊断机能,例如安全气囊的测试。 此外,也有一些保留的会话识别符,为了汽车生产者及供应商的特殊需求而设计。 |
诊断及通信管理 | 0x11 | 0x51 | ECU重置ECU Reset | ECU重置的服务是要重启ECU。依照控制单元硬件以及实现方式的不同,有以下几种不同的重置: “硬重置”模拟电源关闭的重置。 “关闭锁匙重置”模拟用锁匙将汽车熄火,再开启汽车的点火开关。 “软重置”初始化特定程序单元以及存储结构。 也有一些汽车生产者及供应商定义的特殊数值。 |
诊断及通信管理 | 0x27 | 0x67 | 安全性访问Security Access | 可以用安全性检查(Security
check)来启动大部分的安全关键性服务(security-critical
services)。此情形下控制单元会发送“密码种子(seed)”到客户端(电脑或是诊断工具)。客户端再用密码种子计算密钥(key)送回控制单元,以此来解安全关键性服务 |
诊断及通信管理 | 0x28 | 0x68 | 通信控制Communication Control | 此服务可以关闭控制单元发送以及接收消息的功能。 |
诊断及通信管理 | 0x29 | 0x69 | 认证Communication Control | |
诊断及通信管理 | 0x3E | 0x7E | 测试者存在Tester Present | 若客户端长时间没有交换通信资料,控制单元会自动离开目前的会话,回到“默认会话”,也可能会进入休眠模式。而此一服务的目的就是让控制单元知道客户端仍存在。 |
诊断及通信管理 | 0x83 | 0xC3 | 访问时序参数Access Timing Parameters | 在控制器及从机的通信中,需要观察一定的时间,若时间超过此限制,仍没有提交消息,就会假设连接已有问题。可以读取及修改此时间。 |
诊断及通信管理 | 0x84 | 0xC4 | 安全资料传输Secured Data Transmission | ㅤ |
诊断及通信管理 | 0x85 | 0xC5 | 控制DTC设置Control DTC Settings | 启动或关闭部分(或所有)错误的侦测。若诊断工作是在车内进行的,这个机能格外重要,因为诊断工作有可能造成部分零件的异常行为。 |
诊断及通信管理 | 0x86 | 0xC6 | 事件回复Response On Event | ㅤ |
诊断及通信管理 | 0x87 | 0xC7 | 链接控制Link Control | 服务链接控制是用来设置诊断访问的比特率。多半只在中间网关上实现此一机能。 |
资料传输 | 0x22 | 0x62 | 根据标识符读取资料Read Data By Identifier | 透过此服务可以读取控制单元中一个或多个的资料。这些资料的种类不限,也可以有不同的长度,例如料号或是软件版本等。也可以读取像是传感器状态之类会变动的值。每一个值会对一个资料标识符(Data
Identifier、简称DID),数值从0到65535。会用正常的CAN信号来发送特定ECU使用的资料。DID资料只用在资料请求上,也可以用一些没有ECU使用的DID来发送信息,虽ECU不会使用,但服务工具或软件测试程序可以使用这类的信息。 |
资料传输 | 0x23 | 0x63 | 根据地址读取存储器Read Memory By Address | 依给定地址读取物理内存中的值。测试工具可以用此机能来读取软件内部的行为。 |
资料传输 | 0x24 | 0x64 | 根据标识符读取缩放比例资料Read Scaling Data By Identifier | ㅤ |
资料传输 | 0x2A | 0x6A | 周期性根据标识符读取资料Read Data By Identifier Periodic | 透过此服务可以让控制单元周期性发送资料。只能发送透过“动态定义资料标识符”定义的标识符 |
资料传输 | 0x2C | 0x6C | 动态定义资料标识符Dynamically Define Data Identifier | 此服务提供一个修正设备资料标识符(DID)的方式,可以重新调整资料标识符。这个通常是不同资料标识符的组合,或者单纯是所有DID的串接。
请求资料可以依以下的原则规划配置: 原始资料标识符、位置、长度(依字节表示)、子功能字节:defineByIdentifier
存储器位置、长度(依字节表示)、子功能字节:defineByMemoryAddress 可以结合上述二种方式 |
资料传输 | 0x2E | 0x6E | 根据标识符写入资料Write Data By Identifier | 可以更改资料标识符中的数值,命令中除了资料标识符外,也要同时提供要修改的数值 |
资料传输 | 0x3D | 0x7D | 根据地址写入到存储器Write Memory By Address | “根据地址写入到存储器”可以让外面诊断工具写信息到ECU里的特定地址,或特定的连续地址 |
三、应答类型(SID service identify 服务ID)
3.1肯定应答:
- 应答格式 服务ID+40: SID+40
3.2否定应答:
- 应答格式1 7F + 服务类型+否定响应码
- 78等待否定应答格式:7F +服务ID(SID)+ 78
- 举例1:03 7F 10 13 00 00 00 00
- 举例2: 03 7F 10 78 00 00 00 00
响应码 | 代码名称 | 描述 |
0x10 | General Reject | 请求被拒绝,通常是因为不支持当前的服务请求。 |
0x11 | Service Not Supported | 请求的诊断服务不被支持。 |
0x12 | Sub-Function Not Supported | 请求的子功能不被支持。 |
0x13 | Incorrect Message Length/Format | 请求消息的长度或格式不正确。 |
0x14 | Response Too Long | 响应超出了允许的长度。 |
0x21 | Busy Repeat Request | ECU 当前忙于处理其他请求,建议重试。 |
0x22 | Conditions Not Correct | 当前条件不满足,无法处理请求。例如,车辆未达到所需状态(如发动机未启动)。 |
0x24 | Request Sequence Error | 请求的消息顺序错误。例如,服务要求先前发送了特定请求,而当前请求并未遵循该顺序。 |
0x25 | No Response From Subnet Component | 子网组件未响应,导致请求失败。 |
0x31 | Request Out Of Range | 请求的参数超出了允许的范围。例如,试图写入的地址或数据无效。 |
0x33 | Security Access Denied | 诊断服务访问被拒绝,通常是因为未完成安全认证或安全级别不足。 |
0x35 | Invalid Key | 提供的安全认证密钥无效。 |
0x36 | Exceeded Number Of Attempts | 尝试次数超出了限制(例如,输入错误密码超过允许的次数)。 |
0x37 | Required Time Delay Not Expired | 请求过于频繁,必须等待一定时间后再重新发送。 |
0x70 | Upload Download Not Accepted | 上传或下载请求被拒绝,可能是因为内存不可访问或条件不满足。 |
0x71 | Transfer Data Suspended | 数据传输被暂停。 |
0x78 | Response Pending | ECU 处理时间较长,响应需要更多时间。客户端需要等待,并可能需要发送 Tester Present 来保持会话活动。 |
0x7E | Sub-Function Not Supported In Active Session | 当前诊断会话不支持该子功能。例如,尝试在默认会话中请求编程功能。 |
0x7F | Service Not Supported In Active Session | 当前诊断会话不支持该服务。 |
0x92 | Voltage Too High | ECU 电压过高,无法处理请求。 |
0x93 | Voltage Too Low | ECU 电压过低,无法处理请求。 |
常见场景及解释
- 安全访问失败(NRC 0x33 和 0x35)
如果诊断请求需要安全级别访问(如 ECU 的编程功能),但提供的密钥无效或未进行认证,会返回相应的否定响应码。
- 条件不满足(NRC 0x22)
当车辆处于不适合执行该服务的状态(如尝试在车辆行驶时读取存储器)时,会返回该码。
- 响应超时或挂起(NRC 0x78)
某些复杂的请求可能需要 ECU 较长时间来处理。在这种情况下,ECU 返回
0x78 来通知客户端等待更多时间。- 会话模式问题(NRC 0x7E 或 0x7F)
UDS 服务通常在不同的会话模式下操作(如默认会话、扩展诊断会话、编程会话)。某些服务只能在特定会话下执行。
- Author:joybard
- URL:http://blog.joybard.com/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/UDS
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts




