バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
実際にPyFMIを使用してシミュレーションを実施。
恐らく思ったよりも手数が少なかったのではなかろうか?
とりあえず、今回は遠しでやってみる。
(ソースコードもそのまま貼って置く)
登場人物
博識フクロウのフクさん
イラスト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
PyFMIによるFMU制御のシミュレーションソースコード
フクさん
とりあえず、一連の処理をまとめたコードは以下になる。
from pyfmi import load_fmu
import numpy as np
import matplotlib.pyplot as plt
model = load_fmu('Motor.fmu')
# Create an axis of time.
t = np.linspace(0.,2.,200)
# Creation of the Ramp function.
# (Drive from 0[V] to 100[V] in 0.2[s] to 1.0[s].)
x = np.linspace(-20, 220, 200)
x = np.maximum(x, 0)
x = np.minimum(100, x)
u = np.transpose(np.vstack((t,x)))
input_object = ('voltage', u)
res = model.simulate(start_time=0.0,final_time=2.0, input=input_object)
voltage = res['voltage']
current = res['current']
speed = res['speed']
loadTorqueStep_tau = res['loadTorqueStep.tau']
t = res['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.legend(loc='best')
plt.xlabel('time [sec]')
plt.grid(which='both')
plt.show()
結果のグラフ表示
フクさん
そして結果のグラフはこれ。
感想的な何か
太郎くん
FMILibraryと比べるとかなり一撃感があるなー。
フクさん
そうだね。
ここまで簡単にできるといろいろなパターンを自動化するのも楽そうだ。
太郎くん
特にvalurReferenceに振り回されないのがいいね。
FMILibraryの時はvalurReferenceの取得までが面倒だったりしたもんね。
ここらへんが無くなっただけでも大助かりだ。
フクさん
というわけでPyFMIの有用性がなんとなく見えてきたってところだろう。
ソースコードとかモデルとかFMUとか
フクさん
今回使用したPythonコード、Modelicaモデル、FMUをGitHubに上げておいた。
興味のある人を実際に動かしてみると良いだろう。
まとめ
フクさん
まとめだよ。
- PyFMIでFMU制御するPythonコードを開示。
- 割とあっさり実現。
- Pythonなのでmatpotlibでそのままグラフ表示。
- FMILibraryと比べるとvalueReferenceに振り回されることが無い点がとても良い。
- PyFMIによるFMU制御の有用性がなんとなく見えてきた。
バックナンバーはこちら。
コメント