Verwenden Sie cantools und can toolkit, um blf-Dateien in Python zu analysieren

1. Toolkit-Installation

pip install cantools python-can

Zweitens analysieren Sie die blf-Datei

Normalerweise werden dbc-Dateien benötigt, um blf zu analysieren. Natürlich geht es auch ohne dbc, aber die Analyse ist umständlicher. Es wird empfohlen, mit der dbc-Analyse zu kooperieren, die auch unsere am häufigsten verwendete Methode ist. Um dbc zu verwenden, müssen Sie also zuerst die dbc-Datei laden, hier benötigen Sie Cantools, Code:

import cantools
import can
dbc_file = r"C:\Users\master01\Downloads\blf_conf\FS04通用_TBOX(1).dbc"
dbc = cantools.db.load_file(dbc_file)

Nach dem Laden der dbc-Datei können Sie die blf-Datei parsen, den Code

f = r"C:\Users\master01\Downloads\blfdata\问题blf\1.17-9-10.blf"
log_data = can.BLFReader(f)
for msg in log_data:
    print(msg)

Das Druckergebnis sieht so aus

Timestamp: 1673917200.026000        ID: 0301    S Rx                DL:  8    1d b0 41 54 07 02 00 00     Channel: 0
Timestamp: 1673917200.026000        ID: 070b    S Rx                DL:  8    00 c8 0c b6 24 b8 24 b8     Channel: 0
Timestamp: 1673917200.028000        ID: 0322    S Rx                DL:  8    00 00 00 00 00 00 03 00     Channel: 0
Timestamp: 1673917200.126000        ID: 030d    S Rx                DL:  8    00 14 00 00 00 00 00 00     Channel: 0
Timestamp: 1673917200.126000        ID: 0320    S Rx                DL:  8    06 b1 00 00 00 00 07 00     Channel: 0
Timestamp: 1673917200.127000        ID: 0708    S Rx                DL:  8    00 48 00 48 00 08 00 32     Channel: 0
Timestamp: 1673917200.129000        ID: 0712    S Rx                DL:  8    00 06 81 0d 21 05 00 00     Channel: 0
Timestamp: 1673917200.271000    ID: 1821a7c1    X Rx                DL:  8    02 2f 00 00 00 00 00 00     Channel: 0
Timestamp: 1673917200.321000        ID: 0110    S Rx                DL:  8    05 36 16 67 00 09 20 6b     Channel: 0
Timestamp: 1673917200.322000        ID: 0111    S Rx                DL:  8    16 5d 00 00 d4 00 20 bf     Channel: 0
Timestamp: 1673917200.322000        ID: 0112    S Rx                DL:  8    49 32 00 10 00 16 6d 4c     Channel: 0
Timestamp: 1673917200.326000        ID: 0300    S Rx                DL:  8    00 3a c2 f8 00 00 00 00     Channel: 0
Timestamp: 1673917200.326000        ID: 0710    S Rx                DL:  8    00 00 00 00 00 00 00 00     Channel: 0
Timestamp: 1673917200.427000        ID: 0709    S Rx                DL:  8    0e 02 0e b0 4a 0c ff fe     Channel: 0
Timestamp: 1673917200.427000        ID: 070a    S Rx                DL:  8    11 51 1f fd 46 de 1c 83     Channel: 0
Timestamp: 1673917200.428000        ID: 0711    S Rx                DL:  8    02 df 00 09 02 d5 00 d4     Channel: 0
Timestamp: 1673917200.438000        ID: 0308    S Rx                DL:  8    03 22 0a 3c 0a 00 00 2a     Channel: 0
Timestamp: 1673917200.550000        ID: 03a1    S Rx                DL:  8    00 00 06 b1 00 00 15 00     Channel: 0
Timestamp: 1673917200.550000        ID: 03a2    S Rx                DL:  8    00 00 00 00 00 00 05 00     Channel: 0
Timestamp: 1673917200.633000        ID: 0270    S Rx                DL:  8    00 67 67 00 00 00 00 a2     Channel: 0
Timestamp: 1673917200.638000        ID: 0307    S Rx                DL:  8    41 14 03 c0 36 00 00 03     Channel: 0
Timestamp: 1673917200.638000        ID: 0309    S Rx                DL:  8    1c 1c 1c 1c 1c 1c c3 50     Channel: 0
Timestamp: 1673917200.655000        ID: 03a0    S Rx                DL:  8    06 b1 00 00 00 00 15 00     Channel: 0
Timestamp: 1673917200.657000        ID: 030a    S Rx                DL:  8    00 00 00 00 00 00 00 00     Channel: 0

Es kann festgestellt werden, dass der Zeitstempel herausgeparst wird und andere Daten hexadezimal sind, sodass wir es nicht direkt sehen können.Wenn wir mit dem blf-Format vertraut sind, können wir die Daten natürlich selbst wiederherstellen, aber da wir haben bereits eine Bibliothek eines Drittanbieters verwendet, müssen wir natürlich nicht selbst verwenden. Sie wurde analysiert, und nach sorgfältiger Beobachtung kann festgestellt werden, dass das vorherige Laden von dbc nicht verwendet wird, sodass eine wichtige Funktion unter angezeigt wird Diesmal ist das dbc.decode_message(id,data), der spezifische Code ist wie folgt

decoded = {}
for msg in logdata:
    try:
        dec = dbc.decode_message(msg.arbitration_id, msg.data)
        if dec:
            for key, data in dec.items():
                if key not in decoded:
                    decoded[key] = []
                decoded[key].append([msg.timestamp, data])
    except:
        pass

Da ich die Daten schließlich geparst und in mf4 konvertiert habe, habe ich ein decodiertes Wörterbuch erstellt und in jeder Taste ein Signal aufgezeichnet.Diejenigen, die mit mf4 vertraut sind, sollten wissen, dass jedes Signal in mf4 hauptsächlich aus zwei Teilen besteht, einer ist der Zeitstempel, Eins sind Daten, mit diesen beiden können wir mf4-Dateien erstellen und schließlich den Code zum Erstellen von mf4 einfügen

from asammdf import MDF,Signal
sigs = []
for k,v in decoded.items():
    timestamps = [i[0] for i in v]
    data = [i[1] for i in v]
    s = Signal(data,timestamps,name=k)
    sigs.append(s)

mdf = MDF()
mdf.append(sigs)
mdf.save("xx.mf4",overwrite=True)

Auf diese Weise wird das Parsen und Konvertieren der blf-Datei realisiert.Natürlich ist das Konvertierungsformat sehr frei, solange Sie mit dem entsprechenden Format vertraut sind, wie csv, hdf5, xlsx, json, pickle, weil wir Habe schon die Originaldaten bekommen, was zu speichern ist Das Format ist sehr einfach.

Guess you like

Origin blog.csdn.net/zy1620454507/article/details/129855664