Loading

在上一篇文章《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 诊断和通信管理功能单元

SIDService诊断服务名称功能简述子功能
0x10DiagnosticSessionControl诊断会话控制Tester向目标ECU请求控制诊断会话状态
0x11ECUResetECU复位Tester向目标ECU请求强制执行复位操作
0x27SecurityAccess安全访问Tester向目标ECU请求解锁安全访问
0x28CommunicationControl通讯控制Tester向目标ECU请求控制通信行为
0x29Authentication身份认证Tester向目标ECU请求身份认证
0x3ETesterPresent待机握手Tester向目标ECU指示它仍在线
0x84SecuredDataTransmission安全数据传输Tester向目标ECU请求进行具有拓展数据链路安全性的数据传输
0x85ControlDTCSetting控制DTC的设置Tester向目标ECU请求控制DTC的设置
0x86ResponseOnEvent事件响应Tester向目标ECU请求设置和控制特定的事件机制
0x87LinkControl链路控制Tester向目标ECU请求控制通信波特率

1.2 数据传输功能单元

SIDService诊断服务名称功能简述子功能
0x22ReadDataByIdentifier通过DID读数据Tester向目标ECU请求读取指定DID的当前值
0x23ReadMemoryByAddress通过地址读内存Tester向目标ECU请求读取指定内存范围的当前值
0x24ReadScalingDataByIdentifier通过DID读缩放数据/换算信息Tester向目标ECU请求读取指定DID的缩放数据
0x2AReadDataByPeriodicIdentifier周期性读DID数据Tester向目标ECU请求周期性读取指定DID的当前值
0x2CDynamicallyDefineDataIdentifier动态定义DIDTester向目标ECU请求动态定义DID
0x2EWriteDataByIdentifier通过DID写数据Tester向目标ECU请求写入指定数据给指定的DID
0x3DWriteMemoryByAddress通过地址写内存Tester向目标ECU请求写入指定数据到指定的内存范围

1.3 存储数据传输功能单元

SIDService诊断服务名称功能简述子功能
0x14ClearDiagnosticInformation清除诊断信息Tester向目标ECU请求清除诊断信息
0x19ReadDTCInformation读取故障码信息Tester向目标ECU请求读取诊断信息

1.4 输入输出控制功能单元

SIDService诊断服务名称功能简述子功能
0x2FInputOutputControlByIdentifier通过ID控制输入输出Tester向目标ECU请求控制特定的输入/输出

1.5 例程控制功能单元

SIDService诊断服务名称功能简述子功能
0x31RoutineControl例程控制Tester向目标ECU请求启动、停止例程或查询例程结果

1.6 上传下载功能单元

SIDService诊断服务名称功能简述子功能
0x34RequestDownload请求下载Tester向目标ECU请求从Tester到目标ECU的数据传输
0x35RequestUpload请求上传Tester向目标ECU请求从目标ECU到Tester的数据传输
0x36TransferData数据传输Tester向目标ECU发送数据(下载)或请求数据(上传)
0x37RequestTransferExit请求退出传输Tester向目标ECU请求终止数据传输
0x38RequestFileTransfer请求文件传输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) + 0x40sub-functiondiagnostic 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码可参见下表:

NRCNRC define描述
0x00positiveResponse为ECU内部实现所保留,不能在否定响应中使用
0x01 – 0x0FISOSAEReservedISO保留
0x10generalReject未定义的否定响应
0x11serviceNotSupportedECU不支持该诊断请求服务
0x12sub-functionNotSupportedECU不支持该诊断请求服务的子功能
0x13incorrectMessageLengthOrInvalidFormat诊断请求指令的长度或格式不对
0x14responseTooLong诊断响应数据过长,超过网络层支持的最大字节数
0x15 – 0x20ISOSAEReservedISO保留
0x21busyRepeatRequest当前ECU诊断在忙,拒绝诊断请求
0x22conditionsNotCorrect执行诊断的条件不满足
0x23ISOSAEReservedISO保留
0x24requestSequenceError诊断请求的发送顺序不正确
0x25noResponseFromSubnetComponentECU响应超时
0x26FailurePreventsExecutionOfRequestedAction某DTC阻止了该诊断请求
0x27 – 0x30ISOSAEReservedISO保留
0x31requestOutOfRange诊断请求参数超出范围或DID/RID不支持
0x32ISOSAEReservedISO保留
0x33securityAccessDenied不满足安全策略
0x34ISOSAEReservedISO保留
0x35invalidKey钥匙不匹配($27服务使用)
0x36exceedNumberOfAttempts尝试解锁次数达上限($27服务使用)
0x37requiredTimeDelayNotExpired请求解锁的重试延时未到($27服务使用)
0x38secureDataTransmissionRequired需要安全的数据传输
0x39secureDataTransmissionNotAllowed不允许安全数据传输
0x3AsecureDataVerificationFailed安全数据验证失败
0x3B – 0x4FreservedByExtendedDataLinkSecurityDocument数据链路安全性拓展保留
0x50Certificate verification failed – Invalid Time Period证书验证失败-时间段无效
0x51Certificate verification failed – Invalid Signature证书验证失败-签名无效
0x52Certificate verification failed – Invalid Chain of Trust证书验证失败-证书链无效
0x53Certificate verification failed – Invalid Type证书验证失败-类型无效
0x54Certificate verification failed – Invalid Format证书验证失败-格式无效
0x55Certificate verification failed – Invalid Content证书验证失败-内容无效
0x56Certificate verification failed – Invalid Scope证书验证失败-作用域无效
0x57Certificate verification failed – Invalid Certificate (revoked)证书验证失败-证书无效(已吊销)
0x58Ownership verification failed所有权验证失败
0x59Challenge calculation failed挑战计算失败
0x5ASetting Access Rights failed设置访问权限失败
0x5BSession key creation/derivation failed会话密钥创建/派生失败
0x5CConfiguration data usage failed配置数据使用失败
0x5DDeAuthentication failed取消身份验证失败
0x5E – 0x6FISOSAEReservedISO保留
0x70uploadDownloadNotAccepted不允许上传/下载($34服务使用)
0x71transferDataSuspended数据传输操作由于某些故障而中止
0x72generalProgrammingFailure擦除或刷写内存时错误
0x73wrongBlockSequenceCounter块序列计数错误
0x74 – 0x77ISOSAEReservedISO保留
0x78requestCorrectlyReceived-ResponsePending已收到诊断请求,但会晚些响应
0x79 – 0x7DISOSAEReservedISO保留
0x7Esub-functionNotSupportedInActiveSession当前会话下,该子功能不支持
0x7FserviceNotSupportedInActiveSession当前会话下,该服务不支持
0x80ISOSAEReservedISO保留
0x81rpmTooHigh转速过高
0x82rpmTooLow转速过低
0x83engineIsRunning发动机正在运行中
0x84engineIsNotRunning发动机未在运行
0x85engineRunTimeTooLow发动机运行时间太短
0x86temperatureTooHigh温度过高
0x87temperatureTooLow温度过低
0x88vehicleSpeedTooHigh车速过高
0x89vehicleSpeedTooLow车速过低
0x8Athrottle/PedalTooHigh节气门/油门踏板过高
0x8Bthrottle/PedalTooLow节气门/油门踏板过低
0x8CtransmissionRangeNotInNeutral变速箱未在空挡
0x8DtransmissionRangeNotInGear变速箱不在挡位
0x8EISOSAEReservedISO保留
0x8FbrakeSwitch(es)NotClosed (Brake Pedal not pressed or not applied)未踩制动踏板
0x90shifterLeverNotInPark换挡杆不在P挡
0x91torqueConverterClutchLockedTCC锁止
0x92voltageTooHigh电压过高
0x93voltageTooLow电压过低
0x94ResourceTemporarilyNotAvailable资源暂时不可用
0x95 – 0xEFreservedForSpecificConditionsNotCorrect其他特殊的不满足诊断执行条件保留
0xF0 – 0xFEvehicleManufacturerSpecificConditionsNotCorrect车辆制造商指定不满足诊断执行条件保留
0xFFISOSAEReservedISO保留
  1. OEM会定义一个特殊的地址用于指示功能寻址,例如:吉利汽车的功能寻址地址即为0x1FFF。 ↩︎

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

👤本站访客数: 👁️本站访问量: