統一診斷服務 (Unified diagnostic services , UDS) (三)
大年初二更新一篇,祝大家春節快樂,好好休整,節後更好地工作生活。
在上一篇文章中我寫了Diagnostic and Communication Management (診斷和通信管理)這一類診斷服務中的0x10 , 0x11 , 0x27,在這篇文章中繼續這一大類診斷服務中的其他內容。
CommunicationControl (0x28)
該服務用於打開/關閉某些類別的報文的發送/接收。它通常在刷寫軟體或大量數據的時候使用,因為在刷軟體或參數的時候並不需要ECU進行與通信相關的功能,將通信關閉之後可以把所有通信資源都留給軟體或參數的下載,當下載過程完成之後再利用該服務將通信恢復即可。
0x28服務的格式如下圖所示
第一部分即SID,一個byte,值為0x28;
第二部分是sub-function,表明要對ECU的通信進行哪種控制,具體包括 :
0x00 enableRxAndTx (激活接收和發送)
0x01 enableRxAndDisableTx(激活接收和關閉發送)
0x02 disableRxAndEnableTx(激活發送和關閉接收)
0x03 disableRxAndTx(關閉接收和發送)
0x04 enableRxAndDisableTxWithEnhancedAddressInformation(激活接收和關閉發送,針對特定的地址)
0x05 enableRxAndTxWithEnhancedAddressInformation(激活接收和發送,針對特定的地址)
0x06 - 0x7F都是保留或者留給廠商自定義的。
第三部分表明這條診斷請求要對哪種報文進行控制,長度為1個byte,定義如下表所示:
這個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,格式如下:
當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的功能暫時性地禁止掉,則不會造成這種麻煩。
第一部分即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的波特率進行通信。
這個診斷服務的執行分為兩個步驟:
- 驗證ECU是否支持要調整到的目標波特率
- 讓ECU的數據鏈路層和物理層轉到目標波特率的通信狀態
只有當第一個步驟驗證通過了,第二個步驟才可以成功執行。
再次祝大家新年快樂,年後再更。
推薦閱讀: