【XCP】最小構成のMBD事例 第2章 その219【仮想HILS②】

【XCP】最小構成のMBD事例 第2章 その219【仮想HILS②】 事例
【XCP】最小構成のMBD事例 第2章 その219【仮想HILS②】

バックナンバーはこちら。
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。

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

コメント

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