【PyFMI】最小構成のMBD事例 第2章 その141【CAN連携⑤】

【PyFMI】最小構成のMBD事例 第2章 その141【CAN連携⑤】 事例
【PyFMI】最小構成のMBD事例 第2章 その141【CAN連携⑤】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

前回まででPython-CANのインストール、import、バス初期化、送信の復習をしたところ。

必要な情報は思い出したので、
今回は実際の指令値を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で指令値送信のコード

フクさん
フクさん

とりあえず、Python-CANで指令値送信のコードを書いてきた。

import sys
import can
import time

def cansend( cycle = 0.1, loop = False ):
	# バス接続
	bus = can.interface.Bus(bustype='vector', channel='1', bitrate=500000)


	sndparam = [
		0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,
		100,100,
		100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0,
		0,0,0,0,0,0,0,0,0,0,
		80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,
		50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,
		20,20,20,20,20,20,20,20,20,20,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	]
	
	while True:
		for p in sndparam:
			send_msg = can.Message(arbitration_id=0x111, extended_id=0, data=[0x00, p, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
			print('Send msg : %s' % send_msg)
			# 送信
			bus.send( send_msg )
			
			time.sleep(cycle)
		if loop==False:
			break;

if __name__ == '__main__':
	cycle = 0.1
	loop = False
	
	args = sys.argv
	if len(args)>1:
		cycle =  float(args[1])
	if len(args)>2:
		if int(args[2]) != 0:
			loop = True
	
	cansend(cycle=cycle, loop=loop)

コード解説

太郎くん
太郎くん

sndparamが指令値用のデータで、
真ん中あたりのwhileで順次送信してるってのは分かるけど、
if __name__ == ‘__main__’:
あたりでごちゃごちゃやってるのは何?

フクさん
フクさん

(ごちゃごちゃって・・・。)

フクさん
フクさん

そこはコマンドライン引数を取れるようにしただけだね。
特に指定しなくても動くんだけど、
送信周期と指令値送信を繰り返し実施したい場合を想定して追加しておいた。

太郎くん
太郎くん

察するに第1引数が周期で、第2引数が繰り返しかどうかってことろかな?

太郎くん
太郎くん

例えば、周期を200ms、繰り返しモードにしたいときは以下で実行する感じか。

python cansend.py 0.2 1
フクさん
フクさん

そうそう。
正解だ。

フクさん
フクさん

あとは実際に動かしてみるってことかな。

太郎くん
太郎くん

あれ?
受け側が居ないけど動作確認ってできるの?

フクさん
フクさん

BusMasterを使用すれば送ってるかどうかは見れるね。
実際のCANだと相手がいないとACKエラーになって正常なフレームを送信できないんだけど、
Virtual CAN Busの場合は特にそこは見ていないようなので、
動作確認としては問題無い。

BusMaster

以前、BusMasterの話をしたときの記事

太郎くん
太郎くん

ようわからんがBusMasterで見てわかるならOKか。

まとめ

フクさん
フクさん

まとめだよ。

  • Python-CANで指令値送信のコードを提示。
    • CAN関連の前回までの復習の話のまんま。
  • 利便性を上げるためにコマンドライン引数を取り込む機能追加。
    • 送信周期変更と繰り返し処理切替を追加。
  • 動作確認はBusMasterでモニタすることで実施予定。
    • 実際のCANだと対抗機が必要だがVirtual CAN Busでは不要。

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

コメント

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