Main Content

Simulink 関数の概要

Simulink 関数とは

Simulink® 関数は、一連の入力が与えられた場合に一連の出力を計算する計算単位です。関数ヘッダーでは MATLAB® や C++ などのプログラミング言語に似た表記を使用します。Simulink 関数はいくつかの方法で定義して実装できます。

  • Simulink Function ブロックSimulink Function ブロック内で Simulink ブロックを使用して定義される関数。

  • エクスポートされた Stateflow® グラフィカル関数 — Stateflow チャート内でステート遷移で定義され、Simulink モデルにエクスポートされる関数。

  • エクスポートされた Stateflow MATLAB 関数 — Stateflow チャート内で MATLAB 言語ステートメントを使用して定義され、Simulink モデルにエクスポートされる関数。

  • S-FunctionS-function ブロックを使用して定義される関数。S-Function の例については、sfcndemo_simulinkfunction_getset を開いてください。

Simulink の関数の呼び出し元とは

Simulink 関数の呼び出し元は Simulink 関数の実行をモデルまたはチャート階層の任意の場所から呼び出します。

  • Function Caller ブロック — Simulink で定義された関数または Stateflow からエクスポートされた関数を呼び出します。Function Caller を参照してください。

  • Stateflow チャート遷移 — Stateflow チャート内で Simulink で定義された関数または Stateflow からエクスポートされた関数を呼び出します。

  • MATLAB Function ブロック — MATLAB 言語スクリプトから関数を呼び出します。

  • S-Function ブロック — システム メソッドを使用して関数を呼び出します。ssDeclareFunctionCaller および ssCallSimulinkFunction を参照してください。

  • MATLAB System ブロック — System object™ および MATLAB 言語を使用して関数を呼び出します。

ローカル信号への接続

Argument Inport ブロックや Argument Outport ブロックだけでなく、Simulink Function ブロックもブロックのローカル環境において、Inport ブロックまたは Outport ブロックを介して信号に対するインターフェイスとして機能できます。これらの信号は呼び出し元から隠されています。端子ブロックを使用して 2 つの Simulink Function ブロックを接続し、その間の通信を行ったり、外部 I/O を表すルートの Inport ブロックと Outport ブロックに接続したりできます。

Simulink canvas with a Simulink Function block with input, In1, and output, Out1.

また、Outport ブロックをログ ブロック (To FileTo Workspace) や表示ブロック (ScopeDisplay) を含む Sink ブロックに接続することもできます。ただし、これらのブロックは他のすべてのブロックの後に実行されます。

Simulink Function ブロックは Outport ブロックへの関数呼び出しイベントを出力できます。

関数を使用した再利用可能なロジック

モデルの階層構造にわたって再利用可能なロジックが必要なときに関数を使用します。再利用可能なロジックを使用した Simulink 関数が Stateflow チャート内で定義されている例について考えます。

Simulink canvas with a Sine Wave block as input to a Stateflow chart which sends output to a Scope block.

再利用可能なロジックは Stateflow チャートから Simulink Function ブロックに移すことができます。このロジックはその後、Simulink サブシステム (Subsystem および Model ブロック) と Stateflow チャートの任意のモデルの階層構造レベルで、関数呼び出しにより再利用可能になります。

Simulink canvas with a Simulink Function block and a Sine Wave block as input to a Stateflow chart which sends output to a Scope block.

その結果、再利用するためのモデル構造の自由度が高まります。

メモ

Stateflow チャートから関数を呼び出すときの入力引数と出力引数の名前 (x2y2) は、Simulink Function ブロックの関数プロトタイプの引数の名前 (uy) と一致している必要はありません。

入力 / 出力引数動作

Simulink Function ブロックの関数プロトタイプは、同じ入力引数と出力引数をもつことができます。たとえば、ノイズを除去する関数は、信号を入力し、除去した後に信号を返すことができます。

mySignal = filter(mySignal)

Function Caller ブロックで関数を呼び出し、ノイズをテスト信号に追加して、関数のアルゴリズムを検証できます。

Simulink canvas with a Sine Wave block and Band-Limited White Noise block connected to an Add block. The Add block is the input to the Function Caller block which sends output to the Scope block. There is also a Simulink Function block which defines the filter function.

このモデルにコードを生成すると、Simulink Function ブロックの入力引数は信号値のコピーではなく、信号にポインターを渡します。

void filter(real_T *rtuy_mySignal)
{
		. . .
		*rtuy_mySignal = model_P.DiscreteFilter_NumCoef * DiscreteFilter_tmp; 
	}

関数を使用した共有リソース

プリンターなどの共有リソースをモデル化する場合、関数を使用します。モデル slexPrinterExample は、複数のコンピューターとプリンター プロセスをモデル化する単一の Stateflow チャート間の共通インターフェイスとして Simulink Function® ブロックを使用します。

slexPrinterExample を開く場合は、Simulink 関数を使用した共有プリンターでのインク状態の監視を参照してください。

Simulink canvas with 3 subsystems representing computers. Each computer subsystem is connected to a Mux block which is connected to a Scope block. A Simulink Function block defining the printerInk function and another Simulink Function block defining the addPrintJob function. There is also a Stateflow chart to model the state of the printing.

Function Caller による関数の特定方法

関数インターフェイスは MATLAB 構文を使用してその入力引数と出力引数を定義します。関数名は有効な ANSI® C 識別子です。モデルの階層構造には特定された関数名をもつ 1 つの関数定義のみを含めることができます。Simulink は次を検証します。

  • Function Caller ブロックの [関数プロトタイプ] パラメーター内の引数が関数に定義された引数と一致する。たとえば、2 つの入力引数と 1 つの出力引数をもつ関数は以下のように表示されます。

    y = MyFunction(u1, u2)

  • 引数のデータ型、次元および実数/複素数は一致しなければなりません。Function Caller ブロックでは、[入力引数の仕様] パラメーターと [出力引数の仕様] パラメーターを設定できますが、通常これらのパラメーターを手動で指定する必要はありません。Simulink は関数から指定を導出します。

    引数パラメーターを指定しなければならないのは、Function Caller ブロックがモデル内またはモデルが参照する任意の子モデル内で関数を見つけられない場合のみです。この状況は、Function Caller ブロックと呼び出される関数が、共通の親モデルから参照される別のモデルに含まれているときに起こる可能性があります。参照モデルにおける Simulink Function ブロックおよびSimulink Function ブロックの引数の指定を参照してください。

Simulink Function ブロックを使用する理由

トリガーに直接信号が接続されている Function-Call Subsystem ブロックは Simulink Function ブロックよりも信号のトレーサビリティに優れていますが、Simulink Function ブロックにはその他の利点があります。

  • 信号線の経路を排除します。Function Caller ブロックでは、信号線を接続せずに Simulink Function ブロックで定義された関数を実行できます。さらに、関数およびその呼び出しは異なるモデルまたはサブシステムに置くことができます。この方法により、階層モデル構造にまたがる信号の経路指定の問題が排除され、モデル コンポーネントをより多く再利用できます。

  • 同じ関数に複数の呼び出し元を使用します。複数の Function Caller ブロックまたは Stateflow チャートで同じ関数を呼び出すことができます。関数に状態 (たとえば Unit Delay ブロック) が含まれる場合、その状態は異なる呼び出し元の間で共有されます。

  • 関数インターフェイスを関数定義から分離します。関数は実装と関数インターフェイス (入力引数と出力引数) を区別します。したがって、Simulink Function ブロックを使用した関数、Stateflow からエクスポートしたグラフィカル関数、Stateflow からエクスポートした MATLAB 関数を定義できます。呼び出し元は関数の実装方法または実装場所を知る必要はありません。

Simulink 関数または再利用可能なサブシステムの選択

Simulink Function ブロックまたは Subsystem ブロックの使用に関する考慮は、関数呼び出しの間で共有される状態に基づいて行わなければなりません。Simulink Function ブロックは共有される状態をもちますが、Subsystem ブロックは再利用可能な関数として指定されている場合であっても共有される状態をもちません。

  • Simulink Function ブロックでは、1 つのブロックに複数の呼び出し元がある場合、コードは常に 1 つの関数に対して生成されます。Simulink Function ブロックが状態をもつブロック (DelayMemory など) を含んでいる場合、状態は永続的で関数の呼び出し元の間で共有されます。この場合、呼び出しの順序は重要な考慮事項になります。

  • Subsystem ブロックでは、1 つのブロックに複数のインスタンスがあり、再利用可能な関数として設定されている場合、コードは通常、最適化として 1 つの関数に対して生成されます。Subsystem ブロックに状態をもつブロックが含まれている場合でも、コードは 1 つの関数に対して生成されますが、異なる状態変数がその関数に渡されます。インスタンス間で状態は共有されません。

Simulink Function ブロックを使用しない場合

Simulink Function ブロックでは関数をグラフィカルに実装できますが、Simulink Function ブロックを使用することが最適なソリューションではない場合があります。

たとえば、PID コントローラーまたはデジタル フィルターをモデル化するときに、動的システムを定義する方程式をモデル化する必要がある場合です。次の状況が発生する可能性があるため、連立方程式を実装するには S-FunctionSubsystem または Model ブロックを使用し、Simulink Function ブロックは使用しません。

  • 関数呼び出し間の状態の持続性。Simulink Function ブロックが状態をもつ任意のブロック (Unit DelayMemory など) を含む場合、それらの状態の値は関数呼び出しの間で維持されます。その関数に対して複数の呼び出しがある場合、状態値は異なる呼び出し元から発信される呼び出しの間でも維持されます。

  • 連続サンプル時間の継承。Simulink Function ブロックは連続サンプル時間を継承できません。したがって、連続サンプル時間を使用して連続する連立方程式をモデル化するシステムではこのブロックを使用しないでください。

Simulink 関数のトレース

Simulink 関数とその呼び出し元との間の接続を、呼び出し元を関数に接続するラインを使用して視覚的に表示します。

  • トレース ラインのオン/オフ — [デバッグ] タブの [情報のオーバーレイ] [コネクタ] をクリックします。Simulink キャンバスに表示された [コネクタ] ペインで [関数コネクタ] オプションを選択します。

  • トレース ラインの方向 — ブロックの下部で接続されるラインは関数の呼び出し元からのものです。ブロックの上部で接続されるラインは Simulink 関数または関数を含むサブシステムに向かうものです。

    After you turn on tracing lines, a line is displayed connecting the Simulink Function block to the Function Caller block.

    When the Simulink Function block is contained in a subsystem, the line is connected to the Subsystem block.

  • 関数への移動 — 関数の呼び出し元はサブシステム内に配置できます。

    When the Function Caller block is contained in a subsystem, the line is connected to the Subsystem block.

    サブシステム内の呼び出し元から関数に移動するには、最初にサブシステムを開いて、その関数へのリンクをクリックします。

    Simulink canvas with a Sine Wave block connected as input to a Function Caller block which sends output to a Scope block. Below the Function Caller block is a link to the function.

    関数がモデルのルートレベルにある場合、関数が開きます。関数がサブシステム内にある場合、その関数を含むサブシステムが開きます。

Simulink 関数を使用した共有プリンターでのインク状態の監視

[関数コネクタ] を選択すると、モデル slexPrinterExample に呼び出し元と関数の関係が示されます。

この例では、Simulink Function ブロック addPrintJobFunction Caller はエクスポートされた Stateflow 関数 queuePrintJob を呼び出します。サブチャート BusySimulink Function ブロック printerInk を呼び出します。トレース ラインは Stateflow チャートとの間で描画されます。

slexPrinterExample を開く場合は、Simulink 関数を使用した共有プリンターでのインク状態の監視を参照してください。

In the slexPrinterExample, the tracing lines connect each computer to the addPrintJob Simulink Function block. The printerInk function and the addPrintJob function also have lines connecting to the Stateflow chart.

関数呼び出しの強調表示とアニメーション化

アニメーションを使用して関数呼び出しを強調表示します。

以下の例では、アニメーション化された Simulink 関数呼び出しが静止した状態を示します。

アニメーションにアクセスするには、ツールストリップの [デバッグ] タブにある [イベント アニメーション] セクションで、アニメーション速度を [低速][中速]、または [高速] に設定します。

[イベント アニメーション] は、Messages & Events ライブラリのブロック、Stateflow チャート、Function-Call Subsystem ブロック、Simulink 関数、SimEvents® ブロックなど、モデル内にイベント ブロックがある場合に表示されます。

参考

| | | |

関連するトピック