?、UDS概述
1. UDS概念
UDS(Unfied Diagnostic Services)—— 統(tǒng)?診斷服務(wù)
UDS是能夠通過(guò)?套統(tǒng)?的診斷命令與汽?進(jìn)?通信,讀取汽?的相關(guān)數(shù)據(jù),也可以向汽?中寫(xiě)? ?些數(shù)據(jù)。
UDS的特點(diǎn):統(tǒng)?
統(tǒng)?常?的汽?品牌、零部件?商的ECU
統(tǒng)?常?的汽?總線協(xié)議(CAN、LIN、FlexRay、?載以太?、K-Line)
UDS的作?
讀取ECU的故障信息
刷寫(xiě)ECU(更新ECU中的固件程序)
讀取/寫(xiě)?信息(汽?的VIN、ECU的序列號(hào)、ECU固件的版本號(hào)、ECU下線的?期時(shí)間)
UDS遵循的ISO標(biāo)準(zhǔn)
ISO-14229(應(yīng)?層)、ISO-15765(?絡(luò)傳輸層、基于CAN)、……
2. UDS是請(qǐng)求/響應(yīng)模式的
Tester(診斷儀)發(fā)送請(qǐng)求(request)給ECU,ECU處理后返回響應(yīng)給Tester。
請(qǐng)求和響應(yīng)的本質(zhì)都是報(bào)?數(shù)據(jù)(基于CAN總線的CAN報(bào)?)
響應(yīng)根據(jù)成功或失敗可以分為:肯定響應(yīng)(Positive Response)、否定響應(yīng)(Negative Response)
ECU的診斷地址
每個(gè)ECU都有?個(gè)唯?的請(qǐng)求ID和響應(yīng)ID,專(zhuān)?于接收UDS請(qǐng)求命令和進(jìn)?UDS響應(yīng)報(bào)?發(fā)送 的
這個(gè)請(qǐng)求ID和響應(yīng)的ID本質(zhì)上都是CAN報(bào)?的ID
很多ECU都有?業(yè)上標(biāo)準(zhǔn)的診斷請(qǐng)求和響應(yīng)ID,例如:
EMS的ECU的請(qǐng)求ID是7E0、響應(yīng)ID是7E8
診斷的ID都是7開(kāi)頭的
物理地址和功能地址:
每個(gè)ECU各?的唯?請(qǐng)求ID就是這個(gè)ECU請(qǐng)求的物理地址
功能地址是所有ECU公?的地址請(qǐng)求地址
收到這個(gè)ID的請(qǐng)求,那么所有的ECU都會(huì)進(jìn)?處理
//物理地址和功能地址
引擎ECU 請(qǐng)求的物理地址為 0x7E0, 響應(yīng)地址0x7E8
空調(diào)ECU 請(qǐng)求的物理地址為 0x720, 響應(yīng)地址0x728
??ECU 請(qǐng)求的物理地址為 0x760, 響應(yīng)地址0x768
這些ECU的功能地址均為 0x7DF(企業(yè)中實(shí)際上ECU的功能地址都設(shè)置為7DF)
場(chǎng)景1(單聊 @XXX ECU)【物理地址】
請(qǐng)求:Tester --> 0x760報(bào)? --> ??ECU
響應(yīng):??ECU --> 0x768報(bào)? --> Tester
場(chǎng)景2(群聊 @所有?)【功能地址】
請(qǐng)求:Tester --> 0x7DF報(bào)? --> 發(fā)給所有ECU
響應(yīng):引擎ECU --> 0x7E8報(bào)? --> Tester
響應(yīng):空調(diào)ECU --> 0x728報(bào)? --> Tester
響應(yīng):??ECU --> 0x768報(bào)? --> Tester
UDS的報(bào)?是整體放在CAN報(bào)?數(shù)據(jù)域中的

?、UDS協(xié)議的詳解
1. 每?幀UDS的報(bào)??分為“?絡(luò)傳輸層”的數(shù)據(jù)和“應(yīng)?層”的數(shù)據(jù)
?絡(luò)傳輸層的數(shù)據(jù)主要是控制UDS報(bào)?的拆包、裝包、流程控制的
為什么要分包裝包:UDS協(xié)議本身規(guī)定?個(gè)UDS命令最多可以有4095個(gè)字節(jié),那么可能?幀 CAN報(bào)?裝不下?個(gè)UDS命令,?個(gè)UDS命令只好被拆成很多幀 —— 拆包。
應(yīng)?層的數(shù)據(jù)才是UDS最核?的常?服務(wù)命令。
2. UDS?絡(luò)傳輸層協(xié)議規(guī)定的詳解

?絡(luò)傳輸層規(guī)定,UDS的報(bào)?分為單幀和多幀
如果?幀CAN報(bào)?能發(fā)送完所有數(shù)據(jù),就是?[單幀]
如果?幀CAN報(bào)?不能發(fā)送完所有數(shù)據(jù),就使?多幀,其中有:[?幀]、[連續(xù)幀]、[流控制]
多幀發(fā)送的過(guò)程

//【多幀】發(fā)送過(guò)程中的報(bào)?解析
【?幀(Sender 發(fā)給 Receiver)】
分析:10 7B
?位是1,所以是?幀,因此緊接著的07B就是本次多幀的UDS數(shù)據(jù)的總字節(jié)數(shù)
07B --> 123
【流控制(Receiver回給Sender)】
分析:30 00 14
?位是3,所以是流控制,那么剩下的PCI(協(xié)議控制信息)為:
FS(發(fā)送流程的控制狀態(tài)) —— 0
0:代表可以繼續(xù)發(fā)后?的連續(xù)幀
1:暫停發(fā)送后?的連續(xù)幀,直到等到我再次給你發(fā)流控制
2:本次多幀的整個(gè)發(fā)送重置,可能是發(fā)送?想要發(fā)的數(shù)據(jù)太多,接收?數(shù)據(jù)緩存不夠
BS(Block Size 塊??)—— 00
允許發(fā)送?后續(xù)繼續(xù)發(fā)送的連續(xù)幀的數(shù)量,00表示不限制(允許發(fā)送?盡情的發(fā)送,把連續(xù)幀都發(fā)
完)
STmin(最?間隔時(shí)間)—— 14
要求發(fā)送?后續(xù)發(fā)送連續(xù)幀時(shí),每?個(gè)連續(xù)幀發(fā)送出來(lái)被接收?收到后,最少間隔多少毫秒后,再
發(fā)下?幀,00表示不?間隔
【典型的較?的?個(gè)UDS報(bào)?的多幀實(shí)例】
10 7B YY YY YY YY YY YY
30 00 14 00 00 00 00 00
21 YY YY YY YY YY YY YY
22 YY YY YY YY YY YY YY
23 YY YY YY YY YY YY YY
24 YY YY YY YY YY YY YY
25 YY YY YY YY YY YY YY
26 YY YY YY YY YY YY YY
27 YY YY YY YY YY YY YY
28 YY YY YY YY YY YY YY
29 YY YY YY YY YY YY YY
2A YY YY YY YY YY YY YY
2B YY YY YY YY YY YY YY
2C YY YY YY YY YY YY YY
2D YY YY YY YY YY YY YY
2E YY YY YY YY YY YY YY
2F YY YY YY YY YY YY YY
20 YY YY YY YY YY YY YY
21 YY YY YY YY YY 00 00
下面是兩個(gè)示例:


三、UDS應(yīng)?層協(xié)議(UDS的常?的服務(wù)命令)詳解
1. 應(yīng)?層協(xié)議的?般規(guī)定
Tester可以發(fā)送UDS所規(guī)定的各項(xiàng)服務(wù),每項(xiàng)服務(wù)有各?唯?固定的服務(wù)ID(SID)
UDS規(guī)定了6?類(lèi)26個(gè)服務(wù)項(xiàng),每個(gè)服務(wù)項(xiàng)有??唯?的固定SID
請(qǐng)求發(fā)送的應(yīng)?層第1個(gè)字節(jié)就是 請(qǐng)求的SID
當(dāng)ECU收到Tester發(fā)送的請(qǐng)求后,處理后發(fā)回響應(yīng)報(bào)?給Tester,響應(yīng)報(bào)?分肯定響應(yīng)和否定響應(yīng)
肯定響應(yīng)報(bào)?的第1個(gè)字節(jié)為 請(qǐng)求的SID + 0x40
否定響應(yīng)報(bào)?的第1個(gè)字節(jié)固定為 7F ,第2個(gè)字節(jié)為 請(qǐng)求的SID ,第3個(gè)字節(jié)為 NRC 否定響 應(yīng)碼
?個(gè)特殊的否定響應(yīng)碼(NRC)是 78 ,并不是代表失敗了,?是會(huì)晚?點(diǎn)給回響應(yīng)

常?的否定響應(yīng)碼(否定響應(yīng)的原因:失敗的原因)

2. 六?類(lèi)26個(gè)服務(wù)

3. 0x10服務(wù)(會(huì)話狀態(tài)控制)
ECU有三種會(huì)話狀態(tài):默認(rèn)會(huì)話(default)、擴(kuò)展會(huì)話(extended)、編程會(huì)話(programming)
ECU上電后就處于默認(rèn)會(huì)話狀態(tài)
不同的會(huì)話狀態(tài)下,能做的事情不?樣
我們可以使? 0x10 服務(wù)來(lái)切換會(huì)話狀態(tài)
注意點(diǎn)1:要想切換到編程會(huì)話,必須先進(jìn)?擴(kuò)展會(huì)話
注意點(diǎn)2:當(dāng)處于?默認(rèn)會(huì)話狀態(tài)時(shí),超過(guò)了ECU所設(shè)定的最??活動(dòng)時(shí)間,會(huì)?動(dòng)跳回到默認(rèn) 會(huì)話狀態(tài)

//0x10服務(wù)的請(qǐng)求和響應(yīng)
============================================
肯定響應(yīng)的實(shí)例
============================================
Tester:10 03
【10服務(wù),且使?03?功能,表示要切換到擴(kuò)展會(huì)話狀態(tài)】
ECU: 50 03 00 96 00 C8
【50表示肯定響應(yīng),03代表切換到擴(kuò)展會(huì)話狀態(tài)成功】
p2 time為:00 96 => 150(ms)
p2ex time為:00 C8 * 10 => 200 * 10 => 2000(ms)
?外之意:
本次會(huì)話過(guò)程中,后續(xù)你每?個(gè)請(qǐng)求,我會(huì)在150ms內(nèi)進(jìn)?響應(yīng)。
但如果你某?次請(qǐng)求,我給回你的是NRC為78的否定響應(yīng)時(shí),那么你這個(gè)請(qǐng)求我可能要處理的慢?
點(diǎn),但會(huì)在2000ms給出響應(yīng)。
============================================
否定響應(yīng)的實(shí)例
============================================
Tester:10 02
【10服務(wù),且使?02?功能,表示要切換到編程會(huì)話狀態(tài)】
ECU: 7F 10 33
【7F表示否定響應(yīng),10表示否定的SID,33是NRC:代表沒(méi)有權(quán)限】
4. 0x3E服務(wù)(診斷儀在線)
每隔?段時(shí)間(?于服務(wù)器?動(dòng)跳回默認(rèn)會(huì)話的時(shí)間間隔),發(fā)送?次3E請(qǐng)求給ECU
Tester都能配置?動(dòng)發(fā)送3E服務(wù)請(qǐng)求

5. 0x27服務(wù)(獲取安全訪問(wèn)的權(quán)限、解鎖ECU)


使?0x27服務(wù)的注意點(diǎn)
必須在擴(kuò)展會(huì)話模式下進(jìn)?0x27服務(wù)操作
必須要為T(mén)ester設(shè)置好?商提供的安全算法程序的dll?件,以供Tester在發(fā)送27 02服務(wù)時(shí)計(jì)算key值
dll文件的配置:

6. 0x11服務(wù)(重啟/復(fù)位ECU)

7. 0x22服務(wù)(根據(jù)DID讀取數(shù)據(jù))
ECU內(nèi)部可以存儲(chǔ)很多數(shù)據(jù),那么多的數(shù)據(jù),每?個(gè)數(shù)據(jù),都有?個(gè)唯?的數(shù)據(jù)標(biāo)識(shí),這個(gè)標(biāo)識(shí)被 稱(chēng)為DID。
DID代表的是某?項(xiàng)數(shù)據(jù)的名稱(chēng),不是值。
ECU中存儲(chǔ)的?量的數(shù)據(jù)的DID都有?些?業(yè)標(biāo)準(zhǔn),例如:
ECU的序列號(hào)的DID為:F1 8C
汽?的VIN碼的DID為:F1 90
協(xié)議規(guī)定,ECU中存儲(chǔ)的數(shù)據(jù)DID必須是2個(gè)字節(jié)

讀取ECU的序列號(hào)的診斷實(shí)例(國(guó)際慣例,ECU序列號(hào)的DID為F1 8C)

讀取ECU的標(biāo)識(shí)名的診斷實(shí)例(國(guó)際慣例,ECU的標(biāo)識(shí)名的DID為F1 89)

8.0x2E服務(wù)(根據(jù)DID寫(xiě)?數(shù)據(jù))

寫(xiě)??窗當(dāng)前升降百分值的數(shù)據(jù)

9. 0x19服務(wù)(讀取故障信息的)
19服務(wù)主要是?于讀取ECU的?些故障相關(guān)信息,使?不同的?功能完成具體的不同任務(wù),如下:
01 —— 讀取ECU中的故障碼的數(shù)量
02 —— 讀取ECU中的故障碼
04 —— 讀取ECU中故障碼的快照信息(發(fā)?故障的時(shí)候的相關(guān)數(shù)據(jù):?速、?溫、……)
0A —— 讀取ECU所?持的故障碼列表
19 01?功能
19 01 的語(yǔ)法

19 01的診斷命令實(shí)例

19 02 ?功能
19 02的診斷命令的語(yǔ)法

19 02的診斷命令實(shí)例

10. 0x14服務(wù)(清除故障信息)
使? 14 FF FF FF 清除所有ECU中存儲(chǔ)的故障碼
四、診斷故障碼(DTC)
1. 故障碼的基本概念
DTC(Diagnostic Trouble Code)—— 診斷故障碼
產(chǎn)品設(shè)計(jì)時(shí),會(huì)根據(jù)產(chǎn)品硬件羅列出所有可能的故障,并為每個(gè)特定的故障分配?個(gè)代碼,這個(gè)代 碼就是診斷故障碼(DTC)。
如定義供電電壓過(guò)低的故障碼為U2E0468,診斷故障碼可以理解為故障的身份證號(hào)。如Tester 讀取到U2E0468,便知道發(fā)?了供電電壓過(guò)低的故障,這個(gè)故障會(huì)在供電電壓持續(xù)低于8.6V 3 秒后產(chǎn)?,?當(dāng)供電電壓持續(xù)?于9V 5秒后消失。
UDS的3個(gè)字節(jié)DTC(基于UDS with ISO15031-6/SAE J2012-DA)


示例:

2. 故障內(nèi)碼

UDS故障碼的內(nèi)碼
故障碼內(nèi)碼實(shí)例(兩個(gè)字節(jié)):0 0 0 0 1 1 1 0 0 0 1 1 0 0 1 0
故障碼內(nèi)碼實(shí)例(五位故障碼):P0E32
2個(gè)字節(jié)中的第1-2個(gè)bit代表五位故障碼的第1位(代表的是P0E32中的P):
0(P):動(dòng)?系統(tǒng)
1(C):底盤(pán)系統(tǒng)
2(B):?身系統(tǒng)
3(U):?絡(luò)控制系統(tǒng)
2個(gè)字節(jié)中的第3-4個(gè)bit代表五位故障碼的第2位(代表的是P0E32中的0):
0、2、3:ISO/SAE
1:制造商
2個(gè)字節(jié)中的第5-8個(gè)bit代表五位故障碼的第3位(代表的是P0E32中的E):
發(fā)?故障的?系統(tǒng)區(qū)域
0-2:燃油和空?質(zhì)量測(cè)量系統(tǒng)
3:點(diǎn)?系統(tǒng)
A-E:混合動(dòng)?系統(tǒng)
2個(gè)字節(jié)中的第9-12個(gè)bit代表五位故障碼的第4位(代表的是P0E32中的3)
故障的具體位置信息
2個(gè)字節(jié)中的第13-16個(gè)bit代表五位故障碼的第5位(代表的是P0E32中的2)
故障的具體位置信息
3. 故障類(lèi)型字節(jié)(FTB)

4. 故障碼的狀態(tài)
UDS使?1個(gè)字節(jié)描述故障碼的狀態(tài)信息
這1個(gè)字節(jié)上的8個(gè)bit,每個(gè)bit都代表某?種狀態(tài)
?個(gè)故障碼可能同時(shí)處于多個(gè)狀態(tài)

讀取到的ECU返回的?個(gè)?六進(jìn)制的【故障碼信息】的字節(jié)報(bào)?:
02 51 00 09
DTC(前3個(gè)字節(jié):故障內(nèi)碼+FTB)—— 02 51 00
P025100
DTC狀態(tài)(第4個(gè)字節(jié))—— 09
已確認(rèn)的故障(歷史和當(dāng)前均有)
?進(jìn)制: 0 0 0 0 1 0 0 1
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
常?的故障碼狀態(tài)
01 —— 當(dāng)前錯(cuò)誤
08 —— 已確認(rèn)的故障(歷史故障)
09 —— 已確認(rèn)的故障(歷史和當(dāng)前均有)
原文鏈接:https://blog.csdn.net/2201_76134806/article/details/134699888