バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
tkinterによるFMUシミュレーションのリアルタイム波形描画にFMU関連処理を追加しているところ。
前回はdequeの生成までを実施。
実処理に相当するタイマハンドラ周りを実装していくことになるが、
タイマハンドラ内の処理に必要な前準備などもある。
登場人物
博識フクロウのフクさん
イラスト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
必要なタイマハンドラ
内容を入力してください。今回はタイマハンドラの実装ってことだったけど、
描画とFMUシミュレーションは同じタイマハンドラで実行する感じ?
いんや。
別々に分けるつもりだよ。
なんで?
シミュレーション結果を取得したら、すぐに更新すればいいんじゃない?
今回のやり方を始める時にも言ったが、
描画処理がリアルタイム性を落としちゃうんだよね。
よって、描画とシミュレーションを分けて、
例えば、
描画を200ms周期。
シミュレーションを可能な限り早く。
って方が望ましい。
なるほど。
確かに描画にネックがありそうだったから今回の話になったんだよね。
タイマハンドラの定義
必要なタイマハンドラは
FMUシミュレーション用のFMU_handler
と
matplotlib描画用のplot_handler
の二つを用意しよう。
そして、
FMU_handlerは1ms周期、
plot_handler200ms周期、
としておくか。
1ms周期とか動くのかな?
実際は1ms周期にはならないだろうね。
FMU処理の後に再度afterで設定するし。
まぁ可能な限り早く呼び出してくれって程度の数値だと思ってくれ。
内容を入力してください。なるほど。
そういうことか。
FMU_handlerを呼び出す前の準備
ここでFMU_handler内部で使用する時間関連の変数を事前に定義する必要がある。
時間関連?
うん。
実時間が経過した分をシミュレーション時間として設定するんで
前回の時刻の記憶とか必要なんだよね。
まぁコードとしては以下をタイマハンドラの前に実施しておけばOKだろう。
# define timers
start_tick = time.perf_counter()
currenttime = 0
あとはオプション設定も必要かな。
opts = master.simulate_options()
opts["step_size"] = step_size
opts["initialize"] = 1
このオプションの
opts[“initialize”] = 1
ってのは?
初回呼び出し設定だね。
一回simulateメソッドを呼び出した後は
opts[“initialize”] = 0
にすることで、
前回のsimulateメソッドを状態を引き継いだ状態でシミュレーションが再開される。
ほう。
それを利用してシミュレーションを刻むのか。
次は実際のタイマハンドラのコードを書き出してみよう。
まとめ
まとめだよ。
- 必要なタイマハンドラは2つ
- FMU処理用とmatplotlib描画用。
- 描画用側の負荷が高いので、こっちは長めの周期で実施。
- FMU処理用タイマハンドラ内で時間関連の演算が入るため、タイマハンドラ外で下準備が必要。
- Masterの初回呼び出し時のオプションと2回目以降で変える必要がある。
- initializeオプション。
バックナンバーはこちら。
コメント