1.診斷概述
汽車診斷就是通過汽車總線(CAN LIN Eth)來進行診斷會話,大部分通過CAN總線通訊進行請求與響應。
1.診斷分層
DCM內部支持UDS服務和OBD服務(排放,動力)。
以統一診斷服務UDS為例,應用層(ISO 14229標準),會話層,傳輸層,網絡層(ISO 15765 標準),數據鏈路層 (ISO 11898 標準)。
UDS 和 OBD 服務都屬于診斷應用層服務,底層可以通過不同的總線通信實現。比如 UDS 服務支持 CAN 總線 Lin 總線 Eth 總線,OBD 常見的支持 CAN總線、K 線、FlexRay 總線。大家一定要區分診斷服務并不規定一定要通過什么總線實現。
2.AutoSar診斷功能
診斷服務屬于 AutoSAR 服務層,診斷數據流通過 CAN 驅動CANIF 層 CANTP- PDUR -DCM 給到 DCM 模塊,DCM 模塊處理診斷數據,并執行對應的具體診斷服務。
- **DCM:**Diagnostic Communication Manager,診斷通訊管理。實現具體的診斷協議,比如 UDS OBD。這里具體定義了各種不同的診斷服務,比如讀取 ECU 故障碼、寫入 DID 數據等。
- **DEM:**Diagnostic Event Manager,診斷事件管理,用來記錄和存儲診斷事件的,在診斷故障碼寫入的時候會加入防抖策略。DCM 和 DEM 直接交互,只要在 0x19 0x14 等與 DTC 相關服務的時候進行交互。
- **FIM:**Function Inhibition Manager,功能禁止管理。當一些錯誤出現的時候,禁止一些功能,比如檢測到電流過大的時候,關閉繼電器。就是有些 SWC是需要使能條件的,這些條件取決于故障內容(源于 DEM),而 FIM 負責根據故障內容關閉一些 SWC 或執行一些 SWC。
- **故障響應:**應用層傳輸數據到 DEM,DEM 判斷出是哪個故障,之后發送給 FIM;FIM 立即做出判斷,通過回調函數通知 SWC 或者輪詢的方式禁止 SWC
- 故障記錄:應用層傳輸數據給 DEM,DEM 一邊發送給 FIM,另一邊發送給 NVM(管理非易失性存儲的組件),NVM 會將 DTC 存儲到 FLASH 中。
2.UDS服務
UDS服務由診斷請求和診斷響應組成。一般情況下是診斷儀發出診斷請求,ECU 根據診斷請求執行具體診斷服務,并將結果通過診斷應答發出給診斷儀。
響應分為肯定響應和否定響應。
2.1 UDS診斷請求與響應
UDS服務的診斷請求,由SID(服務ID必須)+ 子服務ID + 數據參數組成。
-
帶子服務的請求
例如:10 01(請求切換到默認會話模式)
例如:19 02 FF(請求讀取以 0xFF 為 Mask 的故障信息 -
帶子服務的肯定響應
請求:10 01(切換默認會話模式)
響應:50 01 xx xx xx xx(成功切換默認會話模式) -
不帶子服務的請求
例如:22 F0 90(請求讀取 DID 為 0xF090 的數據)
例如:37(請求數據傳輸退出服務) -
不帶子服務的肯定響應
請求:22 F0 90(讀取 DID 為 0xF090 的數據)
響應:62 F0 90 11 11 11 11 11 11 11 11 11 11(返回 DID 為 0xF090 的數據為 11 11 11 11 11 11 11 11 11 11) -
否定響應
請求:10 02(切換編程會話模式)
負響應:7F 10 7E(切換編程會話服務執行失敗 錯誤碼 NRC 為 7E)
2.2 診斷的尋址方式
尋址方式有兩種,物理尋址和功能尋址。
- 物理尋址
是診斷儀和單個 ECU 之間的診斷,也就是診斷請求報文發出去后,根據報文ID,CAN 網絡中只會有對應的一個 ECU 進行診斷響應 - 功能尋址
是診斷儀和多個 ECU 之間的診斷,也就是診斷請求報文發出去后,CAN 網絡中支持該功能尋址報文 ID 的 ECU,一般功能尋址報文 ID 為 0x7DF,這些 ECU 都會執行診斷服務,并且發出診斷響應。
一個 ECU 內部一般會定義 3 條診斷報文: - 診斷請求接收報文(物理尋址 報文 ID 用戶自定義 同一網絡中的每個 ECU 不一樣)
- 診斷請求接收報文(功能尋址 一般為 0x7DF)
- 診斷應答發送報文(同一網絡的每個 ECU 的 ID 不一樣)
例:整車同一網絡中有 ECU A, B, C, D 多個節點,假設他們的物理請求消息 ID 為 0x701, 0x702, 0x703, 0x704,響應消息地址分別為 0x70A,0x70B, 0x70C, 0x70D,所有 ECU 的功能尋址 ID 為 0x7DF。
物理尋址時:
0x701 0x10 0x01 (對 ECU A 進行診斷請求)
0x70A 0x50 0x01 xx xx xx xx (僅 ECU A 響應)
功能尋址時:
0x7DF 0x10 0x01 (對所有 ECU 進行診斷請求)
0x70A 0x50 0x01 xx xx xx xx (ECU A 響應)
0x70B 0x50 0x01 xx xx xx xx (ECU B 響應)
0x70C 0x50 0x01 xx xx xx xx (ECU C 響應)
0x70D 0x50 0x01 xx xx xx xx (ECU D 響應)
2.3 UDS常用診斷服務
2.3.1 診斷會話控制【0x10】
會話模式有默認會話模式(default session)和非默認會話模式(non-default session),非默認會話模式包含編程會話模式(ProgrammingSession)、拓展診斷會話模式(extendedDiagnosticSession)及其余會話模式。會話模式可以理解為診斷的功能模式,即在不同的會話模式下,能夠支持不同的診斷功能,如在默認會話模式0x01下,一般情況下不允許支持寫服務(WriteDataByIdentifier0x2E),也不允許支持請求下載服務(RequestDownload0x34),而在拓展診斷會話模式0x03下,就允許支持寫服務(WriteDataByIdentifier0x2E),在編程會話模式0x02下,就可以支持(RequestDownload0x34)。
ECU 在剛上電或者復位之后處于默認會話模式(0x01);
默認會話模式下發送 10 03 可以切換至拓展會話模式(0x03);
拓展會話模式發送 10 02 可以切換至編程會話模式(0x02);
而在默認會話模式不可以直接跳轉至編程會話模式,若在模式會話模式直接發送 10 02,此時 ECU 需要響應 NRC 為0x7E(subFunctionNotSupportedInActiveSession)的負響應,響應內容為 7F 10 7E。
如果 ECU 處于非默認會話模式下,客戶端發送 10 01 進入默認會話模式,ECU收到該請求后,ECU 的安全訪問狀態切換到鎖定狀態,由
ReadDataByPeriodicIdentifer(0x2A)服務配置的周期調度被禁止,通過CommunicationControl(0x28)和 ControlDTCSetting(0x85)進行的設置均被復位,即 ECU 初始化所有在非默認模式下激活的事件,設置和控制等操作,但不包括已經寫入到非易失性存儲位置的操作。
- 請求格式: 0x10 + 子服務(1byte)
01 默認會話
02 編程會話
03 拓展會話 - 肯定響應 0x50 子服務ID(1byte) + P2time (接收請求后的響應時間:2byte)+ p2time (接收到請求后P2time * 10 內返回響應會先返回78NRC:2byte)
- 否定響應:0x7F + 0x10 + NRC(1byte)
2.3.2 ECU復位(0x10)
ECU 復位 ECUReset(0x11)是控制 ECU 端執行復位的服務。診斷儀發送 11 01 復位請求后,ECU 復位動作執行前,正響應需先發送給診斷儀,然后 ECU 執行復位操作,成功復位后,ECU 需進入默認會話模式。
- 請求格式: 0x11 + 子服務(1byte)
- 肯定響應 0x50 + 子服務ID(1byte)
- 否定響應:0x7F + 0x11 + NRC(1byte)
2.3.3 安全訪問(0x27)
安全訪問 SecurityAccess(0x27),此服務是提供訪問 ECU 內部數據或者出于安全因素需被限制的診斷服務的請求權限。常見的如讀服務(0x22)讀取非安全信息時能夠直接讀取,不需要利用 27 服務進行安全訪問,而通過寫服務(0x2E)寫入數據時,則通常需要通過 27 服務進行安全訪問才可以寫,刷新程序也需要利用 27 服務通過相關的安全等級才能夠對 ECU 進行程序下載,顯然這些都是需要利用 27 服務進行權限管控,從而保障 ECU 的安全可靠。
安全訪問序列如下圖所示,一共 4 步組成,
- 診斷儀先發送請求 seed 的報文(27 01)
- ECU 響應 seed(67 01 xx xx xx xx)
- 診斷儀根據返回的 seed 按照約定算法計算 key 值,并發送給 ECU 請求驗證(27 02 xx xx xx xx)
- ECU 收到請求之后,也按照約定的算法對該 key 進行校驗,并給出響應,若計算一致,則為正響應(67 02),否則為負響應(7F 27 NRC)
ECU 若校驗 key 一致,則 ECU 則切換安全狀態至對應的解鎖狀態,此時在該解鎖狀態下能夠支持的服務都應該可以工作。如果 ECU 已經處于解鎖狀態,此時診斷儀再次發送請求 seed 的報文,ECU 應該響應 seed 為 0 的正響應。
seed 請求的子服務值為奇數,對應的 key 請求驗證的子服務值為該奇數加 1,如 27 01 與 27 02 為一組安全等級,27 03 與 27 04 為一組安全等級,27 11 與27 12 為一組安全等級。不同的安全等級由客戶定義功能區分。 - seed請求格式: 0x27 + 01 03 05,07~7D
- seed肯定響應 0x67 + 01 03 05,07~7D + 種子(4byte)
- seed否定響應:0x7F + 0x27 + NRC(1byte)
- key請求格式: 0x27 + 02 04 06,08~7E+ key(4byte)
- key肯定響應 0x67 + 02 04 06,08~7E
- key否定響應:0x7F + 0x27 + NRC(1byte)
2.3.4 通訊控制(0x28)
通訊控制服務用于開啟或關閉 ECU 對某些報文的發送或接收,如應用報文和網絡管理報文等。
- 請求格式: 0x28 + 子服務ID(1byte:00:R/T 01:R 02:T 03 :關閉接收/發送) + communicationType(01 一般通訊報文;02 網絡管理報文;03 :一般通訊和網絡管理報文)
- 肯定響應 [0x68] [SubFunction] [CommunicationType]
- 否定響應:0x7F + 0x28 + NRC(1byte)
2.3.4 待機在線(0x3E)
該服務用于診斷儀端告知 ECU 診斷儀依然在線。該服務通常用于保持 ECU 處于非默認模式,由于 ECU 在 S3server 時間收不到診斷請求的話,ECU 將會退回默認會話模式(default session),所以診斷儀為了保持 ECU 處于非默認模式,需要周期性發送 TesterPresent 服務指令,周期時間需要小于 S3server。
- 請求格式:[0x3E] [SubFunction(00/ 80:80不返回肯定響應)]
- 肯定響應:[0x7E] [SubFunction 00]
- 否定響應:[0x7F] [ 0x3E] [NRC]
2.3.5 診斷故障碼設置控制(0x85)
診斷故障代碼設置控制服務用于停止或重啟 ECU 診斷故障代碼的記錄。
當通過該服務對故障碼記錄進行抑制操作后,若會話層時序參數超時從而 ECU進入默認會話,或 ECU 執行復位操作后,診斷故障代碼應該恢復記錄。
當接收到診斷儀發送的清除診斷信息(0x14)服務后,ECU 應重新開啟診斷故障代碼記錄。
- 請求格式:[0x85] [SubFunction(01 :ECU允許記錄DTC;02 :ECU停止記錄DTC)]
- 肯定響應:[0xC5] [SubFunction]
- 否定響應:[0x7F] [ 0x85] [NRC]
2.3.6 讀 DID 數據 (0x22)
根據 DID(標識符)讀取數據服務用于從 ECU 存儲器中讀取由 DID 所確定的數據記錄值,其中 DID 為兩個字節長度的數值。
ISO14229 中定義該服務的請求報文允許支持 1 個或者多個數據標識符,一般主機廠僅支持 1 個 DID 讀取。下圖報文格式也以 1 個 DID 作為講解。
- 請求格式:[0x22] [DID(MSB)] [DID (LSB)]
- 肯定響應:[0x62] [DID(MSB)] [DID (LSB)] DATA(nbyte)
- 否定響應:[0x7F] [ 0x22] [NRC]
2.3.7 寫 DID 數據 (0x2E)
根據 DID 寫入數據服務允許診斷儀將數據寫入由 DID 指定的內部存儲單元。ECU應在數據寫入成功后發送該服務的肯定響應。
- 請求格式:[0x2E] [DID(MSB)] [DID (LSB)] DATA(nbyte)
- 肯定響應:[0x6E] [DID(MSB)] [DID (LSB)]
- 否定響應:[0x7F] [ 0x2E] [NRC]
2.3.8 清除故障碼(0x14)
正響應需在診斷信息清除請求后,ECU 處理完成后發出,即使 ECU 沒有存儲的DTC,也需發出正響應報文。清除 DTC 的同時,所有 DTC 相關存儲信息都應被清除。
- 請求格式:[0x14] 3byte:groupofDTC:FF FF FF 清除所有DTC,清除特定的 DTC 組(由 OEM 定義)
- 肯定響應:[0x54]
- 否定響應:[0x7F] [ 0x14] [NRC]
2.3.9 獲取故障碼信息(0x19)
- 請求格式:[0x19] [sub:01/02 根據狀態掩碼報告診斷故障碼數量/根據狀態掩碼報告診斷故障碼] [DTC StatusMask]
- 肯定響應:[0x59][01] [數量] ;[0x59] [02] [故障碼信息4byte * n]
- 否定響應:[0x7F] [ 0x19] [NRC]
其他子功能簡述:04 :用于請求指定故障碼(DTC)的快照信息;06:通過DTC報告擴展數據 0A:讀取ECU支持的所有DTC列表及其狀態 等等后續深入吧。
2.3.10 通過DID控制輸入輸出(0x2F)
該服務是用于通過 DID 來直接控制 ECU 對應的輸入輸出信號。
- 請求格式:[0x2F] [ControlParameter] [IOControlID] [ControlOptionRecord (可選)] [ControlEnableMaskRecord (可選)]
ControlParameter:控制參數,用于指定控制類型。
常見值:
0x01:重置輸入輸出控制(Reset to default)。
0x02:凍結當前狀態(Freeze current state)。
0x03:短期調整(Short-term adjustment)。
IOControlID:輸入輸出控制的標識符,用于指定要控制的 I/O 信號。
ControlOptionRecord(可選):控制選項記錄,包含具體的控制數據。
ControlEnableMaskRecord(可選):控制使能掩碼記錄,用于指定哪些信號被控制。 - 肯定響應:[0x6F] [IOControlID] [ControlStatusRecord (可選)]
- 否定響應:[0x7F] [ 0x2F] [NRC]
2.3.11 例程控制(0x31)
- 請求格式:0x31 子服務(1byte) RID(2byte)其他控制信息nbyte
01 :啟動程序
02:停止程序
03 : 請求程序執行結果 - 肯定響應:0x71 子服務(1byte) RID(2byte)其他信息nbyte
- 否定響應:[0x7F] [ 0x31] [NRC]
2.3.12 請求下載(0x34)
- 請求格式:[0x34] [DataFormatIdentifier] [MemoryAddressLength] [MemoryAddress] [MemorySize]
DataFormatIdentifier:數據格式標識符,指定壓縮和加密格式。
高 4 位:壓縮方法(通常為 0x0 表示無壓縮)。
低 4 位:加密方法(通常為 0x0 表示無加密)。
MemoryAddressLength:內存地址長度(字節數)。
MemoryAddress:目標內存地址,用于指定下載數據的起始地址。
MemorySize:下載數據的大小(字節數)。 - 肯定響應:
- 否定響應:[0x7F] [ 0x34] [NRC]
2.3.13 傳輸數據(0x36)
- 請求格式:0x36 包序號(1byte) data(nbyte)
- 肯定響應:0x76 包序號(1byte)
- 否定響應:[0x7F] [ 0x36] [NRC]
2.3.14 傳輸數據(0x37)
- 請求格式:0x37
- 肯定響應:0x77
- 否定響應:[0x7F] [ 0x37] [NRC]
2.4 否定響應碼
3. AutoSarDCM模塊
診斷通信管理模塊 DCM(Diagnostic Communication Manager)是實現 AutoSAR BSW 診斷功能的重要模塊。確保診斷數據流并管理診斷狀態,比如管理診斷會話和安全狀態以及診斷服務分配等。
- DCM 模塊會檢查當前診斷服務請求是否支持
- 確認診斷服務能否在當前會話等級以及安全等級執行
- 支持 UDS 服務和 OBD 服務
- DCM 提供了 OSI 層的 5-7 層,會話及應用層
DCM 內部由三大子模塊組成。
3.1 DSL:Diagnostic Server Layer 診斷服務層
- 確保診斷請求和診斷應答的數據流
- 接收 PDUR 的診斷請求,并把診斷請求發給 DSD 模塊
- 將 DSD 模塊發送出來的診斷響應轉發給 PDUR 模塊
- 定時器管理
- S3 定時器超時監控
- P2 定時器超時監控
- 管理會話狀態、安全等級以及身份認證狀態
3.2 DSD:Diagnostic Server Dispatcher 診斷服務分發
- 檢查診斷請求的合法性
- 正響應抑制
- 會話狀態、安全等級校驗
- 分發診斷消息給到 DSP 去執行具體的診斷服務
3.3 DSP:Diagnotic Server Processing 診斷服務執行
- 支持 UDS 服務,如 0x10、0x22、0x2E 等服務
- 支持 OBD 服務,如 0x01、0x02、0x03 等服務
3.4 DCM 與其他模塊的交互
Dcm 模塊作為診斷通信管理模塊,和 Dem、NVM、BswM、ComM、PduR 模塊都有交互。
1.Dcm 和 PduR 的交互
Dcm 通過內部的 DSL 子模塊和 PduR 進行交互,實現診斷報文傳輸:
2.Dcm 和 DEM 的交互
DEM 向 DCM 提供檢索故障碼相關的信息,比如 0x14 服務 0x19 服務,具體如下圖:
3.Dcm 和 ComM 的交互:
當通信狀態變化時,ComM 請求啟動或者禁用診斷通信功能
DCM 會話模式轉變,請求 ComM 通信模式變化
注:對于 ComM 通信管理而言,會有多個 User 請求通信狀態變化,比如 DCM、SWC、NM 等,當 DCM 請求關閉通信時,只是 DCM 的通信不使用了,不涉及其他User 的請求,只有當所有 User 都請求關閉通信時,ComM 才會真正關閉某一路通信。
3 DCM和SWC的交互
有一些具體服務是需要 SWC 實現的,比如診斷 IO 控制的 SWC,當 DCM 的 27 服務請求時,會去具體 SWC 執行控制操作,比如關閉 led 燈等
4.DCM 和 BswM 的交互
? 比如 0x28 服務,DCM 收到 28 服務通信控制時,會將通信模式改變轉發給 BswM,BswM 根據模式變化執行對應的 Action,去開啟或者關閉通信
? 比如 0x11 服務時,也會通知到 BswM,BswM 根據不同的復位類型執行不同的 Action