Submit Search
FMI1.0 FMI for Co-Simulation について
2 likes
4,132 views
A
Amane Tanaka
第57回オープンCAE勉強会@関東(流体など)で発表したものに加筆修正を行ったものです。
Engineering
Read more
1 of 51
Download now
Downloaded 53 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
More Related Content
PDF
FMI-Ver 1.0 FMI for Model Exchange のモデルについて
Amane Tanaka
PDF
OpenFOAM+のCo-simulation機能とFMUの試作
Amane Tanaka
PDF
OpenFOAM -回転領域を含む流体計算 (Rotating Geometry)-
Fumiya Nozaki
PPTX
OpenModelica tutorials_1(超初級チュートリアル1 解析モデルの作成と実行)
Shigenori Ueda
PDF
Linux : PSCI
Mr. Vengineer
PPTX
OpenModelica tutorials_6 Tips(超初級チュートリアル6.便利技 Tableモデルの使い方)
Shigenori Ueda
PPTX
OpenModelica tutorials_2 coding (超初級チュートリアル 2.コーディング)
Shigenori Ueda
PDF
Turbulence Models in OpenFOAM
Fumiya Nozaki
FMI-Ver 1.0 FMI for Model Exchange のモデルについて
Amane Tanaka
OpenFOAM+のCo-simulation機能とFMUの試作
Amane Tanaka
OpenFOAM -回転領域を含む流体計算 (Rotating Geometry)-
Fumiya Nozaki
OpenModelica tutorials_1(超初級チュートリアル1 解析モデルの作成と実行)
Shigenori Ueda
Linux : PSCI
Mr. Vengineer
OpenModelica tutorials_6 Tips(超初級チュートリアル6.便利技 Tableモデルの使い方)
Shigenori Ueda
OpenModelica tutorials_2 coding (超初級チュートリアル 2.コーディング)
Shigenori Ueda
Turbulence Models in OpenFOAM
Fumiya Nozaki
What's hot
(20)
PPTX
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
PDF
組み込みLinuxでのGolangのススメ(Go con版)
Tetsuyuki Kobayashi
PPTX
ParaViewでCSVの点群を表示する
RyogaSato1
PDF
Free cad 0.19.2 and cfdof (Japanese Ver.)
YohichiShiina
PDF
OpenModelica tutorials_7-5 Stream variable(超初級チュートリアル7-5.番外編 Stream変数)
Shigenori Ueda
PDF
OpenFOAMソルバの実行時ベイズ最適化
Masashi Imano
PDF
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
Fumiya Nozaki
PPTX
OpenFOAMにおける相変化解析
takuyayamamoto1800
PDF
OpenFOAM の Function Object 機能について
Fumiya Nozaki
PDF
オープンソースによるモデルベースデザイン(OpenModelica)
Koji Nishi
PDF
Strutsから移行する人のためのjsf基礎
Satoshi Kubo
PDF
CFD for Rotating Machinery using OpenFOAM
Fumiya Nozaki
PDF
OpenFOAM の境界条件をまとめよう!
Fumiya Nozaki
PDF
Managing data workflows with Luigi
Teemu Kurppa
PDF
流体解析入門者向け超初級講習会@関東 修正版
Masashi Imano
PDF
OpenModelica tutorials_7 PlantModel(超初級チュートリアル7.プラントモデル)
Shigenori Ueda
PPTX
モデル検査入門 #wacate
Kinji Akemine
PDF
OpenFOAM LES乱流モデルカスタマイズ
mmer547
PDF
Dockerのディスクについて ~ファイルシステム・マウント方法など~
HommasSlide
PDF
Boundary Conditions in OpenFOAM
Fumiya Nozaki
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
組み込みLinuxでのGolangのススメ(Go con版)
Tetsuyuki Kobayashi
ParaViewでCSVの点群を表示する
RyogaSato1
Free cad 0.19.2 and cfdof (Japanese Ver.)
YohichiShiina
OpenModelica tutorials_7-5 Stream variable(超初級チュートリアル7-5.番外編 Stream変数)
Shigenori Ueda
OpenFOAMソルバの実行時ベイズ最適化
Masashi Imano
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
Fumiya Nozaki
OpenFOAMにおける相変化解析
takuyayamamoto1800
OpenFOAM の Function Object 機能について
Fumiya Nozaki
オープンソースによるモデルベースデザイン(OpenModelica)
Koji Nishi
Strutsから移行する人のためのjsf基礎
Satoshi Kubo
CFD for Rotating Machinery using OpenFOAM
Fumiya Nozaki
OpenFOAM の境界条件をまとめよう!
Fumiya Nozaki
Managing data workflows with Luigi
Teemu Kurppa
流体解析入門者向け超初級講習会@関東 修正版
Masashi Imano
OpenModelica tutorials_7 PlantModel(超初級チュートリアル7.プラントモデル)
Shigenori Ueda
モデル検査入門 #wacate
Kinji Akemine
OpenFOAM LES乱流モデルカスタマイズ
mmer547
Dockerのディスクについて ~ファイルシステム・マウント方法など~
HommasSlide
Boundary Conditions in OpenFOAM
Fumiya Nozaki
Ad
Similar to FMI1.0 FMI for Co-Simulation について
(20)
PDF
20130329 rtm2
openrtm
PDF
OCamlのトップレベルあれそれ
nomaddo
PDF
CheckMATE introduction
Yoshitaro Takaesu
PPTX
TotalViewを使った代表的なバグに対するアプローチ
RWSJapan
PDF
Cuda fortranの利便性を高めるfortran言語の機能
智啓 出川
PDF
CMSI計算科学技術特論A (2015) 第5回 プログラム高速化の応用
Computational Materials Science Initiative
PDF
OpenFOAM Case Handling in dakota-6.8 gui
Etsuji Nomura
PDF
スーパーコンピューターとクラウドでのOpenFOAM性能・費用ベンチマークテスト
Masanori Sumitomo
PDF
160428 東工大「ロボット技術」授業資料
openrtm
PPTX
運用構築技術者の為のPSプログラミング第1回
Shigeharu Yamaoka
PDF
05 tm1 batch
Shinsuke Yamamoto
PDF
テスト自動化のこれまでとこれから
Keizo Tatsumi
PDF
OpenRTM-aist入門
Yuki Suga
PPTX
T93 com入門
伸男 伊藤
PPTX
JAWS-UG HPC #2 LT 並列処理・MPIの第一歩
HPCシステムズ株式会社
PDF
RTミドルウエア講習会2015
Yuki Suga
PDF
やさしく知りたいC言語
uru nru
PPT
Php unit extensions_selenium2_testcaseによる結合試験でらくらくテスト♪
Tsutomu Chikuba
PDF
Replace Output Iterator and Extend Range JP
Akira Takahashi
PPTX
PHPとシグナル、その裏側
do_aki
20130329 rtm2
openrtm
OCamlのトップレベルあれそれ
nomaddo
CheckMATE introduction
Yoshitaro Takaesu
TotalViewを使った代表的なバグに対するアプローチ
RWSJapan
Cuda fortranの利便性を高めるfortran言語の機能
智啓 出川
CMSI計算科学技術特論A (2015) 第5回 プログラム高速化の応用
Computational Materials Science Initiative
OpenFOAM Case Handling in dakota-6.8 gui
Etsuji Nomura
スーパーコンピューターとクラウドでのOpenFOAM性能・費用ベンチマークテスト
Masanori Sumitomo
160428 東工大「ロボット技術」授業資料
openrtm
運用構築技術者の為のPSプログラミング第1回
Shigeharu Yamaoka
05 tm1 batch
Shinsuke Yamamoto
テスト自動化のこれまでとこれから
Keizo Tatsumi
OpenRTM-aist入門
Yuki Suga
T93 com入門
伸男 伊藤
JAWS-UG HPC #2 LT 並列処理・MPIの第一歩
HPCシステムズ株式会社
RTミドルウエア講習会2015
Yuki Suga
やさしく知りたいC言語
uru nru
Php unit extensions_selenium2_testcaseによる結合試験でらくらくテスト♪
Tsutomu Chikuba
Replace Output Iterator and Extend Range JP
Akira Takahashi
PHPとシグナル、その裏側
do_aki
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のダイナミックリンクライブラリに実装される関数
17.
スレーブツールの状態遷移と マスターツールからコールされる関数 17 インスタンス化終了 初期化終了 コミュニケーションステップ計算中 コミュニケーションステップ の途中までしか成功しない コミュニケーションステップ失敗 コミュニケーションステップ成功 致命的エラー エラー 終了状態 メモリ解放 (仕様書 P.31) 関数が細かい文字で見えない と思うけど。。。 1.
FMI-1.0 FMI for Co-Simulation の概要
18.
2. FMUを作って使ってみる。 18 2.
FMUを作って使ってみる
19.
2. FMUを作って使ってみる 19 オープンソースツールのFMIサポート状況( https://www.fmi-standard.org/tools
より抜粋) JModelicaの 一部でもある 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を作って使ってみる
22.
2-1 OpenModelicaでサブシステムモデルをつくる 22 ⑤テキストビューに切り替えて、ソースコードを編集する。 変更部分 追加するコード ⑥編集が終わったら [モデルチェック] をクリックする。 annotationが邪魔なときは、 ツール>オプション >Modelicaテキストエディタ で「行の折り返しを使用」 のチェックをはずすと目ただ なくなる。 入力変数 𝑒 出力変数
𝑦 𝑣 = 𝑑ℎ 𝑑𝑡 𝑑𝑣 𝑑𝑡 = −𝑔 𝑦 = ℎ ℎ < 0 なら 𝑣 = −𝑒 ∗ 𝑣 に初期化しなおす。 初期値 変数 ℎ:高さ、𝑣:速度 パラメータ 𝑔 : 重力加速度 ℎ,: 高さの初期値 2. FMUを作って使ってみる
23.
2-1 OpenModelicaでサブシステムモデルをつくる 23 ⑦アイコンビューに切り替えてアイコンを作成する。 線 楕円 ⑧終わったら保存する。 サブシステムモ デル作成は 終了! 次は動作テスト を行う。 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を作って使ってみる
32.
2-4 OpenModelicaでFMUを読み込む 32 テスト1:入出力のない単体の シミュレーション 開始時刻:0 終了時刻:3 e とy をチェック ②シミュレーション >シミュレーションのセットアップ 2.
FMUを作って使ってみる
33.
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を作って使ってみる
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
47.
473. Tool CouplingタイプのFMUを試作する 作成したFMUを読み込んだブロック 入力変数 出力変数 時間(コミュニケーションポイント) の入力端子 3-2
XcosによるCo-Simulation モデルの作成
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テストモデルが正常に実行できることが確認できた。
Download