Ich möchte in diesem Thread meine Erkenntnisse und Erfahrungen bezüglich der Analyse von CAN-Bus Daten teilen und hoffe natürlich auch auf Ideen und Vorschläge von Euch! search
Im Internet findet man unzählige Infos, Tools, viel kommerzielles und wirklich teures Zeug, aber auch einiges brauchbares. Für einfache Analysen braucht man eigentlich erstmal nur einen CAN-Adapter, Notepad++, Excel/Calc und viel Geduld.
Über CAN-Adapter, dem CAN-Protokoll und den CAN-IDs ist an anderer Stelle genug beschrieben, hier möchte ich nur die Auswertung der Daten besprechen.
Die Firmware des CAN-Adapters und natürlich auch die Software die diese Daten abspeichern kann, bestimmen das Log-Format. Hier mal die mit denen ich häufig arbeite:
1.) Das ELM-Adapter CAN-Log (Dateiendung ".log")
Hier ein Beispiel eines HS-CAN Trace:
Version: ELMConfig 0.2.13b
Adapter: ELM
Driver: VCP
Baudrate: 500000
Connection: Scan
14:27:21.849 102 00 00 4E 90 80 F4 8A 00
14:27:21.849 0FD 7F 45 73 0F 3C 00 E6 01
...
14:27:22.193 2ED 08 CB 3B 61 7E E5 00
...
Alles anzeigen
Vom Header abgesehen besteht jede Zeile aus einer Nachricht in folgendem Format (EBNF-Schreibweise
MESSAGE = HH ':' MM ':' SS '.' UUU ' ' CAN_ID [ ' ' DB0 ' ' DB1 ' ' DB2 ' ' DB3 ' ' DB4 ' ' DB5 ' ' DB6 ' ' DB7 ] ' ' CRLF ;
- Beim Zeitstempel wird die Echtzeit, welche vom Computer stammt der das Log aufzeichnet, verwendet. Die letzten drei Ziffern sind die Millisekunden. Das schellste CAN-Intervall das ich bislang im Mondeo gefunden habe, lag bei 10 ms, also 100 Nachrichten pro Sekunde.
- Die CAN_ID ist ebenfalls in hexadezimaler Schreibweise enthalten
- Der Nachricht können per Protokoll 0 bis 8 Datenbytes anhängen (0 Bytes bei Remote-Frames, welche ich im Mondeo aber bislang noch nicht entdeckt habe), wobei das erste empfangene Datenbyte links als "DB0" bezeichnet wird und das achte als "DB7". Jedes Datenbyte wird in hexadezimaler Schreibweise mit zwei Zeichen repäsentiert.
- Eine Angabe der Datenbytes pro Zeile (das "DLC" Attribut) fehlt bei diesem Format. Ist aber durch die Anzahl der nachfolgenden Datenbytes impliziert.
- Am Ende jeder Zeile befindet sich ein zusätzliches Leerzeichen und eine PC-Kompatible Zeilenschaltung CRLF (CR=0x0D, LF = 0x0A).
- Die Anzahl der Zeilen pro Logfile ist scheinbar unbegrenzt.
2.) LAWICEL CAN-Log
Hier, ebenfalls vom HS-CAN, ein Beispiel für ein Logfile im LAWICEL Format (weit verbreitet):
Time ID DLC Data Comment
17,718 2ED 7 00 24 87 04 B1 B4 00
17,724 581 8 00 00 FF FF FF FF FF FF
17,728 128 8 0C 00 00 00 F0 00 87 FF
17,729 2A8 8 00 45 92 01 F4 D6 5F 00
17,734 160 8 00 01 80 27 99 44 00 C0
17,734 284 8 F1 4F 80 0B 91 80 00 00
17,734 4A3 8 30 72 10 00 00 49 00 00
...
MESSAGE = SS ',' UUU ' ' CAN_ID ' ' DLC ' ' (DB0|' ') ' ' DB1|' ') ' ' (DB2|' ') ' ' (DB3|' ') ' ' (DB4|' ') ' ' (DB5|' ') ' ' (DB6|' ') ' ' (DB7|' ') ' ' [ COMMENT ] CRLF ;
- Auffällig im Vergleich zum ELM-Log ist der Timecode. Hier sind nur die relativen Sekunden und Millisekunden (letztere durch Komma getrennt!) seit Aufzeichnungsstart und nicht die Echtzeit enthält. Die Firmware der LAWICEL Adapter senden nur Millisekunden pro Nachricht im Bereich 0-59.999. Danach wird wieder bei 0 begonnen. Will man also Aufzeichnungen länger als 60 Sekunden betrachten, muss man die fehlende Zeitbasis per Software hinzurechnen.
- Im DLC ("Data-Length-Code") ist zusätzlich die Anzahl der Datenbytes (0-8) der Nachricht enthalten. Zwischen CAN_ID und DLC befinden sich 6 Leerzeichen.
- Ebenfalls verwendet dieses Format PC-Returnzeichen (0x0D, 0x0A) und ein zusätzliches Leerzeichen davor.
- Besonders ist hierbei noch zu erwähnen, das für jedes nicht vorhandene Datenbyte zwei Leerzeichen vorhanden sind.
- Pro Zeile kann ein im Programm erfasster Kommentarstring enthalten sein. Eine Längenbegrenzung ist mir bislang nicht bekannt. Der Kommentar darf alle Zeichen, außer dem Newline enthalten.
3.) Erweitertes LAWICEL CAN-Log
Dieses entspricht im großen und ganzen dem obigen Format, mit dem Zusatz, das hinter den Datenbytes in Hex zusätzlich eine Darstellung als ASCII-Zeichen folgt. Nicht darstellbare ASCII-Zeichen werden durch einen Punkt "." repräsentiert:
33,126 23C 8 5F 80 47 80 57 00 00 00 |_.G.W...|
33,126 24E 8 01 00 00 00 50 00 57 FF |....P.W.|
33,127 260 8 7F 60 32 38 30 32 35 35 |.`280255|
33,127 296 8 1A CE 00 55 DD F3 00 00 |...U....|
In seltenen Fällen kann man hierüber sowas wie Fahrgestellnummer, Kennungen von Radiosendern erkennen.
4.) CANcool Logformat
Timestamp;Frame;ID;DLC;D0;D1;D2;D3;D4;D5;D6;D7;
0;STD;581;8;00;00;FF;FF;FF;FF;FF;FF;
2;STD;511;8;11;01;00;00;00;00;00;00;
4;STD;35;8;00;02;00;00;00;00;00;00;
...
383402;STD;28;8;00;81;10;00;48;FF;FF;FF;
383404;STD;30;8;04;00;00;00;01;01;00;00;
383405;STD;50;8;40;27;2A;47;00;00;50;AC;
MESSAGE = TIMESTAMP ';' FRAMETYPE ';' CAN_ID ';' DLC ';' D0 ';' D1 ';' D2 ';' D3 ';' D4 ';' D5 ';' D6 ';' D7 ';'
- Es gibt eine Headerzeile
- Die einzelnen Felder sind mit Semikolon ";" getrennt
- Eine CAN-Nachricht pro Zeile. Die Zeile endet mit einem ";" und CRLF
- Der TIMESTAMP ist die Integere Zahl der Millisekunden, von 0 beginnend aufsteigend, also immer relativ zum Aufzeichnungsstart.
- Der FRAMETYPE ist "STD" für Standard-Frames (11 Bit Arbitration ID), "EXT" für Erweiterte-Frames (29 Bit) und "RTR" für Remoteframes