こんにちは、wattak777 です。
いきさつ
ひょんなことから BLF ファイルを解析することになりまして。
ところが手元に CANalizer も無く、再生も何かのファイルへのエクスポートもできず。
さて、どげんしたら…と、途方に暮れていたら、
【完全版】pythonでblfファイルのCANデータをcsv化する【詳細解説付き】
というページを発見。
しかし、サンプルを見るとどうやら dbc というデータベースファイルが必要であり、しかも CAN 通信の特定の MSG ID しか取ってこず、本来欲しかったダンプでは残念ながら無く。
作ってみた
…と、いうことでみんな大好き Python で作ってみました。
インストールは上述の記事にもありますが、以下の 2 つのコマンドにて行います。
$ pip install cantools
$ pip install python-can
お試し実装したソースが下記。
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()
出力させてみると、こんな感じ。1
['Timestamp:', '1234567890.123456', 'ID:', '123', ...]
:
後はこのリファレンスを元に必要なデータを column 変数のインデックスを設定して改めて出し直して必要なダンプを取る、という形で行いました。
タイムスタンプについて
ちなみにタイムスタンプの数字はマイクロ秒単位で出ているようですが、整数部分は UTC タイムゾーンにおける 1970 年 1 月 1 日 00:00 からの通算秒のようですね。
リアル時刻に戻すときは注意が必要ですが、再生機構を作りたい場合は 1 つ目のデータのタイムスタンプからの経過秒数だったり、それぞれのひとつ前のデータのラップタイム秒数を計算させて出力する方が良いかもしれません。
以上です。
参考文献
【完全版】pythonでblfファイルのCANデータをcsv化する【詳細解説付き】
-
秒数、IDについてのみ記載しています。自分の手元にある BLF は「DLC」「Chennel」といったフィールドがありましたが、一般的かどうかわからず割愛いたしました。 ↩