pythonでcanログを変換(BLF形式⇔ASCII形式)

CAN,python,vector

はじめに

ECUの開発してる中でcanログを取ることがあるのだけども、通信ログが数ギガ単位になるとPC自体の容量をすぐに圧迫してしまう。

ASCII形式ではなくBLF形式にしとけば容量を節約できるものの、今度はログを確認するときにCanalyzerがインストールされているPCじゃないと読めないから困る。

pythonのcanライブラリを使えば簡単に変換出来て便利なことを知ったので備忘録として残しておく。

CANログの基本

まずは各保存形式の基本から。

形式識別子説明
BLF.blfバイナリ形式であり、データを直接記録するためファイルサイズが比較的小さくなる。
可読性が低いため、特定のデータを抽出や解析する場合には専用のソフトウェアが必要となる。
バイナリデータの処理速度はテキストデータよりも高速。
ASCII.ascテキスト形式であり、ログファイルサイズは大きくなりがち。
可読性が高いため人間が直接読み取ることができる。
テキストデータの処理速度はバイナリデータよりも遅くなる。

一応開いてみると、BLF形式はこんなバイナリファイルなのに対して

ASCII形式は情報の読み取りが可能。

サンプルデータ

いろいろ試すにあたってCANログ(.asc、.blfファイル)が必要となるため、以下から拝借しました。

BLF形式、ASCII形式変換

ざっくりと内容が分かったところでBLF形式 → ASCII形式ASCII形式 → BLF形式の2パターン実装例を紹介。

BLF形式 → ASCII形式

import can

input_blf_file = "sample.blf"
output_asc_file = "output_sample.asc"

with open(input_blf_file, 'rb') as f_in:
    log_in = can.io.BLFReader(f_in)

    with open(output_asc_file, 'w') as f_out:
        log_out = can.io.ASCWriter(f_out)
        for msg in log_in:
            log_out.on_message_received(msg)
        log_out.stop()

ASCII形式 → BLF形式

import can

input_asc_file = "sample.asc"
output_blf_file = "output_sample.blf"

with open(input_asc_file, 'r') as f_in:
    log_in = can.io.ASCReader(f_in)

    with open(output_blf_file, 'wb') as f_out:
        log_out = can.io.BLFWriter(f_out)
        for msg in log_in:
            log_out.on_message_received(msg)
        log_out.stop()

気になったこと

「ASCIIファイル → BLFファイル → ASCIIファイル」と変換してASCIIファイルの差分ととってみたところ結構差分がある。

BLFファイルの変換を挟むことでタイムスタンプのベースなんかが変わってしまうけど、解析するうえでは影響のない差分なので特に問題ないかな?

CAN,pythoncan,python,vector