バックナンバーはこちら。
https://www.simulationroom999.com/blog/diagnostic-communication-backnumber/
はじめに
ISO-TPのシミュレーションをしよう。のシリーズ。
今回はpyton-canを使用したプログラミング。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
python-canによるCAN制御の願望

前回、python-canのモジュールであるcan.playerとcan.loggerを動かしたけど、
動作確認が取れたってだけで、制御した感はないよねー。

うーん。たしかに。
「付属のサンプルプログラムを中身知らずに動かしました。」って程度だよね。

というわけで、
今回はちゃんとPythonコード書いて、
制御してる感を出したい!

(「出したい!」って、願望かい!)
python-canの動作可能CANインターフェースデバイス

と、その前に、
ここでpython-canに対応しているCANインターフェースデバイスを列挙しておこう。
- SocketCAN
- Kvaser’s CANLIB
- CAN over Serial
- CAN over Serial / SLCAN
- IXXAT Virtual CAN Interface
- PCAN Basic API
- USB2CAN Interface
- NI-CAN
- isCAN
- NEOVI Interface
- Vector
- CANalyst-II
- SYSTEC interface

おー結構いろんなデバイスに対応しているんだね。
Vectorのデバイスにも対応しているから
結果的にVirtual CAN Busに対応できるってことか。

他のデバイスでも繋げば同じように動くと思うと汎用性高いよねぇ。
python-canで送受信

で、今回の実験はこんなイメージ。


なるほど。
CANID 0x111を送って、それを受信したCANID 0x222を返信するってことだね。
シンプルだけど、制御している感はあるね。

ということは、
リクエスト側とレスポンス側の
2つのプログラムが必要ってこと?

正解!
python-canのリクエスト側のコード

リクエスト側のコードはこんなん
import can
# バス接続
bus = can.interface.Bus(bustype='vector', channel='0', bitrate=500000)
# 送信データ(CANID 0x111、DLC:8、Data:01 02 03 04 05 06 07 08)
send_msg = can.Message(
arbitration_id=0x111,
extended_id=1,
data=[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08])
print('Send msg : %s' % send_msg)
# 送信
bus.send( send_msg )
# 受信
recv_msg = bus.recv(timeout=1)
print('Recv msg : %s' % recv_msg)

バス接続でVirtual CAN Busに接続して、
MessageでCANフレームを作って、
sendで送信。
recvで受信。
だね。
python-canのレスポンス側のコード

そしてレスポンス側のコードはこんなん。
import can
# バス接続
bus = can.interface.Bus(bustype='vector', channel='0', bitrate=500000)
# 受信
while True:
recv_msg = bus.recv(timeout=1)
if recv_msg != None:
print('Recv msg : %s' % recv_msg)
break
# 送信データ(CANID 0x222、DLC:6、Data:0A 0B 0C 0D 0E 0F)
send_msg = can.Message(
arbitration_id=0x222,
data=[0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F])
print('Send msg : %s' % send_msg)
# 送信
bus.send( send_msg )

これはループで受信待ちして
受信したら、送信用のCANフレームを作って送信って流れだね。
python-canのリクエスト-レスポンスの結果

そして、それぞれの実行結果はこれ。
リクエスト側
Send msg : Timestamp: 0.000000 ID: 00000111 X DLC: 8 01 02 03 04 05 06 07 08
Recv msg : Timestamp: 1596259123.521760 ID: 00000222 X DLC: 6 0a 0b 0c 0d 0e 0f Channel: 0
レスポンス側
Recv msg : Timestamp: 1596259123.514021 ID: 00000111 X DLC: 8 01 02 03 04 05 06 07 08 Channel: 0
Send msg : Timestamp: 0.000000 ID: 00000222 X DLC: 6 0a 0b 0c 0d 0e 0f

同時にcan.loggerで収録した結果が以下。
Begin Triggerblock
0.000000 Start of measurement
0.000000 1 111x Rx d 8 01 02 03 04 05 06 07 08
0.001450 1 222x Rx d 6 0A 0B 0C 0D 0E 0F
End TriggerBlock

バッチリだね!
制御してる感あるよ!

う、動いて良かった・・・。
まとめ

まとめだよ。
- python-canがサポートしているデバイスを列挙した。
- pyton-canによる送受信を実現した。
バックナンバーはこちら。
ボッシュ自動車ハンドブック 日本語第4版
CAN入門講座: 組込みマイコンで学ぶCANプロトコルとプログラミング
CANおよびCANopenによる組み込みネットワーク
カーハッカーズ・ハンドブック ―車載システムの仕組み・分析・セキュリティ
車載イーサネット “クルマIT”高度化への基盤技術
詳解 車載ネットワーク -CAN、CAN FD、LIN、CXPI、Ethernetの仕組みと設計のために
自動車用ECU開発入門 システム・ハードウェア・ソフトウェアの基本とAUTOSARによる開発演習 (エンジニア入門シリーズ122)
車載ネットワ-ク・システム徹底解説: CAN,LIN,FlexRayのプロトコルと実装 (Design wave mook)
コメント