《UDS最全内容总结(共19页).doc》由会员分享,可在线阅读,更多相关《UDS最全内容总结(共19页).doc(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上专心-专注-专业前言UDS协议即ISO14229,是Unified Diagnostic Services,统一诊断服务,是诊断服务的规范化标准,比如读取故障码应该向ECU发什么指令,读数据流又是发什么指令。OBD是关注车辆售后实时排放的理念形成的行业规范,而UDS是诊断服务的统一化规范,只是应用层的规范。UDS(Unified diagnostic services),与OBD最大的区别就在于“Unified”上,UDS是面向整车所有ECU(电控单元)的,而OBD是面向排放系统ECU的。简单说UDS而言,它只是一个应用层协议(ISO 14229-1),所以它既可以在
2、CAN线上实现(见下图.1),甚至也能在Ethernet上实现(DOIP, Diagnostic over Internet protocol 见下图.2)。并且,UDS提供的是一个诊断服务的基本框架,主机厂和零部件供应商可以根据实际情况选择实现其中的一部分或是自定义出一些私有化的诊断服务来,所以基于UDS协议的诊断又常常被称为Enhanced diagnostic(增强型诊断),UDS不是法规要求的,没有统一实现标准,其优势在于方便生产线检测设备的开发,同时更大的方便了售后维修保养和车联网的功能实现。UDS(Unified Diagnostic Services,统一的诊断服务)诊断协议是I
3、SO 15765 和ISO 14229 定义的一种汽车通用诊断协议,位于OSI模型中的应用层,它可在不同的汽车总线(例如CAN, LIN, Flexray, Internet 和K-line)上实现。UDS协议的应用层定义是ISO 14229-1,目前大部分汽车厂商均采用UDS on CAN的诊断协议。如下图所示,ISO 14229-1也就是UDS协议仅对应用层做出了定义,物理层有双绞线和光纤供用户选择,数据链路层采用CAN总线的ISO 11898-1协议,针对Classical CAN仅有8个字节的数据场与应用层可处理多帧数据的矛盾,ISO 15765-2对网络层进行了定义。CAN的8字节数
4、据场会腾出一帧来表示网络层的信息。下图右侧是排放相关的协议,ISO 15031-5主要针对OBD协议,为法规强制要求车厂满足的协议。学习时,我们应在了解CAN总线基本知识的前提下,着重学习ISO 15765-2和ISO 11898-1的协议内容,并通过BootLoader作为例子,对UDS有一个大致的了解。UDS 的7种服务及肯定响应和否定响应的形式UDS本质上是一系列的服务,共包含6大类26种。每种服务都有自己独立的ID,即SID。SID: (Service ID (Identifier)以下简称SID)Service,诊断服务ID。UDS本质上是一种定向的通信,是一种交互协议(Reques
5、t/Response),即诊断方给ECU发送指定的请求数据(Request),这条数据中需要包含SID。如果是肯定的响应(Positive Response),回复SID+0x40,就是请求10,响应50;请求22,响应62,回复的是一组数据。如果是否定的响应(Negative Response),回复7F+SID+NRC,回复的是一个声明。肯定响应和否定响应的形式一定要熟记。UDS的26种服务中,有7种很重要。它们分别是:$10Diagnostic Session Control(诊断会话),$14 Clear Diagnostic Information(清除诊断信息),$19Read D
6、TC Information,$22Read Data By Identifier(通过ID读数据),$27Security Access(安全访问),$2E Write Data By Identifier(通过ID写数据),$3ETester Present(待机握手)。下面对这7个服务进行解读。$10诊断会话Diagnostic Session Control (0x10)Diagnostic Session Control诊断request的格式Diagnostic Session Control这个服务的SID是0x10,request固定为2个byte,第一个byte是SID,第二
7、个byte的低7bit是sub-function,用于指示ECU将进入的session。UDS定义的session包括:0x00 ISOSAE Reserved(保留)0x01 default Session0x02 Programming Session0x03 extended Diagnostic Session0x04 safety System Diagnostic Session0x05 0x3F ISOSAE Reserved(保留)0x40 0x5F vehicle Manufacturer Specific(由整车厂自定义使用)0x60 0x7E system Supplie
8、r Specific(由ECU供应商自定义使用)0x7F ISOSAE Reserved(保留)Diagnostic Session Control用于控制ECU在不同的session之间进行转换,session可以看作是ECU所处的一种软件状态,在不同的session中诊断服务执行的权限不同。 ECU上电之后,默认处在default Session中,在这个session中很多诊断服务不可以执行,很多诊断相关的数据不能读取或写入。一般的诊断仪启动之后,会给ECU发送10 03,即让ECU进入 extended Diagnostic Session中,在这个session中可执行的诊断服务就很
9、多了。而如果要让ECU保持在non-default Session中,则需要诊断仪每隔固定的时间发送0x3E服务,ECU才会知道诊断仪有和自己通信的需求,从而保持在non-default Session中。另一个常用的session是Programming Session,在这个session中可以进行软件刷写的一系列诊断服务。0x40 0x5F 这个范围中的session由整车厂自定义使用,比如,某些诊断服务或诊断数据的操作需要在生产线上执行,即所谓的End-Of-Line,整车厂可以从这个范围中选择一个值来表示EOL session;又或者在开发阶段需要某种“超级”session,则也可以
10、从这里选一个值用来使ECU进入开发模式的session。Diagnostic Session Control这个服务非常简单,但是它却是ECU和诊断通信的第一条诊断命令。$10包含3个子功能,01 Default,02 Programming,03 Extended,ECU上电时,进入的是默认会话(Default)。如果您进入了一个非默认会话的状态,一个定时器会运转,如果一段时间内没有请求,那么到时间后,诊断退回到默认会话01。当然,我们有一个$3E的服务,可以使诊断保持在非默认的状态。UDS包含4种类型,即SID,SID+SF(Sub-function),SID+DID(Data Ident
11、ifier)(读写用),SID+SF+DID。NRC:Negative Response Code(否定响应码)。如果ECU拒绝了一个请求,它会回应一个NRC。不同的NRC有不同的含义。14229-1协议第329页单词:Consult(查阅) Session(会话) DTC (diagnostic trouble code)故障码Handling(处理) Conditions(条件) restricted(受限的) Concept(概念)SA(source address 源地址) TA(目标地址)例子:以CAN总线网络举例。八个帧数据字节,第一字节被网络层占用。请求(Request):02
12、10 02 xx xx xx xx xx ; 02中的0代表网络层单帧SF,2代表 数据域有2个字节;SF,数据域有2个字节,10是SID,02是子功能。肯定响应:02 50 02 xx xx xx xx xx;02同上,10+40表示对SID的肯定回复,02是子功能。否定响应:03 7F 10 22 xx xx xx xx;03同上,7F表示否定响应,10是SID,22是NRC。$3E待机握手Tester Present (0x3E)这个诊断服务的用处可以通过它的名字很明显地得知,即告知ECU诊断仪还在连接着。在上一篇文章中我说到了关于session的部分,如果没有诊断命令的发送和接收,EC
13、U将从non-default session中回退到default session, 0x3E就是用于使ECU保持在当前session。这应该是UDS中最简单的一个诊断服务了,它永远只有两个byte,格式如下:0x3E诊断服务的格式当sub-function是0x00时,ECU要给出response;当sub-function是0x80时,ECU不需要要给出response。一般来说主机厂会为这个服务定义两个时间参数,一个参数用于规定自己的诊断仪发送0x3E服务的间隔,另一个参数用于定义ECU收不到0x3E服务的timeout时间。$3E服务用于向服务器指示诊断仪仍然连接在网络上,之前已经激活
14、的诊断服务功能可以仍然保持激活状态。0x3E就是用于使ECU保持在当前session。这应该是UDS中最简单的一个诊断服务了,它永远只有两个byte,格式如下:例子:023E80 00 00 00 00 00,发送一个3E服务的报文,保持非默认会话状态。80表示无需回复。$27安全访问Security Access (0x27)厂家可能会为ECU定义某些安全级别稍微高一些的诊断服务,在执行此类服务之前,就需要执行Security Access 这个诊断命令,进行一个简单的身份验证。完成Security Access 有以下步骤:诊断仪向ECU请求“Seed”(通常是一个与时间相关的伪随机数),
15、ECU向诊断仪发送“Seed”诊断仪向ECU发送“Key” (根据请求得到的Seed和一个本地的密码进行计算得来)ECU判断诊断仪发来的“Key”是否有效根据UDS的定义,0x03, 0x05, 0x07 0x41 这个范围留给用于request Seed的sub-function;0x04, 0x06, 0x08 0x42这个范围留给用于send Key的sub-function。具体选择哪对值,由整车厂自己定义。整车厂也可以选择多对sub-function,用于不同等级的安全访问。下面我举一个完成Security Access的诊断命令的例子,假设0x05用于request Seed,0x
16、06用于send Key。诊断仪发送 27 05ECU响应 67 05 01 01 01(seed是 01 01 01)诊断仪发送 27 06 02 03 04(key值是02 03 04,seed是 01 01 01,假设本地密码为01 02 03,而算法就是将密码与seed相加)ECU验证成功 67 06此时ECU就处于unlocked的状态了,那些被保护起来的诊断服务和诊断数据可以被操作了。通常来说,如果ECU重启,或者回到了default session,unlocked状态就失效了,如果要执行相关诊断服务,则需要再次执行上面描述的过程。$27安全访问:ECU当中有很多数据是整车厂独有
17、的,并不希望开放给所有客户,它需要做一个保密的设定。我们在读取一些特殊数据的时候,要先进行一个安全解锁。ECU上电之后是一个锁定的状态(Locked),我们通过$27服务,加上一个子服务,再加上一个钥匙,这样的服务请求可以进行解锁。比如下面的例子,2n-1是一个子服务,通过首轮种子的请求,首轮ECU会返回67+01+AA+BB+CC+DD,AADD就是种子了。之后第二轮,诊断端会利用种子进行运算(利用整车厂的算法),生成k1(不一定是1个字节),那么发送请求,27+02+k1。ECU同样也会通过种子算出k2。当k1和k2匹配时,解锁(Unlocked)成功。$27安全访问服务的否定响应服务ID
18、也是7F。还记得刚才否定响应的格式吗7F+27+NRCRx: 0227 0500 00 00 00 00 安全访问,05子功能Tx: 0767 0508 27 11 F0 77 肯定响应,回复了对应安全级别的种子Rx: 0627 06FF FF FF FF 00 发送密钥,4个FF。注意06是与05成对使用的。Tx: 037F 27 7800 00 00 00 否定响应,7F+27+NRCTx: 0267 0600 00 00 00 00 肯定响应,通过安全校验$22读数据$22读数据,Request(请求):22+DID(Data Identifier,通常是两个字节)Response(响应
19、):62+DID+DataDID有一部分已经被ISO 14229-1规定了。比如0xF186就是当前诊断会话数据标识符,0xF187就是车厂备件号数据标识符,0xF188就是车厂ECU软件号码数据ID,0xF189就是车厂ECU软件版本号数据标识符。$2E写数据$22写数据,Request(请求):2E+DID+DataResponse(响应):6E+DID注意,比如0xF186这个DID不支持直接写入数据,需要用$10来进行会话转换。也就是说,对于写数据的请求,一般来说需要在一个非默认会话,和解锁的状态下才能进行。$19 读DTCDTC(diagnostic trouble code):如果
20、系统检测到了一个错误,它将存储为DTC。DTC可表现为:一个显而易见的故障;通讯信号的丢失(不会使故障灯亮起);排放相关的故障;安全相关的错误等。DTC可以揭示错误的位置和错误类型。通常DTC占用3个字节,OBD II占用两个字节。图中FTB为Fault Type Byte。故障码包括四个大类,分别是PCBU,P是powertrain动力系统,C是Chassis底盘,B是Body车身,U是network通信系统。一个DTC信息占用4个字节。最后一个字节是DTC的状态。前两个字节是我们熟知的类似P0047的故障码。LowByte暂不清楚。$19拥有28个子服务(Sub-Function)。常用的
21、子服务有02(通过DTC状态掩码读取DTC),04(读取快照信息),06(读取扩展信息),0A(读ECU支持的所有DTC数据)。刚才提到,一个DTC除了它自己的3个字节,还有一个字节专门用于表达DTC的状态。这个状态字节每个位的含义可以查询ISO 14229-1。注意,并不是所有的DTC状态都是支持的。下图是Request/Response。括号标识循环,可以读出很多DTC。$14清除DTC清除(复位)DTC格式,它可以改变DTC的状态。3个FF代表清除所有DTC。Request:14+FF+FF+FF;Response:54 。我们刚才学完了7种重要的服务,SID。除此之外,在CAN总线中,
22、Addressing information寻址信息通过CAN帧ID体现出来。通讯的模式分两种,一种是物理寻址(点对点),根据物理地址的不同进行访问,但只能访问单个ECU节点,Test为SA源地址,ECUX作为TA目标地址;对应的,另一种是功能寻址(广播),根据功能的不同进行访问,它能访问多个ECU节点。每一个ECU都有2个CAN帧ID,分别对应收和发的物理寻址。以上只是一些粗浅的理解。对26种服务更详细的解读请拉到屏幕下方参考张老师的8篇文章。张老师也开通了微信公众号,可以了解一下。UDS应用的设备:在UDS 诊断产品中知名度最高,应用最广泛的是德国Vector公司的CAN case 配合其
23、CANoe软件,Vector 产品功能齐全,适合系统级汽车总线开发,被大部分汽车厂商采用。Vector 产品因不开放API,不能做二次开发且价格昂贵,不适用于硬件开发团队和生产线的自动化测试。目前市面上有很多CAN 厂商(如Kvaser, ZLG 等)能提供低成本、体积小、驱动简单、开放API 的设备,很适合进行二次开发。杂记变速器控制单元TCU和防抱死系统ABS是CAN车载网络上的两大电子控制单元, 这2个ECU要通过CAN网络进行大量的信息交互。但是由于电磁干扰、串扰、静电等外界干扰或电控单元本身控制策略引起的通信停止等原因, 2个控制单元之间可能会出现通信丢失的现象。控制系统需要将故障信
24、息(例如通信丢失故障信息) 诊断出来, 以处理通信被破坏时出现丢失帧的故障现象, 并记录为DTC (diagnostic trouble code)。ECU的输入信号主要有4种形式: 模拟信号(水温、油压、蓄电池电压等); 数字信号(各种开关信号等); PWM信号(脉冲信号、频率信号等); 网络信号(CAN、LIN上传输的信号)。微控制器可以通过监测这些信号来判别输入电路的工作状况。输出的信号往往用作控制电磁阀、指示灯、步进电机等, 大多数为数字信号。统一诊断服务 (Unified diagnostic services , UDS) (一)UDS由ISO-14229系列标准定义,ISO 14
25、229-1 定义了诊断服务,不涉及网络及实现,只有应用层的内容。而ISO 14229-3则定义了UDS在CAN总线上的实现。诊断通信的过程从用户角度来看非常容易理解,诊断仪发送诊断请求(request),ECU给出诊断响应(response),而UDS就是为不同的诊断功能的request和response定义了统一的内容和格式。Diagnostic request的格式:Diagnostic request的格式可以分为两类:一类是拥有sub-function的,一类是没有sub-function的,如下面两张图所示。Service ID(以下简称SID)的长度固定为1个字节,代表了这条诊断命
26、令执行的什么功能。Sub-function的长度也是1个字节,它通常表示对这个诊断服务的具体操作,比如是启动、停止还是查询这个诊断服务。Parameter则根据各个诊断服务的不同具有不同的内容,长度和格式并没有统一规格,它用于限定诊断服务执行的条件,比如某个诊断服务执行的时间等。parameter的一个重要应用是作为标识符,标识诊断请求要读出的数据内容。有一点要补充的是,其实sub-function严格来说是7个bit,而不是1个byte,因为它的最高位bit被用于抑制正响应(suppress positive response, SPR),如果这个bit被置1,则ECU不会给出正响应(pos
27、itive response); 如果这个bit被置0,则ECU会给出正响应。这样做的目的是可以告诉ECU不要发不必要的response,从而节约通信资源。Diagnostic response的格式:Diagnostic response分为positive和negative两类。positive response意味着诊断仪发过来的诊断请求被执行了negative response则意味着ECU因为某种原因无法执行诊断仪发过来的诊断请求,而无法执行的原因则存在于negative response的报文中。positive responsepositive response的格式如上图所示,
28、也基本上是由三部分组成,其中的response SID这个字节作为诊断请求的echo,它等于SID + 0X40。后面的两个部分则视具体的诊断服务而定。negative responsenegative response的格式固定为3个字节,第一个字节为0x7F,第二个字节是被拒绝掉的SID,第三个字节是这个诊断服务无法被执行的原因。下面这张图列举了部分原因代码,比如,如果ECU给出7F 22 13这个negative response,则说明22这个服务因为诊断请求数据长度不对的原因无法执行。总结:诊断通信的过程就是诊断仪和ECU交换数据,前者发的是request,后者发的是response
29、,而UDS最重要的作用就是定义了这些request和response的格式和内容。统一诊断服务 (Unified diagnostic services , UDS) (二)UDS定义的诊断服务从逻辑来说分为以下几类:Diagnostic and Communication Management (诊断和通信管理)Data Transmission (数据传输)Stored Data Transmission (存储数据传输,用于操作DTC)Input Output Control (IO控制)Routine Control (不知如何翻译好,作用是调用ECU内部的预置函数)Upload Do
30、wnload (上传下载)UDS规定使用1个byte来表示诊断服务,即所谓的Service ID,简称SID。本文介绍一下Diagnostic and Communication Management 这一类诊断服务中的一部分。Diagnostic Session Control (0x10)Diagnostic Session Control诊断request的格式Diagnostic Session Control这个服务的SID是0x10,request固定为2个byte,第一个byte是SID,第二个byte的低7bit是sub-function,用于指示ECU将进入的session。
31、UDS定义的session包括:0x00 ISOSAE Reserved(保留)0x01 default Session0x02 Programming Session0x03 extended Diagnostic Session0x04 safety System Diagnostic Session0x05 0x3F ISOSAE Reserved(保留)0x40 0x5F vehicle Manufacturer Specific(由整车厂自定义使用)0x60 0x7E system Supplier Specific(由ECU供应商自定义使用)0x7F ISOSAE Reserved
32、(保留)Diagnostic Session Control用于控制ECU在不同的session之间进行转换,session可以看作是ECU所处的一种软件状态,在不同的session中诊断服务执行的权限不同。 ECU上电之后,默认处在default Session中,在这个session中很多诊断服务不可以执行,很多诊断相关的数据不能读取或写入。一般的诊断仪启动之后,会给ECU发送10 03,即让ECU进入 extended Diagnostic Session中,在这个session中可执行的诊断服务就很多了。而如果要让ECU保持在non-default Session中,则需要诊断仪每隔固
33、定的时间发送0x3E服务,ECU才会知道诊断仪有和自己通信的需求,从而保持在non-default Session中。另一个常用的session是Programming Session,在这个session中可以进行软件刷写的一系列诊断服务。0x40 0x5F 这个范围中的session由整车厂自定义使用,比如,某些诊断服务或诊断数据的操作需要在生产线上执行,即所谓的End-Of-Line,整车厂可以从这个范围中选择一个值来表示EOL session;又或者在开发阶段需要某种“超级”session,则也可以从这里选一个值用来使ECU进入开发模式的session。Diagnostic Sessi
34、on Control这个服务非常简单,但是它却是ECU和诊断通信的第一条诊断命令。诊断response的格式:Diagnostic Session Control这个诊断服务的response分为三部分,第一部分是0x50,作为SID的echo;第二部分是进入的session,作为sub-function的echo;第三部分是4个字节,前两个字节代表P2 Server_max,即ECU在应用层上对诊断命令的响应时间,后两个字节代表P2*Server_max,即ECU在暂时无法处理当前诊断命令(具体表现为发送了NRC 0X78),在应用层上对诊断命令响应的最长时间。ECU Reset 诊断req
35、uest的格式ECU Reset (0x11) ECU Reset 这条指令的用途是通过诊断请求使ECU重启。ECU Reset 这个服务的SID是0x11,request固定为2个byte,第一个byte是SID,第二个byte的低7bit是sub-function,用于指示ECU将模拟哪种方式进行重启。常用的sub-function包括(只举2个例子,UDS还定义了很多其他的值)0x01hard Reset 模拟KL30的重启0x02key Off On Reset 模拟KL15的重启当我们通过诊断命令改写了ECU的某些数据,或者对ECU进行了某些设置,只有将ECU重启才能将这些配置生效,
36、所以就有了这个诊断命令。在ECU Reset 执行之后,ECU会从Non-default session回退到default session中。Security Access (0x27)厂家可能会为ECU定义某些安全级别稍微高一些的诊断服务,在执行此类服务之前,就需要执行Security Access 这个诊断命令,进行一个简单的身份验证。完成Security Access 有以下步骤:诊断仪向ECU请求“Seed”(通常是一个与时间相关的伪随机数),ECU向诊断仪发送“Seed”诊断仪向ECU发送“Key” (根据请求得到的Seed和一个本地的密码进行计算得来)ECU判断诊断仪发来的“Ke
37、y”是否有效根据UDS的定义,0x03, 0x05, 0x07 0x41 这个范围留给用于request Seed的sub-function;0x04, 0x06, 0x08 0x42这个范围留给用于send Key的sub-function。具体选择哪对值,由整车厂自己定义。整车厂也可以选择多对sub-function,用于不同等级的安全访问。下面我举一个完成Security Access的诊断命令的例子,假设0x05用于request Seed,0x06用于send Key。诊断仪发送 27 05ECU响应 67 05 01 01 01(seed是 01 01 01)诊断仪发送 27 06
38、 02 03 04(key值是02 03 04,seed是 01 01 01,假设本地密码为01 02 03,而算法就是将密码与seed相加)ECU验证成功 67 06此时ECU就处于unlocked的状态了,那些被保护起来的诊断服务和诊断数据可以被操作了。通常来说,如果ECU重启,或者回到了default session,unlocked状态就失效了,如果要执行相关诊断服务,则需要再次执行上面描述的过程。统一诊断服务 (Unified diagnostic services , UDS) (三)在上一篇文章中我写了Diagnostic and Communication Management
39、 (诊断和通信管理)这一类诊断服务中的0x10 , 0x11 , 0x27,在这篇文章中继续这一大类诊断服务中的其他内容。Communication Control (0x28)该服务用于打开/关闭某些类别的报文的发送/接收。它通常在刷写软件或大量数据的时候使用,因为在刷软件或参数的时候并不需要ECU进行与通信相关的功能,将通信关闭之后可以把所有通信资源都留给软件或参数的下载,当下载过程完成之后再利用该服务将通信恢复即可。0x28服务的格式如下图所示0x28服务的格式第一部分即SID,一个byte,值为0x28;第二部分是sub-function,表明要对ECU的通信进行哪种控制,具体包括 :
40、0x00 enable Rx And Tx (激活接收和发送)0x01 enable Rx And Disable Tx(激活接收和关闭发送)0x02 disable Rx And Enable Tx(激活发送和关闭接收)0x03 disable Rx And Tx(关闭接收和发送)0x04 enable Rx And Disable Tx With Enhanced Address Information(激活接收和关闭发送,针对特定的地址)0x05 enable Rx And Tx With Enhanced Address Information(激活接收和发送,针对特定的地址)0x06
41、 - 0x7F都是保留或者留给厂商自定义的。第三部分 communication Type的定义表明这条诊断请求要对哪种报文进行控制,长度为1个byte,这个byte中最常用的就是低2 bit,0x1代表普通应用报文,0x2代表网络管理报文,0x3代表普通应用报文和网络管理报文。第四部分 是optional的,只有当sub-functional等于0x04或0x05时才需要使用。定义如下表所示:举个完整的诊断服务例子:28 01 01 表示激活应用报文的接收并关闭应用报文的发送(网络管理报文不受影响)。28 00 01 表示激活应用报文的接收和发送(网络管理报文不受影响)。Tester Pre
42、sent (0x3E)这个诊断服务的用处可以通过它的名字很明显地得知,即告知ECU诊断仪还在连接着。在上一篇文章中我说到了关于session的部分,如果没有诊断命令的发送和接收,ECU将从non-default session中回退到default session, 0x3E就是用于使ECU保持在当前session。这应该是UDS中最简单的一个诊断服务了,它永远只有两个byte,格式如下:0x3E诊断服务的格式当sub-function是0x00时,ECU要给出response;当sub-function是0x80时,ECU不需要要给出response。一般来说主机厂会为这个服务定义两个时间参
43、数,一个参数用于规定自己的诊断仪发送0x3E服务的间隔,另一个参数用于定义ECU收不到0x3E服务的timeout时间。Control DTC Setting (0x85)该服务用于控制ECU的DTC存储,这个服务常常和前面提到的OX 28服务一起使用,比如,在开始写参数之前,为了获得更快的传输速度,我们用OX 28服务把所有ECU的通信关闭了,但此时因为收到不到相关的报文,ECU会没有必要地存储很多DTC,这时如果我们使用85服务把ECU存储DTC的功能暂时性地禁止掉,则不会造成这种麻烦。0x85服务的格式第一部分即SID,一个byte,值为0x85;第二部分是sub-function,表明
44、是打开还是关闭ECU的DTC存储,具体包括 :0x01 on0x02 off第三部分是optional的,由各家自己定义,比如,可以用FF FF FF 来表示这条诊断命令针对所有的DTC。Response On Event (0x86)我在以前的文章里说,诊断通信过程是问答式的,诊断仪发请求,ECU给响应。0x86服务算是一个例外,在ECU收到这条0x86服务之后,当DTC产生时,它会自动地上报DTC及相关环境数据,直到用另一条0x86服务来关闭ECU的这个行为。该功能主要用于ECU的前期开发阶段,在售后和生产中是不会用到的,而且该服务的格式复杂(即可变的参数很多),执行它还分为好几个步骤,我
45、就不详细写了。Link Control (0x87)这个服务用于转化ECU数据链路层和物理层的状态,比如,在高速CAN上的ECU正常通信速率是500 kbit/s,但它同时也支持1M bit/s的波特率,如果需要刷写大量数据,便可以利用这条诊断服务让ECU以1M bit/s的波特率进行通信。这个诊断服务的执行分为两个步骤:(1)验证ECU是否支持要调整到的目标波特率(2)让ECU的数据链路层和物理层转到目标波特率的通信状态。只有当第一个步骤验证通过了,第二个步骤才可以成功执行。统一诊断服务 (Unified diagnostic services , UDS) (四)这篇文章介绍一下UDS的第
46、二类诊断服务,即Data Transmission (数据传输)。这类诊断服务包括以下SID:Read Data By Identifier (0x22)Read Memory By Address (0x23)Read Scaling Data By Identifier (0x24)Read Data By Periodic Identifier (0x2A)Dynamically Define Data Identifier (0x2C)Write Data By Identifier (0x2E)Write Memory By Address (0x3D)通常,0x22和0x2E成对使
47、用,0x23和0x3D成对使用,这几个服务用于诊断数据的基本读写操作。0x24,0x2A,0x2C是一些特殊操作。0x22和0x2E这两个服务是对以标识符(identifier)标记的数据的操作,前者是读,后者是写。UDS规定,诊断数据使用两个byte的标识符来标记,比如,0xF187用来标记ECU的零件号,0xF19E用于标记该ECU所使用的诊断文件的名字,UDS还规定了厂家可以自定义的标识符范围。这两个服务的用法很简单,下面我以读取ECU的零件号为例说明:22 F1 87 (读取零件号)62 F1 87 XX YY ZZ KK MM NN(给出零件号)具体每次可以使用22服务读取几个ID,每个ID的读写权限(比如在哪些session中可以读写,是否需要安全访问操作等),由厂家自定义。假设零件号这个ID是可以写入的话,则写零件号的诊断命令是:2E F1 87 XX YY ZZ KK MM NN(写入零件号)6E F1 87(给出positive response)0x23服务的请求格式0x230x23和0x3D这两个服务是对以地址信息(memory Address )标记的数据的操作,前者是读,后者是写。这个命令的
限制150内