Main Content

モデルからの Simulink 関数の呼び出し

Simulink® 関数には、プログラミング言語に似た入力引数と出力引数を使用するインターフェイスがあります。Simulink 関数の呼び出し元は、Simulink 関数に入力引数を介してデータを送り、関数を実行し、出力引数を介して関数からデータを受け取ります。次を使用して Simulink 関数を呼び出すことができます。

  • Function Caller ブロック

  • MATLAB Function ブロック

  • Stateflow® チャート

次のセクションで Simulink 関数を呼び出す方法を説明します。関数 y = timestwo(x) は呼び出し元からの値 (x) を 2 で乗算してから、計算された値 (y) を呼び出し元に送り返します。関数を作成するにはモデルへの Simulink 関数の追加を参照してください。

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

ex_simulink_functions_and_function_callers という名前のモデルでは、Simulink 関数を作成して呼び出す複数の方法が説明されています。

このモデルでは、Simulink 関数を次の 3 つの方法で作成します。

  • Simulink Function ブロック

  • グラフィカル関数をエクスポートする Stateflow チャート

  • MATLAB 関数をエクスポートする Stateflow チャート

このモデルでは、各 Simulink 関数を次の 3 つの方法で呼び出します。

  • Function Caller ブロック

  • MATLAB Function ブロック

  • Stateflow チャート

Simulink 関数とその呼び出し元との間のラインによる接続を視覚的に表示するには、[デバッグ] タブにある [情報のオーバーレイ] で、[関数コネクタ] ボタンを選択します。

Function Caller ブロックを使用した Simulink Function ブロックの呼び出し

入力引数を介して Simulink Function ブロックにデータを送信する Function Caller ブロックを設定し、出力引数を介して関数からデータを受け取ります。

  1. Function Caller ブロックをモデルに追加します。

  2. Function Caller ダイアログ ボックスを開きます。[関数プロトタイプ] ボックスで y = timestwo(x) を入力します。この関数プロトタイプは、Function Caller ブロックに入力端子 x と出力端子 y を作成します。

    メモ

    空白のテキスト ボックスに入力すると、入力しているテキストに一致する以前作成した関数プロトタイプのリストが表示されます。

  3. Simulink Function ブロックを使用した Simulink 関数の作成で説明しているように Simulink Function ブロックを追加して設定します。

    メモ

    Simulink Function ブロックの関数名と引数名と、Function Caller ブロックの [関数プロトタイプ] は、正確に一致していなければなりません。

    After you configure the block, the Function Caller block has an input port x and an output port y. The function prototype is displayed in the Simulink Function block.

関数呼び出しのテスト

  1. 入力にテスト データを供給する Sine Wave ブロックと、出力から結果を表示する Scope ブロックを追加します。

    After you add the components to test the function call, there is a Sine Wave block as input to the function caller which sends output to a Scope block.

  2. シミュレーションを実行します。振幅 2 の入力正弦波は 2 倍になります。

    A scope displaying a sine wave with an amplitude of 4.

MATLAB Function ブロックを使用した Simulink Function ブロックの呼び出し

入力引数を介して Simulink Function ブロックにデータを送信する MATLAB Function ブロックを設定し、出力引数を介して関数からデータを受け取ります。

  1. MATLAB Function ブロックをモデルに追加します。

  2. このブロックをダブルクリックして MATLAB® エディターを開きます。関数呼び出し y1 = timestwo(x1) を入力します。

    MATLAB code editor with function algorithm defined as y1 equals timestwo of x1.

    メモ

    MATLAB Function ブロック内で定義する関数の引数名は、Simulink Function ブロック内で定義する関数の引数名と一致する必要はありません。Simulink Function を呼び出す Function Caller ブロックの場合、引数名は一致しなければなりません。

    メモ

    MATLAB Function ブロックは離散サンプル時間と固定マイナー サンプル時間のみをサポートします。

  3. Simulink Function ブロックを使用した Simulink 関数の作成で説明しているように Simulink Function ブロックを追加して設定します。

    After you configure the block, the Function Caller block has an input port x1 and an output port y1. The function prototype is displayed in the Simulink Function block.

関数呼び出しのテスト

  1. 入力にテスト データを供給する Sine Wave ブロックと、出力から結果を表示する Scope ブロックを追加します。

    After you add the components to test the function call, there is a Sine Wave block as input to the function caller which sends output to a Scope block.

  2. Sine Wave ブロックの場合、[サンプル時間]0.01 に設定します。モデルの場合、[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインを開きます。[タイプ][固定ステップ][固定ステップ サイズ]0.01 に設定します。

  3. シミュレーションを実行します。

Stateflow チャートを使用した Simulink Function ブロックの呼び出し

入力引数を介して Simulink Function ブロックにデータを送信する Stateflow チャートを設定し、出力引数を介して関数からデータを受け取ります。

  1. Stateflow チャートを Simulink モデルに追加します。Simulink ブロック線図でダブルクリックします。検索ボックスで chart を入力し、検索結果から [チャート] を選択します。

  2. チャートをダブルクリックして開きます。

  3. 左側のツール バーで、デフォルト遷移アイコン をクリックし、チャートにドラッグします。

  4. チャートに入力端子を追加します。モデル エクスプローラーを開きます。左側のペインで Chart を選択します。メニューから、[追加][データ] を選択します。[名前]x1 に、[スコープ][入力] に設定します。

    メモ

    Stateflow チャートで定義する関数の引数名は、Simulink Function ブロックで定義する関数の引数名と一致する必要はありません。Simulink Function を呼び出す Function Caller ブロックの場合、引数名は一致しなければなりません。

  5. チャートに出力端子を追加します。メニューから、[追加][データ] を選択します。[名前]y1 に、[スコープ][出力] に設定します。

  6. Sine Wave ブロックを追加し、信号出力をチャートの入力端子に接続します。Scope ブロックを追加し、入力をチャートの出力端子に接続します。

  7. 遷移コードを編集して関数を呼び出します。たとえば、Simulink Function ブロックを呼び出すには、次を入力します。

    {y1=timestwo_sf(x1);}

    メモ

    Stateflow チャートへの入力信号は、連続または離散のどちらであっても構いません。

  8. Simulink Function ブロックを使用した Simulink 関数の作成で説明しているように Simulink Function ブロックを追加して設定します。

    After you configure the Stateflow chart, the chart block has an input of x1, output of y1, and shows the transition code which calls the Simulink Function.

関数呼び出しのテスト

  1. 入力にテスト データを供給する Sine Wave ブロックと、出力から結果を表示する Scope ブロックを追加します。

    After you add the components to test the function call, there is a Sine Wave block as input to the Stateflow chart which sends output to a Scope block.

  2. Sine Wave ブロックの場合、[サンプル時間]0.01 に設定します。モデルの場合、[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインを開きます。[タイプ][固定ステップ][固定ステップ サイズ]0.01 に設定します。

  3. シミュレーションを実行します。

複数のサイトからの Simulink Function ブロックの呼び出し

複数のサイトから Simulink Function ブロックを呼び出す場合、すべての呼び出しサイトが関数の状態を共有します。たとえば、2 つの呼び出しを含む Stateflow チャートと同じ関数の呼び出しを含む 2 つの Function Caller ブロックがあると仮定します。

Simulink canvas with a Stateflow chart, a Simulink Function block, and 2 Function Caller blocks.

Simulink Function ブロックで定義される関数は 1 の入力で呼び出されるたびに 1 ずつインクリメントされるカウンターです。

To represent the function algorithm, the Simulink canvas has a trigger port, counter, with an input of u, an Add block, a Unit Delay block, and an output of y.

2 つの Function Caller ブロックと Stateflow チャートからの呼び出しの間でブロック値が維持されるため、Unit Delay ブロックには状態があります。概念上、これは以下のように MATLAB コードに実装される関数と考えることができます。

function y = counter(u)
persistent state;
if isempty(state)
      state = 0;
end
y = state;
state = state + u;

Simulink は Unit Delay ブロックの状態値をシミュレーションの開始時に初期化します。その後は、関数が呼び出されるたびに状態値が更新されます。

この例では、Scope1 で観測される出力はタイム ステップごとに 4 ずつインクリメントします。Scope2Scope3Scope4 も似たような動作を示します。関数呼び出しの実行シーケンスによる観測信号のシフトが唯一の違いです。

A scope displaying a step function incrementing by 4 each time step.

複数の呼び出しがある診断設定

1 つの関数を共有し、サンプル時間レートが異なる複数の呼び出しでは、データの整合性とリアルタイム コードの一貫性が問題になる場合があります。診断の重大度を制御することを検討します。

[固定ステップ] ソルバーを選択します。[各離散レートを個別のタスクとして扱う] パラメーターを以下のように設定します。

  • オフにし (シングルタスク)、[シングルタスク データ転送] パラメーターを [なし] (既定)、[警告] または [エラー] に設定する。

  • オンにし (マルチタスク)、[マルチタスク データ転送] パラメーターを [エラー] (既定) または [警告] に設定する。

参考

| | | |

関連するトピック