バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回はPyFMIの復習とPIDのFMUをDummy_FMUModel化を実施。
ロードの仕方を変えるだけでFMU間の構造に手を入れる必要はなさそう。
とはいっても、PID.fmuの内部アルゴリズムが空っぽになってしまっているので、
ここの辻褄合わせは必要になる。
登場人物
博識フクロウのフクさん

イラスト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
DummyFMU化したPID制御の辻褄合わせ

前回、PID制御をDummyFMU化したんで、
PID制御の内部アルゴリズムが空っぽの状態になってる。

あれ?
ここってどうするんだっけ?
確か以前は指令器をDummyFMUにしたからその時と同じことをすれば良い感じか?

指令器をDummyFMUにした話はここでやったっけ。

結論としては、Dummy_FMUModelCS2のdo_stepメソッドをオーバーライドすればOKか。

正解。
do_stepメソッドをオーバーライド

コードとしては以下にすればOKだ。
なお、do_dummyは以前からあるものだ。
def do_pid(self, current_t, step_size, new_step=True):
self.model_sub1.values[self.model_sub1.get_variable_valueref("y")] = self._voltage
self.model_sub1.completed_integrator_step()
return 0
def do_dummy(self, current_t, step_size, new_step=True):
self.model_dummy.values[self.model_dummy.get_variable_valueref("y")] = self._y
self.model_dummy.completed_integrator_step()
self.model_sub1.do_step = self.do_pid
self.model_dummy.do_step = self.do_dummy

PID制御器としてはdo_pidを用意して、それでdo_stepをオーバーライドすれば良いのね。

do_pid関数の中のself._voltageは
たぶんXCP経由で取得したPID制御器の出力だね。
do_pid関数内部でPID.fmuの変わりに出力を決めてるってところだ。

そこも正解。

まぁ入出力だけの辻褄合わせなので、それほど難しい話では無いはずだ。
まとめ

まとめだよ。
- DummyFMU化したPID制御の辻褄合わせを実施。
- Dummy_FMUModelCS2のdo_stepメソッドをオーバーライドすればOK。
- do_stepをdp_pidとして実装。
- do_pid関数内部でPID.fmuの変わりに出力を決定する仕掛け。
- このように入出力の辻褄合わせをすればOK。
バックナンバーはこちら。
コメント