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  DATA7DF 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  DATA733 03 22 F1 80             //Request ECU: $03 = data size, $22 = SID ReadDataByIdentifier, $F180 = parameters73B 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 0x740740 A0 0F 8A FF 32 FF       //Request ECU: Channel parametrization300 A1 0F 8A FF 4A FF       //Response ECU: Channel parametrization740 10 00 02 10 89          //Request ECU: $10 = last packet                            //$02 = data size, $10 = request StartDiagnosticSession, $89 = parameter300 B1                      //Response ECU: ACK300 10 00 02 50 89          //Response ECU: $10 = last packet                             //$02 = data size, $50 = response StartDiagnosticSession, $89 = parameter740 B1                      //Request ECU: ACK 740 11 00 02 21 01          //Request ECU: $11 = last packet                            //$02 = data size, $21 = request ReadDataByIdentifier, $01 = parameter300 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