OBD-II-Dienste¶
OBD-II nach SAE J1979 (ISO 15031-5) kennt „Services“ (Modes). obd-diag nutzt nur die
lesenden und den einen schreibenden Dienst Mode 04. Eine positive Antwort beginnt mit
dem Mode plus 40 (01 → 41), eine Ablehnung mit 7F (Antwortformate).
Mode |
Anfrage |
Antwort |
Wofür |
Code |
|---|---|---|---|---|
01 |
|
|
aktuelle Werte, unterstützte PIDs, Readiness |
|
02 |
|
|
Freeze Frame 00 |
|
03 |
|
|
gespeicherte Fehlercodes |
|
04 |
|
|
Fehlercodes löschen (gesperrt) |
|
06 |
|
|
Testergebnisse (nur CAN) |
|
07 |
|
|
ausstehende Fehlercodes |
wie 03 |
09 |
|
|
FIN |
|
09 |
|
|
Steuergeräte-Informationen |
|
0A |
|
|
permanente Fehlercodes |
wie 03 |
Die Zahl der Codes steht nur bei CAN in der Antwort (Antwortformate).
Mode 01: aktuelle Daten¶
Unterstützte PIDs. 0100 liefert vier Bytes, je Bit eine PID: Bit 7 von A ist PID
01, Bit 0 von D ist PID 20. Ist PID 20 gesetzt, gibt es mit 0120 die nächsten 32 PIDs,
dann 0140 usw. obd-diag fragt das bei allen Steuergeräten ab und vereinigt die
Ergebnisse.
4100BE3FA813 → A=BE B=3F C=A8 D=13: u. a. PIDs 01, 03, 04, 05, 06, 07 unterstützt
Werte. Jede PID hat eine feste Umrechnung, z. B. 410C1AF8 → (256 · 0x1A + 0xF8) / 4
= 1726 1/min. Alle 140 Werte mit Formel: PID-Formeln.
Readiness (PID 01). Vier Datenbytes A bis D:
Bits |
Bedeutung |
|---|---|
A7 |
Motorkontrollleuchte (MIL) an |
A6 bis A0 |
Zahl der gespeicherten Codes dieses Steuergeräts |
B3 |
0 = Ottomotor, 1 = Diesel |
B0 bis B2 / B4 bis B6 |
Aussetzer, Kraftstoffsystem, Komponenten: unterstützt / nicht abgeschlossen |
C, D |
Bit n: Monitor n unterstützt / nicht abgeschlossen; Bedeutung je nach Motorart (Katalysator, Lambdasonde, AGR … bzw. NOx, Partikelfilter, Ladedruck …) |
Antworten mehrere Steuergeräte, zählt je Monitor der schlechteste Stand, die MIL ist an, wenn eines sie meldet, und die Codezahlen werden addiert.
Readiness dieser Fahrt (PID 41). Gleicher Aufbau wie PID 01, aber Byte A ist
reserviert, und die Bits gelten nur für den laufenden Fahrzyklus (seit Zündung an): das
erste Bit je Monitor heißt „in dieser Fahrt freigegeben“ (0 = ausgesetzt oder nicht
vorhanden), das zweite „in dieser Fahrt nicht abgeschlossen“. Welche Belegung C und D
haben, kommt aus PID 01. Nutzt der Readiness-Assistent (Readiness-Assistent,
services/readiness_assist.py).
Mode 02: Freeze Frame¶
Beim Speichern eines Codes hält das Steuergerät einige Messwerte fest. obd-diag liest Frame 00: PID 02 (auslösender Code), 04 (Last), 05 (Kühlmittel), 0C (Drehzahl), 0D (Geschwindigkeit).
020200 → 4202000420 42 02 00: Antwort auf PID 02, Frame 00; 04 20: auslösender Code P0420
Die Frame-Nummer gehört nach J1979 in die Anfrage (020C00). Antwortet das Fahrzeug
auf 020200 mit NO DATA oder 7F 02 12, wird 0202 ohne Frame-Nummer versucht (wie
python-OBD); klappt das, wird der ganze Freeze Frame so gelesen. Welche Form ein
Fahrzeug erwartet, lässt sich nur am echten Gerät klären.
Mode 03, 07, 0A: Fehlercodes¶
Ein Code besteht aus zwei Bytes (SAE J2012):
flowchart LR
B["04 20"] --> H["erstes Byte 0x04 = 0000 0100"]
H --> S["Bits 7-6: 00 → P"]
H --> D1["Bits 5-4: 00 → 0"]
H --> D2["Bits 3-0: 0100 → 4"]
B --> L["zweites Byte 0x20 → 20"]
S & D1 & D2 & L --> C["P0420"]
Bits 7–6 des ersten Bytes |
Buchstabe |
Bereich |
|---|---|---|
|
P |
Antrieb (Powertrain) |
|
C |
Fahrwerk (Chassis) |
|
B |
Karosserie (Body) |
|
U |
Netzwerk |
Beispiel: C1 00 → Bits 7–6 11 = U, dann 0, 1, 00 → U0100.
Mode 04: Löschen¶
Löscht gespeicherte und ausstehende Codes, Freeze Frame und Readiness. Permanente Codes bleiben. Nach SAE muss ein Diagnosegerät vorher nachfragen (Datenblatt S. 35). Mode 04 ist gesperrt und nur über den Ablauf unter Fehlercodes lesen und löschen erreichbar; die Absicherung beschreibt Sicherheitskonzept.
Mode 06: Testergebnisse¶
0600 liefert wie 0100 eine Bitmaske der unterstützten Monitor-IDs (MID) 01 bis
20, 0620 die nächsten usw. Für jede gesetzte MID fragt obd-diag 06 <MID> ab. Bei
CAN besteht die Antwort aus Blöcken zu 9 Bytes, einer je Test:
4621 80 24 0064 0000 00C8
46 21: Antwort für MID 21 (Katalysator Bank 1); 80: Test-ID (ab 80 vom Hersteller
festgelegt); 24: Einheit und Skalierung (UASID 24: Anzahl, Faktor 1); dann Wert 0064
= 100, Minimum 0000 = 0 und Maximum 00C8 = 200: bestanden. UASIDs ab 80 sind
vorzeichenbehaftet (Zweierkomplement). Die Tabelle der Einheiten steht in SAE J1979
Anhang E; obd-diag kennt dieselben wie python-OBD. Ältere Protokolle antworten in einem
anderen Format ohne UASID; obd-diag liest Mode 06 dort nicht.
Mode 06 und Mode 09 (außer der FIN) liest obd-diag mit eingeschalteten Headern
(ATH1, danach wieder ATH0), damit jeder Wert dem richtigen Steuergerät zugeordnet
wird.
Mode 09: FIN¶
0902 liefert die Fahrzeug-Identifizierungsnummer, bei CAN mehrteilig:
014
0: 490201575657
1: 5A5A5A314B5A36
2: 57313233343536
0x014 = 20 Bytes: 49 02 (Antwort, InfoType 02), 01 (ein Datenelement), dann 17
ASCII-Zeichen WVWZZZ1KZ6W123456. Ältere Protokolle liefern fünf Zeilen
49 02 <1–5> <4 Bytes>, die erste vorn mit 00 aufgefüllt. Die Anfrage heißt genau
0902; 09021 (mit falscher Antwortzahl) kann laut Datenblatt Probleme machen und ist
verboten. Die Dekodierung beschreibt FIN-Dekodierung.
Mode 09: Steuergeräte¶
0900 liefert je Steuergerät eine Bitmaske der unterstützten InfoTypes. obd-diag fragt
davon nur 04 (Kalibrierungs-IDs, je 16 ASCII-Zeichen), 06 (CVN, je 4 Bytes), 08
bzw. 0B (Überwachungszähler Otto bzw. Diesel, je 2 Bytes) und 0A (Name, 20
ASCII-Zeichen) ab. Das Byte nach dem InfoType nennt die Zahl der Datenelemente:
4906019F3E61C2
49 06: Antwort auf InfoType 06; 01: eine CVN; 9F3E61C2: die CVN. Die
Überwachungszähler beginnen mit den Fahrzyklen mit erfüllten Bedingungen und der Zahl
der Zündungen, danach je Test ein Paar abgeschlossen, Bedingungen erfüllt. Was
obd-diag daraus zeigt, beschreibt Steuergeräte und Testergebnisse.