UDS简介

因为ISO文档需要收费,所以以下内容整理于网络,请以ISO文档为准。

2022.7.15更新:UDS相关协议已制定成国家标准,标准号是GB/T 40822-2021,标准名是《道路车辆 统一的诊断服务》,英文名是《Road vehicles—Unified diagnostic services》,官网上卖两百多,淘宝只需要卖2块钱,搜索“国家标准”关键字,然后找客服询价就行了。

一、协议栈总览

UDS标准栈

二、UDS应用层

USD应用层由ISO 14229标准定义。诊断通信的过程从用户角度来看非常容易理解,诊断仪发送诊断请求(request),ECU给出诊断响应(response),而UDS就是为不同的诊断功能的request和response定义了统一的内容和格式。

Diagnostic request的格式:

Diagnostic request的格式可以分为两类:一类是拥有sub-function的,另一类是没有sub-function的,如下面两张图所示。Service ID(以下简称SID)的长度固定为1个字节,代表了这条诊断命令执行的什么功能。sub-function的长度也是1个字节,它通常表示对这个诊断服务的具体操作,比如是启动、停止还是查询这个诊断服务。而后面的parameter则根据各个诊断服务的不同具有不同的内容,长度和格式并没有统一规格,它用于限定诊断服务执行的条件,比如某个诊断服务执行的时间等。parameter的一个重要应用是作为标识符,标识诊断请求要读出的数据内容,我会在后续的文章里详细讲述各个诊断服务的应用。

拥有sub-function的诊断请求:

拥有sub-function的诊断请求

无sub-function的诊断请求:

无sub-function的诊断请求

有一点要补充的是,其实sub-function严格来说是7个bit,而不是1个byte,因为它的最高位bit被用于抑制正响应(suppresspositive response,SPR),如果这个bit被置1,则ECU不会给出正响应(positive response);如果这个bit被置0,则ECU会给出正响应。这样做的目的是可以告诉ECU不要发不必要的response,从而节约通信资源。

Diagnostic response的格式:

Diagnostic response分为positive和negative两类。positive response意味着诊断仪发过来的诊断请求被执行了,而negative response则意味着ECU因为某种原因无法执行诊断仪发过来的诊断请求,而无法执行的原因则存在于negative response的报文中。

positive response

positive response的格式如上图所示,也基本上是由三部分组成,其中的response SID这个字节作为诊断请求的echo,它等于SID + 0X40。后面的两个部分则视具体的诊断服务而定。

negative response

negative response的格式固定为3个字节,第一个字节为0x7F,第二个字节是被拒绝掉的SID,第三个字节是这个诊断服务无法被执行的原因。下面这张表格列举了部分原因代码,比如,如果ECU给出7F 22 13这个negative response,则说明22这个服务因为诊断请求数据长度不对的原因无法执行。

HexMnemonicDescription
10GRGeneral reject
11SNSService not supported
12SFNSSub-Function not supported
13IMLOIFIncorrect message length or invalid format
14RTLResponse too long
21BRRBusy repeat request
22CNCConditions not correct
24RSERequest sequence error
25NRFSCNo response from sub-net component
26FPEORAFailure prevents execution of requested action
31ROORRequest out of range
33SADSecurity access denied
35IKInvalid key
36ENOAExceeded number of attempts
37RTDNERequired time delay not expired
38-4FRBEDLSDReserved by Extended Data Link Security Document
70UDNAUpload/Download not accepted
71TDSTransfer data suspended
72GPFGeneral programming failure
73WBSCWrong Block Sequence Counter
78RCRRPRequest correctly received, but response is pending
7ESFNSIASSub-Function not supported in active session
7FSNSIASService not supported in active session

总结:诊断通信的过程就是诊断仪和ECU交换数据,前者发的是request,后者发的是response,而UDS最重要的作用就是定义了这些request和response的格式和内容。今天这篇文章对request和response进行了简要介绍,在后面描述各种诊断服务的文章中我会通过更多的示例来说明这两个基本概念。

三、UDS传输层&网络层:DoCAN

可以从总览图中了解到DoCAN是传输层和网络层的协议,由ISO 15765标准定义,其底层是ISO 11898标准定义的CAN 2.0协议,因为CAN 2.0协议的一个数据帧最多包含8个字节的数据,因此如果一条诊断命令超过了8字节,就需要DoCAN协议分包后再交给CAN 2.0协议进行传输。ISO 15765-2定义了4种类型的帧结构,分别是:SingleFrame、FirstFrame、ConsecutiveFrame、FlowControl。其中SingleFrame用于长度不超过7个字节的诊断命令或响应,FirstFrame、ConsecutiveFrame、FlowControl用于传输长度大于7个字节的诊断命令或响应。每个诊断帧的第一个字节的高4bit用于描述该帧的类型,即该帧属于上述四种中的哪一种。

DoCAN的四种帧结构

SingleFrame用于下面这种简单的场景:当诊断报文长度小于等于7时,再加上一个字节的PCI控制信息就是小于等于8,可以在一帧CAN报文上传输,所以不需要进行分包。此时数据域的第一个字节高4位值为0000,标识这是一个帧SingleFrame,低4位是SF_DL,即DataLength,描述后面有几个字节。如果有没有使用的字节,通常要用0x55或0xAA来填充,因为这两个值的二进制表述其实就是01010101和10101010,这样在CAN总线上可以让信号跳变得更频繁一些,不会出现长时间电平不变的情况。

SingleFrame

如果一帧CAN报文无法承载一条诊断报文,则需要按照下面的流程进行分包发送:

诊断报文的分段发送

首先,发送端要以一个FirstFrame开启通信,告诉接收端还有后续的内容要发,FirstFrame使用前两个字节作为PCI信息,第一个字节高4位为0001,标识这是一个FirstFrame,低4位加上第二个字节用于描述总共发送的数据长度是多少(包括在FirstFrame中和在ConsecutiveFrame中的所有字节数)。

之后接收端发送FlowControl,告诉发送端能以什么样的速度来发送数据,FlowControl第一字节的高4位为0011,低4位为FS,即FlowStatus,第二个字节为BS(BlockSize),第三个字节为STmin(SeperateTime)。FlowControl有0、1、2三种状态,分别命名为ContinueToSend (CTS)、Wait (WT)、Overflow (OVFLW)。如果允许发送端继续发送ConsecutiveFrame,则FlowStatus=0;若要求发送端等一会再发送ConsecutiveFrame,则FlowStatus=1,再下次允许sender发送ConsecutiveFrame时,receiver再发一个FlowStatus=0的FlowControl。如果receiver因为资源问题无法接收sender发送的数据,则发送一个FlowStatus=2的FlowControl。

BS指示sender一次可以发送多少个ConsecutiveFrame,当发送ConsecutiveFrame数量达到BS时,需要receiver再次以一个FlowControl开启下一波的ConsecutiveFrame发送。

receiver根据自身的接收和处理能力使用STmin指示sender在发送ConsecutiveFrame时最小的时间间隔是多少,从而实现流控制。

ConsecutiveFrame就是承载FirstFrame无法完全承载的剩余数据了,它使用第一个字节用作PCI,高4bit为0010,低4bit用于标识ConsecutiveFrame的序列号,从1开始,每发送一次ConsecutiveFrame增加1。

不分段传输的诊断服务举例:

request:02 10 03 55 55 55 55 55

response:06 50 03 00 32 01 F4 AA

这是一个请求进入extended session的最简单的诊断服务,请求和应答都是SingleFrame,加粗的0标识了SingleFrame,后面的2和6表示了这条诊断报文拥有几个字节的数据。

分段传输的诊断服务举例:

这是一个读取DTC的命令和应答。

03 19 02 08 55 55 55 55 (诊断仪发送的SingleFrame的request)

10 33 59 02 19 01 00 07 (ECU以FirstFrame开始传输的response)

30 00 00 55 55 55 55 55 (诊断仪发送的FlowControl)

21 09 03 05 02 09 05 04 (ECU发送的ConsecutiveFrame)

22 07 09 05 06 06 09 05 (ECU发送的ConsecutiveFrame)

23 08 03 08 07 01 05 08 (ECU发送的ConsecutiveFrame)

24 07 01 06 08 07 01 0C (ECU发送的ConsecutiveFrame)

25 08 07 01 0D 08 07 03 (ECU发送的ConsecutiveFrame)

26 07 09 08 01 01 09 09 (ECU发送的ConsecutiveFrame)

27 01 07 09 AA AA AA AA (ECU发送的ConsecutiveFrame,此时传输结束)

在这里我把所有传输层相关的PCI信息都用粗体标识了。

需要提一下的是,BS和STmin等于0时,表示接收端可以以最快的速度来接收数据,发送端可以一次发送的ConsecutiveFrame数量不受限制。

四、UDS传输层&网络层:DoIP

DoIP是Diagnostic communication over Internet Protocol 的简称,顾名思义,就是通过网络协议进行诊断通信,由ISO13400 系列标准定义。这里的网络协议,指的就是OSI七层模型中,通用计算机网络所使用的从层4到层1这四层协议。AutoSAR官网上有一份完整的DoIP文档:Specification of Diagnostic over IP,协议内容在7.3节。

DoIP报文结构:

DoIP帧结构

ItemPosition (Byte)Length (Byte)
Protocol version01
Inverse protocol version11
Payload type22
Payload length44
Payload type specific message content8

DoIP报文有如下类型的Payload:

Payload Type valuePayload type nameConnection Kind
0x0001Vehicle Identification request messageUDP
0x0002Vehicle identification request message with EIDUDP
0x0003Vehicle identification request message with VINUDP
0x0005Routing activation requestTCP
0x0008Alive Check responseTCP
0x4001DoIP entity status requestUDP
0x4003Diagnostic power mode information requestUDP
0x8001Diagnostic messageTCP
0x0000Generic DoIP header negative acknowledgeUDP/TCP
0x0004Vehicle announcement message/vehicle identification responseUDP
0x0006Routing activation responseTCP
0x0007Alive Check requestTCP
0x4002DoIP entity status responseUDP
0x4004Diagnostic power mode information responseUDP
0x8002Diagnostic message positive acknowledgementTCP
0x8003Diagnostic message negative acknowledgementTCP

再详细说一下Diagnostic message类型的Payload:

Diagnostic message (for request and response) (payload type 0x8001)

ItemPosition (Byte)Length (Byte)
Source address02
Target address22
User data4

Diagnostic acknowledge message (payload type 0x8002)

ItemPosition (Byte)Length (Byte)
Source address02
Target address22
ACK code (0x00)41
Previous diagnostic message5

Diagnostic negative acknowledge message (payload type 0x8003)

ItemPosition (Byte)Length (Byte)
Source address02
Target address22
Diagnostic message negative acknowledge code41
Previous diagnostic message5
  • 9
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值