『お手軽にモデルベース開発環境を構築したい』で紹介した、ModelicaとPythonの連携方法についてです。
目的
下記のような操作を行うことが今回の目的です。
- Modelicaで物理モデルを作成する。
- 物理モデルをPythonのPyModelicaモジュール(JModelica)でFMU形式にコンパイルする。
- FMUファイルをPythonのPyFMIモジュール(JModelica)で計算する。
- 計算結果をPythonのMatplotlibモジュールでグラフ表示する。
環境設定
実行環境
- Windows 10 (64bit)
Anaconda2のインストール
連成シミュレーション・マスタとしてのPython実行環境をAnacondaで構築します。後述のJModelicaがPython2 32bitのみに対応しているため、Anacondaもそれに対応したものを用います。(すでに別のPython環境がインストールされている場合も、追加でインストールすれば問題ないと思います。)
以下のページから『Python 2.7 version (32bit)』版のインストーラをダウンロードします。
Download Anaconda Now! | Continuum
ダウンロードしたインストーラを実行し、基本的にデフォルトのまま進めます。インストール先フォルダは C:\Anaconda2
に設定しておきます。
JModelicaのインストール
PythonモジュールのPyModelicaとPyFMIを利用するため、JModelicaをインストールします。
下記ページから最新のインストーラをダウンロードします。
Download | JModelica.org
Pythonモジュールインストール時、インストール先が C:\Anaconda2
になるように選択します。
Modelicaモデルを作成する
今回は『WindowsでOpenModelicaを使う』で紹介した Modelica.Thermal.HeatTransfer.Exsamples.Motor
をModelica形式で保存したものを用います。
『ozawaat/FMI_Motor』の Motor.mo
に保存しておきましたのでこちらをご利用ください。
Motor.mo
を適当な場所に保存しておいてください。
ModelicaモデルをFMU形式にコンパイルする
JModelicaからPythonを起動する
Motor.mo
が保存されているフォルダでPythonを操作します。Pythonの起動方法は以下のいずれかを用いてください。
-
[画面左下のWindowsマーク] → [JModelica.org-1.17] からIPythonを開き、コンソールに
!cd C:\[Motor.moが保存されているフォルダ]\
を入力してフォルダを移動します。 -
Motor.mo
と同じフォルダにC:\JModelica.org-1.17
からIPython.bat
をコピーしておきます。このIPython.bat
をダブルクリックしてIPythonを開きます。
ModelicaファイルをFMUにコンパイルする
Motor.mo
と同じフォルダに下記ファイルを保存します。
from pymodelica import compile_fmu
model_name = 'Motor'
mo_file = 'Motor.mo'
my_fmu = compile_fmu(model_name, mo_file, target='cs')
IPythonコンソールから
run Motor_Compile.py
を入力すると、 Motor.mo
がコンパイルされて Motor.fmu
が作成されます。
FMUをPythonで計算してグラフに表示する
Motor.mo
と同じフォルダに下記ファイルを保存します。
import matplotlib.pyplot as plt
from pyfmi import load_fmu
model = load_fmu('Motor.fmu')
opts = model.simulate_options()
opts["ncp"] = 1000
res = model.simulate(final_time=100000, options=opts)
T1 = res['Twinding.T']
T2 = res['Tcore.T']
t = res['time']
plt.plot(t, T1, label="Twinding.T")
plt.plot(t, T2, label="Tcore.T")
plt.legend(loc='best')
plt.xlabel('time [sec]')
plt.ylabel('Temperature [K]')
plt.show()
IPythonコンソールから
run Motor.py
を入力すると、 Motor.fmu
がPython上で計算されて下記のグラフが表示されます。