pythonでcanデータの読み取り vol2

会社技術

はじめに

canにはどうやらファイルの種類があるようだ。前記事ではblfの読み取りについて記載したが、ascの拡張子もあるようで読み取りに挑戦した。

pythonでの読み取り方法

前提

前記事にあるとおり、「can」および「cantool」をpipしていること。

ascの読み取り

中身をちらっと見ると機械語にはなっていなかった。しかし、内容は意味不明だ。

こんな感じ

とりあえず「blf」と同じようにできないかやってみた。.dbcは同じようなことが書いてあったが、ちょっと違いがあったのでまずはこちらを載せる。これはasc,blf間の違いなのかは分からない。。

dbc中身紹介

コードはこちら。

import pandas as pd
import cantools
import can

filename=input("please input dbc filename:")
print(filename)
dbc_can=cantools.database.load_file(filename)

file=input("please input asc filename:")
print(file)
ascdata=can.io.asc.ASCReader(file) #change point for blf

BO=input("please input BO Num.:") #red circle at picture =1981
print(BO)

name=input("please input After BO:") #red triangle at picture =SCU~DTOOL
print(name)

variable=input("please input variable:") #red squere at picture =SCU~DTOOL
print(variable)

#initialized time constant
timestamp_ini=0
#initialized list
outputlist=[]

for msg in ascdata:
    if(msg.arbitration_id==int(BO)):
        temp=dbc_can.get_message_by_name(name).\
            decode(msg.data, decode_choices=False)
        aaa=temp[variable]
        if(timestamp_ini==0):
            timestamp_ini=msg.timestamp
        else:
            Timer=msg.timestamp-timestamp_ini
            outputlist.append([Timer,aaa])

df=pd.DataFrame(outputlist)
df.columns=(["Time","aaa"])
df.to_csv(file[:-4]+".csv") #.blf -> .csv

解説

基本blfの読み取りと同じようにできた。can.io.~.~の~の部分だけが変化点。
今回は少し調査を深めた。tempにはどのようなものが格納されているのか?をみると、、
tempの中身

:区切りで変数と数字が組みになって格納されていた。なので、
aaa=temp[variable]
な感じで変数名を選択するとその値が抽出できるといった具合かな??

注意点

よくわからないがBOの数字は11bit以上取れないようだ。なので、dbc内にBOが2048?以上のものがあるとエラーが出る。これらのBOは読み取れない。なくなく、これらの行を消す。。
エラー画像

おわり

python関係の記事はアクセス数がよいなあ。。特にアフィしていないので、稼ぎにはならないと思うが。。