uds帧格式_如何看懂UDS诊断报文
UDS介紹
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(待機握手)。
image
下面對這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有不同的含義。
NRC.jpg
例子:以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.
N_PDU format.png
網絡層 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
PCI_format.png
綜上所述,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為填充位。
參考資料:
總結
以上是生活随笔為你收集整理的uds帧格式_如何看懂UDS诊断报文的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java内置锁——synchronize
- 下一篇: php 查找无限级,Ztree +