OBD2-Lesegerät - Fahrzeugdiagnose

Bei der Erstellung der Anwendung standen wir vor vielen Auswahlmöglichkeiten, Problemen usw., mit denen wir Sie in diesem Artikel vertraut machen werden. Wie sich herausstellte, können Sie einen Dialog mit dem Auto führen und sind sehr produktiv. Um die Kommunikation mit dem Auto zu organisieren, müssen Sie natürlich „Kontakt herstellen“, „die richtige Frage stellen“ und die vom Auto erhaltene „Antwort“ richtig verstehen. Dementsprechend soll der Artikel die Organisation des Dialogs in einer zugänglichen Sprache erläutern und Ihnen erklären, auf welche Fehler Sie unterwegs stoßen könnten und wie Sie damit umgehen sollen.

Verbindungswahl


Zunächst muss klargestellt werden, dass für den Anschluss an das Fahrzeug ein ELM327-Adapter verwendet wird. ELM327 ist eine Mikroschaltung, mit der Sie die in den Diagnosereifen von Autos verwendeten Protokolle in das RS232-Protokoll konvertieren können, an das wir Daten übertragen. Aufgrund der Tatsache, dass die Datenübertragung über das RS232-Protokoll nacheinander erfolgt, tritt das erste Problem auf - die Datenübertragungsgeschwindigkeit, die wir in einem der folgenden Absätze zu umgehen versuchen werden.

Es gibt verschiedene Varianten des ELM327-Adapters, die nach der Datenübertragungsmethode klassifiziert werden - Bluetooth, WIFI, USB. Basierend auf der Tatsache, dass das Entwicklungsziel ein mobiles Gerät mit Android ist, können Sie die beiden am besten geeigneten Versionen von ELM327 auswählen, z. B. Bluetooth und WIFI. Da es nur einen Weg gibt, Daten zu empfangen und zu verarbeiten, und sie sich nur in den Verbindungsoptionen zum Adapter unterscheiden, können Sie nur einen auswählen, einen Dialog mit ihm organisieren und dann die verbleibenden Verbindungsoptionen hinzufügen.

ELM327 1.5 vs ELM327 2.1




Eines der ersten Probleme, auf das Sie stoßen konnten, war das Problem, den Adapter direkt auszuwählen, in unserem Fall Bluetooth. Es stellt sich heraus, dass Sie, wenn Sie alle (zumindest die meisten) Autos unterstützen müssen, Version v1.5 anstelle von v2.1 wählen müssen, was beim Kauf eines Adapters tatsächlich mehrmals geklärt werden muss, da Verkäufer versuchen, die Adapterversion nicht für die jeweilige auszugeben in der Tat, weil Sie sind nicht besonders unterschiedlich. In Version v2.1 werden die Protokolle J1850 PWM und J1850 VPW nicht unterstützt. Dies bedeutet, dass Sie keine Verbindung zu Fahrzeugen herstellen können, die diese Protokolle verwenden.

Verbindung


Die Verbindung zum Adapter erfolgt in mehreren Schritten:

  • Verbindung zu einem Adapter herstellen (Bluetooth, WIFI)
  • Senden von Initialisierungsbefehlen (Initialisierungszeichenfolge)

Wenn bei der Organisation der Verbindung alles klar ist. Das Funktionsprinzip ist das gleiche wie bei jedem Bluetooth / WIFI-Chat. Um zu verstehen, wie die Initialisierungszeichenfolge gesendet wird, muss untersucht werden, welche Befehle vorhanden sind und welche Funktionen sie ausführen.

AT Z [alle zurücksetzen]
Setzen Sie die Adaptereinstellungen auf die Werkseinstellungen zurück.
AT L1-0
Linefeeds aktivieren / deaktivieren.
AT E1-0
Echo ein - aus
AT H1-0
Header ein - aus
AT AT0-1-2
Adaptives Timing Aus - Adaptives Timing Auto1 - Adaptives Timing Auto2
AT ST FF
Stellen Sie das Zeitlimit auf Maximum ein.
AT D [alles auf Standard setzen]
Setzen Sie die Einstellungen auf den vom Benutzer konfigurierten Ausgangszustand zurück.
AT DP [Beschreibe das aktuelle Protokoll]
Der Scanner kann das Protokoll des Fahrzeugs, an das er angeschlossen ist, unabhängig bestimmen.
AT IB10 [ISO-Baudrate auf 10400 einstellen]
Der Befehl legt die Baudrate für ISO 9141-2 und fest
ISO 14230-4 10400
AT IB96 [ISO-Baudrate auf 9600 einstellen]
Der Befehl legt die Baudrate für ISO 9141-2 und fest
ISO 14230-4 9600 für Protokolle 3,4,5.
AT SP h [Protokoll einstellen h]
Der Protokollauswahlbefehl h, wobei h:

0 - Automatisch;
1 - SAE J1850 PWM (41,6 kBaud);
2 - SAE J1850 VPW (10,4 Kbaud);
3 - ISO 9141-2 (5 Baud Init, 10,4 Kbaud);
4 - ISO 14230-4 KWP (5 Baud Init, 10,4 Kbaud);
5 - ISO 14230-4 KWP (Fast Init, 10,4 Kbaud);
6 - ISO 15765-4 CAN (11-Bit-ID, 500 kBaud);
7 - ISO 15765-4 CAN (29-Bit-ID, 500 kBaud);
8 - ISO 15765-4 CAN (11-Bit-ID, 250 kBaud);
9 - ISO 15765-4 CAN (29-Bit-ID, 250 kBaud);
AT SP Ah [Protokoll h mit Auto einstellen]

Der Befehl legt das Standardprotokoll h fest. Wenn die Verbindung mit dem Protokoll h fehlgeschlagen ist, startet der Adapter die automatische Auswahl des Protokolls.

Basierend auf den oben beschriebenen Befehlen bilden wir die Initialisierungszeichenfolge.

initializeCommands = Arrays.asList("ATZ", "ATL0", "ATE1", "ATH1", "ATAT1", "ATSTFF", "ATDP", "ATSP0"); 

Es ist ratsam, dem Benutzer das Ändern der Initialisierungsbefehle zu ermöglichen, da zur Auswahl des „Schlüssels“ für einige Fahrzeuge geeignetere Adaptereinstellungen ausgewählt werden müssen. In unserem Fall werden Einstellungen verwendet, die für die meisten Standardprotokolle geeignet sind.

Es ist auch ratsam, auf den Befehl APSP0 zu achten, daher legen wir die automatische Standardprotokollauswahl fest. Dies kann einige Zeit dauern.

Wenn der Benutzer weiß, was sein automatisches Protokoll ist, kann er mithilfe der Möglichkeit, das Verbindungsprotokoll zu ändern, 0 in seine Protokollnummer ändern.

Diagnosedaten lesen


Die speziellen Befehle von PID werden zum Lesen von Diagnosedaten verwendet.
PID (Parameter-IDs - On-Board Diagnostic Parameter Identifiers) - Codes, mit denen die Leistung bestimmter Fahrzeugsensoren abgefragt wird.

Die wichtigsten Pids finden Sie auf Wikipedia. Es gibt einen vollständigen Satz grundlegender Befehle, die alle Autos unterstützen sollten. Es gibt auch Befehlssätze für bestimmte Marken und Fahrzeugtypen. Diese Sätze werden gegen eine Gebühr bereitgestellt. In unserem Fall konzentriert sich die Anwendung auf die grundlegende Diagnose von Autos, wir verwenden den grundlegenden Befehlssatz.

Es ist auch möglich, aktuelle Daten vom Auto zu empfangen, während der Befehl zum Empfangen von Daten vom Auto am Anfang 01 hat , was anzeigt, dass wir echte Daten erhalten möchten. Wenn wir die gespeicherten Fahrzeugdaten erhalten möchten, müssen Sie am Anfang des Befehls 02 angeben. Der Befehl zum Abrufen der aktuellen Geschwindigkeit des Fahrzeugs lautet beispielsweise 010D und zum Abrufen der gespeicherten Geschwindigkeit 020D .

Wenn Sie sich die Anzahl der Befehle, die von offenen Ressourcen bereitgestellt werden, genau ansehen, können Sie nur das Problem feststellen, über das ich ganz am Anfang geschrieben habe, nämlich das Problem der Antwortgeschwindigkeit des Adapters. Da das Senden und Empfangen von Befehlen sequentiell erfolgt, muss zum Empfangen von Sensorwerten zum aktuellen Zeitpunkt auf eine Antwort auf alle vorherigen Befehle gewartet werden. Wenn Sie daher den Empfang aller Befehle anfordern, besteht eine hohe Wahrscheinlichkeit, dass die Aktualisierung der realen Daten sehr langsam erfolgt. Dieses Problem kann jedoch gelöst werden, wenn Sie die Befehle verwenden, mit denen nur die im Auto vorhandenen Teams angezeigt werden. Zum Beispiel:

0100 - PIDs unterstützt [01 - 20]
0120 - PIDs unterstützt [21 - 40]
0140 - PIDs unterstützt [41 - 60]
0160 - PIDs unterstützt [61 - 80]
0180 - PIDs unterstützt [81 - A0]
01A0 - PIDs unterstützt [A1 - C0]

Ich werde anhand einer der Pids zeigen, wie festgestellt werden kann, welche Sensoren im Auto vorhanden sind. Zum Beispiel:

  • 0100 \\ Anfrage
  • BB1E3211 \\ Antwort aus dem Auto

Wir übersetzen die Antwort aus dem Auto in ein Binärzahlensystem

 BB1E3211(16) > 10111011000111100011001000010001(2) 

Anhand der folgenden Platte können wir von 01 bis 20 bestimmen, welche Pids von unserem Auto unterstützt werden:



Anhand der erhaltenen Daten können wir feststellen, dass unser Auto die folgenden Pids unterstützt:

  01, 03, 04, 05, 07, 08, 0C, 0D, 0E, 0F, 13, 14, 17, 1C, 20 

Anstatt alle 32 Teams zu senden und auf eine Antwort zu warten, werden wir nur 15 Teams einsetzen, obwohl einige möglicherweise nicht anwesend sind. Dies ist jedoch nicht die Grenze der sogenannten Optimierung. Damit die Daten noch schneller aktualisiert werden, empfehle ich Ihnen, nur Daten zu den Sensoren anzufordern, die auf dem Bildschirm angezeigt werden. Dies schränkt jedoch einige Funktionen der Anwendung ein. Zum Beispiel ein Verlaufsdatensatz.

Autofehler lesen und dekodieren


Autofehler können auch unterschiedlich sein und es gibt auch separate Befehle für sie. Zum Beispiel:

  • 03 - Zum Speichern gespeicherter Fehlercodes
  • 0A - Zum Anzeigen dauerhafter Fehlercodes.

Wie bei anderen Befehlen treten Fahrzeugfehler in codierter Form auf. Wie bei anderen Befehlen müssen sie dekodiert werden, um die erforderlichen Informationen zu erhalten. Lassen Sie mich Ihnen ein Beispiel geben, wie die Fehlerdecodierung funktioniert. Code:

 private final static char[] dtcLetters = {'P', 'C', 'B', 'U'}; private final static char[] hexArray = "0123456789ABCDEF".toCharArray(); private void performCalculations(String fault) { final String result = fault; String workingData = ""; int startIndex = 0; troubleCodesArray.clear(); try { if (result.contains("43")) { workingData = result.replaceAll("^43|[\r\n]43|[\r\n]", ""); } else if (result.contains("47")) { workingData = result.replaceAll("^47|[\r\n]47|[\r\n]", ""); } for(int begin=startIndex; begin < workingData.length(); begin += 4) { String dtc = ""; byte b1 = Utility.hexStringToByteArray(workingData.charAt(begin)); int ch1 = ((b1 & 0xC0) >> 6); int ch2 = ((b1 & 0x30) >> 4); dtc += dtcLetters[ch1]; dtc += hexArray[ch2]; dtc += workingData.substring(begin + 1, begin + 4); if (dtc.equals("P0000")) { continue; } troubleCodesArray.add(dtc); } } catch (Exception e) { Log.e(TAG, "Error: " + e.getMessage()); } } 

Und jetzt zur Erklärung.

Basierend auf der empfangenen Antwort können wir einen Fehlercode erhalten, dafür dekodieren wir die empfangene Nachricht unter Verwendung der folgenden Platten.

Erster Charakter:



Zweites Zeichen:



3, 4, 5 Zeichen werden gemäß dieser Tabelle gebildet:



Auf dieser Grundlage können wir versuchen, die folgende Antwort 0001000000111110 zu analysieren



Fehlercode: P103E

Nachwort


In dieser Phase haben wir herausgefunden, wie ein Dialog mit dem Adapter organisiert, Befehle an ihn gesendet, seine Antworten empfangen und entschlüsselt werden können. Dies ist ein großer Teil der Arbeit, wenn man bedenkt, wie viel Zeit es kostet, das Material zu studieren, aber gleichzeitig ziemlich interessant. Außerhalb dieses Artikels gibt es viele Probleme mit der visuellen Oberfläche sowie viele zusätzliche Funktionen, z. B. das Hinzufügen neuer Pids aus einer Datei, eine standardmäßige und erweiterte Methode zum Herstellen einer Verbindung zum Adapter und zum Erstellen von Diagrammen.

Matvienko Alexander, Hossein Fakhr.

Source: https://habr.com/ru/post/de444726/


All Articles