统一诊断服务 (Unified diagnostic services , UDS) (三)

转载来自知乎:https://zhuanlan.zhihu.com/p/33852614 张丁

我用来画重点地 可以去知乎看博主的哈 写的很好 

CommunicationControl (0x28)

该服务用于打开/关闭某些类别的报文的发送/接收。它通常在刷写软件或大量数据的时候使用,因为在刷软件或参数的时候并不需要ECU进行与通信相关的功能,将通信关闭之后可以把所有通信资源都留给软件或参数的下载,当下载过程完成之后再利用该服务将通信恢复即可。

0x28服务的格式如下图所示

                                                   0x28服务的格式

第一部分即SID,一个byte,值为0x28;

第二部分是sub-function,表明要对ECU的通信进行哪种控制,具体包括 :

0x00 enableRxAndTx (激活接收和发送)

0x01 enableRxAndDisableTx(激活接收和关闭发送)

0x02 disableRxAndEnableTx(激活发送和关闭接收)

0x03 disableRxAndTx(关闭接收和发送)

0x04 enableRxAndDisableTxWithEnhancedAddressInformation(激活接收和关闭发送,针对特定的地址)

0x05 enableRxAndTxWithEnhancedAddressInformation(激活接收和发送,针对特定的地址)

0x06 - 0x7F都是保留或者留给厂商自定义的。

第三部分表明这条诊断请求要对哪种报文进行控制,长度为1个byte,定义如下表所示:

                                                            communicationType的定义

这个byte中最常用的就是低2 bit,0x1代表普通应用报文,0x2代表网络管理报文,0x3代表普通应用报文和网络管理报文

第四部分是optional的,只有当sub-functional等于0x04或0x05时才需要使用。

举个完整的诊断服务例子:

28 01 01 表示激活应用报文的接收并关闭应用报文的发送(网络管理报文不受影响)。

28 00 01 表示激活应用报文的接收和发送(网络管理报文不受影响)。

 


 

TesterPresent (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。

一般来说主机厂会为这个服务定义两个时间参数,

一个参数用于规定自己的诊断仪发送0x3E服务的间隔

另一个参数用于定义ECU收不到0x3E服务的timeout时间

 


 

ControlDTCSetting (0x85)

该服务用于控制ECU的DTC存储这个服务常常和前面提到的28服务一起使用,比如,在开始写参数之前,为了获得更快的传输速度我们用28服务把所有ECU的通信关闭了,但此时因为收到不到相关的报文,ECU会没有必要地存储很多DTC这时如果我们使用85服务把ECU存储DTC的功能暂时性地禁止掉,则不会造成这种麻烦。

                                          0x85服务的格式

第一部分即SID,一个byte,值为0x85;

第二部分是sub-function,表明是打开还是关闭ECU的DTC存储,具体包括 :

0x01 on

0x02 off

第三部分是optional的,由各家自己定义,比如,可以用FF FF FF 来表示这条诊断命令针对所有的DTC。

 


 

ResponseOnEvent (0x86)

我在以前的文章里说,诊断通信过程是问答式的,诊断仪发请求,ECU给响应

0x86服务算是一个例外,在ECU收到这条0x86服务之后,当DTC产生时,它会自动地上报DTC及相关环境数据,直到用另一条0x86服务来关闭ECU的这个行为。

该功能主要用于ECU的前期开发阶段,在售后和生产中是不会用到的,而且该服务的格式复杂(即可变的参数很多),执行它还分为好几个步骤,我就不详细写了。

 


 

 

LinkControl (0x87)

这个服务用于转化ECU数据链路层和物理层的状态,比如,在高速CAN上的ECU正常通信速率是500 kbit/s,但它同时也支持1M bit/s的波特率,如果需要刷写大量数据,便可以利用这条诊断服务让ECU以1M bit/s的波特率进行通信。

这个诊断服务的执行分为两个步骤:

  1. 验证ECU是否支持要调整到的目标波特率
  2. 让ECU的数据链路层和物理层转到目标波特率的通信状态

只有当第一个步骤验证通过了,第二个步骤才可以成功执行。

 

posted @ 2020-07-02 15:28  冰糖葫芦很乖  阅读(874)  评论(0编辑  收藏  举报