Edited at

WindowsでModelicaとPythonを連携する

More than 1 year has passed since last update.

お手軽にモデルベース開発環境を構築したい』で紹介した、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の起動方法は以下のいずれかを用いてください。


  1. [画面左下のWindowsマーク] → [JModelica.org-1.17] からIPythonを開き、コンソールに

    !cd C:\[Motor.moが保存されているフォルダ]\

    を入力してフォルダを移動します。


  2. Motor.mo と同じフォルダに C:\JModelica.org-1.17 から IPython.bat をコピーしておきます。この IPython.bat をダブルクリックしてIPythonを開きます。



ModelicaファイルをFMUにコンパイルする

Motor.mo と同じフォルダに下記ファイルを保存します。


Motor_Compile.py

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 と同じフォルダに下記ファイルを保存します。


Motor.py

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上で計算されて下記のグラフが表示されます。