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

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

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

はじめに

前回は、指令器ことCANの送信側を作成して動作確認までした。
BusMasterでCANフレームが確認できているので、
おそらく問題無いだろう。

今回からFMU処理、グラフ描画処理をしている方に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

CAN受信側はどうするか?

太郎くん
太郎くん

CANの送信はできたから、次は受信かな?

フクさん
フクさん

そうだね。
以前作ったtkinter+matplotlib+pyFMUにPython-CANを追加する。

太郎くん
太郎くん

具体的には何をすれば良い?

フクさん
フクさん

まぁCANに関しての流れは送信側と一緒だね。
あとは、どこで受信するか、モードの切り替えをどうするか。
ってところだな。

太郎くん
太郎くん

モードの切り替え?

フクさん
フクさん

以前作ったtkinterベースのコードだと
Scaleによる入力だったり、sin波入力だったりでいろいろな入力源を用意したけど、
そこにCANが追加されるんだよね。
まぁ同じようにチェックボックス追加して、それで切替で良いと思うけど。

太郎くん
太郎くん

そういやそういう話したね。

CAN受信

フクさん
フクさん

じゃ、さくっとCAN受信について説明をしてしまおう。

フクさん
フクさん

import、初期化はCAN送信の時と一緒だ。

import can

# バス接続
self.bus = can.interface.Bus(bustype='vector', channel='1', bitrate=500000)
フクさん
フクさん

channel=’1′
は送信側と合わせる必要があるから注意。

太郎くん
太郎くん

確か送信側も
channel=’1′
だったはず。

CAN受信

フクさん
フクさん

次はCAN受信。
こんな感じを想定している。

recv_msg = self.bus.recv(timeout=0.0)
if recv_msg != None:
	if recv_msg.arbitration_id == 0x111:
		data = recv_msg.data[0]*0x10000 + recv_msg.data[1]*0x100 + recv_msg.data[2]
		self.y_can_tmp = data/255.0
太郎くん
太郎くん

recvメソッドでとりえあず受信して見て、
受信データが有ればなんかする。
って感じだね。

フクさん
フクさん

まぁ実際はスレッド作ってそこでタイムアウト待ち状態で待たせる方が効率的ではあるのだが、
スレッド作るのも面倒だし、スレッドの影響でまた負荷状態が変わっても嫌だし。
というわけでタイムアウトが0秒のポーリング型にしている。

太郎くん
太郎くん

まぁシンプルな方が良いよね。

フクさん
フクさん

次はtkinter側というかGUI側の調整だな。

まとめ

フクさん
フクさん

まとめだよ。

  • CAN受信用にモード切替のUIが必要。
    • チェックボックスで実施予定。
  • CAN受信のimport、バス初期化はCAN送信側といっしょ。
  • 実際の想定受信コードも記載。
    • スレッドを使うことも可能だが、タイムアウトを0秒にするポーリング型を想定。
      • とりあえず、負荷に影響を与えない&シンプルな実装にする。

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

コメント

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