Main Content

MATLAB Function ブロックのコードと統合に関する制限

MATLAB Function ブロックは MATLAB® Coder™ および Stateflow® のインフラストラクチャに依存するため、以下に従う必要があります。

  • コード生成でサポートされない関数を使用するには、関数を外部関数として宣言します。

  • データ定義のガイドラインに従います。

  • フィードバック ループでブロックを使用するには、ブロックで非直達を使用するように設定します。

また、一度変数にプロパティを割り当てた後は、いくつかの例外を除き、そのクラス、サイズ、実数/複素数を関数本体の他の場所で再定義することはできません。

サポートされる関数の使用

MATLAB Function ブロックが含まれるモデルをシミュレートするときに、ソフトウェアはブロックからバイナリ コードまたは C/C++ MATLAB 実行可能 (MEX) コードを生成し、このコードをモデルに統合します。MATLAB Function ブロックでは、Simulink® の外部にある MATLAB コードから C/C++ コードを生成するために使用する、MATLAB Coder と同じインフラストラクチャが使用されます。

MATLAB Function ブロックはコンパイルとシミュレーションにコード生成技術を利用しているため、MATLAB Coder の C/C++ コード生成の制限が MATLAB Function ブロックにも適用されます。そのため、MATLAB Function ブロックのコードでは、C/C++ コード生成用にサポートされている MATLAB 言語機能のみを外部関数として宣言して使用できます。サポートされているコード生成用の関数のリストについては、C/C++ コードの生成でサポートされている関数およびオブジェクトを参照してください。サポートされている言語機能については、C/C++ コード生成でサポートされている MATLAB 言語機能を参照してください。

外部関数の使用

シミュレーションでは、サポートされていない関数も coder.extrinsic で外部関数として宣言することで使用できます。外部関数として宣言した関数は、モデルのシミュレーション中に MATLAB ワークスペースで実行されます。

たとえば、MATLAB Function ブロックで patch を使用してデータをプロットする場合、coder.extrinsic を使用して外部関数として関数を宣言します。

coder.extrinsic("patch"); 
外部関数を宣言した後、その関数を宣言の下のコードで使用できます。

plotaxis などの一部のプロット関数は、MATLAB Function ブロックで自動的に外部関数として扱われます。coder.extrinsic を使用してそれらを外部関数として明示的に宣言する必要はありません。

外部関数は、生成されるスタンドアロン コードからは省略されます。そのため、スタンドアロン コードを生成する際、ブロックの出力に影響する外部関数は使用しないでください。詳細については、コード生成における関数呼び出しの解決およびcoder.extrinsic コンストラクトの使用を参照してください。

コード生成用の変数の準備

効率的なスタンドアロン コードを生成するには、MATLAB でコードを実行するときの通常の方法とは別の方法でデータ型を定義する必要があります。コード生成のためのデータの定義に関する考慮事項を参照してください。

一度変数にプロパティを割り当てた後は、いくつかの例外を除き、そのクラス、サイズ、実数/複素数を関数本体の他の場所で再定義することはできません。変数プロパティの再代入を参照してください。

MATLAB Function ブロックでの非直達の使用

Simulink ブロックでは、"直達" とはブロックの出力を入力端子信号の値で直接制御することを意味します。非直達では、出力信号の値は、シミュレーション中の少なくとも 1 つの関数の入力信号の値に依存しません。

既定では、MATLAB Function ブロックで直達が有効になります。直達を無効にすると、Simulink セマンティクスによって、出力が現在の状態にのみ依存することが確実になります。非直達を使用すると、フィードバック ループで MATLAB Function ブロックを使用し、代数ループを回避できます。

非直達を使用するには、次を行います。

  • 最上位関数の本体内で coder.inline を使用することで、MATLAB Function ブロックの関数のインライン化を有効にする。

  • MATLAB Function ブロックのプロパティを開き、[直達を許可] をオフにします。詳細については、MATLAB Function ブロック プロパティの指定を参照してください。

非直達の制限

[直達を許可] がオフになっている場合、入力または更新された永続変数に依存する出力はプログラムしないでください。たとえば、以下は使用しないでください。

counter = counter + 1;  	% update state
output = counter;       	% compute output based on updated state
代わりに、以下のコードを使用します。
output = counter;       	% compute output based on current state
counter = counter + 1;  	% update state
詳細については、MATLAB 関数での永続変数の初期化を参照してください。

また、カスタム コード関数の出力は現在の状態のみに依存するように強制できないため、MATLAB Function ブロックでカスタム コード関数を呼び出すことはできません。MATLAB Function ブロックでカスタム コード関数を呼び出すとエラーが発生します。

さらに、関数呼び出しの出力をもつ MATLAB Function ブロックは予期しない結果になることがあります。[直達を許可] が無効になっている場合、トリガーされるサブシステムは関数呼び出しをモデルの更新フェーズで受け取るため、必要とされるよりも後に関数呼び出しの出力が実行されます。このような問題を回避するために、関数呼び出しの出力を使用する際は [直達を許可] を有効にしてください。

参考

関連するトピック