====== OBD-II-Diagnose ====== Was du über die OBD-II-Buchse des U5 bekommst und was nicht — ermittelt durch Abtasten mit einem billigen USB-CAN-Adapter und Gegenprüfen anhand der Anzeigen der Head-Unit. Kurzfassung: **du kannst sehr viel lesen, aber ohne den geheimen Schlüssel des Herstellers nichts schreiben.** Siehe [[de:canbus|CAN-Bus]] dazu, wie sich dieser Anschluss von den internen Bussen unterscheidet. ===== Der Anschluss ist ein reines Abfrage-Diagnosegateway ===== * OBD-II **Pin 6 = CAN-H, Pin 14 = CAN-L** (Masse an 4/5, Dauerplus 12 V an 16). Das ist das einzige CAN-Paar am Stecker — kein zweiter Bus, kein Automotive Ethernet / DoIP. * **Passives Mithören bleibt stumm** — bei jeder Bitrate wird hier nichts gesendet. * **Aktive Anfragen werden beantwortet**, und zwar mit **500 kbit/s, 11 Bit** (ISO 15765-4). 29 Bit und andere Bitraten bleiben stumm. * Der Anschluss hängt an einem **eigenen Diagnose-CAN, der am zentralen Gateway endet**. Das Gateway verbindet die getrennten internen Busse des Fahrzeugs — **Antrieb, Fahrwerk, Karosserie/Komfort, Infotainment, Telematik** — und **leitet** jede Anfrage an das Zielsteuergerät weiter. Du erreichst darüber also jedes Steuergerät, aber am Stecker liegen die laufenden internen Botschaften nie an. Du kannst hier **abfragen**, nicht **mitschneiden**. Das ist eine echte Firewall im zentralen Gateway. ===== Generisches OBD-II — jedes Diagnosegerät ===== Die genormten Abgasdienste funktionieren, funktional adressiert an **0x7DF** (Antworten auf **0x7E8**): * **Mode 09** — VIN (''09 02'') und Kalibrier-IDs. * **Mode 03 / 07 / 0A** — gespeicherte / sporadische / permanente DTCs. * **Mode 01** — Live-PIDs. Der primäre Antriebs-Endpunkt (**0x7E0**) meldet eine PID-Unterstützungsmaske von ''BF FB FF F7'' und — bei einem Elektroauto praktisch — **PID 0x5B** („hybrid/EV battery remaining charge“, verbleibende Ladung der Antriebsbatterie). * **Mode 04** — Abgas-DTCs löschen (siehe //Fehlercodes löschen// weiter unten). Wie bei jedem Elektroauto gibt generisches OBD wenig her — VIN, generische Fehlercodes, ein paar Werte (im geparkten Zustand meist 0). Alles Interessante — echter SoC, Packspannung, Zelldaten — liegt in der darunterliegenden **herstellerspezifischen UDS**-Schicht. ===== Die Steuergeräte-Übersicht (UDS) ===== Das Gateway **leitet UDS-Anfragen an die internen Steuergeräte weiter**. Zähle sie **behutsam** mit einem einzigen funktionalen **TesterPresent** auf (''3E 00'' → 0x7DF): das ändert nichts, und trotzdem antwortet jedes erreichbare Steuergerät von seiner eigenen ID. Beim U5 findet man so **24 Steuergeräte**. Antwort-ID = Anfrage-ID **+ 8** (z. B. 0x701 → 0x709). ^ Anfrage-ID ^ Anmerkungen ^ | **0x7E0** | Antriebs-Endpunkt für generisches OBD. Antwortet auf Mode 01, **weist aber jedes UDS ab** (serviceNotSupported). | | **0x7E1** | **Batteriemanagementsystem** — Packspannung / Strom / SoC / Zelldaten liegen hier (siehe unten). | | **0x7E2, 0x7E3** | Antriebspaar (fortlaufende Teilenummern) — Motor-/Ladeelektronik. | | **0x700–0x707, 0x710–0x713, 0x720–0x727, 0x730–0x736, 0x7AC** | Steuergeräte für Karosserie / Fahrwerk / Komfort (BCM, HVAC, ESP, EPS, Airbag, Lenkung, Kombiinstrument, Sitze, Heckklappe, TPMS, …). | Die so erreichbaren internen Steuergeräte sind der übliche EV-Satz: **BMS, VCU, Motorsteuergerät, Bordladegerät, Fahrstufenwahl** (Antrieb); **BCM, Klimamodul, PTC/Kompressor, Sitzheizungen, Heckklappe, Warnklang für niedrige Geschwindigkeit** (Karosserie); **ESP, EPS, iBooster, Airbag, Lenkwinkelsensor, Kameras/Radare** (Fahrwerk); **Head-Unit, Kombiinstrument** (Infotainment); **T-Box** (Telematik). Die genaue Zuordnung Adresse↔Modul ist nur für 0x7E0/0x7E1 bestätigt; der Rest ist aus den Daten und dem Adressblock erschlossen. ===== Daten lesen (zerstörungsfrei) ===== In der **Standardsitzung** (ohne Sitzungswechsel) geht üblicherweise: * **0x19 ReadDTCInformation** — gespeicherte Fehlercodes, dekodiert (''19 02 FF'' = Abfrage nach Statusmaske). * **0x22 ReadDataByIdentifier** — Daten über eine 16-Bit-DID lesen. Der **Identifikationsblock** (DIDs ''0xF180''–''0xF1FF'') liefert bei den meisten Steuergeräten: eine Teilenummer im Schema ''8619xxxxx'', einen Lieferantencode (''CS-000xxx''), ein Programmierdatum und die VIN (''0xF190''). Beispiel von einem Steuergerät: Teil ''861923101B'', Lieferant ''CS-000029'', programmiert **2021-11-10**. Wenn du das über alle 24 Steuergeräte durchziehst, entsteht eine komplette Teilenummern- und Build-Karte des Fahrzeugs — eine öffentliche Aiways-Steuergeräteliste gibt es sonst nicht. Das **BMS (0x7E1)** führt einen Live-Messblock rund um die DIDs **''0x8800''–''0x887F''** — grob **120 aggregierte Batteriewerte**: Packspannung, Strom, Zellspannungen, SoC, Temperaturen und Statuswörter. Hier sollten die Zahlen liegen, die die Head-Unit //nicht// zeigt (Zelle min/max, Temperaturen, Alterungszustand). ===== ⚠ Das Fahrzeug nicht stören, während es benutzt wird ===== Ein **breit angelegter Scan** — viele Steuergeräteadressen durchfahren und dabei eine **erweiterte Sitzung** erzwingen (''10 03'') — bringt Steuergeräte dazu, **ihre normalen CAN-Botschaften einzustellen**. Das Kombiinstrument markiert die „fehlenden“ Module dann mit **Warnsymbolen**, und eine nachgelagerte Anzeige kann **auf einem Ersatzwert einfrieren** (wir haben gesehen, wie die Außentemperaturanzeige hängenblieb). Es ist **nur lesend und geht von selbst zurück**, sobald das Abtasten aufhört, aber: * **Führe niemals einen breiten/aggressiven Scan während der Fahrt aus** — ein Steuergerät, das mitten in der Fahrt vom Bus fällt, ist unsicher. * Nimm besser die **behutsame Methode**: funktionale Erkennung + **nur Lesezugriffe in der Standardsitzung** (0x19 / 0x22), keine Sitzungssteuerung. Ein einzelner Lesezugriff auf ein Steuergerät in der Standardsitzung stört das Kombiinstrument nicht. ===== Die Fehlercodes, die du sehen wirst ===== Die letzten zwei Hex-Stellen eines DTC sind das genormte **Fehlertyp-Byte**: **…88 = CAN Bus Off**, **…87 = fehlende Botschaft / Zeitüberschreitung**, **…82/83 = Aktivitätszähler / Prüfsumme**. Ein `U…87`- / `U…88`-Code bedeutet also **„Kommunikationsverlust“**, kein echtes Hardware-Ereignis. Eine Folge davon: jede Bus- oder Spannungsunterbrechung — **auch ein aggressiver Scan** — lässt viele Module **gleichzeitig** „Kommunikationsverlust“ gegeneinander eintragen. Nach einem heftigen Scan ist mit einer **langen Liste von U-Codes** zu rechnen (und mit zusammenhängenden B-/C-Code-Bereichen); das sind **Artefakte, die sich über saubere Fahrzyklen selbst löschen**. Beachtung verdienen die **Antriebs-P-Codes**, die auf echte Sensor- / HV-Fehler zeigen. Lies erst alle mit 0x19 aus, dann urteile. ===== Fehlercodes des Batteriemanagements ===== Die herstellerspezifischen Codes (zweites Zeichen `1`, z. B. ''P110C00'') sind, wie sich zeigt, ordentlich dokumentiert und tatsächlich EV-relevant — Spannungsprüfungen der HV-Schütze, Fehler der BMS-Stromsensoren, Zeitüberschreitungen von Gateway-Botschaften, Crash-/Airbag-Signalisierung. Keiner davon ist ein Überrest aus der Verbrennerwelt. Die folgenden Codes des Batteriemanagements sind identifiziert und bestätigt: ^ Code ^ Bedeutung ^ | ''P112868'' | Fehler des CAN-Kollisions-(Crash-)Signals | | ''U11FA87'' | Zeitüberschreitung der Botschaft 0x2BB des Gateways | | ''U11FB87'' | Zeitüberschreitung der Botschaft 0x2DF des Gateways | | ''U11FC87'' | Zeitüberschreitung der Botschaft 0x3AA des Gateways | | ''U11FD87'' | Zeitüberschreitung der Botschaft 0x050 des Gateways | | ''U11FE87'' | Zeitüberschreitung der Botschaft 0x2F1 des Gateways | | ''U11FF87'' | Zeitüberschreitung der Botschaft 0x195 des Gateways | | ''U120087'' | Zeitüberschreitung der Botschaft 0x37F des Gateways | | ''U120187'' | Zeitüberschreitung der Botschaft 0x28C des Gateways | | ''U120287'' | Zeitüberschreitung der Botschaft 0x17D des Gateways | | ''U002888'' | CAN-Bus deaktiviert (Bus-Off ≥3 s im geweckten Zustand) | | ''U00BA88'' | CAN-Bus für Gleichstrom-Schnellladen deaktiviert | | ''U10BA87'' | Zeitüberschreitung der Botschaft Gleichstrom-Schnellladen (Ladesteuergerät) | | ''U112182'' | Fehler im Zähler der Crash-Botschaft des Airbag-Steuergeräts | | ''U112183'' | Prüfsummenfehler der Crash-Botschaft des Airbag-Steuergeräts | | ''U011187'' | Kommunikationsverlust mit dem BMS (Botschaft 0x2C7 fehlt 10 s) | | ''P110364'' | Plausibilitätsfehler der Spannung hinter dem Hauptrelais | | ''P110386'' | Spannung am Hauptrelais ungültig | | ''P11021C'' | Batteriespannung außerhalb des zulässigen Bereichs | | ''P11081C'' | Versorgungsspannung des internen Stromsensors (CAB) fehlerhaft | | ''P110A1C'' | Versorgungsspannung des internen Stromsensors (LEM) fehlerhaft | | ''P110C00'' | 12-V-Versorgung schaltet sich unerwartet ab | | ''P11011D'' | Shunt-Strom außerhalb des zulässigen Bereichs | | ''P110162'' | Plausibilitätsprüfung des Shunt-Stromsignals fehlgeschlagen | | ''P110164'' | Selbstlernfehler des Shunt-Stromsensors | | ''P110167'' | Fehler des Shunt-Stromsensors | | ''P110192'' | Strommessfehler in zwei Schaltkreisen | | ''P110711'' | Interner Stromsensor (Iem) — Kurzschluss nach Masse | | ''P110712'' | Interner Stromsensor (Iem) — Kurzschluss nach Plus | | ''P110264'' | Plausibilitätsprüfung des Batteriesignals fehlgeschlagen | | ''P110286'' | Batteriespannungssignal ungültig | | ''P110464'' | Plausibilitätsfehler der Spannung hinter dem Relais für Gleichstrom-Schnellladen | | ''P110486'' | Gleichstrom-Ladespannung ungültig | | ''P11B467'' | Spannungsfehler beim Gleichstrom-Schnellladen | | ''P11051D'' | Messwert des Hall-Stromsensors außerhalb des Bereichs | | ''P110562'' | Plausibilitätsprüfung des Hall-Stromsignals fehlgeschlagen | | ''P110564'' | Selbstlernfehler des Hall-Stromsensors | | ''P110567'' | Hall-Stromsensor defekt | | ''P110592'' | Abweichung des von verschiedenen Sensoren gemessenen Sammelschienenstroms zu groß | | ''P110609'' | Fehler des internen Stromsensors (CAB) | | ''P11061C'' | Versorgungsspannung des internen Stromsensors (CAB) fehlerhaft | | ''P110692'' | Fehler des internen Stromsensors (CAB) nach dem BMS-Selbsttest | | ''P115B92'' | Gleichzeitiger Ausfall der Sensoren zweier Strom-Schaltkreise | | ''U11F487'' | Zeitüberschreitung der Botschaft des internen Stromsensors (CAB) | Jeder Code hier löscht sich automatisch, wenn er 40 Fahrzyklen lang nicht auftritt — oder per Diagnosegerät. Die übliche Eskalation bei der Reparatur ist: Codes anderer Module gegenprüfen → Kabelbaum/Steckverbinder prüfen → Isolationswiderstand des HV-Kabelbaums prüfen (Zielwert >1,5 MΩ, ≥120 MΩ für die PTC-Heizung, bei 500 V DC) → Antriebsbatterie komplett als Baugruppe ersetzen — einen Reparaturweg auf Bauteilebene für die BMS-Platine gibt es nicht. Die **generischen/SAE-Codes** dagegen (zweites Zeichen `0`, z. B. die oben bei Live-Scans gesehenen ''P02C1''/''P01C1'') liegen in Bereichen, die die Norm für Verbrenner-Teilsysteme definiert — ''P02xx'' heißt nominell „fuel injector circuit“ (Einspritzventil-Schaltkreis) und ist an diesem Auto bedeutungslos. Das Steuergerät, das sie meldet, identifiziert sich über Mode 09 selbst als **''HPCM-HybridPtCtrl''** („Hybrid Powertrain Control Module“) — ein echter Hinweis darauf, dass seine Diagnosesoftware von einer Hybrid-/Verbrennerplattform stammt und einige alte generische Prüfungen für die reine EV-Variante nie ganz herausgenommen wurden. Behandle unerklärte Codes im generischen P0-Bereich mit Misstrauen; verlässlich ist der herstellerspezifische P1xx-Bereich. Auch Codes des Ladesystems sind aufgetaucht, bisher aber nur als nackte Kennungen (noch keine Definitionen gefunden): ''P120019'', ''P120119'', ''P122000'', ''P122100'', ''P128A19'', ''P128B98'', ''P12A500''. Wenn jemand herausfindet, was die bedeuten, bitte hier ergänzen. Hinweis zur Abdeckung: eine systematische Suche hat Fehlercode-Dokumentation **nur** für die obigen Codes des Batteriemanagements und für diese nackte Liste des Ladesystems gefunden — noch nichts für ESP, Parkbremse, Bremskraftverstärker, Lenkung, HVAC oder Karosserieelektrik. Wenn dein Auto einen Code aus einem dieser Bereiche wirft, ist er in diesem Wiki nicht dokumentiert — bitte ergänze, was du findest. ===== Die Rohwerte dekodieren ===== Für die herstellerspezifischen DIDs gibt es keine öffentliche Skalierung, also werden Rohwerte über **Korrelation** dekodiert — lies eine DID, während du den wahren Wert aus einer anderen Quelle kennst (die dekodierte Anzeige der Head-Unit ist ideal), und suche das Feld plus den Faktor, die passen. Einem Feld ist erst zu trauen, wenn du es **bewegen** kannst: schalte eine große HV-Last (Klimakompressor) ein und aus und schau, welche Felder mitgehen. So am BMS (0x7E1) bestätigt: * **Packspannung** = DID **''0x8871''** (Rohwert = Volt; gelesen 407 gegen 406,9 V in der Head-Unit). * **Packstrom** = DID **''0x887b''** (steigt mit der Last; über den Klima-Ein/Aus-Test identifiziert). Für Ladezustand und die Spannung des 12-V-Systems gibt es plausible Kandidaten, sie sind aber **noch nicht festgenagelt** — nahezu konstante Signale brauchen das Fahrzeug in **verschiedenen Zuständen** (eine Fahrt, ein Ladevorgang), bevor Feld und Skalierung bestätigt werden können. Die dekodierten Zahlen sind gegen die bekannten Packdaten plausibel (Bereich ≈**268–417 V**, **24 Module**, Zelle **2,8–4,35 V**), also ist z. B. ein ''0x882d''-Messwert von ≈**4,01 V** eine echte Zellspannung. Ein Logger, der Referenzwerte und DIDs gemeinsam über normale Fahrten mitschreibt, ist der saubere Weg, die Karte fertigzustellen. ===== Fehlercodes löschen ===== Das Löschen von DTCs ist der eine „Schreibzugriff“, der normalerweise **ohne** Security Access (Sicherheitszugriff) erlaubt ist — er wird für Reparaturen gebraucht: * **Generisch — Mode 04** (''ClearDiagnosticInformation''): ''04'' an 0x7DF / 0x7E0 senden. Löscht Abgas-DTCs und Freeze Frames. * **Herstellerspezifisch — UDS-Dienst 0x14**: ''14 FF FF FF'' („alle Gruppen löschen“) an ein bestimmtes Steuergerät senden (z. B. 0x7E1). Löscht die gespeicherten DTCs dieses Moduls, üblicherweise in der Standardsitzung. Anmerkungen: Löschen **verdeckt echte Fehler** (gute und schlechte gleichermaßen) — lies die Codes vorher aus. **Permanente DTCs** kann kein Werkzeug löschen; das Steuergerät löscht sie selbst, nachdem seine Readiness-Monitore durchgelaufen sind. Das Abklemmen der 12-V-Batterie setzt flüchtige Anzeigezustände zurück, löscht aber **keine** gespeicherten DTCs (nichtflüchtig) — dafür brauchst du einen Löschbefehl. ===== Das Fahrzeug aufwecken ===== Diagnoseanfragen an diesem Anschluss **wecken das Gateway und die adressierten Steuergeräte** für die Diagnose (so arbeitet ein Diagnosegerät an einem geparkten Auto). Das ist aber nur ein Diagnose-Weckruf — es fährt das HV-System **nicht** hoch, schließt die Hauptschütze nicht und startet die Klimatisierung nicht. Das sind Aktuator-Funktionen hinter Security Access. ===== Was gesperrt ist — und die eine interessante Ausnahme ===== Alles, was **verändert oder ansteuert** — Konfiguration schreiben (0x2E), Aktuatortests (0x2F), Routinen (0x31), Steuergerät-Reset (0x11), Flashen (0x34/0x36/0x37) — liegt hinter **Security Access (0x27)**. Das Gateway antwortet auf eine **Seed**-Anfrage, aber der **Schlüsselalgorithmus ist ein OEM-Geheimnis**, das für dieses Auto nicht öffentlich ist. In der Praxis ist **OBD-II hier also nur lesend**: Fehlercodes und Daten ja, Steuern nein. **Die interessante Ausnahme:** ein Werkstatt-Diagnosegerät aktiviert Funktionen wie HV-Hochfahren oder Vorklimatisierung über eine **sicherheitsgeschützte Routine (0x31)** über **denselben Diagnose-CAN**. Der Diagnoseanschluss ist für die Steuerung also architektonisch keine Sackgasse — mit dem richtigen Security-Access-Schlüssel **ließe sich die Vorklimatisierung im Prinzip direkt über OBD-II befehlen**, ohne Anzapfen eines internen Busses. Der Schlüssel ist das fehlende Stück (siehe [[de:roadmap|Roadmap]]). ===== Alles Standard ===== Darunter steckt schlichtes **UDS (ISO 14229)** über **ISO-TP (ISO 15765-2)** auf 500 k / 11 Bit CAN — auf Protokollebene nichts Proprietäres. Das heißt, gängige offene Werkzeuge funktionieren: ein kleiner ISO-TP- + UDS-Client in Python oder Diagnosewerkzeuge von der Stange sprechen mit diesem Auto. //Nicht// offen sind das **Datenwörterbuch** (welche DID was bedeutet, mit welcher Skalierung) und der **Security-Access-Schlüssel** — beide stecken in der Diagnosedatenbank des Herstellers. ===== Verkabelung & Werkzeug ===== Ein **USB-CAN-Adapter der CANable-Klasse** (gs_usb) auf **500 k / 11 Bit**, aus Python angesteuert (Rohframes + eine kleine ISO-TP-Schicht für mehrteilige UDS-Botschaften). * **CAN-H → OBD-Pin 6, CAN-L → OBD-Pin 14** verdrahten, Masse an Pin 4/5. Wenn du das falsch machst, sieht es genau wie ein toter Bus aus. * DIP-Schalter des Adapters: **Boot OFF** (Betrieb), **R120 OFF** (der OBD-II-Bus ist schon mit 2×120 Ω terminiert). Eine DIP-Änderung wirkt erst nach komplettem Aus- und Wiedereinstecken. * Prüfe die Verdrahtung, indem du beim aktiven Abtasten die TX- **und** RX-LEDs des Adapters blinken siehst.