バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回、PyFMIから各種FMUを呼び出す際の構成図を出した。
FMU間の信号線の接続はPython上から実施することを想定。
今回から実際のPythonコードの話になるが、
割とややこしいことになるかもしれない・・・。
登場人物
博識フクロウのフクさん
![指差しフクロウ](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
![技術者太郎](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
PyFMIでマルチFMU制御する際の前提知識
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
マルチFMUを制御するPythonコードは書けた?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
一応書けたには書けたが・・・。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
なんか問題でも?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
うーん、ちょっと先に説明を入れないとコードだけだと伝わり難いかなーって思って。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」10アップ.png)
もしかして、凄まじい規模のコード量になったとか?!
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
コード規模は大して大きくないかな。
ただ、前回のPyFMIでは扱ってなかった概念が出てくるんで
それを先に説明してしまいたい。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
なるほど。
だったら、早速よろしくー。
importするモジュール
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まずimportするモジュールだが、以前はload_fmuだけだったのだが、以下に変わる。
from pyfmi import FMUModelCS2, Master
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
FMUModelCS2とMaster?
FMUModelCS2はどっかで見たことあるような?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
たぶんここだね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
あ、そうそう。
load_fmuが自動でFMUのタイプを判定してオブジェクトを返してくれるんだけど、
それの一つだね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
ということは、
load_fmuが判定してくれるからload_fmuのままでも良かったのでは?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
まぁ今回はそうなんだけど、
今後のPyFMIの使い方を想定するとFMUModelCS2の方が説明として繋ぎ易いんだよね。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/びっくりフクロウ.png)
とういうか、
以前、load_fmuの自動判別の説明をしたとき、
load_fmuは可能な限り使用しないって説明したじゃん!
そして太郎くんも同意してたじゃん!
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
あれ?
そうだっけ?
もう昔の話だからなぁ・・・。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
(一週間前なはずなんだが・・・。)
Masterモジュール
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
で、Masterの方は?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
シミュレーションをする上での土台になる部分だね。
各種FMUと接続構成を渡してうまくやってくれるところ。
詳細は随時説明しよう。
FMUのロード
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
そして、FMUのロードの部分は以下になる。
model_sub1 = FMUModelCS2( "PID.fmu", "", _connect_dll=True)
model_sub2 = FMUModelCS2( "Motor.fmu", "", _connect_dll=True)
model_sub3 = FMUModelCS2( "Ramp.fmu", "", _connect_dll=True)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
各種FMUのPATHをしていしてロードするのか。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
あれ?引数がPATH以外にもいろいろあるね?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
厳密には1つ目はFMU名、2つ目はFMUがあるPATHを指定する。
まぁ1つ目のFMU名のところでPATH指定しちゃうことが多いから2つ目は空文字になるね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
そして、_connect_dllってのは?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
FMU内部のライブラリをロードするか否か。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」11アップ.png)
いや、FMUを使いたいんだからロードするでしょ!!
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
まぁロードしないやり方もあるってことなのかもねー。(すっとぼけ)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
(何か隠してやがるな・・・。)
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- PyFMIでマルチFMU制御する際にある程度の前提知識が必要になる。
- FMUロード。
- 以前はload_fmuを使ったが、今回はFMUModelCS2を使用。
- 引数が増えている。
- PATHの指定がファイル名のPATHに分けることが可能。
- DLLロード有無の引数がある。
- つまりロードしない使い方が・・・。
バックナンバーはこちら。
コメント