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.