🐍

blf ファイルのダンプを取ってみた

2022/10/16に公開

こんにちは、わたる です。

いきさつ

ひょんなことから BLF ファイルを解析することになりまして。
ところが手元に CANalizer も無く、さてどげんしたら…と、途方に暮れていたら、

【完全版】pythonでblfファイルのCANデータをcsv化する【詳細解説付き】

というページを発見。google センセイは便利ですね。

しかし、サンプルを見るとどうやら dbc というデータベースファイルが必要らしく、かつ、指定した特定の MSG ID しか取ってこず、本来欲しかったダンプでは残念ながら無く。

ええい、作っちゃえ

…と、いうことでみんな大好き Python で作ってみました。
インストールは上述の記事にもありますが、Python が使える環境で以下の 2 つのコマンドにて行います。

$ pip install cantools
$ pip install python-can

お試し実装したソースが下記。

sample.py
import cantools
import can
import sys

filename=sys.argv[1]
print(filename)

blfdata = can.io.blf.BLFReader(filename)
blfdata = list(blfdata)

outputfile = open('output.txt', 'w')
for msg in blfdata:
	msg = str(msg)
	column = msg.strip().split()
	outputfile.write(column)
	outputfile.write('\n')

outputfile.close()

結果の output.txt はこんな感じ。[1]

['Timestamp:', '1234567890.123456', 'ID:', '123', ...]
  :

後はこのリファレンスを元に必要なデータを column 配列のインデックスを設定して改めて出し直して必要なダンプを取る、という形で行いました。

タイムスタンプについて

二つ目の数字はタイムスタンプでマイクロ秒単位で出ているようですが、整数部分は UTC タイムゾーンにおける 1970 年 1 月 1 日 00:00 からの通算秒のようです。

リアル時刻に戻すときは注意が必要ですが、1 つ目のデータのタイムスタンプからの経過秒数を計算したり、それぞれのひとつ前のデータの差分を計算させる、といった方法が良いと思います。

参考文献

【完全版】pythonでblfファイルのCANデータをcsv化する【詳細解説付き】

脚注
  1. 秒数、IDについてのみ記載しています。自分の手元にある BLF は「DLC」「Chennel」といったフィールドがありましたが、一般的かどうかわからず割愛いたしました。 ↩︎

Discussion