SlideShare a Scribd company logo
FMI1.0
FMI for Co-Simulationについて
1. FMI for Co-Simulationの概要
2. FMUを作って使ってみる
3. Tool CouplingタイプのFMUを試作する。
第57回オープンCAE勉強会@関東(流体など)
finback 2016/08/05 改訂
1. FMI-1.0 FMI for Co-Simulation の概要 2
1. FMI for Co-Simulationの概要
1. FMI-1.0 FMI for Co-Simulation の概要
3
https://www.fmi-standard.org/tools (の一部)
様々なダイナミックシステムのシミュレーションツール間で Co-Simulation を実行するための規格である。
(Functional Mock-up Interface) https://www.fmi-standard.org/start
OpenModelica, JModelica, PyFMI, Scilab/Xcos FMU wrapper, FMUSDK, EnergyPlus など
オープンソース系ツールも多い。
サポートしている機能
1. FMI-1.0 FMI for Co-Simulation の概要
1. FMI-1.0 FMI for Co-Simulation の概要
4
FMI 1.0 FMI for Model Exchange 2010-07-26 MODELISAR
FMI 1.0 FMI for Co-Simulation 2010-10-12 MODELISAR
FMI 2.0 FMI for Model Exchange & Co-Simulation 2014-07-25 Modelica Association
https://www.fmi-standard.org/downloads仕様書
1-1 どんなモデルのCo-Simulationができるのか?
1-2 どのようなツールならCo-Simulationができるのか?
1-3 ソフトウェアの構成は?
1-4 FMUの中身は?
• XMLファイル
• ダイナミックリンクライブラリに実装される関数
1. FMI-1.0 FMI for Co-Simulation の概要
1-1 どんなモデルのCo-Simulationができるのか?
5
次のようなサブシステムが連成するモデルのシミュレーションを行う。
互いに異なる
シミュレーションツールの
ソルバーが
時間前進的(time increasing)
なシミュレーンを行う。
サブシステムモデル(Subsystem Models)
入力 𝒖 𝑡 と出力 𝒚 𝑡
で他のサブシステムモデル
と接続され、
シミュレーション中に
中間的な計算値が
の交換がなされる。
独立なタイムステップ
ℎ% = 𝑡%'( − 𝑡%
連成システムモデル(Coupled System Model)
計算値の交換を行うのは
コミュニケーションポイント	𝑡𝐶%と
呼ばれる離散的時刻に限定される。
𝑡 = 𝑡𝐶,, 𝑡𝐶(, ⋯ , 𝑡𝐶%, ⋯ , 𝑡𝐶/
コミュニケーションステップ
ℎ𝐶% = 𝑡𝐶%'( − 𝑡𝐶%
コミュニケーションステップℎ𝐶% と
各サブシステムのソルバーの ℎ% は
互いに独立にとれる。
(仕様書 P.11より)
1. FMI-1.0 FMI for Co-Simulation の概要
対象となるモデルの概要
1-2 どのようなツールならCo-Simulationができるのか?
6
基本的機能
• 𝑡01231 < 𝑡𝐶% < 𝑡567 となる任意の時間値 (コミュニケーションポイント)𝑡𝐶% を受け取ることができる。
• 計算時間が 𝑡𝐶% になるとシミュレーションを中断する(一時的に止める)ことができる。
• 中断している間に、入力変数 u(tC<) を受信し、出力変数 𝒚(𝑡𝐶%) を送信することができる。
• 中断している間に、次のコミュニケーションポイント tC<'( を受け取ることができる。
時間依存変数 𝑣 𝑡 の 𝑡01231 < 𝑡 < 𝑡567 の時間前進的 (time increasing) なシミュレーションを
行うツールが次のような機能をもつとき連成(coupling)ができる。
オプション的機能(必ずしも必要ではない)
• ℎ𝐶%	> 0 を可変にできる。
• ℎ𝐶% = 0 にできる。(イベントループのイタレーションができる)
• [𝑡𝐶%, 𝑡𝐶%'(] で入力変数 u(tC<) を補間できる。( u̇ tC< , ü tC< , ⋯ を使用する)
• [𝑡𝐶%, 𝑡𝐶%'(] のシミュレーションを非同期的に実行することができる。
ℎ𝐶% = 𝑡𝐶%'( − 𝑡𝐶% ≥ 0 : コミュニケーションステップ
1. FMI-1.0 FMI for Co-Simulation の概要
サブシステムのシミュレーションツール(スレーブツール)の機能的条件
サブシステムモデルは
常微分方程式や
微分代数方程式
で表されるモデルで
無くてもいい。
1-3 ソフトウェアの構成は?
7
マスターツール (Master Tool)
FMUを読み込んで
サブシステム間の計算値の交換や
同期、Co-Simulationの進行など
を担当する。
スレーブツール(Slave Tool)
サブシステムのシミュレーション
を実行する。
FMUを生成する機能をもつ
FMU(Functional Mock-up Unit) for Co-Simulation
以下を含む zip ファイル(拡張子fmu)
• サブシステムモデルやソルバーに関する情報が記述されたXMLファイル
• マスターとスレーブのインターフェース関数を含むダイナミックリンクライブラリ
• Cで記述されたソースコード(必須ではない)
(仕様書 p.17)
1. FMI-1.0 FMI for Co-Simulation の概要
Co-Simulationの実例
8
FMI for Co-SimulationのFMUを読み込んだブロック
スレーブツールのソルバーで動く。
FMI for Model ExchangeのFMUを読み込んだブロック
マスターツールのソルバーで動く。
マスターツール(Xcos)で
つくった
スーパーブロックモデル
Scilab/Xcos FMU wrapper のデモ
PID controller FMU Generated by Xcos
マスターツールもモデルを
作成する機能がある場合、
マスターツールのモデルと
スレーブツールのモデルが
協調的に動作する。
いろんな方法で作った
PID制御器のモデル
制御対象のモデル
https://forge.scilab.org/index.php/p/fmu-wrapper/
マスター
ツールの
ブロック
1. FMI-1.0 FMI for Co-Simulation の概要
注意!!
このデモを実行する
ためには、FMUを
読み込み直す必要がある。
1-3 ソフトウェアの構成は?
9
初期化 (initialization sub-phase)
• スレーブツールに関する情報を得る
• サブシステムの接続関係を解析する
• マスターアルゴリズムを選択する
シミュレーション (simulation sub-phase)
• コミュニケーションステップ hC< = tC<'( − tC< を計算する。
• サブシステムの入力値 u tC< , (u̇ tC< , ü tC< , ⋯ )を計算する。
• スレーブツールに tC<, tC<'(, u tC< , (u̇ tC< , ü tC< , ⋯) を送信する。
• スレーブツールに [tC<, tC<'(] のシミュレーションを実行させる。
• 正常に計算が終了したら、出力値 y tC<'( , (ẏ tC<'( , ÿ tC<'( , ⋯ ) を受信する。
• 正常に計算が終了しない場合、オプションに応じて他の情報を送受信する。
マスターアルゴリズムは
FMI 1.0 for Co-Simulation
の仕様には含まれていない。
終了処理 (shutdown sub-phase)
• シミュレーションを完全に終了する。
1. FMI-1.0 FMI for Co-Simulation の概要
マスターツールの役割
1-3 ソフトウェアの構成は?
10
マスターツールのソルバー
スレーブツールのソルバー
FMU
マスターツールのソルバー
マスターツールのソルバー
スレーブツールのソルバー
スレーブツールのソルバー
Cosimulation_StandAlone
(Code Generation)
FMUのダイナミックリンクライブラリに
スレーブツールのソルバーが含まれる
Cosimulation_Tool (Tool Coupling)
FMUのライブラリにはスレーブツールと通信する
ラッパーツールが含まれる。
一台のコンピュータ
でマスターツールと
スレーブツールが
異なるプロセスで動作する
場合。
複数のコンピュータ
でマスターツール
とスレーブツールが
動作する場合。
FMU
FMU
ネットワーク通信
スレーブツールのソルバーがどこにあるか!
(仕様書 P.13)
(仕様書 P.14)
(仕様書 P.14)
1. FMI-1.0 FMI for Co-Simulation の概要
FMUの実装の種類
1-4 FMUの中身は?
1. FMI-1.0 FMI for Co-Simulation の概要 11
FMU(Functional Mock-up Unit) for Co-Simulation
以下を含む zip ファイル(拡張子fmu)
• サブシステムモデルやソルバーに関する情報が記述されたXMLファイル
• マスターとスレーブのインターフェース関数を含むダイナミックリンクライブラリ
• Cで記述されたソースコード(必須ではない)
modelDescriptin.xml XMLファイル
ダイナミックリンクライブラリ
Cで記述されたソースコード
FMUSDKで作成した bouncingBall.fmu の内容
1-4 FMUの中身は?
12
FMI for Model Exchange と比べて
FMI for Co-Simulation ではFMUの実装の種類に関する情報が追加されている。
Capabilitiesはスレーブツールの
オプション的機能の有無について記述する。
• canHandleVariableCommunicationStepSize
• canHandleEvents
• canRejectsSteps
• canInterpolateInputs
• maxOutputDerivativeOrder
• canRunAsynchronously
• canSignalEvents
• canBeInstantiatedOnlyOncePerProces
• canNotUseMemoryManagementFunctions
スレーブツールのソルバーを
ダイナミックリンクライブラリに含む
スレーブツールと通信するラッパーを含む
XMLファイル modelDescription.xml の内容
ℎ𝐶% 可変ℎ𝐶% = 0	が可能
入力変数の
補間が可能
非同期的実行が可能
(仕様書 P.33)
(仕様書 P.34)
(仕様書 P.36-37)
入力変数
出力変数
パラメータ
その他の変数
開始時刻
終了時刻
トレランス
1. FMI-1.0 FMI for Co-Simulation の概要
1-4 FMUの中身は?
13
FMU SDK ( https://www.qtronic.de/jp/fmusdk.html )
で作成したFMI 1.0 for Co-Simulation に対応したbouncingBall.fmu
modelDescription.xml (eを入力変数、hを出力変数に改変したもの)
モデル変数
<ModelVariables>
FMUの実装の種類
<Implementation>
モデル識別情報
状態変数や
イベントインジケータの数
ダイナミックリンク
ライブラリが
スレーブソルバーを含む
ℎ𝐶% 可変
ℎ𝐶% = 0 が可能
FMUの実装の種類
スレーブツールのオプション的機能
XMLファイル modelDescription.xmlの実例
出力変数
入力変数
1. FMI-1.0 FMI for Co-Simulation の概要
1-4 FMUの中身は?
14
FMI のバージョンを返す
• const char* fmiGetVersion()
デバッグ用ログ出力の設定
fmiStatus fmiSetDebugLogging(fmiComponent c, fmiBoolean loggingOn)
スレーブツールに入力データを渡す。
• fmiStatus fmiSetReal(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiReal value[])
• fmiStatus fmiSetInteger(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiInteger value[])
• fmiStatus fmiSetBoolean(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiBoolean value[])
• fmiStatus fmiSetString(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiString value[])
スレーブツールから出力データを得る
• fmiStatus fmiGetReal(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiReal value[])
• fmiStatus fmiGetInteger(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiInteger value[])
• fmiStatus fmiGetBoolean(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiBoolean value[])
• fmiStatus fmiGetString(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiString value[])
FMI 1.0 FMI for Model Exchange と共通の関数
FMUのダイナミックリンクライブラリに実装される関数
1. FMI-1.0 FMI for Co-Simulation の概要
15
ヘッダファイル fmiPlatformTypes.h の変数 fmiPlatform の文字列ポインタ("starndard32")を返す。
• const char* fmiGetTypesPlatform()
スレーブツールのインスタンス生成、初期化
• fmiComponent fmiInstantiateSlave(fmiString instanceName, fmiString GUID, fmiString fmuLocation,
fmiString mimeType, fmiReal timeout, fmiBoolean visible, fmiBoolean interactive,
fmiCallbackFunctions functions, fmiBoolean loggingOn)
• fmiStatus fmiInitializeSlave(fmiComponent c, fmiReal tStart, fmiBoolean StopTimeDefined, fmiReal tStop)
コミュニケーションステップのシミュレーションの実行
• fmiStatus fmiDoStep(fmiComponent c, fmiReal currentCommunicationPoint, fmiReal communicationStepSize,
fmiBoolean newStep)
スレーブツールの終了、リセット、メモリー解放
• fmiStatus fmiTerminateSlave(fmiComponent c)
• fmiStatus fmiResetSlave(fmiComponent c)
• void fmiFreeSlaveInstance(fmiComponent c)
FMI 1.0 FMI for Co-Simulationのみの関数(1) – 基本的機能に関するもの
コミュニケーションポイント
コミュニケーションステップサイズ
FMU SDKの場合、関数 fmiDoStep に、コミュニケーションステップサイズの1/10の
タイムステップでEuler法の数値積分を行うソルバーが組み込まれるようになっている。
1. FMI-1.0 FMI for Co-Simulation の概要
1-4 FMUの中身は? FMUのダイナミックリンクライブラリに実装される関数
16
入出力変数補間のため、入出力変数の時間微分を得る。
• fmiStatus fmiSetRealInputDerivatives(fmiComponent c, const fmiValueReference vr[], size_t nvr,
const fmiInteger order[], const fmiReal value[])
• fmiStatus fmiGetRealOutputDerivatives(fmiComponent c, const fmiValueReference vr[], size_t nvr,
const fmiInteger order[], fmiReal value[])
コミュニケーションステップのシミュレーションを非同期実行したときの処理
• fmiStatus fmiGetStatus(fmiComponent c, const fmiStatusKind s, fmiStatus* value) スレーブの状態を調べる
• fmiStatus fmiCancelStep(fmiComponent c) コミュニケーションステップのシミュレーションを中断(キャンセル)する。
コミュニケーションステップの途中までしかシミュレーションが成功しなかったときの処理。スレーブの状態を調べる
• fmiStatus fmiGetRealStatus(fmiComponent c, const fmiStatusKind s, fmiReal* value)
• fmiStatus fmiGetIntegerStatus(fmiComponent c, const fmiStatusKind s, fmiInteger* value)
• fmiStatus fmiGetBooleanStatus(fmiComponent c, const fmiStatusKind s, fmiBoolean* value)
• fmiStatus fmiGetStringStatus(fmiComponent c, const fmiStatusKind s, fmiString* value)
FMI 1.0 FMI for Co-Simulationのみの関数(2) – オプション的機能に関するもの
1. FMI-1.0 FMI for Co-Simulation の概要
1-4 FMUの中身は? FMUのダイナミックリンクライブラリに実装される関数
スレーブツールの状態遷移と
マスターツールからコールされる関数
17
インスタンス化終了
初期化終了
コミュニケーションステップ計算中
コミュニケーションステップ
の途中までしか成功しない
コミュニケーションステップ失敗
コミュニケーションステップ成功
致命的エラー
エラー
終了状態 メモリ解放
(仕様書 P.31)
関数が細かい文字で見えない
と思うけど。。。
1. FMI-1.0 FMI for Co-Simulation の概要
2. FMUを作って使ってみる。 18
2. FMUを作って使ってみる
2. FMUを作って使ってみる
19
オープンソースツールのFMIサポート状況( https://www.fmi-standard.org/tools より抜粋)
JModelicaの
一部でもある
2. FMUを作って使ってみる。
2. FMUを作って使ってみる
• 2-1 OpenModelica でサブシステムモデルをつくる。
• 2-2 JModelica.org でサブシステムモデルのFMUをつくる。
• 2-3 JModelica.orgでFMUを読み込む。
• 2-4 OpenModelica でFMUを読み込む。
• 2-5 Scilab/Xcos FMU wrapper でFMUを読み込む。
20
跳ね返るボール( Bouncing Ball )
Modelica by Example
Discrete Behavior > Bouncing Ball
http://book.xogeny.com/behavior/discrete/bouncing/
をモデルの参考にして、e を入力変数とし、出力変数 y = h を追加したもの。
対象とするサブシステムモデル
2. FMUを作って使ってみる
2-1 OpenModelicaでサブシステムモデルをつくる
21
①ファイル>Modelicaクラス新規作成
②FMITestを右クリック>Modelicaクラス新規作成
名前: FMITest
クラス・タイプ: Package
名前: BouncingBall
クラス・タイプ: Model
挿入するクラス:
FMITest
③ライブラリブラウザで、BouncingBallを選択し、
ダイアグラムビューに切り替える。
④ライブラリ>Modelica>
>Blocks>Interfaces を展開し
RealInputとRealOutput
をドラッグアンドドロップ
する。
ダイアグラムビュー
( https://openmodelica.org/download/download-windows )
OpenModelica 1.9.6 Windows版を使用する。
2. FMUを作って使ってみる
2-1 OpenModelicaでサブシステムモデルをつくる
22
⑤テキストビューに切り替えて、ソースコードを編集する。
変更部分
追加するコード
⑥編集が終わったら
[モデルチェック]
をクリックする。
annotationが邪魔なときは、
ツール>オプション
>Modelicaテキストエディタ
で「行の折り返しを使用」
のチェックをはずすと目ただ
なくなる。
入力変数 𝑒
出力変数 𝑦
𝑣 =
𝑑ℎ
𝑑𝑡
𝑑𝑣
𝑑𝑡
= −𝑔
𝑦 = ℎ	
ℎ < 0 なら 𝑣 = −𝑒 ∗ 𝑣	
に初期化しなおす。
初期値
変数 ℎ:高さ、𝑣:速度 パラメータ
𝑔 : 重力加速度
ℎ,: 高さの初期値
2. FMUを作って使ってみる
2-1 OpenModelicaでサブシステムモデルをつくる
23
⑦アイコンビューに切り替えてアイコンを作成する。
線 楕円
⑧終わったら保存する。
サブシステムモ
デル作成は
終了!
次は動作テスト
を行う。
2. FMUを作って使ってみる
2-1 OpenModelicaでサブシステムモデルをつくる
24
①シミュレーション>シミュレーションのセットアップ
開始時刻: 0
終了時刻: 3
チェックする。(モデルの中に開始時間や終了時間に関する情報を入れる)
テスト1:入出力なしのサブシステムモデル単体でのシミュレーション e=0.8で一定
2. FMUを作って使ってみる
③ h または y
をチェックして
プロットする。
②シミュレーション実行
2-1 OpenModelicaでサブシステムモデルをつくる
25
① FMITest右クリック>Modelicaクラス新規作成
名前: BouncingBallTest
クラス・タイプ: Model
• BouncingBall
• Modelica.Block.Sources.Step
• Modelica.Block.Interaction.Show.RealValue
で新しいモデルを作成し、以下のモデルを
ライブラリブラウザからドラッグして配置し接続
する。
height: -0.3
offset: 1.0
startTime: 1
テスト2:入出力がある場合のサブシステムモデル
のシミュレーション
②右クリックして
パラメータを選択する。
e を変化させる
設定
2. FMUを作って使ってみる
2-1 OpenModelicaでサブシステムモデルをつくる
26
③シミュレーション>シミュレーションのセットアップ
開始時刻: 0
終了時刻: 3
1秒までは e=1、その後 e= 0.7
テスト2:入出力がある場合のサブシステムモデルのシミュレーション
⑤入力変数 e
出力変数 y
をチェックする
⑥最後に保存する。
FMITest.mo
2. FMUを作って使ってみる
④シミュレーションの実行
2-2 JModelica.org でCo-Simulation用のFMUをつくる
27
OpenModelica には、FMI 1.0 for Co-Simulation の仕様のFMUを生成する機能が無いので
JModelica.org を使用して作成する。
from pymodelica import compile_fmu
model_name = 'FMITest.BouncingBall
mo_file = 'FMITest.mo'
my_fmu = compile_fmu(model_name, mo_file, target='cs')
( http://www.jmodelica.org/ )
JModelica.org 1.17 windows版を使用する。
① スタートメニューの JModelica.org-1.17の中の
IPython か Pythonのコンソールを起動する。
② OpnemModelicaで保存したファイルのある
ディレクトリをカレントディレクトリにして
以下を入力する。
from pyfmi import load_fmu
myModel = load_fmu('FMITest_BouncingBall.fmu')
myModel.simulate()
FMITest_BouncingBall.fmu が生成される。
③ 以下を入力し、単体のシミュレーションを行う。
JModelica環境の IPython コンソール
Co-Simulation⽤
FMU
作成
単体のシミュレーション
2. FMUを作って使ってみる
2-2 JModelica.org でCo-Simulation用のFMUをつくる
28
④スタートメニューのJModelica-1.17
の中の plot-GUI を起動する。
⑤File>Openで
FMITest_BoucingBall_result.txt
を選択する。
⑥ツリーを展開し、
h または y をチェックして
プロットする。
テスト1:入出力がない単体の
シミュレーション
JModelica.orgのplot-GUIで
結果を表示する。
2. FMUを作って使ってみる
2-3 JModelica.org でFMUを読み込む
29
テスト2:入出力がある場合のシミュレーション
JModelica.org では GUI によるシステム
モデルの構築はできないので次のスライドに
示すPythonスクリプト
bouncingBallTest.py
を実行することによって
入出力がある場合のテストを行う。
⑦ JModelica.org-1.17のIPython
コンソールで以下を実行する。
run "bouncingBallTest.py"
図化に Matplotlib を使用した。
(http://matplotlib.org/ )
2. FMUを作って使ってみる
30
boundingBallTest.py
# -*- coding: utf-8 -*-
"""
Created on Tue May 10 01:18:52 2016
@author: finback
"""
import pylab as P
import pyfmi
def stepf(t):
startTime = 1.0
if t < startTime:
return 1.0
else:
return 0.7
model = pyfmi.load_fmu("FMITest_BouncingBall.fmu")
t_start = 0.0
t_end = 3.0
dt = (t_end-t_start)/500
t_res = []
e_res = []
y_res = []
t = t_start
e = stepf(t)
model.set("e",e)
model.initialize()
y = model.get("y")
t_res.append(t)
e_res.append(e)
y_res.append(y[0])
while t < t_end :
status = model.do_step(t,dt)
if status == pyfmi.fmi.FMI_OK:
y = model.get("y")
e_res.append(e)
y_res.append(y[0])
t += dt
t_res.append(t)
e = stepf(t)
model.set("e",e)
else:
print "error"
break
P.plot(t_res,y_res)
P.plot(t_res,e_res)
P.xlim(t_start,t_end)
P.ylim(-0.1,1.1)
P.show()
入力変数の変化を
表す関数
モデルの
インスタンス化
入力変数の初期設定と
モデルの初期化
コミュニケーション
ステップサイズ計算
初期化された
出力変数取得
コミュニケーション
ステップの実行
図化処理
次のコミュニケーション
ステップの計算
出力変数取得
入力変数の計算と
設定
結果用配列
2. FMUを作って使ってみる
2-4 OpenModelicaでFMUを読み込む
31
①FMI(M)>FMU読込み
JModelica で作成したFMUを
OpenModelica で読んでみる。
FMIファイル : FMITest_BouncingBall.fmu
ツリーを展開すると
FMIのインターフェース関数に相当する
関数が表示される。
2. FMUを作って使ってみる
2-4 OpenModelicaでFMUを読み込む
32
テスト1:入出力のない単体の
シミュレーション
開始時刻:0
終了時刻:3
e とy
をチェック
②シミュレーション
>シミュレーションのセットアップ
2. FMUを作って使ってみる
2.4 OpenModelicaでFMUを読み込む
33
テスト2:入出力のある場合の
シミュレーション
③新しいモデル
BouncingBallCSTest
を作成し、以下をライブラリから
ドラッグ・アンド・ドロップし、
接続する。
• FMITest_BouncingBall_cs_st_FMU
• Modelica.Block.Sources.Step
• Modelica.Block.Interaction.Show.RealValue
height: -0.3
offset: 1.0
startTime: 1
2. FMUを作って使ってみる
2-4 OpenModelicaでFMUを読み込む
34
入力変数 e をステップ的に
変化させたのに、
出力変数 y の計算結果に反映
されない!!
ログファイルを見ると、
入力変数をセットする関数
fmiSetReal がコールされて
いないようである。
④シミュレーション
>シミュレーションのセットアップ
開始時刻:0
終了時刻:3
でシミュレーションを実行する。
OpenModelica FORUM
でも報告されている。
https://www.openmodelica.org/forum/default-topic/1639-data-exchange-between-fmu-model-and-openmodelica-block
単体テストと同じ結果にしかならない!!!
2. FMUを作って使ってみる
2-5 Scilab/Xcos FMU wrapperでFMUを読み込む
35
JModelica.org で作成した
FMITest_BouncingBall.fmu
をコピーして次のようにリネームする。
FMITest_BouncingBall.zip
解凍して中身を確認する。
Windows用32bitのダイナミック
ライブラリが生成されている。
Scilab/Xcos もWindows 32bit版を使用する。
ソースファイル
ダイナミックリンク
ライブラリ
XMLファイル
2. FMUを作って使ってみる
Scilab には ATOMS というモジュール管理システムがあり、atomsInstall というコマンドでインストールする。
atomsInstall で FMU wrapper をインストールするには、少し問題があり手直しが必要である。
次スライドの手順でインストールする。
2-5 Scilab/Xcos FMU wrapperでFMUを読み込む
36
① fmu-wrapper-0.6.zip を解凍する。
② ファイル DESCRIPTION の次の行( 30行目)以降で、
1桁目から始まっている全ての行の1桁目にスペースを
挿入する。
③ etc¥fmu_wrapper.start の77行目の pwd() を root_tlbx
に変更する
④ 再び zip で fmu-wrapper-0.6.zip を圧縮する。
atomsInstall('fmu-wrapper-0.6.zip')
スペース
⑤ Scilab を起動し、ファイルブラウザを
fmu-wrapper-0.6.zip のあるディレクトリに
移動して以下を実行する。
⑥ ファイルブラウザを
%userprofile%¥Roaming¥Scilab¥scilab-5.5.2
¥atoms¥fmu_wrapper¥0.6に移動して以下を実行する。
exec builder.sce
Scilab/Xcos FMU wrapper ( https://forge.scilab.org/index.php/p/fmu-wrapper/ )
のインストールに関するワークアラウンド
⑦ Scilabを再起動する。
https://forge.scilab.org/index.php/p/fmu-wrapper/issues/1462/
に情報あり。
Scilabのインストール先を変えた場合は、
Scilabのインストール先¥contrib¥fmu_wrapper¥0.6
2. FMUを作って使ってみる
2-5 Scilab/Xcos FMU wrapperでFMUを読み込む
37
Scilab によるスタンドアロンタイプのFMUの単体のシミュレーション
はサポートされていない。
https://forge.scilab.org/index.php/p/fmu-wrapper/issues/1548/
Scilab コンソール
エラー
Xcosによるテストのみを行う。
2. FMUを作って使ってみる
2-5 Scilab/Xcos FMU wrapperでFMUを読み込む
38
信号源> CLOCK_c
ドラッグ・アンド・ドロップ
右クリックして
ブロックパラメータを選択し
FMITest_BouncingBall.fmu
を設定する。
① モデルの作成
テスト1: 入力変数が一定の場合
FMInterface
信号源> const
信号の配線
> MUX
出力/表示> CSCOPE
2. FMUを作って使ってみる
2-5 Scilab/Xcos FMU wrapperでFMUを読み込む
39
② シミュレーション>設定 ③ 開始
テスト1: 入力変数が一定の場合
2. FMUを作って使ってみる
2-5 Scilab/Xcos FMU wrapperでFMUを読み込む
40
テスト2: 入力変数が変化する場合
信号源
>STEP_FUNCTION
入力信号をステップ関数に変えて実行する。
2. FMUを作って使ってみる
各ツールのFMI 1.0 FMI for Co-Simulation の対応状況のまとめ
41
ツール モデル作成環境 ソルバー
FMU SDK ○ C⾔語 Euler法
OpenModelica ×
OpenModelica+ JModelica.org ○ Modelica⾔語 Euler法, cvode
Scilab/Xcos + Xcos FMU wrapper ○ Xcosブロック線図
FMI 1.0 FMI for Co-Simulation の FMUの作成 スレーブツール
ツール モデル作成環境 備考
FMU SDK △ ⼊⼒変数なし
OpenModelica △ Modelica⾔語 ⼊⼒変数なし
JModelica.org (PyFMI) ○ Pythonスクリプト
Scilab/Xcos + Xcos FMU wrapper ○ Xcosブロック線図 Euler法
FMI 1.0 FMI for Co-Simulation の FMUの読み込み マスターツール
未検証
2. FMUを作って使ってみる
3. Tool CouplingタイプのFMUを試作する 42
3.Tool Coupling タイプのFMUを試作する
3.Tool Coupling タイプのFMUを試作する
43
マスターツール(Xcos, PyFMIなど)
マスター
ツールの
モデル
FMU
FMU
サーバー
スレーブ
ツールの
モデルTCP/IP
ソケット
通信
FMU SDKを改造して
通信機能を持たせる。
PythonのThreadingTCPServer
を使用して作成する。
OpenFOAMなど
のモデル
Windows, Linux, Mac, …
スレーブツール
PyFOAM
シェルスクリプト
など
Windows, Linux, Mac,…
構想中のシステム
3. Tool CouplingタイプのFMUを試作する
FMU SDK, JModelica.org, Xcosで作成できるのは StandAlone タイプのFMUである。
ここでは、FMU SDKを改造して Tool CouplingタイプのFMUを試作する。
今回はこの範囲まで作成する。
Windows版のみ
3.Tool Coupling タイプのFMUを試作する
• 3-1 作成したもの
• 3-2 FMUジェネレータによる FMU の作成
• 3-3 Xcos による Co-Simulation モデルの作成
• 3-3 FMUサーバーのスレーブツール実行部分の編集
• 3-4 Co-Simulation の実行
3. Tool CouplingタイプのFMUを試作する 44
45
3-1 作成したもの
FMUジェネレータ(Python)
• FMUのソースコード(可変部、モデル固有の
情報を含む)を出力する。
• XMLファイルを生成する。
• バッチファイルを使用してコンパイルし、ZIP
化を行う。
FMUのソースコード(不変部)(C言語)
• FMUサーバーと通信を行うクライアント。
• FMU SDKのCo-Simulation用のソースコード
を改造し通信機能を持たせる。
FMUサーバ (Python)
• FMU本体の要求によってスレーブツールをコ
ントロールするサーバ。
• Pythonの標準ライブラリを使用し、マルチプ
ラットフォームを目指す。
3. Tool CouplingタイプのFMUを試作する
fmuchick (https://github.com/finback-at/fmuchick )
FMUジェネレータ
fmuchick.py
FMUのソースコード
FMUサーバー
fmuserver.py
テスト用データ
開発およびテスト環境
• Windows 10
• Visual Studio 2012
• Python 2.7.11 (32bit)
• wxPython 3.0
3. Tool CouplingタイプのFMUを試作する 46
① ディレクトリgenerator
でコマンドプロンプトから
python fmuchick.py
を実行する。
② モデルデータを入力する。
• モデル情報
• 入力変数
• 出力変数
• FMU名
• GUID
• サーバのIPアドレス
• サーバのポート番号
③ [Generate FMU]ボタンを
クリックする。
3-2 FMUジェネレータ
による FMU の作成
④ FMU が生成される。 FMUジェネレータ
ボタンを押すとFMUができる。
入力変数
input1: 0.0
input2: 1.0
出力変数
output1: 0.1
output2: 0.2
スレーブツールの実行に
必要なモデル情報など任意の情報
• Mode Name: TestModel
• Description: Simple Test Model
クリックするとModel Nameの値
がコピーされる。
クリックするとGUIDが生成される。
FMUサーバーを実行するマシンの
• IPアドレス
• 使用するポート番号
Start Time: 0 s
Stop Time: 10 s
Tolerance: 1.0e-4
473. Tool CouplingタイプのFMUを試作する
作成したFMUを読み込んだブロック
入力変数
出力変数
時間(コミュニケーションポイント)
の入力端子
3-2 XcosによるCo-Simulation モデルの作成
48
上記をカスタマイズすることで様々なスレーブツールに対応することが可能。
スレーブツールを起動して初期化する。
入力変数 inputValue[] を使って、
時刻 t から t+dt のシミュレーションを行い、
結果を出力変数 outputValue[] にセットする。
シミュレーションを中止する。
abort, kill, …
itemValue[], inputValue[], outputValue[]
が使用できる。
3. Tool CouplingタイプのFMUを試作する
def toolInitialize(self):
for i in range(0,self.nitem):
print self.itemName[i]+": "+self.itemValue[i]
for i in range(0,self.ninput):
print self.inputName[i]+" = "+str(self.itemValue[i])
for i in range(0,self.noutput):
print self.outputName[i]+" = "+str(self.outputValue[i])
def toolDoStep(self):
print "t = "+str(self.ctime) + " dt = "+str(self.cstep)
for i in range(0,self.ninput):
print self.inputName[i]+" = "+str(self.inputValue[i])
for i in range(0, self.noutput):
if self.ctime <= 1e-6:
self.outputValue[i] = self.inputValue[i]
else:
self.outputValue[i] += self.inputValue[i] * self.cstep
print self.outputName[i]+" = "+str(self.outputValue[i])
def toolTerminate(self):
print "Terminate tool!"
スレーブツールとして外部プログラム
を実行する代わりに入力信号をEuler法
で数値積分するコードを記述した。
3-3 FMUサーバー (server/fmuserver.py) のスレーブツール実行部分の編集
3-4 Co-Simulationの実行
3. Tool CouplingタイプのFMUを試作する 49
① ディレクトリ server で
コマンドラインから、
python fmuserver.py
を実行する
② Xcos を実行する。
シミュレーションが終了したら、
Ctrl-C でサーバーを止める。
3. Tool CouplingタイプのFMUを試作する 50
入力信号 出力信号(ダミーソルバーによる入力信号の積分)
Co-Simulationのテスト結果
まとめ
3. Tool CouplingタイプのFMUを試作する 51
• Tool Coupling タイプのFMUを試作した。
• XcosでCo-Simulationテストモデルを作成した。
• スレーブツールとして入力信号をEuler法で積分するコードをFMU
サーバに実装した。
• Co-Simulationテストモデルが正常に実行できることが確認できた。

More Related Content

PDF
FMI-Ver 1.0 FMI for Model Exchange のモデルについて
PDF
OpenFOAM+のCo-simulation機能とFMUの試作
PDF
OpenFOAM -回転領域を含む流体計算 (Rotating Geometry)-
PPTX
OpenModelica tutorials_1(超初級チュートリアル1 解析モデルの作成と実行)
PDF
Linux : PSCI
PPTX
OpenModelica tutorials_6 Tips(超初級チュートリアル6.便利技 Tableモデルの使い方)
PPTX
OpenModelica tutorials_2 coding (超初級チュートリアル 2.コーディング)
PDF
Turbulence Models in OpenFOAM
FMI-Ver 1.0 FMI for Model Exchange のモデルについて
OpenFOAM+のCo-simulation機能とFMUの試作
OpenFOAM -回転領域を含む流体計算 (Rotating Geometry)-
OpenModelica tutorials_1(超初級チュートリアル1 解析モデルの作成と実行)
Linux : PSCI
OpenModelica tutorials_6 Tips(超初級チュートリアル6.便利技 Tableモデルの使い方)
OpenModelica tutorials_2 coding (超初級チュートリアル 2.コーディング)
Turbulence Models in OpenFOAM

What's hot (20)

PPTX
イベント駆動プログラミングとI/O多重化
PDF
組み込みLinuxでのGolangのススメ(Go con版)
PPTX
ParaViewでCSVの点群を表示する
PDF
Free cad 0.19.2 and cfdof (Japanese Ver.)
PDF
OpenModelica tutorials_7-5 Stream variable(超初級チュートリアル7-5.番外編 Stream変数)
PDF
OpenFOAMソルバの実行時ベイズ最適化
PDF
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
PPTX
OpenFOAMにおける相変化解析
PDF
OpenFOAM の Function Object 機能について
PDF
オープンソースによるモデルベースデザイン(OpenModelica)
PDF
Strutsから移行する人のためのjsf基礎
PDF
CFD for Rotating Machinery using OpenFOAM
PDF
OpenFOAM の境界条件をまとめよう!
PDF
Managing data workflows with Luigi
PDF
流体解析入門者向け超初級講習会@関東 修正版
PDF
OpenModelica tutorials_7 PlantModel(超初級チュートリアル7.プラントモデル)
PPTX
モデル検査入門 #wacate
PDF
OpenFOAM LES乱流モデルカスタマイズ
PDF
Dockerのディスクについて ~ファイルシステム・マウント方法など~
PDF
Boundary Conditions in OpenFOAM
イベント駆動プログラミングとI/O多重化
組み込みLinuxでのGolangのススメ(Go con版)
ParaViewでCSVの点群を表示する
Free cad 0.19.2 and cfdof (Japanese Ver.)
OpenModelica tutorials_7-5 Stream variable(超初級チュートリアル7-5.番外編 Stream変数)
OpenFOAMソルバの実行時ベイズ最適化
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
OpenFOAMにおける相変化解析
OpenFOAM の Function Object 機能について
オープンソースによるモデルベースデザイン(OpenModelica)
Strutsから移行する人のためのjsf基礎
CFD for Rotating Machinery using OpenFOAM
OpenFOAM の境界条件をまとめよう!
Managing data workflows with Luigi
流体解析入門者向け超初級講習会@関東 修正版
OpenModelica tutorials_7 PlantModel(超初級チュートリアル7.プラントモデル)
モデル検査入門 #wacate
OpenFOAM LES乱流モデルカスタマイズ
Dockerのディスクについて ~ファイルシステム・マウント方法など~
Boundary Conditions in OpenFOAM
Ad

Similar to FMI1.0 FMI for Co-Simulation について (20)

PDF
20130329 rtm2
PDF
OCamlのトップレベルあれそれ
PDF
CheckMATE introduction
PPTX
TotalViewを使った代表的なバグに対するアプローチ
PDF
Cuda fortranの利便性を高めるfortran言語の機能
PDF
CMSI計算科学技術特論A (2015) 第5回 プログラム高速化の応用
PDF
OpenFOAM Case Handling in dakota-6.8 gui
PDF
スーパーコンピューターとクラウドでのOpenFOAM性能・費用ベンチマークテスト
PDF
160428 東工大「ロボット技術」授業資料
PPTX
運用構築技術者の為のPSプログラミング第1回
PDF
05 tm1 batch
PDF
テスト自動化のこれまでとこれから
PDF
OpenRTM-aist入門
PPTX
T93 com入門
PPTX
JAWS-UG HPC #2 LT 並列処理・MPIの第一歩
PDF
RTミドルウエア講習会2015
PDF
やさしく知りたいC言語
PPT
Php unit extensions_selenium2_testcaseによる結合試験でらくらくテスト♪
PDF
Replace Output Iterator and Extend Range JP
PPTX
PHPとシグナル、その裏側
20130329 rtm2
OCamlのトップレベルあれそれ
CheckMATE introduction
TotalViewを使った代表的なバグに対するアプローチ
Cuda fortranの利便性を高めるfortran言語の機能
CMSI計算科学技術特論A (2015) 第5回 プログラム高速化の応用
OpenFOAM Case Handling in dakota-6.8 gui
スーパーコンピューターとクラウドでのOpenFOAM性能・費用ベンチマークテスト
160428 東工大「ロボット技術」授業資料
運用構築技術者の為のPSプログラミング第1回
05 tm1 batch
テスト自動化のこれまでとこれから
OpenRTM-aist入門
T93 com入門
JAWS-UG HPC #2 LT 並列処理・MPIの第一歩
RTミドルウエア講習会2015
やさしく知りたいC言語
Php unit extensions_selenium2_testcaseによる結合試験でらくらくテスト♪
Replace Output Iterator and Extend Range JP
PHPとシグナル、その裏側
Ad

FMI1.0 FMI for Co-Simulation について

  • 1. FMI1.0 FMI for Co-Simulationについて 1. FMI for Co-Simulationの概要 2. FMUを作って使ってみる 3. Tool CouplingタイプのFMUを試作する。 第57回オープンCAE勉強会@関東(流体など) finback 2016/08/05 改訂
  • 2. 1. FMI-1.0 FMI for Co-Simulation の概要 2 1. FMI for Co-Simulationの概要
  • 3. 1. FMI-1.0 FMI for Co-Simulation の概要 3 https://www.fmi-standard.org/tools (の一部) 様々なダイナミックシステムのシミュレーションツール間で Co-Simulation を実行するための規格である。 (Functional Mock-up Interface) https://www.fmi-standard.org/start OpenModelica, JModelica, PyFMI, Scilab/Xcos FMU wrapper, FMUSDK, EnergyPlus など オープンソース系ツールも多い。 サポートしている機能 1. FMI-1.0 FMI for Co-Simulation の概要
  • 4. 1. FMI-1.0 FMI for Co-Simulation の概要 4 FMI 1.0 FMI for Model Exchange 2010-07-26 MODELISAR FMI 1.0 FMI for Co-Simulation 2010-10-12 MODELISAR FMI 2.0 FMI for Model Exchange & Co-Simulation 2014-07-25 Modelica Association https://www.fmi-standard.org/downloads仕様書 1-1 どんなモデルのCo-Simulationができるのか? 1-2 どのようなツールならCo-Simulationができるのか? 1-3 ソフトウェアの構成は? 1-4 FMUの中身は? • XMLファイル • ダイナミックリンクライブラリに実装される関数 1. FMI-1.0 FMI for Co-Simulation の概要
  • 5. 1-1 どんなモデルのCo-Simulationができるのか? 5 次のようなサブシステムが連成するモデルのシミュレーションを行う。 互いに異なる シミュレーションツールの ソルバーが 時間前進的(time increasing) なシミュレーンを行う。 サブシステムモデル(Subsystem Models) 入力 𝒖 𝑡 と出力 𝒚 𝑡 で他のサブシステムモデル と接続され、 シミュレーション中に 中間的な計算値が の交換がなされる。 独立なタイムステップ ℎ% = 𝑡%'( − 𝑡% 連成システムモデル(Coupled System Model) 計算値の交換を行うのは コミュニケーションポイント 𝑡𝐶%と 呼ばれる離散的時刻に限定される。 𝑡 = 𝑡𝐶,, 𝑡𝐶(, ⋯ , 𝑡𝐶%, ⋯ , 𝑡𝐶/ コミュニケーションステップ ℎ𝐶% = 𝑡𝐶%'( − 𝑡𝐶% コミュニケーションステップℎ𝐶% と 各サブシステムのソルバーの ℎ% は 互いに独立にとれる。 (仕様書 P.11より) 1. FMI-1.0 FMI for Co-Simulation の概要 対象となるモデルの概要
  • 6. 1-2 どのようなツールならCo-Simulationができるのか? 6 基本的機能 • 𝑡01231 < 𝑡𝐶% < 𝑡567 となる任意の時間値 (コミュニケーションポイント)𝑡𝐶% を受け取ることができる。 • 計算時間が 𝑡𝐶% になるとシミュレーションを中断する(一時的に止める)ことができる。 • 中断している間に、入力変数 u(tC<) を受信し、出力変数 𝒚(𝑡𝐶%) を送信することができる。 • 中断している間に、次のコミュニケーションポイント tC<'( を受け取ることができる。 時間依存変数 𝑣 𝑡 の 𝑡01231 < 𝑡 < 𝑡567 の時間前進的 (time increasing) なシミュレーションを 行うツールが次のような機能をもつとき連成(coupling)ができる。 オプション的機能(必ずしも必要ではない) • ℎ𝐶% > 0 を可変にできる。 • ℎ𝐶% = 0 にできる。(イベントループのイタレーションができる) • [𝑡𝐶%, 𝑡𝐶%'(] で入力変数 u(tC<) を補間できる。( u̇ tC< , ü tC< , ⋯ を使用する) • [𝑡𝐶%, 𝑡𝐶%'(] のシミュレーションを非同期的に実行することができる。 ℎ𝐶% = 𝑡𝐶%'( − 𝑡𝐶% ≥ 0 : コミュニケーションステップ 1. FMI-1.0 FMI for Co-Simulation の概要 サブシステムのシミュレーションツール(スレーブツール)の機能的条件 サブシステムモデルは 常微分方程式や 微分代数方程式 で表されるモデルで 無くてもいい。
  • 7. 1-3 ソフトウェアの構成は? 7 マスターツール (Master Tool) FMUを読み込んで サブシステム間の計算値の交換や 同期、Co-Simulationの進行など を担当する。 スレーブツール(Slave Tool) サブシステムのシミュレーション を実行する。 FMUを生成する機能をもつ FMU(Functional Mock-up Unit) for Co-Simulation 以下を含む zip ファイル(拡張子fmu) • サブシステムモデルやソルバーに関する情報が記述されたXMLファイル • マスターとスレーブのインターフェース関数を含むダイナミックリンクライブラリ • Cで記述されたソースコード(必須ではない) (仕様書 p.17) 1. FMI-1.0 FMI for Co-Simulation の概要
  • 8. Co-Simulationの実例 8 FMI for Co-SimulationのFMUを読み込んだブロック スレーブツールのソルバーで動く。 FMI for Model ExchangeのFMUを読み込んだブロック マスターツールのソルバーで動く。 マスターツール(Xcos)で つくった スーパーブロックモデル Scilab/Xcos FMU wrapper のデモ PID controller FMU Generated by Xcos マスターツールもモデルを 作成する機能がある場合、 マスターツールのモデルと スレーブツールのモデルが 協調的に動作する。 いろんな方法で作った PID制御器のモデル 制御対象のモデル https://forge.scilab.org/index.php/p/fmu-wrapper/ マスター ツールの ブロック 1. FMI-1.0 FMI for Co-Simulation の概要 注意!! このデモを実行する ためには、FMUを 読み込み直す必要がある。
  • 9. 1-3 ソフトウェアの構成は? 9 初期化 (initialization sub-phase) • スレーブツールに関する情報を得る • サブシステムの接続関係を解析する • マスターアルゴリズムを選択する シミュレーション (simulation sub-phase) • コミュニケーションステップ hC< = tC<'( − tC< を計算する。 • サブシステムの入力値 u tC< , (u̇ tC< , ü tC< , ⋯ )を計算する。 • スレーブツールに tC<, tC<'(, u tC< , (u̇ tC< , ü tC< , ⋯) を送信する。 • スレーブツールに [tC<, tC<'(] のシミュレーションを実行させる。 • 正常に計算が終了したら、出力値 y tC<'( , (ẏ tC<'( , ÿ tC<'( , ⋯ ) を受信する。 • 正常に計算が終了しない場合、オプションに応じて他の情報を送受信する。 マスターアルゴリズムは FMI 1.0 for Co-Simulation の仕様には含まれていない。 終了処理 (shutdown sub-phase) • シミュレーションを完全に終了する。 1. FMI-1.0 FMI for Co-Simulation の概要 マスターツールの役割
  • 10. 1-3 ソフトウェアの構成は? 10 マスターツールのソルバー スレーブツールのソルバー FMU マスターツールのソルバー マスターツールのソルバー スレーブツールのソルバー スレーブツールのソルバー Cosimulation_StandAlone (Code Generation) FMUのダイナミックリンクライブラリに スレーブツールのソルバーが含まれる Cosimulation_Tool (Tool Coupling) FMUのライブラリにはスレーブツールと通信する ラッパーツールが含まれる。 一台のコンピュータ でマスターツールと スレーブツールが 異なるプロセスで動作する 場合。 複数のコンピュータ でマスターツール とスレーブツールが 動作する場合。 FMU FMU ネットワーク通信 スレーブツールのソルバーがどこにあるか! (仕様書 P.13) (仕様書 P.14) (仕様書 P.14) 1. FMI-1.0 FMI for Co-Simulation の概要 FMUの実装の種類
  • 11. 1-4 FMUの中身は? 1. FMI-1.0 FMI for Co-Simulation の概要 11 FMU(Functional Mock-up Unit) for Co-Simulation 以下を含む zip ファイル(拡張子fmu) • サブシステムモデルやソルバーに関する情報が記述されたXMLファイル • マスターとスレーブのインターフェース関数を含むダイナミックリンクライブラリ • Cで記述されたソースコード(必須ではない) modelDescriptin.xml XMLファイル ダイナミックリンクライブラリ Cで記述されたソースコード FMUSDKで作成した bouncingBall.fmu の内容
  • 12. 1-4 FMUの中身は? 12 FMI for Model Exchange と比べて FMI for Co-Simulation ではFMUの実装の種類に関する情報が追加されている。 Capabilitiesはスレーブツールの オプション的機能の有無について記述する。 • canHandleVariableCommunicationStepSize • canHandleEvents • canRejectsSteps • canInterpolateInputs • maxOutputDerivativeOrder • canRunAsynchronously • canSignalEvents • canBeInstantiatedOnlyOncePerProces • canNotUseMemoryManagementFunctions スレーブツールのソルバーを ダイナミックリンクライブラリに含む スレーブツールと通信するラッパーを含む XMLファイル modelDescription.xml の内容 ℎ𝐶% 可変ℎ𝐶% = 0 が可能 入力変数の 補間が可能 非同期的実行が可能 (仕様書 P.33) (仕様書 P.34) (仕様書 P.36-37) 入力変数 出力変数 パラメータ その他の変数 開始時刻 終了時刻 トレランス 1. FMI-1.0 FMI for Co-Simulation の概要
  • 13. 1-4 FMUの中身は? 13 FMU SDK ( https://www.qtronic.de/jp/fmusdk.html ) で作成したFMI 1.0 for Co-Simulation に対応したbouncingBall.fmu modelDescription.xml (eを入力変数、hを出力変数に改変したもの) モデル変数 <ModelVariables> FMUの実装の種類 <Implementation> モデル識別情報 状態変数や イベントインジケータの数 ダイナミックリンク ライブラリが スレーブソルバーを含む ℎ𝐶% 可変 ℎ𝐶% = 0 が可能 FMUの実装の種類 スレーブツールのオプション的機能 XMLファイル modelDescription.xmlの実例 出力変数 入力変数 1. FMI-1.0 FMI for Co-Simulation の概要
  • 14. 1-4 FMUの中身は? 14 FMI のバージョンを返す • const char* fmiGetVersion() デバッグ用ログ出力の設定 fmiStatus fmiSetDebugLogging(fmiComponent c, fmiBoolean loggingOn) スレーブツールに入力データを渡す。 • fmiStatus fmiSetReal(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiReal value[]) • fmiStatus fmiSetInteger(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiInteger value[]) • fmiStatus fmiSetBoolean(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiBoolean value[]) • fmiStatus fmiSetString(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiString value[]) スレーブツールから出力データを得る • fmiStatus fmiGetReal(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiReal value[]) • fmiStatus fmiGetInteger(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiInteger value[]) • fmiStatus fmiGetBoolean(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiBoolean value[]) • fmiStatus fmiGetString(fmiComponent c, const fmiValueReference vr[], size_t nvr, fmiString value[]) FMI 1.0 FMI for Model Exchange と共通の関数 FMUのダイナミックリンクライブラリに実装される関数 1. FMI-1.0 FMI for Co-Simulation の概要
  • 15. 15 ヘッダファイル fmiPlatformTypes.h の変数 fmiPlatform の文字列ポインタ("starndard32")を返す。 • const char* fmiGetTypesPlatform() スレーブツールのインスタンス生成、初期化 • fmiComponent fmiInstantiateSlave(fmiString instanceName, fmiString GUID, fmiString fmuLocation, fmiString mimeType, fmiReal timeout, fmiBoolean visible, fmiBoolean interactive, fmiCallbackFunctions functions, fmiBoolean loggingOn) • fmiStatus fmiInitializeSlave(fmiComponent c, fmiReal tStart, fmiBoolean StopTimeDefined, fmiReal tStop) コミュニケーションステップのシミュレーションの実行 • fmiStatus fmiDoStep(fmiComponent c, fmiReal currentCommunicationPoint, fmiReal communicationStepSize, fmiBoolean newStep) スレーブツールの終了、リセット、メモリー解放 • fmiStatus fmiTerminateSlave(fmiComponent c) • fmiStatus fmiResetSlave(fmiComponent c) • void fmiFreeSlaveInstance(fmiComponent c) FMI 1.0 FMI for Co-Simulationのみの関数(1) – 基本的機能に関するもの コミュニケーションポイント コミュニケーションステップサイズ FMU SDKの場合、関数 fmiDoStep に、コミュニケーションステップサイズの1/10の タイムステップでEuler法の数値積分を行うソルバーが組み込まれるようになっている。 1. FMI-1.0 FMI for Co-Simulation の概要 1-4 FMUの中身は? FMUのダイナミックリンクライブラリに実装される関数
  • 16. 16 入出力変数補間のため、入出力変数の時間微分を得る。 • fmiStatus fmiSetRealInputDerivatives(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiInteger order[], const fmiReal value[]) • fmiStatus fmiGetRealOutputDerivatives(fmiComponent c, const fmiValueReference vr[], size_t nvr, const fmiInteger order[], fmiReal value[]) コミュニケーションステップのシミュレーションを非同期実行したときの処理 • fmiStatus fmiGetStatus(fmiComponent c, const fmiStatusKind s, fmiStatus* value) スレーブの状態を調べる • fmiStatus fmiCancelStep(fmiComponent c) コミュニケーションステップのシミュレーションを中断(キャンセル)する。 コミュニケーションステップの途中までしかシミュレーションが成功しなかったときの処理。スレーブの状態を調べる • fmiStatus fmiGetRealStatus(fmiComponent c, const fmiStatusKind s, fmiReal* value) • fmiStatus fmiGetIntegerStatus(fmiComponent c, const fmiStatusKind s, fmiInteger* value) • fmiStatus fmiGetBooleanStatus(fmiComponent c, const fmiStatusKind s, fmiBoolean* value) • fmiStatus fmiGetStringStatus(fmiComponent c, const fmiStatusKind s, fmiString* value) FMI 1.0 FMI for Co-Simulationのみの関数(2) – オプション的機能に関するもの 1. FMI-1.0 FMI for Co-Simulation の概要 1-4 FMUの中身は? FMUのダイナミックリンクライブラリに実装される関数
  • 18. 2. FMUを作って使ってみる。 18 2. FMUを作って使ってみる
  • 20. 2. FMUを作って使ってみる • 2-1 OpenModelica でサブシステムモデルをつくる。 • 2-2 JModelica.org でサブシステムモデルのFMUをつくる。 • 2-3 JModelica.orgでFMUを読み込む。 • 2-4 OpenModelica でFMUを読み込む。 • 2-5 Scilab/Xcos FMU wrapper でFMUを読み込む。 20 跳ね返るボール( Bouncing Ball ) Modelica by Example Discrete Behavior > Bouncing Ball http://book.xogeny.com/behavior/discrete/bouncing/ をモデルの参考にして、e を入力変数とし、出力変数 y = h を追加したもの。 対象とするサブシステムモデル 2. FMUを作って使ってみる
  • 21. 2-1 OpenModelicaでサブシステムモデルをつくる 21 ①ファイル>Modelicaクラス新規作成 ②FMITestを右クリック>Modelicaクラス新規作成 名前: FMITest クラス・タイプ: Package 名前: BouncingBall クラス・タイプ: Model 挿入するクラス: FMITest ③ライブラリブラウザで、BouncingBallを選択し、 ダイアグラムビューに切り替える。 ④ライブラリ>Modelica> >Blocks>Interfaces を展開し RealInputとRealOutput をドラッグアンドドロップ する。 ダイアグラムビュー ( https://openmodelica.org/download/download-windows ) OpenModelica 1.9.6 Windows版を使用する。 2. FMUを作って使ってみる
  • 24. 2-1 OpenModelicaでサブシステムモデルをつくる 24 ①シミュレーション>シミュレーションのセットアップ 開始時刻: 0 終了時刻: 3 チェックする。(モデルの中に開始時間や終了時間に関する情報を入れる) テスト1:入出力なしのサブシステムモデル単体でのシミュレーション e=0.8で一定 2. FMUを作って使ってみる ③ h または y をチェックして プロットする。 ②シミュレーション実行
  • 25. 2-1 OpenModelicaでサブシステムモデルをつくる 25 ① FMITest右クリック>Modelicaクラス新規作成 名前: BouncingBallTest クラス・タイプ: Model • BouncingBall • Modelica.Block.Sources.Step • Modelica.Block.Interaction.Show.RealValue で新しいモデルを作成し、以下のモデルを ライブラリブラウザからドラッグして配置し接続 する。 height: -0.3 offset: 1.0 startTime: 1 テスト2:入出力がある場合のサブシステムモデル のシミュレーション ②右クリックして パラメータを選択する。 e を変化させる 設定 2. FMUを作って使ってみる
  • 26. 2-1 OpenModelicaでサブシステムモデルをつくる 26 ③シミュレーション>シミュレーションのセットアップ 開始時刻: 0 終了時刻: 3 1秒までは e=1、その後 e= 0.7 テスト2:入出力がある場合のサブシステムモデルのシミュレーション ⑤入力変数 e 出力変数 y をチェックする ⑥最後に保存する。 FMITest.mo 2. FMUを作って使ってみる ④シミュレーションの実行
  • 27. 2-2 JModelica.org でCo-Simulation用のFMUをつくる 27 OpenModelica には、FMI 1.0 for Co-Simulation の仕様のFMUを生成する機能が無いので JModelica.org を使用して作成する。 from pymodelica import compile_fmu model_name = 'FMITest.BouncingBall mo_file = 'FMITest.mo' my_fmu = compile_fmu(model_name, mo_file, target='cs') ( http://www.jmodelica.org/ ) JModelica.org 1.17 windows版を使用する。 ① スタートメニューの JModelica.org-1.17の中の IPython か Pythonのコンソールを起動する。 ② OpnemModelicaで保存したファイルのある ディレクトリをカレントディレクトリにして 以下を入力する。 from pyfmi import load_fmu myModel = load_fmu('FMITest_BouncingBall.fmu') myModel.simulate() FMITest_BouncingBall.fmu が生成される。 ③ 以下を入力し、単体のシミュレーションを行う。 JModelica環境の IPython コンソール Co-Simulation⽤ FMU 作成 単体のシミュレーション 2. FMUを作って使ってみる
  • 28. 2-2 JModelica.org でCo-Simulation用のFMUをつくる 28 ④スタートメニューのJModelica-1.17 の中の plot-GUI を起動する。 ⑤File>Openで FMITest_BoucingBall_result.txt を選択する。 ⑥ツリーを展開し、 h または y をチェックして プロットする。 テスト1:入出力がない単体の シミュレーション JModelica.orgのplot-GUIで 結果を表示する。 2. FMUを作って使ってみる
  • 29. 2-3 JModelica.org でFMUを読み込む 29 テスト2:入出力がある場合のシミュレーション JModelica.org では GUI によるシステム モデルの構築はできないので次のスライドに 示すPythonスクリプト bouncingBallTest.py を実行することによって 入出力がある場合のテストを行う。 ⑦ JModelica.org-1.17のIPython コンソールで以下を実行する。 run "bouncingBallTest.py" 図化に Matplotlib を使用した。 (http://matplotlib.org/ ) 2. FMUを作って使ってみる
  • 30. 30 boundingBallTest.py # -*- coding: utf-8 -*- """ Created on Tue May 10 01:18:52 2016 @author: finback """ import pylab as P import pyfmi def stepf(t): startTime = 1.0 if t < startTime: return 1.0 else: return 0.7 model = pyfmi.load_fmu("FMITest_BouncingBall.fmu") t_start = 0.0 t_end = 3.0 dt = (t_end-t_start)/500 t_res = [] e_res = [] y_res = [] t = t_start e = stepf(t) model.set("e",e) model.initialize() y = model.get("y") t_res.append(t) e_res.append(e) y_res.append(y[0]) while t < t_end : status = model.do_step(t,dt) if status == pyfmi.fmi.FMI_OK: y = model.get("y") e_res.append(e) y_res.append(y[0]) t += dt t_res.append(t) e = stepf(t) model.set("e",e) else: print "error" break P.plot(t_res,y_res) P.plot(t_res,e_res) P.xlim(t_start,t_end) P.ylim(-0.1,1.1) P.show() 入力変数の変化を 表す関数 モデルの インスタンス化 入力変数の初期設定と モデルの初期化 コミュニケーション ステップサイズ計算 初期化された 出力変数取得 コミュニケーション ステップの実行 図化処理 次のコミュニケーション ステップの計算 出力変数取得 入力変数の計算と 設定 結果用配列 2. FMUを作って使ってみる
  • 31. 2-4 OpenModelicaでFMUを読み込む 31 ①FMI(M)>FMU読込み JModelica で作成したFMUを OpenModelica で読んでみる。 FMIファイル : FMITest_BouncingBall.fmu ツリーを展開すると FMIのインターフェース関数に相当する 関数が表示される。 2. FMUを作って使ってみる
  • 34. 2-4 OpenModelicaでFMUを読み込む 34 入力変数 e をステップ的に 変化させたのに、 出力変数 y の計算結果に反映 されない!! ログファイルを見ると、 入力変数をセットする関数 fmiSetReal がコールされて いないようである。 ④シミュレーション >シミュレーションのセットアップ 開始時刻:0 終了時刻:3 でシミュレーションを実行する。 OpenModelica FORUM でも報告されている。 https://www.openmodelica.org/forum/default-topic/1639-data-exchange-between-fmu-model-and-openmodelica-block 単体テストと同じ結果にしかならない!!! 2. FMUを作って使ってみる
  • 35. 2-5 Scilab/Xcos FMU wrapperでFMUを読み込む 35 JModelica.org で作成した FMITest_BouncingBall.fmu をコピーして次のようにリネームする。 FMITest_BouncingBall.zip 解凍して中身を確認する。 Windows用32bitのダイナミック ライブラリが生成されている。 Scilab/Xcos もWindows 32bit版を使用する。 ソースファイル ダイナミックリンク ライブラリ XMLファイル 2. FMUを作って使ってみる Scilab には ATOMS というモジュール管理システムがあり、atomsInstall というコマンドでインストールする。 atomsInstall で FMU wrapper をインストールするには、少し問題があり手直しが必要である。 次スライドの手順でインストールする。
  • 36. 2-5 Scilab/Xcos FMU wrapperでFMUを読み込む 36 ① fmu-wrapper-0.6.zip を解凍する。 ② ファイル DESCRIPTION の次の行( 30行目)以降で、 1桁目から始まっている全ての行の1桁目にスペースを 挿入する。 ③ etc¥fmu_wrapper.start の77行目の pwd() を root_tlbx に変更する ④ 再び zip で fmu-wrapper-0.6.zip を圧縮する。 atomsInstall('fmu-wrapper-0.6.zip') スペース ⑤ Scilab を起動し、ファイルブラウザを fmu-wrapper-0.6.zip のあるディレクトリに 移動して以下を実行する。 ⑥ ファイルブラウザを %userprofile%¥Roaming¥Scilab¥scilab-5.5.2 ¥atoms¥fmu_wrapper¥0.6に移動して以下を実行する。 exec builder.sce Scilab/Xcos FMU wrapper ( https://forge.scilab.org/index.php/p/fmu-wrapper/ ) のインストールに関するワークアラウンド ⑦ Scilabを再起動する。 https://forge.scilab.org/index.php/p/fmu-wrapper/issues/1462/ に情報あり。 Scilabのインストール先を変えた場合は、 Scilabのインストール先¥contrib¥fmu_wrapper¥0.6 2. FMUを作って使ってみる
  • 37. 2-5 Scilab/Xcos FMU wrapperでFMUを読み込む 37 Scilab によるスタンドアロンタイプのFMUの単体のシミュレーション はサポートされていない。 https://forge.scilab.org/index.php/p/fmu-wrapper/issues/1548/ Scilab コンソール エラー Xcosによるテストのみを行う。 2. FMUを作って使ってみる
  • 38. 2-5 Scilab/Xcos FMU wrapperでFMUを読み込む 38 信号源> CLOCK_c ドラッグ・アンド・ドロップ 右クリックして ブロックパラメータを選択し FMITest_BouncingBall.fmu を設定する。 ① モデルの作成 テスト1: 入力変数が一定の場合 FMInterface 信号源> const 信号の配線 > MUX 出力/表示> CSCOPE 2. FMUを作って使ってみる
  • 39. 2-5 Scilab/Xcos FMU wrapperでFMUを読み込む 39 ② シミュレーション>設定 ③ 開始 テスト1: 入力変数が一定の場合 2. FMUを作って使ってみる
  • 40. 2-5 Scilab/Xcos FMU wrapperでFMUを読み込む 40 テスト2: 入力変数が変化する場合 信号源 >STEP_FUNCTION 入力信号をステップ関数に変えて実行する。 2. FMUを作って使ってみる
  • 41. 各ツールのFMI 1.0 FMI for Co-Simulation の対応状況のまとめ 41 ツール モデル作成環境 ソルバー FMU SDK ○ C⾔語 Euler法 OpenModelica × OpenModelica+ JModelica.org ○ Modelica⾔語 Euler法, cvode Scilab/Xcos + Xcos FMU wrapper ○ Xcosブロック線図 FMI 1.0 FMI for Co-Simulation の FMUの作成 スレーブツール ツール モデル作成環境 備考 FMU SDK △ ⼊⼒変数なし OpenModelica △ Modelica⾔語 ⼊⼒変数なし JModelica.org (PyFMI) ○ Pythonスクリプト Scilab/Xcos + Xcos FMU wrapper ○ Xcosブロック線図 Euler法 FMI 1.0 FMI for Co-Simulation の FMUの読み込み マスターツール 未検証 2. FMUを作って使ってみる
  • 42. 3. Tool CouplingタイプのFMUを試作する 42 3.Tool Coupling タイプのFMUを試作する
  • 43. 3.Tool Coupling タイプのFMUを試作する 43 マスターツール(Xcos, PyFMIなど) マスター ツールの モデル FMU FMU サーバー スレーブ ツールの モデルTCP/IP ソケット 通信 FMU SDKを改造して 通信機能を持たせる。 PythonのThreadingTCPServer を使用して作成する。 OpenFOAMなど のモデル Windows, Linux, Mac, … スレーブツール PyFOAM シェルスクリプト など Windows, Linux, Mac,… 構想中のシステム 3. Tool CouplingタイプのFMUを試作する FMU SDK, JModelica.org, Xcosで作成できるのは StandAlone タイプのFMUである。 ここでは、FMU SDKを改造して Tool CouplingタイプのFMUを試作する。 今回はこの範囲まで作成する。 Windows版のみ
  • 44. 3.Tool Coupling タイプのFMUを試作する • 3-1 作成したもの • 3-2 FMUジェネレータによる FMU の作成 • 3-3 Xcos による Co-Simulation モデルの作成 • 3-3 FMUサーバーのスレーブツール実行部分の編集 • 3-4 Co-Simulation の実行 3. Tool CouplingタイプのFMUを試作する 44
  • 45. 45 3-1 作成したもの FMUジェネレータ(Python) • FMUのソースコード(可変部、モデル固有の 情報を含む)を出力する。 • XMLファイルを生成する。 • バッチファイルを使用してコンパイルし、ZIP 化を行う。 FMUのソースコード(不変部)(C言語) • FMUサーバーと通信を行うクライアント。 • FMU SDKのCo-Simulation用のソースコード を改造し通信機能を持たせる。 FMUサーバ (Python) • FMU本体の要求によってスレーブツールをコ ントロールするサーバ。 • Pythonの標準ライブラリを使用し、マルチプ ラットフォームを目指す。 3. Tool CouplingタイプのFMUを試作する fmuchick (https://github.com/finback-at/fmuchick ) FMUジェネレータ fmuchick.py FMUのソースコード FMUサーバー fmuserver.py テスト用データ 開発およびテスト環境 • Windows 10 • Visual Studio 2012 • Python 2.7.11 (32bit) • wxPython 3.0
  • 46. 3. Tool CouplingタイプのFMUを試作する 46 ① ディレクトリgenerator でコマンドプロンプトから python fmuchick.py を実行する。 ② モデルデータを入力する。 • モデル情報 • 入力変数 • 出力変数 • FMU名 • GUID • サーバのIPアドレス • サーバのポート番号 ③ [Generate FMU]ボタンを クリックする。 3-2 FMUジェネレータ による FMU の作成 ④ FMU が生成される。 FMUジェネレータ ボタンを押すとFMUができる。 入力変数 input1: 0.0 input2: 1.0 出力変数 output1: 0.1 output2: 0.2 スレーブツールの実行に 必要なモデル情報など任意の情報 • Mode Name: TestModel • Description: Simple Test Model クリックするとModel Nameの値 がコピーされる。 クリックするとGUIDが生成される。 FMUサーバーを実行するマシンの • IPアドレス • 使用するポート番号 Start Time: 0 s Stop Time: 10 s Tolerance: 1.0e-4
  • 48. 48 上記をカスタマイズすることで様々なスレーブツールに対応することが可能。 スレーブツールを起動して初期化する。 入力変数 inputValue[] を使って、 時刻 t から t+dt のシミュレーションを行い、 結果を出力変数 outputValue[] にセットする。 シミュレーションを中止する。 abort, kill, … itemValue[], inputValue[], outputValue[] が使用できる。 3. Tool CouplingタイプのFMUを試作する def toolInitialize(self): for i in range(0,self.nitem): print self.itemName[i]+": "+self.itemValue[i] for i in range(0,self.ninput): print self.inputName[i]+" = "+str(self.itemValue[i]) for i in range(0,self.noutput): print self.outputName[i]+" = "+str(self.outputValue[i]) def toolDoStep(self): print "t = "+str(self.ctime) + " dt = "+str(self.cstep) for i in range(0,self.ninput): print self.inputName[i]+" = "+str(self.inputValue[i]) for i in range(0, self.noutput): if self.ctime <= 1e-6: self.outputValue[i] = self.inputValue[i] else: self.outputValue[i] += self.inputValue[i] * self.cstep print self.outputName[i]+" = "+str(self.outputValue[i]) def toolTerminate(self): print "Terminate tool!" スレーブツールとして外部プログラム を実行する代わりに入力信号をEuler法 で数値積分するコードを記述した。 3-3 FMUサーバー (server/fmuserver.py) のスレーブツール実行部分の編集
  • 49. 3-4 Co-Simulationの実行 3. Tool CouplingタイプのFMUを試作する 49 ① ディレクトリ server で コマンドラインから、 python fmuserver.py を実行する ② Xcos を実行する。 シミュレーションが終了したら、 Ctrl-C でサーバーを止める。
  • 50. 3. Tool CouplingタイプのFMUを試作する 50 入力信号 出力信号(ダミーソルバーによる入力信号の積分) Co-Simulationのテスト結果
  • 51. まとめ 3. Tool CouplingタイプのFMUを試作する 51 • Tool Coupling タイプのFMUを試作した。 • XcosでCo-Simulationテストモデルを作成した。 • スレーブツールとして入力信号をEuler法で積分するコードをFMU サーバに実装した。 • Co-Simulationテストモデルが正常に実行できることが確認できた。