【CanTp】車両診断通信 その20【シミュレーション⑦】

【CanTp】車両診断通信 その20【シミュレーション⑦】 車両診断通信

バックナンバーはこちら。
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による送受信を実現した。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました