バックナンバーはこちら。
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秒にするポーリング型を想定。
- とりあえず、負荷に影響を与えない&シンプルな実装にする。
- スレッドを使うことも可能だが、タイムアウトを0秒にするポーリング型を想定。
バックナンバーはこちら。
コメント