Utilisez cantools et can toolkit pour analyser les fichiers blf en python

1. Installation de la boîte à outils

pip install cantools python-can

Deuxièmement, analysez le fichier blf

Dans des circonstances normales, les fichiers dbc sont nécessaires pour analyser blf. Bien sûr, cela est également possible sans dbc, mais l'analyse est plus gênante. Il est recommandé de coopérer avec l'analyse dbc, qui est également notre méthode la plus couramment utilisée. Donc, pour utiliser dbc, vous devez d'abord charger le fichier dbc, ici vous avez besoin de 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)

Après avoir chargé le fichier dbc, vous pouvez analyser le fichier blf, le 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)

Le résultat imprimé est comme ça

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

On peut constater que l'horodatage est analysé et que d'autres données sont en hexadécimal, nous ne pouvons donc pas le voir directement. Bien sûr, si nous connaissons le format blf, nous pouvons restaurer les données par nous-mêmes, mais puisque nous ont déjà utilisé une bibliothèque tierce, bien sûr nous n'avons pas besoin de l'utiliser nous-mêmes Elle a été analysée, et après une observation attentive, on peut constater que le chargement précédent de dbc n'est pas utilisé, donc une fonction importante apparaît à cette fois, c'est dbc.decode_message(id,data), le code spécifique est le suivant

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

Parce que j'ai finalement analysé les données et les ai converties en mf4, j'ai construit un dictionnaire décodé et enregistré un signal dans chaque touche.Ceux qui connaissent mf4 doivent savoir que chaque signal dans mf4 contient principalement deux parties, l'une est l'horodatage, une est des données, avec ces deux, nous pouvons créer des fichiers mf4, et enfin mettre le code pour créer mf4

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)

De cette manière, l'analyse et la conversion du fichier blf sont réalisées. Bien sûr, le format de conversion est très libre, tant que vous connaissez le format correspondant, tel que csv, hdf5, xlsx, json, pickle, car nous ont déjà les données d'origine, ce qu'il faut enregistrer Le format est très simple.

Je suppose que tu aimes

Origine blog.csdn.net/zy1620454507/article/details/129855664
conseillé
Classement