メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

関数の呼び出し元と関数プロトタイプを使用して、モデルの階層構造で Simulink® 関数を呼び出して実行できます。関数が呼び出されると、呼び出し元は入力引数を介して関数にデータを送り、出力引数を介して関数からデータを受け取ります。Simulink 関数はいくつかの方法で呼び出すことができます。

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

  • Chart (Stateflow) — Simulink で定義された関数または Stateflow からエクスポートされた関数を呼び出します。参照モデルで定義された関数の場合は、チャート内の Simulink 関数に Function Caller ブロックをラップします。

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

  • MATLAB System ブロック — System object™ および MATLAB 言語を使用して関数を呼び出します。MATLAB System ブロックからの Simulink 関数の呼び出しを参照してください。

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

  • SimEvents® イベント アクション — SimEvents ブロックのイベント アクションから関数を呼び出します。Events and Event Actions (SimEvents)を参照してください。

以下のセクションでは、Function Caller ブロック、Chart ブロック、MATLAB Function ブロックを使用して Simulink 関数を呼び出す方法を示します。関数 y = timestwo(x) は呼び出し元からの値 (x) を 2 で乗算してから、計算された値 (y) を呼び出し元に送り返します。関数を定義するには、モデルでの Simulink 関数の定義を参照してください。

Simulink 関数の定義と呼び出し

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

このモデルでは、Simulink 関数を次の方法で定義します。

  • Simulink Function ブロック

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

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

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

  • Function Caller ブロック

  • MATLAB Function ブロック

  • Stateflow チャート

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

入力引数を介して Simulink 関数にデータを送り、出力引数を介して関数からデータを受け取る 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 倍になります。

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

入力引数を介して Simulink 関数にデータを送り、出力引数を介して関数からデータを受け取る 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 関数の呼び出し

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

参照モデルで定義された関数の場合は、チャート内の Simulink 関数に Function Caller ブロックをラップします。

  1. Stateflow チャートを Simulink モデルに追加します。

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

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

  4. チャートに入力端子を追加します。

    1. モデル エクスプローラーを開きます。

    2. 左側のペインで Chart を選択します。

    3. メニューから、[追加][データ] を選択します。

    4. [名前]x1 に、[スコープ][入力] に設定します。

    メモ

    Stateflow チャートで定義する関数の引数名は、Simulink Function ブロックで定義する関数の引数名と一致する必要はありません。

  5. チャートに出力端子を追加します。

    1. メニューから、[追加][データ] を選択します。

    2. [名前]y1 に、[スコープ][出力] に設定します。

  6. 遷移のラベルを入力して関数を呼び出します。たとえば、Simulink Function ブロックを呼び出すには、次を入力します。

    {y1=timestwo_sf(x1);}

    メモ

    Stateflow チャートへの入力信号は連続でも離散でもかまいません。

  7. 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 関数の呼び出し

Simulink 関数は複数回呼び出すことができます。Simulink Function ブロックで定義された関数の呼び出しが複数ある場合、状態値は異なる呼び出し元から発信される呼び出しの間で維持されます。

たとえば、2 つの呼び出しを含む Stateflow チャートと同じ関数 counter の呼び出しを含む 2 つの Function Caller ブロックがあるとします。

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

counter という名前の関数は Simulink Function ブロックで定義されています。counter 関数が呼び出されるたびに、入力引数 u1 ずつインクリメントされます。

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 も似たような動作を示します。関数呼び出しの実行シーケンスによる観測信号のシフトが唯一の違いです。

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

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

[固定ステップ] ソルバーを選択します。[各離散レートを個別のタスクとして扱う] パラメーターを使用して、シングル タスク データ転送とマルチタスク データ転送のどちらで実行するかを指定します。

  • シングル タスク データ転送の場合、[各離散レートを個別のタスクとして扱う] をオフにし、[シングルタスク データ転送] パラメーターを [なし] (既定)、[警告]、または [エラー] に設定します。

  • マルチタスク データ転送の場合、[各離散レートを個別のタスクとして扱う] をオンにし、[マルチタスク データ転送] パラメーターを [エラー] (既定) または [警告] に設定します。

参考

| (Stateflow) | |

トピック