ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ブロックを使用した MATLAB Functions の実装

MATLAB Function ブロックは、カスタム MATLAB® 関数を Simulink に実装する最も簡単な方法です。Simulink® のグラフィックス言語によって表現されない機能をモデル化するには、MATLAB のテキスト言語で容易に表現されるアルゴリズムの場合は、MATLAB Function ブロックを使用できます。MATLAB Function ブロックを使用して、読み取り可能で効率的かつコンパクトな C/C++ コードを生成し、デスクトップおよび組み込みアプリケーションに配布します。

つまり、MATLAB Function ブロックにより、MATLAB 言語を使用するカスタム機能を定義できます。これらのブロックは、以下の場合に、カスタム機能を作成する適切な開始点です。

  • カスタム化する機能をモデル作成する既存の MATLAB 関数がある。

  • Simulink ブロック線図を使うより MATLAB 関数を使った方がカスタム機能のモデル作成が容易な場合。

  • カスタム化する機能が連続状態または離散ダイナミクス状態を含まない。動的状態をモデル化するには、S-Function を使用する。

MATLAB Function ブロックを使用するタイミングの決定

MATLAB Function ブロックは次の機能を提供します。

  • MATLAB 関数から組み込み可能なアプリケーションを作成できる — MATLAB Function ブロックは、効率の良い C/C++ コードを生成する MATLAB ツールボックス関数の一部をサポートしています。詳細については、C/C++ コードの生成でサポートされている関数およびオブジェクト — アルファベット順を参照してください。このサポートによって、Simulink Coder™ を使用して MATLAB Function ブロックから高度な数学アプリケーションを実装する組み込み可能な C コードを生成できます。つまり、MATLAB の機能を取り入れた実行可能ファイルを作成して MATLAB 環境の外で実行できます。

  • プロパティを Simulink 入出力信号から継承する — 既定の設定では、MATLAB Function ブロックへの入出力信号のデータ型とサイズは Simulink 信号から継承されます。モデル エクスプローラー (モデル エクスプローラーを使用した検索と編集 を参照) または [端子とデータの管理] (端子とデータの管理 を参照) で入力と出力のサイズとデータ型を明示的に指定することもできます。

MATLAB Function ブロックからの関数の呼び出し

MATLAB コードを Simulink モデルに統合するには、MATLAB Function ブロックから次のいずれかの関数を呼び出します。

  • ローカル関数 — MATLAB Function ブロックの本体で定義されたローカル関数を呼び出すことができます。

  • コード生成をサポートする MATLAB ツールボックス関数 — MATLAB Function ブロックから、コード生成をサポートするツールボックス関数を呼び出すことができます。Simulink Coder を使ってモデルを作成するとき、これらの関数は、デスクトップおよび組み込み環境におけるメモリやパフォーマンスの要件を満たすように最適化された C コードを生成します。サポートされている関数の一覧は、C/C++ コードの生成でサポートされている関数およびオブジェクト — アルファベット順 を参照してください。

  • コード生成をサポートしない MATLAB 関数 — MATLAB Function ブロックから "外部" 関数を呼び出すこともできます。これらは、MATLAB パス上の関数で、ターゲット言語でサポートされていないため、実行するためにコンパイラによって MATLAB に送られます。これらはコードを生成しませんが、モデルのシミュレーション中に MATLAB ワークスペースでのみ実行されます。coder.extrinsic を使用して外部関数として明示的に宣言しなければ、Simulink Coder ソフトウェアはすべての MATLAB 関数をコンパイルしようとします。MATLAB 関数の外部関数としての宣言を参照してください。

    コード生成ソフトウェアでは plotdispfigure などの多くの一般的な可視化関数の呼び出しを検出します。MEX コード生成の場合、これらの関数に対して MATLAB を自動的に呼び出します。スタンドアロン コード生成の場合、これらの可視化関数のコードは生成されません。したがって、関数 coder.extrinsic を使用して、これらの関数を外部として宣言する必要はありません。コード生成における関数呼び出しの解決を参照してください。

  • Simulink Function ブロックと Stateflow® ブロックの関数 — MATLAB Function ブロックから、Simulink Function ブロックで定義された関数を呼び出すこともできます。関数 Stateflow は、[チャート プロパティ] ダイアログ ボックスで [チャート レベルの関数をエクスポート (グローバル)] および [エクスポートされた関数の Simulink による呼び出しを許可] チェック ボックスをオンにすると、呼び出すことができます。Simulink Function ブロックと Stateflow ブロックで定義された関数を呼び出す方法の詳細については、Simulink Function ブロックとエクスポートされた Stateflow 関数の使用を参照してください。

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

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

既定の設定では、MATLAB Function ブロックで直達が有効になっています。直達を無効にすると、Simulink セマンティクスによって、出力が現在の状態にのみ依存することが確実になります。非直達を使用すると、フィードバック ループで 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

メモ

非直達を使用するには、coder.inline を使用して関数のインライン化を有効にする必要があります。

参考

関連するトピック