V tomto článku se zaměřím na úvod do diagnostiky jednotlivých řídících jednotek použitých v automobilech po sběrnici CAN.
OBD byl primárně vytvořen pro monitorování parametrů motoru se zaměřením na diagnostiku emisí osobních automobilů. Tedy základ je v komunikaci s řídící jednotkou motoru (Engine ECU). Ke komunikaci s ECU jsou automobily vybavené konektorem OBD-II, který na jednotlivých pinech umožňuje se připojit k různým sběrnicím (v závislosti na typu auta a druhu použité sběrnice/protokolu).
Standardní konektor pro diagnostiku OBD-II
Pro připojení ke konektoru OBD-II můžeme využít tyto protokoly pro CAN:
Pro vyčítání jednotlivých parametrů s řídící jednotky byl definován standard SAE J1979, který definuje jednotlivé servisy SID/parametry PID k přístupu k ECU datům. Seznam jednotlivých servisů SID a parametrů PIDs je zde.
Vybrané servis ID - SID:
Zde je ukázka jak adresovat ECU jednotku, příklad čtení VIN:
ID DATA
7DF 02 09 02 //Request ECU: $02 = data size, $09 = SID - Service 09 , $02 = PID code 02 - VIN (Vehicle Id. Number)
7E8 10 14 49 02 01 33 46 41 //Response ECU: $10 ISO-TP First frame, $14 = data size, $62 = SID, $02 = PID, data[0..2]
7E0 30 02 14 00 00 00 00 00 //Request ECU: $30 ISO-TP Flow control frame, $02 = block size, $14 = ST (separation time 0-127ms, $0-$7F)
7E8 21 44 50 34 46 4A 32 42 //Response ECU: $21 ISO-TP Consecutive frame 1, data[3..9]
7E8 22 4D 31 31 33 39 31 33 //Response ECU: $22 ISO-TP Consecutive frame 2, data[10..16]
Zatím co OnBoard diagnostika je přímo určená na vyčítání dat z řídící jednotky pomocí standardního konektoru OBD umístěného v automobilu, je OffBoard diagnostika zaměřená na komunikaci/diagnostiku ostatních komponent automobilu obsahujících ECU (jako např. světlomety, AC panely, Airbag systém ...) buď přímo umístěných v autě nebo mimo (třeba jako testovaní komponent v laboratoři nebo testování funkčnosti při výrobě - EndOfLine testry).
UDS je diagnostický protokol pro ECU jednotky. Stejně jako v případe OnBoard diagnostiky jsou definované jednotlivé servisy - SIDs.
Vybrané servis ID - SID:
Jednoduchý příklad vyčtení dat servisu "Read Data By Identifier":
ID DATA
733 03 22 F1 80 //Request ECU: $03 = data size, $22 = SID ReadDataByIdentifier, $F180 = parameters
73B 10 13 62 F1 80 30 31 32 //Response ECU: $10 ISO-TP First frame, $13 = data size, $62 = SID, $F180 = parameters, data[0..2]
733 30 02 14 00 00 00 00 00 //Request ECU: $30 ISO-TP Flow control frame, $02 = block size, $14 = ST (separation time 0-127ms, $0-$7F)
73B 21 33 34 35 36 37 38 39 //Response ECU: $21 ISO-TP Consecutive frame 1, data[3..9]
73B 22 30 31 32 33 34 35 //Response ECU: $22 ISO-TP Consecutive frame 2, data[10..15]
Pro řízení zpráv (požadavek <> odpověď) jsou definovány standardy:
ISO-TP definuje pro první byte hlavičky:
Ukázky takového toku požadavku a odpovědí jsou uvedené v předchozích dvou příkladech.
Příklad použití je zde:
ID DATA
200 01 C0 00 10 00 03 01 //Request ECU: Channel Setup Id 0x300
201 00 D0 00 03 40 07 01 //Response ECU: Channel Setup Id 0x740
740 A0 0F 8A FF 32 FF //Request ECU: Channel parametrization
300 A1 0F 8A FF 4A FF //Response ECU: Channel parametrization
740 10 00 02 10 89 //Request ECU: $10 = last packet
//$02 = data size, $10 = request StartDiagnosticSession, $89 = parameter
300 B1 //Response ECU: ACK
300 10 00 02 50 89 //Response ECU: $10 = last packet
//$02 = data size, $50 = response StartDiagnosticSession, $89 = parameter
740 B1 //Request ECU: ACK
740 11 00 02 21 01 //Request ECU: $11 = last packet
//$02 = data size, $21 = request ReadDataByIdentifier, $01 = parameter
300 B2 //Response ECU: ACK
300 21 00 1A 61 01 01 00 00 //Response ECU: $21 = packet to follow
//$1A = data size, $61 = response ReadDataByIdentifier, $01 = parameter, data[0..1]
300 22 27 00 00 22 00 80 1A //Response ECU: $22 = packet to follow
//data[2..8]
300 23 32 4B 25 02 7A 25 00 //Response ECU: $23 = packet to follow
//data[9..15]
300 14 00 25 00 00 25 00 00 //Response ECU: $14 = last packet
//data[16..22]
740 B5 //Request ECU: ACK
740 A8 //Response ECU: Channel parametrization, disconnect