UDS(Unified Diagnostic Services,統一的診斷服務)診斷協議是ISO 15765 和ISO 14229 定義的一種汽車通用診斷協議,位於OSI模型中的應用層,它可在不同的汽車總線(例如CAN, LIN, Flexray, Ethernet 和 K-line)上實現。UDS協議的應用層定義是ISO 14229-1,目前大部分汽車廠商均采用UDS on CAN的診斷協議。
UDS本質上是一系列的服務,共包含6大類26種。每種服務都有自己獨立的ID,即SID。
- SID:Service Identifier,診斷服務ID。UDS本質上是一種定向的通信,是一種交互協議(Request/Response),即診斷方給ECU發送指定的請求數據(Request),這條數據中需要包含SID。
- 如果是肯定的響應(Positive Response),回復
[SID+0x40]
,如請求10,響應50;請求22,響應62。 - 如果是否定的響應(Negative Response),回復7F+SID+NRC,回復的是一個聲明。
肯定響應和否定響應的形式一定要熟記。
常用服務介紹
UDS的26種服務中,有7種很重要。它們分別是:
- $10 Diagnostic Session Control(診斷會話),
- $14 Clear Diagnostic Information(清除診斷信息),
- $19 Read DTC Information,
- $22 Read Data By Identifier(通過ID讀數據),
- $27 Security Access(安全訪問),
- $2E Write Data By Identifier(通過ID寫數據),
- $3E Tester Present(待機握手)。

下面對這7個服務進行解讀。
$10診斷會話
$10包含3個子功能,
- 01 Default,
- 02 Programming,
- 03 Extended,
ECU上電時,進入的是默認會話(Default)。如果您進入了一個非默認會話的狀態,一個定時器會運轉,如果一段時間內沒有請求,那么到時間后,診斷退回到默認會話01。當然,我們有一個$3E的服務,可以使診斷保持在非默認的狀態。
報文包含4種類型,即
- SID,
- SID+SF(Sub-function),
- SID+DID(Data Identifier)(讀寫用),
- SID+SF+DID。
NRC:Negative Response Code(否定響應碼)。如果ECU拒絕了一個請求,它會回應一個NRC。不同的NRC有不同的含義。

例子:以CAN總線網絡舉例。
八個數據字節,第一字節被網絡層占用。
- 請求(Request):
02 10 02 xx xx xx xx xx
02中的0代表網絡層單幀SF,2代表 數據域有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待機握手
$3E服務用於向服務器指示診斷儀仍然連接在網絡上,之前已經激活的診斷服務功能可以仍然保持激活狀態。
例子:
02 3E 80 00 00 00 00 00,發送一個3E服務的報文,保持非默認會話狀態。80表示無需回復。
$27安全訪問
27服務,加上一個子服務,再加上一個鑰匙,這樣的服務請求可以進行解鎖。
比如下面的例子,2n-1是某個子服務,通過首輪種子的請求,首輪ECU會返回67+01+AA+BB+CC+DD,AA~DD就是種子了。之后第二輪,診斷端會利用種子進行運算(利用整車廠的算法),生成k1(不一定是1個字節),那么發送請求,27+02+[k1]。ECU同樣也會通過種子算出k2。當k1和k2匹配時,解鎖(Unlocked)成功。
- 例子:
Rx: 02 27 05 00 00 00 00 00 安全訪問,05子功能
Tx: 07 67 05 08 27 11 F0 77 肯定響應,回復了對應安全級別的種子
Rx: 06 27 06 FF FF FF FF 00 發送密鑰,4個FF。注意06是與05成對使用的。
Tx: 03 7F 27 78 00 00 00 00 否定響應,7F+27+NRC
Tx: 02 67 06 00 00 00 00 00 肯定響應,通過安全校驗
$22讀數據
$22讀數據,
Request(請求):
22+DID(Data Identifier,通常是兩個字節)
Response(響應):
62+DID+Data
DID有一部分已經被ISO 14229-1規定了。比如0xF186就是當前診斷會話數據標識符,0xF187就是車廠備件號數據標識符,0xF188就是車廠ECU軟件號碼數據ID,0xF189就是車廠ECU軟件版本號數據標識符。
$2E寫數據
$22寫數據,
Request(請求):
2E+DID+Data
Response(響應):
6E+DID
注意,比如0xF186這個DID不支持直接寫入數據,需要用$10來進行會話轉換。也就是說,對於寫數據的請求,一般來說需要在一個非默認會話,或解鎖的狀態下才能進行。
$19 讀DTC
DTC(diagnostic trouble code):如果系統檢測到了一個錯誤,它將其存儲為DTC。DTC可表現為:一個顯而易見的故障:通訊信號的丟失(不會使故障燈亮起);排放相關的故障;安全相關的錯誤等。DTC可以揭示錯誤的位置和錯誤類型。通常DTC占用3個字節,OBD II占用兩個字節。
故障碼包括四個大類,分別是PCBU,P是powertrain動力系統,C是Chassis底盤,B是Body車身,U是network通信系統。一個DTC信息占用4個字節。最后一個字節是DTC的狀態。前兩個字節是我們熟知的類似P0047的故障碼。
DTCHighByte | DTCMiddleByte | DTCLowByte | DTCStatus |
---|---|---|---|
Byte 1 | Byte 2 | Byte 3 | Byte 4 |
$19 擁有28個子服務(Sub-Function)。常用的子服務有02(通過DTC狀態掩碼讀取DTC),04(讀取快照信息),06(讀取擴展信息),0A(讀ECU支持的所有DTC數據)。
$14清除DTC
清除(復位)DTC格式,它可以改變DTC的狀態。3個FF代表清除所有DTC。
Request:14+FF+FF+FF;
Response:54 。
診斷報文解析
UDS 的診斷數據的發送與接收都是基於CAN,所以每個數據流都包含基本的CAN Message 的架構
CAN Message =CAN ID + CAN DATA
根據上篇UDS文章的敘述,每一個PDU 包含控制信息PCI,數據信息Data.

網絡層 PDU(協議數據單元)PCI(協議控制信息)格式:具體如下圖所示:
幀類型 | bit7-4 | bit3-0 | Byte 2 | Byte 3 |
---|---|---|---|---|
單幀 | PCItype=0 | SF_DL | N/A | N/A |
首幀 | PCItype=1 | FF_DL | FF_DL | N/A |
連續幀 | PCItype=2 | SN | N/A | N/A |
流控幀 | PCItype=3 | FS | BS | ST_min |

綜上所述,N_PDU =N_PCI+N_DATA
, N_PCI
的值主要集中的前三個字節,N_DATA
值主要集中在后面7位字節。其中,
-
SF_DL
代表單幀中數據字節數(取值0-7), -
FF_DL
代表 連續幀中的數據字節數(12bit可表四8~4095), -
SN
代表此幀為連續幀中的第幾幀,(0、1、2...E、F、0、1...) -
FS
流控制幀,有三種狀態:繼續發送0、保持等待1、數據溢出2 -
BS
規定發送端允許持續傳輸連續幀數目的最大值(0~255), -
STmin
限定連續幀相互之間所允許的最小時間間隔。
先面用連個例子進行說明,請參考!
例子 1--- 單幀的數據傳輸與接收
[圖片上傳失敗...(image-b66bab-1538824826939)]
數據發送: 02 27 09
數據反饋: 03 7F 27 7E ---==否定的響應==(Negative Response),回復==7F+SID+NRC==,回復的是一個聲明
數據發送: 02 10 40
數據反饋: 06 50 40 00 32 01 F4 ---==肯定的響應==(Positive Response),回復[==SID+0x40==],就是請求10,響應40;回復的是一組數據
由於這個數據發送與接收都是單幀傳輸,所以第一個數據的高四位均為0,四個數據流中的第一個字節的低四位,02,03,02,06代表的為此幀數據含有幾個字節,多余的數據位都用 00或者AA行填充。
例子2 --- 多幀的數據接收與傳輸
[圖片上傳失敗...(image-b5e84b-1538824826939)]
數據發送:
- 06 19 04 00 01 00 00 00
數據反饋:
- 10 1E 59 04 00 01 00 27
- 30 00 00 00 00 00 00 00
- 21 00 0B FF FF FF FF FF
- 22 FF FF FF FF FF FF FF
- 23 FF FF FF FF FF FF FF
- 24 FF FF FF AA AA AA AA
數據發送為單幀,所以06代表發送的數據中含有6個字節,
回復為Positive Response,為連續幀。
- 10中的1代表連續幀的首幀,==01E代表此連續幀含有30個字節==,
- 30代表此連續幀的流控制幀,
- 21,22,23,24代表連續幀中的第幾幀,21代表第一幀,22代表第二幀,依此類推,其中AA為填充位。