バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回はFMUプラットフォームのMasterに対するオプションの話。
かなり多くのオプションがあったが、
今回使用するのはstep_sizeの指定くらい。
そして今回がコード全体を見せる回になる。
登場人物
博識フクロウのフクさん
イラスト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制御用のコード
フクさん
とりあえず、必要な前提知識は話したので、ソースコード開示だ。
from pyfmi import FMUModelCS2, Master
import numpy as np
import matplotlib.pyplot as plt
model_sub1 = FMUModelCS2( "PID.fmu", "", _connect_dll=True)
model_sub2 = FMUModelCS2( "Motor.fmu", "", _connect_dll=True)
model_sub3 = FMUModelCS2( "Ramp.fmu", "", _connect_dll=True)
models = [model_sub1, model_sub2, model_sub3]
connections = [
(model_sub3,"y",model_sub1,"target"),
(model_sub1,"y",model_sub2,"voltage"),
(model_sub2,"speed",model_sub1,"u"),
]
master = Master(models, connections)
opts = master.simulate_options()
opts["step_size"] = 0.001
res = master.simulate(final_time=2.0, options=opts)
voltage = res[model_sub2]['voltage']
current = res[model_sub2]['current']
speed = res[model_sub2]['speed']
loadTorqueStep_tau = res[model_sub2]['loadTorqueStep.tau']
target = res[model_sub1]['target']
t = res[model_sub1]['time']
plt.plot(t, voltage, label="voltage")
plt.plot(t, current, label="current")
plt.plot(t, speed, label="speed")
plt.plot(t, loadTorqueStep_tau, label="loadTorqueStep.tau")
plt.plot(t, target, label="target")
plt.legend(loc='best')
plt.xlabel('time [sec]')
plt.grid(which='both')
plt.show()
ソースコード確認
太郎くん
まぁ前半は前回まで説明してもらった部分で、
後半はシミュレーション結果を取得して、グラフ表示してるところか。
フクさん
そうだね。
以前のPyFMIを使用した時もそうだったが、
各種パラメータが連想配列でアクセスできるのは本当に楽だ。(じみじみ)
太郎くん
(FMILibraryの時は結構大変だったもんな・・・。)
フクさん
あとは実行して、その後いろいろ考察だ。
太郎くん
(な、なんか問題があることが前提の方な言い方だ・・・。)
ソースコードやモデルやFMUとか
フクさん
今回使用したPythonコード、Modelicaモデル、FMUはGitHubで公開している。
興味がある人は実際に動かしてみると良いだろう。
まとめ
フクさん
まとめだよ。
- マルチFMU制御用のコード提示。
- 前半は前回まで説明した内容。
- ロード、モデルセット、モデル間接続セット、Master定義
- 後半はシミュレーション結果取得と波形表示。
- 前半は前回まで説明した内容。
- FMILibraryの時とは異なり、結果取得と波形表示が楽なのは本当に有難い。
- 結果は連想配列で取得。
- 波形表示はmatplotlib使用。
バックナンバーはこちら。
コメント