Main Content

カスタム ブロックの機能の比較

カスタム ブロックを作成する場合、次のことを考慮してください。

この表は、各カスタム ブロック タイプにおける 3 つの懸念事項への対処を示しています。

モデル化における考慮事項

カスタム ブロック タイプ状態ダイナミクスのモデル化シミュレーションの性能 コード生成
Interpreted MATLAB Functionなし 高速ではないサポートなし
Level-2 MATLAB S-Functionあり高速ではないTLC ファイルが必要
MATLAB Functionなし高速サポートあり、ただし例外あり
MATLAB Systemあり高速サポートあり、ただし例外あり
あり高速TLC ファイルまたは非インライン S-Function のサポートが必要
C Callerなし高速サポートあり
C Functionあり高速サポートあり
あり高速サポートあり
Simulink Functionあり高速サポートあり
あり高速サポートあり
Fcnなし非常に高速サポートあり

カスタム ブロックの詳細設計については次を考慮してください。

状態動作のモデル化

現在の出力を計算するために以前の出力の一部またはすべてを要求するブロックの、状態動作をモデル化する必要があります。詳細については、状態変数を参照してください。

カスタム ブロック タイプメモ
Fcn, Interpreted MATLAB Function, C Caller状態動作をモデル化できない。
MATLAB Function, C Functionpersistent 変数を使用することで離散状態をモデル化できる。
Level-2 MATLAB® S-FunctionContStates 実行時オブジェクト メソッドまたは Dwork 実行時オブジェクト メソッドをブロック コールバック メソッドと組み合わせて使用することで連続状態動作と離散状態動作の両方をモデル化できる。サポートされるメソッドのリストについては、Write Level-2 MATLAB S-FunctionsLevel-2 MATLAB S-Function Callback Methodsを参照。
MATLAB SystemSystem object™ のDiscreteState プロパティをブロック コールバック メソッドと組み合わせて使用することで離散状態動作をモデル化できる。このブロックは System object メソッドを次のコールバック メソッドに対して使用する。mdlOutputs (stepImploutputImpl)、mdlUpdate (updateImpl)、mdlInitializeConditions (resetImpl)、mdlStart (setupImpl)、mdlTerminate (releaseImpl)。詳細については、System object とはを参照。
C MEX S-Function, S-Function Builderブロック コールバック メソッドを組み合わせて使用することで連続状態動作と離散状態動作の両方をモデル化できる。詳細については、Callback Methods for C MEX S-Functionsを参照。
Simulink Functionエンジンと直接通信する。連続および離散 Simulink ブロック ライブラリにある適切なブロックを使用することで状態動作をモデル化できる。異なる呼び出し元からこの関数が複数回呼び出される場合、状態値はそれらの呼び出しの間でも維持される。詳細については、複数のサイトからの Simulink Function ブロックの呼び出しを参照してください。
Subsystemエンジンと直接通信する。連続および離散 Simulink ブロック ライブラリにある適切なブロックを使用することで状態動作をモデル化できる。

シミュレーションの性能

ほとんどのアプリケーションについて、すべてのカスタム ブロック タイプは十分なシミュレーション性能を提供します。実性能の表示を得るには、Simulink プロファイラーを使用してください。詳細については、プロファイラーによるパフォーマンス データの取得を参照してください。

性能表示の 2 つのカテゴリは、インターフェイス コストとアルゴリズム コストです。インターフェイス コストは、データを Simulink エンジンからブロックに移動するのに要する時間です。アルゴリズム コストは、ブロックで実装したアルゴリズムを実行するのに要する時間です。

カスタム ブロック タイプメモ
Fcnシミュレーションの性能が最も優れています。このブロックは Simulink エンジンと緊密に統合されており、シミュレーションとコード生成用に最適化されています。
Interpreted MATLAB Functionインターフェイスの関係で、性能はやや低速ながら、MATLAB 関数と同じアルゴリズム コストになります。
ブロック データ (入力や出力など) が Interpreted MATLAB Function ブロックとの間でやり取りされるとき、Simulink エンジンはこのデータを MATLAB 配列にパッケージ化します。このパッケージ化には時間がかかり、通信時に一時的にメモリ要求が増加します。このインターフェイスでフレームや配列のような大量のデータをやり取りすると、性能がかなり低速になることがあります。
データが変換された後は、MATLAB 実行エンジンがアルゴリズムを実行します。その結果、アルゴリズム コストは MATLAB 関数と同じになります。
Level-2 MATLAB S-FunctionInterpreted MATLAB Function ブロックと同じアルゴリズム コストが発生しますが、インターフェイス コストはわずかながら高くなります。MATLAB S-Function は複数の入力と出力を扱うので、Interpreted MATLAB Function ブロックよりパッケージが複雑です。さらに、Simulink エンジンは実装したブロック メソッドごとに MATLAB 実行エンジンを呼び出しますが、Interpreted MATLAB Function ブロックは Outputs メソッドに対してのみ MATLAB 実行エンジンを呼び出します。
MATLAB Functionコードを生成してシミュレーションを実行するので、コストは他の Simulink 組み込みブロックと同じになります。
このブロックのアルゴリズム コストの解析は、ブロックの実装方法のせいで難しくなっています。平均すると、このブロックの関数と MATLAB 関数はほぼ同じ速度で実行されます。
MATLAB 実行エンジンを呼び出すために coder.extrinsic を使用するコードが MATLAB Function ブロックにある場合、MATLAB S-Function または Interpreted MATLAB Function ブロックで発生するすべてのコストが発生します。MATLAB 実行エンジンが MATLAB Function ブロックから呼び出されると、意図しない実行を避けるために、確認の警告が出ます。
アルゴリズム コストを削減するには、すべての MATLAB Function ブロックのデバッグを無効にします。
MATLAB Systemインタープリター型実行モードでは、モデルが MATLAB 実行エンジンを使用してブロックをシミュレートするため、性能は Level-2 MATLAB S-function に類似します。コード生成モードでは、モデルが生成コードを使用してブロックをシミュレートするため、性能は MATLAB Function に類似します。詳細については、この表の MATLAB Function の項目を参照してください。
C Caller, C Functionモデルを初めてシミュレートするときは、カスタム コードの解析とビルドが原因で、実行速度が遅くなる可能性があります。最初のコンパイル後にシミュレーションを高速化するには、[コンフィギュレーション パラメーター] から、コンパイルを高速化するために [高速なビルド] を選択し、シミュレーションを高速化するために [高速に実行] を選択します。
C MEX S-Functionコンパイルされたコードを使ってシミュレーションを実行するので、コストは Simulink 組み込みブロックと同じになります。アルゴリズム コストは S-Function の複雑度によって異なります。
S-Function Builderこのブロックは指定した仕様と C コードのみから S-Function をビルドします。モデルで生成された S-Function のラッパーとしてこのブロックを使用することもできます。C MEX S-Function と比較すると、このブロックのアルゴリズム コストはラッパーからのみ発生します。
Simulink Function、Subsystemライブラリに含まれている場合、ブロックが通常のサブシステムとしてモデル内に存在する場合に比べて、インターフェイスやアルゴリズムの追加コストは発生しません。
性能は、サブシステム内で実行されるアルゴリズムの複雑度に比例します。サブシステムがライブラリの中にある場合、オーバーヘッドはブロック線図がはじめて更新されるときやシミュレーションの準備をするときに、まだ読み込まれていないライブラリを Simulink が読み込むときに発生します。参照されているすべてのライブラリ ブロックが変更されていない場合、Simulink はその後ライブラリを再読み込みしません。モデルがライブラリを使用しなかった場合よりも、モデルのコンパイルは速くなります。

コード生成

モデルがより大きなシステムの一部である場合、コード生成が必要です。カスタム ブロック タイプの中には Simulink Coder™ でコード生成をサポートしないものがあります。

カスタム ブロック タイプメモ
Fcnコード生成をサポートします。
Interpreted MATLAB Functionコード生成をサポートしない。
C Caller, C Functionコード生成をサポートします。
Level-2 MATLAB S-FunctionTarget Language Compiler (TLC) 関数を使って実装されたアルゴリズムに対してのみコードを生成します。アクセラレータ モードとエクスターナル モードのシミュレーションでは、アルゴリズムを TLC で実装することなく S-Function を MATLAB 実行エンジンを呼び返してインタープリターで実行するようにできます。MATLAB S-Function が SimViewingDevice である場合、Simulink Coder 製品はコード生成時に自動的にそのブロックを除外します。
MATLAB Function, MATLAB Systemコード生成をサポートします。ただし、ブロックが MATLAB 実行エンジンを呼び出す場合、MATLAB 実行エンジンの呼び出しがブロックの出力に影響しない場合にのみ、ビルドに Simulink Coder 製品が使用されます。この条件下では、Simulink Coder 製品は生成された C コードからこれらの呼び出しを除外します。この機能によって、組み込みコードを生成する場合でも可視化コードをそのまま残すことができます。
C MEX S-Function, S-Function Builder

いずれもコード生成をサポートします。

  • インラインでない S-Function のコード生成では、Simulink Coder 製品は C MEX 関数を使用。

  • C MEX S-Function の場合には、インライン化された S-Function が必要な場合や、手書きコードのラッパーを作成する必要がある場合は、S-Function の TLC ファイルを記述しなければならない。

  • S-Function Builder の場合には、[ラッパー TLC の生成] オプションを選択して自動的に TLC ファイルを生成できる。

詳細については、S-Function とコード生成 (Simulink Coder)を参照してください。

Simulink Functionコード生成をサポートします。
Subsystemサブシステムに含まれるブロックがコード生成をサポートする限り、コード生成をサポートします。詳細については、サブシステム (Simulink Coder)を参照してください。

複数の入力端子と出力端子

次のタイプのカスタム ブロックでは、複数の入力端子と出力端子がサポートされます。

カスタム ブロック タイプメモ
Fcn, Interpreted MATLAB Functionサポートされる入力端子と出力端子はそれぞれ 1 つのみ。
MATLAB Functionバスを含む、複数の入力端子と出力端子をサポート。詳細については、MATLAB Function ブロック内での構造体の作成およびMATLAB Function ブロックへのバスの付加を参照してください。
MATLAB Systemバスを含む、複数の入力端子と出力端子をサポート。さらに、getNumInputs メソッドおよび getNumOutputs メソッドを使用して、System object のプロパティに基づいて入力端子と出力端子の数を変更できる。
C Caller, C Functionバスを含む、複数の入力端子と出力端子をサポート。
Level-2 MATLAB S-Function、C MEX S-Function、S-Function Builder複数の入力端子と出力端子をサポート。さらに、ユーザー定義のパラメーターに基づいて入力端子と出力端子の数を変更できる。C MEX S-Function および S-Function Builder はバスをサポートしている。
Simulink Functionバスを含む、複数の入力端子と出力端子をサポート。
サブシステムバスを含む、複数の入力端子と出力端子をサポート。さらに、ユーザー定義のパラメーターに基づいて入力端子と出力端子の数を変更できる。詳細については、自己修正可能なリンク付きサブシステムを参照してください。

Simulink ブロック線図の更新速度

Simulink は毎回のシミュレーションの前と、ユーザーに要求されたときにブロック線図を更新します。ブロックごとに、ブロック線図の更新プロセスで何らかのオーバーヘッドが発生します。

カスタム ブロック タイプメモ
Fcn, Interpreted MATLAB Functionブロック線図の更新コストは低コストです。
MATLAB Function, C Caller, C Functionコードの生成を通してシミュレーションを行います。したがって、ブロックがはじめて更新されるときはかなり時間がかかる場合があります。コードの生成はインクリメンタルなので、ブロックとそれに接続する信号が変更されていないときは、Simulink はブロックを繰り返し更新しません。
MATLAB Systemブロック線図の更新でコードを生成しないため、MATLAB Function より高速。コードの生成はインクリメンタルなので、ブロックとそれに接続する信号が変更されていないときは、Simulink はブロックを繰り返し更新しません。
C MEX S-Function、Level-2 MATLAB S-Functionブロック線図の更新で実行されるメソッドをオーバーライドするときにのみ、他の Simulink ブロックより大きなオーバーヘッドが発生します。メソッドが複雑になると、ブロック線図を更新する時間が目に見えて長くなります。ブロック線図を更新するときに実行されるメソッドのリストは、Simulink Engine Interaction with C S-Functionsのプロセスの図解を参照してください。ブロック線図を更新するとき、モデルの初期化の段階で Simulink は mdlStart までのすべての関連メソッドを呼び出しますが、mdlStart はその中に含まれません。
Simulink Function、Subsystem速度は、サブシステム内で実行されるアルゴリズムの複雑度に比例します。サブシステムがライブラリの中にある場合、オーバーヘッドはブロック線図がはじめて更新されるときやシミュレーションの準備をするときに、まだ読み込まれていないライブラリを Simulink が読み込むときに発生します。参照されているすべてのライブラリ ブロックが変更されていない場合、Simulink はその後ライブラリを再読み込みしません。モデルがライブラリを使用しない場合よりも、モデルのコンパイルは速くなります。

コールバック メソッド

Simulink ブロックは、(Simulink Function ブロックを除く) ブロックの動作を完全に指定するブロック コールバック メソッドを介して Simulink エンジンと通信します。各カスタム ブロック タイプに異なるセットのコールバック メソッドを実装できます。ブロックが Simulink エンジンとやり取りする方法については、Simulink Engine Interaction with C S-Functionsを参照してください。この表ではS-Function Callback Methodsの名前を同等と見なして使用します。

カスタム ブロック タイプメモ
Fcn, Interpreted MATLAB Function, MATLAB Function, C Callerいずれも、入力された値から出力値を計算するために mdlOutputs メソッドを作成する。これらのブロックの 1 つを使って他のコールバック メソッドを実装することはできないため、状態動作をモデル化できない。
C Functionstart、output、および terminate コールバック メソッドの実装を許可します。永続データを使用した離散状態のモデル化を許可します。
Level-2 MATLAB S-Functionコールバック メソッドのより大きなサブセットを実装でき、それには連続状態および離散状態のモデル化に使用できるメソッドが含まれる。サポートされるメソッドのリストについては、Write Level-2 MATLAB S-FunctionsLevel-2 MATLAB S-Function Callback Methodsを参照。
MATLAB SystemSystem object メソッドを次のコールバック メソッドに対して使用する。mdlOutputs (stepImploutputImpl)、mdlUpdate (updateImpl)、mdlInitializeConditions (resetImpl)、mdlStart (setupImpl)、mdlTerminate (releaseImpl)。詳細については、Simulink エンジンと System object メソッドとの相互作用を参照。
C MEX S-Functionコールバック メソッドの完全なセットを実装できる。
S-Function BuildermdlOutputsmdlDerivatives、および mdlUpdate を実装できる。
Simulink Functionスタンドアロンの関数としてパッケージ化される。この関数の呼び出し元はすべて、呼び出し元の場所に基づくコールバック メソッドのいずれかの一部になる。
Subsystemエンジンと直接通信する。連続および離散 Simulink ブロック ライブラリにある適切なブロックを使用することで状態動作をモデル化できる。

MATLAB S-Function とコード生成用 MATLAB 関数の比較

MATLAB S-Function とコード生成用の MATLAB 関数には根本的な違いがあります。

  • Simulink Coder 製品は MATLAB S-Function とコード生成用 MATLAB 関数の両方のコードを生成できます。ただし、MATLAB S-Function にはコード生成にターゲット言語のコンパイラ (TLC) ファイルが必要ですが、コード生成用 MATLAB 関数には必要ありません。

  • MATLAB S-Function は任意の MATLAB 関数を使用できますが、コード生成用 MATLAB 関数は MATLAB 言語のサブセットです。サポートされているコード生成用の関数のリストについては、C/C++ コードの生成でサポートされている関数およびオブジェクトを参照してください。

  • MATLAB S-Function は離散状態と連続状態のダイナミクスをモデル化できますが、コード生成用 MATLAB 関数は状態ダイナミクスをモデル化できません。

カスタム ブロックの機能拡張

コールバックと MATLAB グラフィックスを使ってカスタム ブロックの機能を拡張できます。

ブロックのコールバックは、シミュレーションの特定の時点でユーザー定義の動作を実行します。たとえば、コールバックはシミュレーションの前にデータを MATLAB ワークスペースに読み込んだり、シミュレーションの終わりにシミュレーション データのグラフを生成したりできます。ブロック コールバックはどのカスタム ブロック タイプでも使用できます。使用できるコールバックの一覧と使用方法の詳細については、ブロックのコールバックを参照してください。

App Designer (MATLAB のグラフィカル ユーザー インターフェイス開発環境) はカスタム ユーザー インターフェイスを手軽に作成するツールを提供します。App Designer の使用方法の詳細については、アプリの作成を参照してください。

参考

| | | | | | | | | |

関連するトピック