UDS学习总结
UDS简介
1.1 什么是UDS
UDS (Unified Diagnostic Services) 统一诊断服务,是车辆诊断的一种应用层协议,面向整车所有ECU ,UDS协议ISO 14229定义了应用层和会话层,在协议里面定义了诊断的请求,诊断响应的报文格式,以及ECU怎样处理诊断请求报文,以及诊断服务的应用。它不关心底层数据链路层和物理层如何实现,所以可以在各种汽车总线上应用(CAN、Ethernet 、FlexRay、LIN等)。
诊断通信用于建立诊断仪与ECU之间的通信连接,并负责将ECU中的诊断结果输送到诊断仪中。
1.2 UDS的作用
UDS的作用非常广泛,几乎跟随ECU软件开发的全过程。
- ECU开发过程可用到它来构建bootloader,上传和下载数据,即软件刷写,控制器Reset;
- 测试时可用它来读写存储,控制外设;
- 产线上可用它来校准机械件,控制例程,进行下线执行器测试,刷新软件,配置防盗,读取号码,下线配置等;
- 在行驶过程中,要用它来监测各种故障,并记下故障码;
- 4S店里,技师需要读取当前故障、历史故障,读取故障发生时刻环境信息状态,清除故障,判断故障发生点,还可以用来升级ECU程序。
1.3 UDS在OSI模型中的应用

这张图描述了UDS在OSI七层模型中的应用,OSI的第一层第二层分别定义了物理层和数据链路层,第三层第四层定义了网络层和传输层,第七层是应用层。
比如说我们熟悉的CAN总线,物理层和数据链路层遵循的是ISO 11898,而它的传输层遵循的是ISO 15765-2,在ISO 14229-3中定义了UDS基于CAN总线的应用,而现在比较火的以太网,它的物理层和数据链路层遵循的是ISO 13400-3,它的传输层也就是DoIP遵循的是ISO 13400-2,它的UDS基于以太网的应用是ISO 14229-5。
UDS的通信机制
基于C/S的诊断通信机制,诊断仪作为Client发出诊断请求request,车辆相关ECU作为Server处理该请求并发送诊断响应response(Pos Response/Neg Response),诊断报文是典型的事件触发型报文,有请求才会有响应。
如果ECU收到了诊断仪Tester发来的诊断请求并且确认了该请求,并作出对应的处理和响应,此时ECU向诊断仪发送肯定响应Pos Response。
如果ECU无法发送对应的响应或者需要经过更长时间才能发送对应的响应则向诊断仪发送否定响应Neg Response。

在某些情况下, Client发出诊断请求,ECU不需要进行某种响应(肯定响应/否定响应)。

UDS诊断服务
3.1 诊断服务的概念
在UDS协议中,Service Identifier(SID)是指服务标识符,用于标识要执行的服务。每个服务都有一个唯一的SID,在诊断会话中通过SID来区分要执行/响应哪种服务请求。对于诊断服务更多详细内容的介绍除了查看ISO 14229-1规范中的定义外还可参考该博文《UDS协议从入门到精通(UDS速查手册)》
3.2 寻址方式
在总线上往往有着众多ECU设备,作为诊断设备既可以与所有的ECU一起沟通,也可以指定某一个ECU单独沟通。所以寻址方式就有功能寻址(Functionally Addressed)和物理寻址(Physically Addressed)两种。
功能寻址可以广播诊断请求Request(一般为报文ID为7DF),同时等待总线上的ECU给与响应,即一对多模式。
物理寻址指定发送特定诊断请求Request(每个ECU的物理寻址CAN_ID 都是唯一的),等待指定ECU给与响应,即一对一模式。
因此一般ECU的诊断报文会有三个CAN_ID,其中DiagRequest(诊断物理请求报文)和DiagState(诊断功能请求报文)是ECU接收来自Client的报文,而DiagRespone(诊断响应报文)是ECU反馈的报文。
3.3 诊断服务分类
ISO 14229-1中定义了26种服务并将这些服务分为6大类:诊断和通信管理类、数据传输类、存储数据传输类、输入输出控制类、例程功能类、上传下载类。具体的服务说明如下图所示:

表格中标黄部分为常用的服务,其他的不常用。
3.4 服务响应规则
诊断仪请求第一个字节为Service Identifier (SID),代表诊断服务的标识符,如果ECU发送肯定响应,第一位为SID+40,例如0x22服务的响应SID为0x62;如果ECU发送否定响应,响应格式固定为第一字节0x7F,第二字节为SID,第三字节为Negative Response Code (NRC),根据NRC可以判断错误原因和位置。


请求格式:
[SID]+[DID/RID/SubFunction/etc]+[OptionalParameter]
肯定响应格式:
[SID+0x40]+[DID/RID/SubFunction/etc]+[OptionalParameter]
否定响应格式:
[7F]+[SID]+[NRC]
Subfunction
SF通常代表该诊断服务的具体操作,例如是启动、停止还是查询这个诊断服务(0x31)或者进入哪个会话状态(0x10),不是所有服务均有子功能。
Tester发送:
0x10 0x03 (session control request for Subfunction 03,extended session)
ECU肯定响应:
0x50 0x03 (Positive response starting with 0x10 + 0x40 = 0x50)
Tester发送:
0x10 0xFF (session control request for Subfunction FF,invalid session)
ECU否定响应:
0x7F 0x10 0x12 (Negative response starting with 0x7F,NRC 0x12,Subfunction not supported)
DID
DID(Data Identifier)的作用是ECU在对应位置存储了大量数据,可以使用DID 对该数据进行检索或管理,DID有2个字节,DID parameter definitions见ISO 14229-1:2020 Annex C.1。
Tester发送:
0x22 0xF1 0x90 (ReadDataByIdentifier request for Data Identifier 0xF190,VIN number)
ECU肯定响应:
0x62 0xF1 0x90 0x12 0x34 0x56 0x78 0x9a 0xbc
Tester发送:
0x22 0xF1 0x90 (ReadDataByIdentifier request for Data Identifier 0xF190,VIN number)
ECU否定响应:
0x7F 0x22 0x22 (Negative response starting with 0x7F,NRC 0x22,ConditionsNotCorrect)
RID
Client使用 Routine Control 服务开始例程(routine) 、终止例程、请求例程执行结果。1个例程可以通过2个字节的RID( Routine Identifier )来检索,RID parameter definitions 见ISO 14229-1:2020 Table F.1。
Tester发送:
0x31 0x01 0xF1 0xA0 0x78 (RoutineControl (0x31) Start request(0x01) for Routine Identifier 0xF1A0,checkProgrammingIntegrity, CRC32 result is 0x78)
ECU肯定响应:
0x71 0x01 0xF1 0xA0 0x00 (Positive response starting with 0x31 + 0x40 = 0x71, passed IntegrityCheck 0x00)
Tester发送:
0x31 0x50 0x12 0x34 (RoutineControl (0x31) subfunction(0x50) for Routine Identifier 0x1234)
ECU否定响应:
0x7F 0x31 0x12 (Negative response (1st 0x7F) for RoutineControl request (0x31) indicating that this subfunction is not supported (0x12)
肯定响应抑制位
肯定响应抑制位是在Subfunction里的这个字节的最高位,我们把它叫做肯定响应抑制位。功能寻址下在Request中SubFunction的最高位bit7若置0x01,正响应会被抑制,即不回复正响应,负响应正常回复。

NRC
Tester发送的请求报文格式错误,或者请求发送的条件处于错误,ECU将发送否定响应,否定响应的格式是“7F+SID+NRC”,常用到的NRC有如下:

时间参数(P2Sever和P2Sever*)
当Tester给ECU发送请求过后,ECU需要在P2Sever时间内给出相应的响应,如果ECU当前正在处理别的任务,处理别的事情,而不能在P2Sever的时间内给出相应的响应,那么它先在P2Sever时间内给出一个NRC为78的Pending报文,告诉Tester“ECU正在忙”,之后会在P2Sever*的时间内给出其它的响应报文,如果P2Sever*的时间内还是不能给出相应的肯定响应和否定响应,将继续给出Pending报文,直到能够正确处理请求报文之后,会给出正确的响应报文。

UDS通过CAN进行诊断通信(DoCAN)
ISO 15765-2作为车辆诊断通信的一个组成部分,规范了“传输协议和网络层服务”。UDS网络层,又称为TP层(Transport Protocol Layer)。其存在的目的是为了解决ISO 11898协议中定义的经典CAN数据链路层与ISO 14229协议中定义的应用层,彼此之间数据长度不统一的问题。经典CAN数据链路层最大能够支持8个字节,但ISO 14229并不仅仅是为了CAN总线设计的,最大容量达到4294 967 295个字节。比如VIN码是17个字节,CAN总线必然需要传递3帧才能传完VIN码,那么如何科学、快捷、安全地将多个字节通过经典CAN来进行传输,就成了一个需要解决的问题。ISO 15765-2 协议由此诞生。
4.1 网络层功能
-
为上层的应用层提供接口服务,服务接口定义了访问网络层提供的功能(即传输/接收数据和设置协议参数)所需的一组服务。定义了两类服务:
a ) 通信服务
这些服务可传输多达 4294 967 295 字节的数据。
-
N_USData.request:该服务用于请求发送数据。如有必要,网络层会对数据进行分段。
-
N_USData_FF.indication:该服务用于通知上层被拆分的信息的首帧的接收
-
N_USData.indication:该服务用于向上层提供接收到的数据。
-
N_USData.confirm:该服务向上层确认所请求的服务是否已执行(成功与否)
b ) 协议参数设置服务:
这些服务(定义如下)可以动态设置协议参数
-
N_ChangeParameter.request:该服务用于对特定内部参数的动态设置的请求。
-
N_ChangeParameter.confirm:该服务向上层确认更改特定协议的请求是否已完成 (成功与否)。
包含的三种服务项说明如下:
——请求服务,被更高的通信层或应用层使用,用于向网络层传递控制信息及要发送的数据;
——指示服务,被网络层使用,用于向更高通信层或应用层传递状态信息及接收到的数据;
——确认服务,被网络层使用,用于向更高通信层或应用层传递状态信息。
如下是N_USData.request的服务原语:
该服务是请求传递<MessageData>数据及<Length>字节数,从发送者到到对等实体接收者,通过在N_SA,N_TA,N_TAtype及N_AE中的地址信息确认。(参看4.2对参数的定义)
N_USData.request(
Mtype
N_SA
N_TA
N_TAtype
[N_AE]
<MessageData>
<Length>
)
每次调用 N_USData.request 服务时,网络层应当通过一条N_USData.confirm服务通知服务使用者信息传递的完成情况。(成功或失败)。
-
提供网络层的内部操作为实现对等实体间的通信提供了分段、重组、数据传输流控制方法。网络层主要的任务是传递一帧或大于一帧的数据信息。超过一帧的信息被分成多个部分,每一个部分都以一个CAN帧的形式被发送。


-
网络层中的时间控制。
4.2 网络服务数据单元说明
Mtype(消息类型)
类型:枚举类型
范围:诊断,远程诊断
描述:参数 Mtype 用于确定服务相中信息参数的类型及范围。该部分的 ISO 15765 协议指定了两个值标识这个参数。文档使用者可通过指定其它的类型,也可通过文档中网络层使用的其它地址信息参数的组合来扩展这些值的范围。每新定义的一套地址信息,Mtype 应当赋予新值,标识新的地址信息。
——如果 Mtype = 诊断,N_AI 地址信息应当包含参数 N_SA,N_TA和 N_TAtype。
——如果 Mtype = 远程诊断,N_AI 地址信息应当包含参数 N_SA,N_TA,N_TAtype和 N_AE。
N_AI (地址信息)
该参数指的是地址信息。总的来说,N_AI 参数用于确定信息发送者和接收者的源地址(N_SA), 目标地址(N_TA),也包含确定物理寻址还是功能寻址(N_TAtype)和可选择地址扩展(N_AE)的通信模式。
- N_SA (网络源地址)
类型:1 字节的无符号整数
范围:0-255
描述:N_SA 参数代表发送者网络层实体
- N_TA(网络目标地址)
类型:1 字节的无符号整数
范围:0-255
描述:N_TA 参数代表接收者网络层实体
- N_TAtype(网络目标地址类型)
类型:枚举类型
范围:物理的,功能的
描述:N_TAtype 参数是对 N_TA 参数的扩展。它被网络层对等实体使用,代表通信模式。
两种通信模式说明如下:1 对 1 的通信,称为物理地址,1 对多的通信称为功能地址。
——物理地址(1 对 1 通信)网络层所有类型的信息都支持。
——功能地址(1 对多通信)仅仅对单帧的通信支持。
- N_AE(网络地址扩展)
类型:1 字节的无符号整数
范围:0-255
描述:N_AE 参数用于在大的网络上扩展现行的地址范围,用于子网中发送与接收网络层实体而不是本地网的通信。若 Mtype 设置为远程诊断时,N_AE 仅仅是地址信息的一部分。
<Length>
类型: 32位
范围: 0x0000 0001- 0x FFFF FFFF
描述:该参数包含要发送或接收的数据长度。
<MessageData>
类型:字符串
范围:不固定
描述:该参数包含与上层实体所有交互的数据
<Parameter>
类型:枚举类型
范围:STmin, BS
描述:该参数确定网络层的参数
<Parameter_Value>
类型:1 字节无符号整数
范围:0-255
描述:该参数分配给协议参数<Parameter>作为指示服务。
<N_Result>
类型:枚举类型
范围:N_OK, N_TIMEOUT_A, N_TIMEOUT_Bs, N_TIMEOUT_Cr, N_WRONG_SN,N_INVALID_FS,
N_UNEXP_PDU, N_WFT_OVRN, N_BUFFER_OVFLW, N_ERROR
描述:该参数包含服务项执行的结果状态。如果同时产生了两个或以上的错误,网络层应该使用下列错误指示中首先找到的参数值,发送给高层。
——N_OK
该值表示服务执行完全正确;它可同时由发送者和接收者发送至服务的使用者。
——N_TIMEOUT_A
该值在定时器 N_Ar/N_As 超过了定时值 N_Asmax/N_Armax,发送给服务的使用者;它可同时由发送者和接收者发送至服务的使用者。
——N_TIMEOUT_Bs
该值在定时器 N_Bs 超过了定时值 N_Bsmax,发送给服务的使用者;它仅能由发送者发送至服务的使用者。
——N_TIMEOUT_Cr
该值在定时器 N_Bs 超过了定时值 N_Crmax,发送给服务的使用者;它仅能由接收者发送至服务的使用者。
——N_WRONG_SN
该值在接收到意外的连续的数值(PCI.SN)时被发送至服务使用者;它仅能由接收者发送至服务的使用者。
——N_INVALID_FS
该值在从流控(FC)N_PDU 接收到无效的或未知的流状态值时发送至服务的使用者;它仅能由发送者发送至服务的使用者。
——N_UNEXP_PDU
该值在接收到未知协议数据单元时发送给服务使用者,它仅能由接收者发送至服务的使用者。
——N_WFT_OVRN
该值在接收到流控 WAIT 帧超过最大计数 N_WFTmax 时发送至服务使用者。
——N_BUFFER_OVFLW
该值在接收到流控(FC)N_PDU 状态 Flow = OVFLW 时发送给服务的使用者。它用于指示接收者缓冲区无法存储首帧中数据长度(FF_DL),因此,该拆分数据的传递被丢弃。它仅能由发送者发送至服务的使用者。
——N_ERROR
这是一个默认的错误值。它是当检测到网络层错误并且没有其它更好的参数描述该项错误时使用发送到服务使用者。它可同时由发送者和接收者发送至服务的使用者。
<Result_ChangeParameter>
类型: 枚举类型
范围:N_OK, N_RX_ON, N_WRONG_PARAMETER, N_WRONG_VALUE
描述:该参数包含服务执行的结果状态信息
——N_OK
该值表示服务执行完全正确;它可同时由发送者和接收者发送至服务的使用者。
——N_RX_ON
该值发送给服务使用者指示虽然<N_AI>标识的信息接收到了,但服务没有执行。它仅能由接收者发送至服务的使用者。
——N_WRONG_PARAMETER
该值发送给服务的使用者表示由于未定义的<Parameter>,服务没有执行;它可同时由发送者和接收者发送至服务的使用者。
——N_WRONG_VALUE
该值发送给服务的使用者表示由于<Parameter_Value>超出范围,服务没有执行,它可同时由发送者和接收者发送至服务的使用者。
4.3 传输层协议
网络协议数据单元(N_PDU,Network_Protocol Data Unit)包含N_AI,N_PCI,N_Data。即地址信息,协议控制信息和数据。


不同节点中网络层对等协议实体之间的通信是通过交换 N_PDU 来完成的。ISO 15765 的这一部分规定了四种不同类型的传输层协议数据单元:单帧(SingleFrame,SF N_PDU)、首帧 (FirstFrame,FF N_PDU)、连续帧(ConsecutiveFrame, CF N_PDU)和流控制 (FlowControl,FC N_PDU),用于在对等网络层实体之间建立通信路径、交换通信参数、传输用户数据和释放通信资源。
- SF N_PDU 由单帧协议控制信息 (SF N_PCI) 标识。SF N_PDU 应由发送网络实体发出,并可由一个或多个接收网络实体接收。发送SF N_PDU 的目的是传输可通过单个服务请求传输到数据链路层的服务数据单元,以及传输未分段的报文。
- FF N_PDU 由 首帧协议控制信息 (FF N_PCI) 标识。FF N_PDU 应由发送网络实体发出,并在分段报文传输期间由唯一的接收网络实体接收。它标识网络发送实体传输的分段信息的第一个 N_PDU。接收网络层实体应在收到 FF N_PDU 时开始组装分段报文。
- CF N_PDU 由连续帧协议控制信息 (CF N_PCI) 标识。CF N_PDU 传输服务数据单元报文数据(<MessageData>)的段 (N_Data)。发送实体在 FF N_PDU 之后传输的所有N_PDU 都应编码为 CF N_PDU。接收实体应在接收到最后一个 CF N_PDU 后,将组装好的信息传递给网络接收实体的服务用户。CF N_PDU 应由发送网络实体发出,并在分段信息传输期间由唯一的接收网络实体接收。
- FC N_PDU 由 流控帧协议控制信息 (FC N_PCI)标识。FC N_PDU 指示发送网络实体开始、停止或恢复 CF N_PDU 的传输。当准备接收更多数据时,接收网络层实体应在正确接收到 FF N_PDU 后向发送网络层实体发送该信息。
-
一个FF N_PDU,或
-
如果需要发送更多连续帧,则发送连续帧块中的最后一个 CF N_PDU。
如果发送实体传输的 FF N_PDU 中的长度信息 (FF_DL)超过了接收实体的缓冲区大小,FC N_PDU还可通知发送网络实体在分段信息传输期间暂停传输 CF N_PDU,或中止分段信息的传输。
N_AI
N_AI 用于标识网络层的通信对等实体。在 N_SDU 中接收到的 N_AI 信息 (N_SA、N_TA、N_TAtype[和 N_AE])应复制并包含在 N_PDU 中。如果 N_SDU 中接收到的报文数据(<MessageData>和 <Length>)需要分段才能由网络层传输完整的报文,则应复制 N_AI并将其包含(重复)在传输的每个 N_PDU 中。
注:有关地址信息的详细说明,请参阅4.2
N_PCI
N_PCI标识网络层帧的类型。网络协议数据单元(N_PDU)有四种类型,即单帧(SF)、首帧(FF)、连续帧(CF)、流控制帧(FC)。

N_Data
N_Data 用于传输在 N_USData.request 服务调用中的<MessageData> 参数中接收到的服务用户数据。如果需要,<MessageData>会被分割成更小的部分,在通过网络传输之前,每个部分都适合 N_PDU 数据字段。
N_Data 的大小取决于 N_PDU 类型、所选地址格式和 TX_DL 值。
4.4 寻址方式
除了数据部分,为了将数据发送到对的地方,所以还需要对源地址以及目标地址进行定义,对于地址的定义,网络层定义了三种类型,分别是标准,扩展和混合,其实说白了就是按照一定要求把CAN ID进行定义。
N_AI是网络层对地址信息的定义,它在CAN数据链路层数据包中的映射就是CAN ID部分。通常对于上层协议的数据包一般是直接填进下层协议的Data段,但对于CAN不仅仅是Data段。如下是CAN数据链路层的数据包格式:

CAN的仲裁段就是CAN ID,网络层的数据包会被拆散,其中N_AI会被映射到CAN ID段,N_PCI和N_Data整体会成为CAN的Data段。根据N_AI的映射方式,网络层定义了几种寻址方式。
标准地址
这个指的是使用CAN的“标准帧”11位作为N_AI,至于源地址、目标地址等等,都是根据设备具体定义;比如0x741、0x749、0x7DF这些ID就已经区分了源、目标、类型这些内容了。需要说明的是,源地址、目标地址还有类型不需要单独占一个字节,不然11bit就不够用了。由于这些数据组合有限,通过自定义的映射方式,11bit就够用了。比如0x7DF,就是把它定义成,源地址是诊断仪、目标地址是ECU3,地址类型是功能寻址。
N_TAtype为物理寻址可以支持多帧,如下:

N_TAtype功能寻址只支持单帧,见下表:

标准固定地址
标准固定寻址是标准寻址的一种子格式,其中进一步定义了地址信息与 CAN 标识符的映射关系。在上述标准寻址的一般情况下,N_AI 和 CAN 标识符之间的对应关系是开放的。
对于标准固定寻址,就是在标准地址的基础上,把CAN的“标准帧”11位改为使用“扩展帧”29位并做了特殊位定义。表 26 和表 27 根据目标地址类型(N_TAtype) 定义了地址信息 (N_AI) 与 CAN 标识符的映射关系。N_PCI和 N_Data 放在 CAN 帧数据字段中。
N_TAtype为物理寻址可以支持多帧,如下:

N_TAtype功能寻址只支持单帧,见下表:

对于CAN的扩展帧,ID段有29位,其中28-24位是固定的,23-16位用于表征地址类型,15-8和7-0分别表示源地址和目的地址。
举例:CANID 0x18DBFFFA ----18表示00011000,前三位保留,110表示优先级,DB表示219功能寻址, FF为N_TA目标地址 ,FA为 N_SA源地址。
扩展地址
在标准地址的基础上,对于N_SA、N_TAtype和Mtype的每个组合,都会分配一个唯一的CAN标识符。把数据域的字节1拿出来用作N_TA来标识这个数据的接收者是谁,N_PCI 和 N_Data 安置在 CAN 帧数据域剩下的字节。
物理寻址:

功能寻址:

混合地址
混合寻址是 Mtype 设置为远程诊断时使用的寻址格式。远程诊断的概念是指数据域里的内容将会包含“远程地址(RA)”作为远程节点的标识,混合地址的格式中对CAN的“标准帧”11位和“扩展帧”29位的使用都进行了不同的定义。
混合地址的CAN“扩展帧”29位的格式如下:
N_TAtype为物理寻址可以支持多帧

N_TAtype为功能寻址只支持单帧

主要的区别在于16~23位dec段的值,与之前介绍的“标准固定地址”有所不同,而且占用了数据域中的第一个字节,作为地址扩展。
11 位 CAN 标识符方案的映射关系,对于N_SA、N_TA 和 N_TAtype的每种组合,可以使用相同的 CAN 标识符。N_AE 放在CAN 帧数据字段的第一个数据字节中。N_PCI和 N_Data 位于 CAN 帧数据字段的其余字节中。
混合地址的CAN“标准帧”11位的格式如下:

4.5 网络层定时参数
ISO15765-2中还针对时间制定了严格的超时机制,在网络层中主要有如下几个时间参数:

单帧报文收发流程的网络层定时参数应用如下所示:

流程分析:
1 发送方N_USData.req:会话层向传输层/网络层发出未分段报文
发送方L_Data.req:传输层/网络层向数据链路层传送单帧并启动N_As 定时器
2 接收方L_Data.ind:数据链路层向传输层/网络层发出 CAN 帧的接收信息
接收方N_USData.ind:传输层/网络层向会话层发出未分段报文的完成信息非分段报文
发送方L_Data.con:数据链路层向传输层/网络层确认 CAN 帧已被确认;发送端停止N_As 定时器
发送方N_USData.con:传输层/网络层向会话层发出 CAN 帧已确认的信息;发送方停止N_AS 定时器未分段报文
多帧报文收发流程的网络层定时参数应用如下所示:

流程分析:
1 发送方 N_USData.req:会话层向传输层/网络层发出分段报文
发送方L_Data.req:传输层/网络层向数据链路层发送 FirstFrame,并启动N_As定时器
2 接收方L_Data.ind:数据链路层向传输层/网络层发出 CAN 帧接收信号;接收方启动N_Br 定时器
接收方 N_USDataFF.ind:传输层/网络层向会话层发出接收分段报文的第一帧
发送方L_Data.con:数据链路层向传输层/网络层确认 CAN 帧已被确认;发送方停止N_As 定时器并启动N_Bs定时器
3 接收方L_Data.req:传输层/网络层向数据链路层发送流量控制(ContinueToSend和 BlockSize值=2d)传送到数据链路层,并启动N_Ar定时器
4 发送端L_Data.ind:数据链路层向传输层/网络层发出 CAN 帧的接收信号;发送端停止N_Br定时器。并启动N_Cs定时器
接收方L_Data.con:数据链路层向传输层/网络层确认 CAN 帧已被确认;接收方停止N_Ar 定时器并启动N_Cr定时器
5 发送方L_Data.req:传输层/网络层向数据链路层发送第一个连续帧,并启动N_As 定时器
6 接收方L_Data.ind:数据链路层向传输层/网络层发出 CAN 帧接收信号;接收方重新启动N_Cr 定时器
发送方L_Data.con:数据链路层向传输层/网络层确认 CAN 帧已被确认;发送端停止N_As定时器,并根据上一个 FlowControl的分离时间值(STmin)启动N_Cs定时器
7 发送方L_Data.req:当 N_Cs 定时器耗尽 (STmin) 时,传输层/网络层向数据链路层发送下一个 ConsecutiveFrame,并启动N_As 定时器
8 接收方L_Data.ind:数据链路层向传输层/网络层发出 CAN 帧接收信号;接收方停止N_Cr 定时器并启动N_Br 定时器
发送方L_Data.con:数据链路层向传输层/网络层确认 CAN 帧已被确认;发送方停止N_As 定时器并启动N_Bs 定时器;发送方等待下一次流量控制。
9 接收方L_Data.req:传输层/网络层向数据链路层发送流量控制(等待),并启动N_Ar 定时器
10 发送方L_Data.ind:数据链路层向传输层/网络层发出 CAN 帧的接收信号;发送方重新启动N_Bras 定时器。
接收方L_Data.con:数据链路层向传输层/网络层确认 CAN 帧已被确认;接收方停止N_Ar 定时器并启动N_Br定时器
11 接收方L_Data.req:传输层/网络层向数据链路层发送流量控制(ContinueToSend),并启动N_Ar定时器
12 发送方L_Data.ind:数据链路层向传输/网络层发出 CAN 帧接收信号;
接收方L_Data.req:传输/网络层向数据链路层发出 FlowControl(ContinueToSend)信号,并启动N_Ar定时器并启动N_Cs定时器
接收方L_Data.con:数据链路层向传输层/网络层确认 CAN 帧已被确认;接收方停止N_Ar定时器并启动N_Cr定时器
13 发送方L_Data.req:传输层/网络层向数据链路层发送 ConsecutiveFrame,并启动N_As定时器
14 接收方L_Data.ind:数据链路层向传输层/网络层发出 CAN 帧接收信号;接收器重新启动N_Cr定时器
发送方L_Data.con:数据链路层向传输层/网络层确认 CAN 帧已被确认;发送端停止N_As定时器,并根据上一个FlowControl的分离时间值(STmin)启动N_Cs定时器
15 发送方L_Data.req:当N_Cs定时器耗尽(STmin) 时,传输层/网络层向数据链路层发送最后一个 ConsecutiveFrame,并启动N_As定时器
16 接收方L_Data.ind:数据链路层向传输层/网络层发出CAN 帧接收信号;接收方停止N_Cr定时器
接收方 N_USData.ind:传输层/网络层向会话层发出完成分段报文的通知。
发送方L_Data.con:数据链路层向传输层/网络层确认 CAN 帧已被确认;发送端停止N_As定时器
发送方N_USData.con:传输层/网络层向会话层发出分段报文已完成的通知。
网络层超时的原因和处理方法:

UDS通过LIN进行诊断通信(DoLIN)
5.1 网络层概述
-
网络层服务原语
服务原语定义服务使用者(比如,诊断应用)如何与服务提供者(比如,网络层)合作。有如下服务原语(请求,指示,确认):
——使用服务原语请求(service_name.request),服务使用者从服务提供者请求服务;
——使用服务原语指示(service_name.indication),服务提供者告知服务使用者,网络层的内部事件或一个对等协议层实体服务使用者的服务请求;
——服务原语确认(service_name.confirm),服务提供者告知服务使用者,服务使用者此前的服务请求结果。
如下定义的通信服务,最多可以传输4095字节的数据:
a) N_USData.request:该服务用于请求传输数据。如果必要的话,网络层会把数据分段;
b) N_USData_FF.indication:该服务用于向上层指示开始接收分段帧;
c) N_USData.indication:该服务用于向上层提供接收的数据;
d) N_USData.confirm:该服务用于向上层确认请求的服务已经被执行(成功或失败)。
如下是N_USData.request的服务原语:
该服务原语请求从发送端到接收端对等实体发送内容为<MessageData>,长度为<length>字节。根据N_NAD中的地址信息识别(见5.2参数定义)。
每次调用N_USData.request服务,网络层应通过生成N_USData.confirm服务调用,向服务使用者指示报文发送完成(或失败)。
N_USData.request (
N_NAD
<MessageData>
<Length>
)
-
网络层内部操作
网络层内部操作提供了分段和重组的方法。网络层的主要目的是传输帧,这些帧可能可以放在一帧LIN报文中,也可能无法放在一帧LIN报文中。对于无法放在一帧LIN报文中的帧会分段为多个部分,每一个部分都可以放在一帧LIN报文中。
图6和图7分别表示不分段帧传输和分段帧传输的例子:

5.2 网络服务数据单元说明
N_AI, 地址信息
N_AI用于识别网络层通信对等实体。 N_AI由LIN ID和N_NAD组成。
- 两个专用的LIN ID用于任何传输层协议通信:
ID 0x3C(主节点请求)分配给主节点用于报文的传输;ID 0x3D (从节点响应)分配给从节点用于报文的传输;
此外,整体来看, N_AI参数用于识别帧发送端和接收端,以及帧的通信模型(N_TAtype)。
- N_NAD包含了由请求/响应寻址的从节点以及寻址类型(物理寻址、功能寻址、广播式)。这些参数提到了寻址信息。
类型:一字节无符号整型值;范围: 01-FF ;
描述:规定两种通信模式:——一对一通信,称为物理寻址;
——一对多通信,称为功能寻址或广播寻址。取决于N_NAD值的通信模式如下:——00:不适用,预留用于休眠指令帧;——01-7D:物理寻址类型;——7E:功能寻址类型;——7F:广播寻址类型;——80–FF:专用寻址类型。
所有类型的网络层帧都应支持物理寻址。请求得到响应是在预期中的。 N_NAD值应始终根据从节点中配置的NAD进行验证。
功能寻址应仅支持单帧通信。功能寻址请求不应得到响应。只有主节点可以发送功能寻址报文。
所有类型的网络层帧都应支持广播寻址。预期不会得到应答但应支持,即使可能引发冲突。只有主节点可以发送广播寻址帧。
<Length>
类型:12位。
范围:00116-FFF16。
描述:该参数包括需要发送/接收的数据的长度。
<MessageData>
类型:字节串。
范围:不适用。
描述:该参数包括所有的更高层实体交换的数据。
<N_Result>
类型:枚举型。
范围:N_OK、N_TIMEOUT_As、N_TIMEOUT_Cs、N_TIMEOUT_Cr、N_WRONG_SN、N_UNEXP_PDU、N_ERROR、N_UNEXP_NEW_REQ。
描述:该参数包括与服务执行结果相关的状态。如果同时发现两个或更多的错误,那么网络层实体应使用错误提示中该清单内的首先发现的参数值,提供给更高层:
——N_OK:该值意味着服务执行已经成功完成;可以在发送端和接收端均发送该值给服务使用者;
——N_TIMEOUT_As:当计时器 N_As 的计时超过其超时值 N_Asmax 时,应在发送端发送该值给服务使用者;
——N_TIMEOUT_Cs:当计时器 N_Cs 的计时超过其超时值 N_Csmax 时,应在发送端发送该值给协议使用者;
——N_TIMEOUT_Cr:当计时器 N_Cr 的计时超过其超时值 N_Crmax 时,应在发送端发送该值给服务使用者;
——N_WRONG_SN:当接收到非预期的序列号(N_PCI.SN)时,应发送该值给服务使用者;只能在接收端发送该值给服务使用者;
——N_UNEXP_PDU:当接收到非预期的协议数据单元时,应发送该值给服务使用者;可以在接收端或发送端发送该值给服务使用者;
——N_ERROR:该参数为一般性错误值。当网络层检测到错误,并且没有更适合的描述该错误的参数值时,可以发送该值给服务使用者;
——N_UNEXP_NEW_REQ:该值在如下场景下发送:
a) 当接收到新的更高优先级的N_USData.request请求服务调用时,会以N_USData.indication()的参数的形式,发送该值给激活的诊断通信中更低优先级的服务;
b) 由于当前激活的诊断通信中服务优先级更高,导致N_USData.request请求无法被接收;
c) 当接收到新的相同优先级的N_USData.request请求服务调用时,可以发送该值给服务使用者。
5.3 传输层协议
协议数据单元(N_PDU)使得网络层一个节点可以与网络层一个或更多节点间数据传递(对等协议实体)。所有的N_PDU由三个字段组成,见表2。

网络层不同节点对等协议实体间通信通过交换N_PDU完成。有三种不同类型的传输层协议数据单元:——单帧(SF N_PDU);
——首帧(FF N_PDU);——连续帧(CF N_PDU)。
用于在对等网络层实体间建立通信路径、交换通信参数、发送使用者数据以及释放通信资源。
- SF N_PDU通过单帧协议控制信息(SF N_PCI)识别。 SF N_PDU应由发送网络实体发出,并被所有的网络实体接收。只有通过N_AI寻址到的唯一的实体,在整个分段帧传输期间应处理该请求。其他未被寻址到的节点应拒绝挂起中的连接。当可以通过单个的服务请求传递给数据链路层,以及传递不分段帧时,应发送SF N_PDU以传递服务数据单元。
- FF N_PDU通过首帧协议控制信息(FF N_PCI)识别。 FF N_PDU应由发送网络实体发出,并被所有的网络实体接收。只有通过N_AI寻址到的唯一的实体,在整个分段帧传输期间应处理该请求。其他未被寻址到的节点应拒绝挂起中的连接。通过FF N_PDU可识别分段帧的第一个N_PDU,由网络发送实体发送,由接收网络实体接收。接收网络层实体在接收到FF N_PDU时,开始组装分段帧。
- CF N_PDU通过连续帧协议控制信息(CF N_PCI)识别。 CF N_PDU传递多个服务数据单元帧数据(<MessageData>)场(N_Data)。所有发送实体发送的,位于FF N_PDU之后的N_PDU应被编码为CF N_PDU。接收实体在接收到最后一帧CF N_PDU后,应传递组装后的报文给网络接收实体的服务使用者。 CF N_PDU在分段报文发送期间,应由发送网络实体发出,由唯一的接收网络实体接收。
地址信息(N_AI)
N_AI用于识别网络层通信对等实体。在N_SDU-N_NAD中接收到的N_AI信息应被复制并包括在N_PDU中。如果在N_SDU中接收到的报文数据(<MessageData>和<Length>)太长,需要分段网络层才能完成帧发送,那么N_NAD应被复制并包括(重复地)在发送的每一个N_PDU中。该段包括可以识别交换的帧类型的地址信息,数据交换发生在接收方和发送方之间。
注: 地址信息的详细描述,见5.2。
协议控制信息(N_PCI)
该段可识别交换的N_PDU的类型, 该段也被用于在通信网络层实体间交换其他控制参数。

数据场(N_DATA)
N_PDU中的N_Data用于传输在N_USData.request服务调用, < MessageData >参数中接收到的服务使用者数据。如果需要, < MessageData >在通过网络发送前,会被分段为更小的部分,每一个部分都可以放在N_PDU的数据场中。如果是该帧的SF或最后一个CF,则N_Data的大小取决于N_PDU类型和剩余MessageData的数量。
5.4 网络层定时参数
传输层(基于ISO 17987-2) 时序参数定义在下表:

不分段帧的网络层时序参数如下:

流程分析:
1 Sender N_USData.req: 会话层生成一条不分段帧给传输层。
Sender L_Data.req: 传输层请求向数据链路层发送单帧,并启动N_As定时器。该框图表示数据链路和传输层之间的时序关系,并不代表实际的总线报文调度。
2 Receiver L_Data.ind: 数据链路层生成并发给传输层,表示接收到LIN帧。
Receiver N_USData.ind: 传输层生成并发给会话层,表示不分段帧接收完成。
Sender L_Data.con: 数据链路层向传输层确认,传输层LIN帧已经成功发送完毕。发送者停止N_As定时器。Sender N_USData. con: 传输层生成并发给会话层,表示不分段帧发送完成。
分段帧的网络层时序参数如下:

流程分析:
1 Sender N_USData.req:会话层生成一条分段帧给传输层。
Sender L_Data.req:传输层请求向数据链路层发送首帧,并启动N_As定时器。该框图表示数据链路和传输层之间的时序关系,并不代表实际的总线帧调度。
2 Receiver L_Data.ind:数据链路层生成并发给传输层,表示接收到LIN帧。接收者启动N_Cr定时器。
Receiver N_USData_FF.ind:传输层生成并发给会话层,表示接收到分段帧的首帧。
Sender L_Data.con:数据链路层向传输层确认, LIN帧已经成功发送完毕。发送者停止N_As定时器,并启动N_Cs定时器。
3 Sender L_Data. req:传输层向数据链路层请求发送第一帧连续帧,并启动N_As定时器。
4,6 Receiver L_Data.ind:数据链路层生成并发给传输层,表示接收到LIN帧。接收者启动N_Cr定时器。
Sender L_Data.con:数据链路层向传输层确认, LIN帧已经成功发送完毕。发送者停止N_As定时器,并根据连续帧最小时间间隔(STmin) 启动N_Cs定时器。
5,7 Sender L_Data. req:当N_Cs定时器超时(STmin),传输层向数据链路层请求发送下一帧连续帧,并启动N_As定时器。
8 Receiver L_Data.ind:数据链路层生成并发给传输层,表示接收到LIN帧。接收者停止N_Cr定时器。Sender L_Data.con:数据链路层向传输层确认, LIN帧已经成功发送完毕。发送者停止N_As定时器。Receiver N_USData.ind:传输层生成并发给会话层,表示分段帧已接收完毕。
Sender N_USData.con:传输层生成并发给会话层,表示分段帧已发送完毕。
网络层超时的原因和动作:


浙公网安备 33010602011771号