1. 程式人生 > >統一診斷服務 (Unified diagnostic services , UDS) (三)

統一診斷服務 (Unified diagnostic services , UDS) (三)

大年初二更新一篇,祝大家春節快樂,好好休整,節後更好地工作生活。

在上一篇文章中我寫了Diagnostic and Communication Management (診斷和通訊管理)這一類診斷服務中的0x10 , 0x11 , 0x27,在這篇文章中繼續這一大類診斷服務中的其他內容。

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的資料鏈路層和物理層轉到目標波特率的通訊狀態

只有當第一個步驟驗證通過了,第二個步驟才可以成功執行。

再次祝大家新年快樂,年後再更。