FMIインポート
このセクションでは、FMI 標準の簡単な説明と、FMU ファイルのインポートに使用される FMI インポート コンポーネントについて説明します。
FMI規格について
機能モックアップインターフェース(FMI)は、XMLファイル、バイナリ、Cコードを圧縮した単一のファイル(FMU:Functional Mock-up Unit)を用いて動的モデルを交換するためのコンテナとインターフェースを定義するフリースタンダードです。言い換えれば、FMIは、あるシミュレーションツールからモデルをエクスポートし、別のツールにインポートする方法、そしてそのモデルをインターフェースする方法に関するルールを提供します。
- モデル交換のためのFMI -モデリング環境が、他のモデリングおよびシミュレーション環境で利用可能な動的システムモデルのCコード表現を生成できるようにすることを目的としています。モデルは、時間、状態、およびステップイベントを含む微分方程式、代数方程式、および離散方程式で記述されます。Cコードが連続システムを記述する場合、そのシステムは、それが使用される環境の積分器によって解かれます。
- FMI for Co-Simulation -協調シミュレーション環境におけるシミュレーションツールの連携のためのインターフェース標準を提供することを目的としています。サブシステム間のデータ交換は、個別の通信ポイントに限定されます。2つの通信ポイント間の時間中、サブシステムはそれぞれのソルバーによって互いに独立して解かれます。マスターアルゴリズムは、サブシステム間のデータ交換とすべてのシミュレーションソルバー(スレーブ)の同期を制御します。シンプルなマスターアルゴリズムだけでなく、より高度なマスターアルゴリズムもサポートされています。[ fmi-standard-org ]
2 種類の違いは、インポート ツールが FMU を時間的に前進させる方法にあります。
温度や速度といった物理量を表すモデルは、一般的に微分方程式で記述されます。物理量が時間とともにどのように変化するかは、その量自体の値(状態)と、どのような外部からの影響(入力)を受けるかによって決まります。
次の例を見てみましょう。家の温度がどのように変化するかを示す非常に単純な数学モデルは次のように表すことができます。
dThouse/dt = k1*(Tout-Thouse) k2*ボイラー電力 k3
ここで、量の変化率( dThouse/dt )は、状態( Thouse )と入力( ToutとBoilerPower )に依存します。k1 、 k2 、 k3は時間とともに変化しないパラメータです。家屋内の温度が時間とともにどのように変化するかを計算するには、この微分方程式を数値ソルバーに接続する必要があります。
Co-simulation FMU をシミュレーションする場合、数値ソルバーはエクスポートツールに組み込まれ、提供されます。インポートツールは入力を設定し、FMU に指定された時間だけステップを進めるよう指示し、出力を読み取ります。
Model Exchange FMU をシミュレーションする場合、数値ソルバーはインポートツールによって提供されます。FMU は、状態と入力を設定し、状態微分(つまり方程式の左辺)を計算する関数を提供します。インポートツールのソルバーは、使用する時間ステップと、次の時間ステップにおける状態計算方法を決定します。[ modelon.com ]
協調シミュレーションのためのFMI
Typhoon HIL ツールチェーンでは、Co-simulation 用の FMI のみがサポートされており、ここで説明します。
FMI for Co-Simulation は、シミュレータによってソルバーとともに実行可能なコードとしてエクスポートされたサブシステム モデルとの結合 (図 1 ) と、シミュレーション ツールの結合 (シミュレータ結合、ツール結合(図 2 )) の両方を目的として設計されています。


エクスポートされたFMUはスレーブとして動作し、インポートしたツールはマスターとして動作します。マスターはすべてのデータ交換と時刻同期を担当します。また、スレーブ間のデータ交換はマスターのみを介して行われ、スレーブ間で直接通信が行われることはありません。
マスターとスレーブ間のデータ交換は、個別の通信ポイントに限定されます。これは、最も一般的なマスターアルゴリズムで説明できます。このアルゴリズムは、各通信ポイントでシミュレーションを停止し、すべてのスレーブからの出力を収集し、スレーブの入力を計算し、それらの入力をスレーブに分配し、固定された通信ステップサイズで次の通信ステップで(協調)シミュレーションを継続します。
各通信ポイントにおけるデータフローは、図 3のブロック図で表すことができます。

Typhoon HILツールチェーンにおけるFMIサポート
既に述べたように、Typhoon HILツールチェーンは協調シミュレーション用のFMIのみをサポートしています。また、FMIバージョン2のみがサポートされており、FMUファイルのインポートのみがサポートされています。これは、ライブラリのFMUインポートコンポーネント(Signal Processing -> Extras -> FMU Import)を使用して有効化できます。
HILデバイスとVirtual HILデバイスはどちらもFMUインポート機能をサポートしています。HILデバイスを使用する場合は、ソースコードファイルをFMUファイルに含める必要があります。Virtual HILデバイスを使用する場合は、ソースコードとwin64ライブラリの両方を使用できます。両方を指定した場合、win64ライブラリが使用されます。したがって、ソースコードを使用する場合は、FMUファイルからwin64ライブラリを削除する必要があります。
また、HILデバイスを使用する場合、Co-simulationはスタンドアロンで実行する必要があります。つまり、ツールの連携は不可能であり、モデルソルバーはFMUに組み込む必要があります。これはVirtual HILの制限ではありませんが、非同期実行は正しく動作しません。言い換えれば、Do Step関数は「Pending」ステータスを返してはなりません。これは、マスターアルゴリズムがこれをサポートするように設計されていないためです。
マスター アルゴリズムは、図 4のブロック図に示されています。

- スレーブの初期化 – このステップでは、スレーブモデルに必要なすべてのリソースを割り当てるfmi2Instantiate関数が呼び出されます。
- パラメータの初期化 – fmi2SetReal 、 fmi2SetInteger、およびfmi2SetBoolean関数が呼び出され、すべての定数入力とパラメータ値が初期化されます。
- 実験のセットアップ – fmi2SetupExperiment関数が呼び出されます。開始時刻は0と定義され、終了時刻は定義されていません。
- 初期化モードに入る - fmi2EnterInitializationMode関数が呼び出されます。
- 初期化モードを終了 - fmi2ExitInitializationMode関数が呼び出されます。
- 入力の設定 – このステップはシミュレーション中に呼び出され、 fmi2SetReal 、 fmi2SetInteger 、およびfmi2SetBoolean関数を呼び出してスレーブの入力と調整可能なパラメータを初期化します。
- ステップ実行 – fmi2DoStep関数が呼び出され、スレーブは1つのシミュレーションステップを実行します。定義されたシミュレーションステップは、回路図モデルで定義された実行レートと同じです。
- 出力の読み取り - スレーブ出力値を取得するために、 fmi2GetReal 、 fmi2GetInteger 、およびfmi2GetBoolean関数が呼び出されます。
- 実験の終了 – 実験を終了するfmi2Terminate関数が呼び出されます。
- スレーブの解放 - スレーブの初期化ステップで割り当てられたすべてのリソースを解放するためにfmi2FreeInstance関数が呼び出されます。
どの関数呼び出しでも戻り値はチェックされず、マスターは戻り値として OK ステータスを期待していることに注意することが重要です。
FMUインポート
FMI スレーブ機能は、回路図エディター ライブラリの FMU インポート コンポーネントを使用して定義されます。
コンポーネント イメージ、ダイアログ ウィンドウ、およびプロパティを表 1に示します。
コンポーネントアイコン | コンポーネントダイアログ | プロパティ |
---|---|---|
![]() FMUインポート |
![]() |
|
コンポーネント ダイアログ ウィンドウの [ファイルの選択] ボタンを使用すると、目的の FMU ファイルを参照できます。
FMUファイルが正しく解析されれば、ファイルから抽出された変数に基づいてテーブルが更新されます。一般情報フィールドもFMUファイルの情報で埋められます。FMUファイルをインポートした後のダイアログウィンドウの例を以下に示します。

パスの種類プロパティでは、FMUファイルパスの保存形式を選択できます。絶対パスはFMUファイルへの完全なシステムパスを保存し、相対パスはモデルディレクトリからの相対パスを保存します。相対パスは、モデルが先に保存されている場合にのみ選択できます。
- 入力– FMUスレーブへの入力値です。モデル制御コンボボックスが「外部」に設定されている場合、コンポーネントに入力端子が作成され、ユーザーは任意の信号をこの変数に接続できます。デフォルトでは、すべての入力が「外部」に設定されています。この場合、「開始値」は無視され、接続された信号の値が使用されます。モデル制御が「定数」に設定されている場合、端子は接続されず、「開始値」が変数値として使用されます。モデル制御が「定数」に設定されている場合は、「開始値」を変更できます。
- 出力– これらはFMUスレーブの出力です。出力端子は出力変数ごとに作成され、選択または選択解除することはできません。
- パラメータ– FMUスレーブで定義されるパラメータです。入力と同様に、パラメータは定数にすることも、シミュレーション中に変更することもできます。モデル制御が外部に設定されている場合は、コンポーネントに入力端子が作成され、目的の信号を接続できます。モデル制御が調整可能に設定されている場合は、HIL SCADAで利用可能なモデルエクスプローラからシミュレーション中にパラメータを変更できます。デフォルトでは、すべてのパラメータは定数として扱われます。モデル制御が定数に設定されている場合は、開始値を変更できます。パラメータタブで使用可能な変数のみを調整可能に設定できます。
- ローカル変数– これらはFMUスレーブのローカル変数です。FMIでは、ローカル変数は読み取り可能だが、その値はシミュレーション内の他の場所では使用できない変数として定義されています。実際には、これらの値は読み取り可能だが、コンポーネント上に端子は作成されないことを意味します。「プロットを有効にする」オプションをオンにすると、FMUインポートコンポーネント内にプローブコンポーネントが作成され、その変数をSCADAで監視したり、API関数を使用して読み取ったりできるようになります。
物件名 | 説明 |
---|---|
名前 | 変数名。端末名も指定します。 |
寸法 | 変数の次元。FMIバージョン2はスカラーのみをサポートするため、この値は常に1になります。ベクトル値はFMUファイル内でアンラップされ、各要素はスカラーとしてマッピングされます。例えば、「res」が出力ベクトル変数の場合、「res[0]」、「res[1]」、…という3つの出力変数が存在します。 |
開始値 | 入力とパラメータの初期値。変数がモデル制御されていない場合は、この値を変更できます。 |
データ型 | FMUファイルで指定されたデータ型。すべてのデータ型(実数、整数、ブール値、列挙型、文字列)がサポートされていますが、モデルからの信号を介して外部から制御できるのは、実数、整数、ブール値の変数のみです。つまり、コンポーネント上の端子を作成できるのは、これら3つの変数のみです。 |
分 | 許容される最小変数値。 |
マックス | 許容される最大変数値。 |
ユニット | FMUで定義された変数単位。このプロパティの値によって変数値が変更されることはありません。単位が非標準の場合(例:mi/h)、km/hまたはm/sへの変換はユーザーが追加する必要があります。 |
プロットを有効にする | ローカル変数に使用されます。チェックすると、変数はSCADAで監視したり、API関数を使用して読み取ったりできます。 |
モデル制御 | 入力、パラメータに使用されます。「外部」に設定すると、コンポーネントに入力端子が作成され、ユーザーはモデルから任意の信号を接続できるようになります。「パラメータ」タブの「モデル制御」は「調整可能」に設定することもできます。 |
FMI標準についてセクションで述べたように、FMUは基本的に、単一のアーカイブに圧縮されたバイナリファイルとCコードのコレクションです。つまり、コードをHILデバイスで実行される実行ファイルにコンパイルするために、Cコンパイラが呼び出されます。ほとんどの場合、FMUはコンパイラに追加の定義を渡す必要はありませんが、必要な場合は、 「追加定義」プロパティがその役割を果たします。たとえば、コードには、マルチスレッドをサポートするプラットフォームのコード実行を処理するNO_MULTITHREADED_SUPPORT定義が含まれている場合があります。HILデバイスはマルチスレッドをサポートしていないため、図6に示すように、この定義を追加定義に含める必要があります。
定義が複数ある場合は、1 つのスペースを使用して区切られます。
デフォルトで含まれる定義の1つにFMI2_FUNCTION_PREFIXがあります。この定義により、すべてのFMU関数に適切なプレフィックスが付与され、手動で宣言する必要がなくなります。
追加リソース
FMU標準では、FMUアーカイブ内にリソースフォルダが存在することが定義されています。シミュレーションを正しく動作させるために追加のリソースが必要な場合は、このフォルダに保存されます。通常、これらのリソースには、経験的データ、パラメータ、テーブル、さらには追加のDLLなどが含まれます。
HILデバイス上で実行される信号処理コードはベアメタルアプリケーションとして実行されるため、HILデバイスではファイルシステムコールがサポートされません。また、HILデバイスはファイルを開いてデータを抽出できないため、リソースフォルダは使用できず、無視されます。HILデバイスにFMUを実装する際には、シミュレーション結果に大きな変化が生じる可能性があるため、この点にご注意ください。
VHIL を使用してシミュレーションを実行する場合、リソースフォルダーが使用され、シミュレーションは通常どおり実行されます。
使用例
FMU インポート コンポーネントの使用方法は、誘導機オープン ループ制御のサンプル モデル (examples\models\power electronics\indm_open_loop_control\ indm_open_loop_control.tse) で説明されています。
サンプルモデルを図 7に示します。

オープンループ制御は信号処理コンポーネントを使用して設計されており、回路図の下部に配置されています。この制御には2つの入力と1つの出力があります。入力は周波数と変調度で、出力は3相整流器の基準信号です。同じ制御をMATLAB/Simulinkで作成しました(下記)。



MATLAB SimulinkからFMUファイルをエクスポートする
MATLAB 2021a バージョンから、ユーザーは Simulink モデルを FMU アーカイブにエクスポートできるようになりました。
- FMUモデルの入力と出力を定義するには、 輸入 そして
アウトポート コンポーネントは、図のように使用する必要があります。 図9
図9 InportおよびOutportコンポーネント - モデル設定(図10)、ソルバータイプは、指定された値を持つ固定ステップとして定義する必要があります。 図11
図10.モデル設定 図11ソルバー設定 - リアルタイムHILプラットフォームでFMUモデルを実行できるようにするには、ハードウェアターゲットを正しく指定する必要があります。まず、システムターゲットファイルを次のように定義する必要があります。 リアルタイム.tlc 次に、デバイスの種類を次のように指定します。 ARM Cortex-A. 図12 そして 図13 これを例証します。
図12システムターゲット設定 図13デバイスタイプの設定 - FMUファイルをエクスポートするには、「保存」ドロップダウンメニューで「スタンドアロンFMU」オプションを選択し、次のようにFMUアーカイブにソースコードを含めるようにしてください。 図14.
図14スタンドアロンFMUのエクスポート