このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
モデルからの 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 ブロックを設定し、出力引数を介して関数からデータを受け取ります。
Function Caller ブロックをモデルに追加します。
Function Caller ダイアログ ボックスを開きます。[関数プロトタイプ] ボックスで
y = timestwo(x)
を入力します。この関数プロトタイプは、Function Caller ブロックに入力端子x
と出力端子y
を作成します。メモ
空白のテキスト ボックスに入力すると、入力しているテキストに一致する以前作成した関数プロトタイプのリストが表示されます。
Simulink Function ブロックを使用した Simulink 関数の作成で説明しているように Simulink Function ブロックを追加して設定します。
メモ
Simulink Function ブロックの関数名と引数名と、Function Caller ブロックの [関数プロトタイプ] は、正確に一致していなければなりません。
関数呼び出しのテスト
入力にテスト データを供給する Sine Wave ブロックと、出力から結果を表示する Scope ブロックを追加します。
シミュレーションを実行します。振幅
2
の入力正弦波は 2 倍になります。
MATLAB Function ブロックを使用した Simulink Function ブロックの呼び出し
入力引数を介して Simulink Function ブロックにデータを送信する MATLAB Function ブロックを設定し、出力引数を介して関数からデータを受け取ります。
MATLAB Function ブロックをモデルに追加します。
このブロックをダブルクリックして MATLAB® エディターを開きます。関数呼び出し
y1 = timestwo(x1)
を入力します。メモ
MATLAB Function ブロック内で定義する関数の引数名は、Simulink Function ブロック内で定義する関数の引数名と一致する必要はありません。Simulink Function を呼び出す Function Caller ブロックの場合、引数名は一致しなければなりません。
メモ
MATLAB Function ブロックは離散サンプル時間と固定マイナー サンプル時間のみをサポートします。
Simulink Function ブロックを使用した Simulink 関数の作成で説明しているように Simulink Function ブロックを追加して設定します。
関数呼び出しのテスト
入力にテスト データを供給する Sine Wave ブロックと、出力から結果を表示する Scope ブロックを追加します。
Sine Wave ブロックの場合、[サンプル時間] を
0.01
に設定します。モデルの場合、[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインを開きます。[タイプ] を[固定ステップ]
、[固定ステップ サイズ] を0.01
に設定します。シミュレーションを実行します。
Stateflow チャートを使用した Simulink Function ブロックの呼び出し
入力引数を介して Simulink Function ブロックにデータを送信する Stateflow チャートを設定し、出力引数を介して関数からデータを受け取ります。
Stateflow チャートを Simulink モデルに追加します。Simulink ブロック線図でダブルクリックします。検索ボックスで
chart
を入力し、検索結果から[チャート]
を選択します。チャートをダブルクリックして開きます。
左側のツール バーで、デフォルト遷移アイコン をクリックし、チャートにドラッグします。
チャートに入力端子を追加します。モデル エクスプローラーを開きます。左側のペインで
Chart
を選択します。メニューから、[追加] 、 [データ] を選択します。[名前] をx1
に、[スコープ] を[入力]
に設定します。メモ
Stateflow チャートで定義する関数の引数名は、Simulink Function ブロックで定義する関数の引数名と一致する必要はありません。Simulink Function を呼び出す Function Caller ブロックの場合、引数名は一致しなければなりません。
チャートに出力端子を追加します。メニューから、[追加] 、 [データ] を選択します。[名前] を
y1
に、[スコープ] を[出力]
に設定します。Sine Wave ブロックを追加し、信号出力をチャートの入力端子に接続します。Scope ブロックを追加し、入力をチャートの出力端子に接続します。
遷移コードを編集して関数を呼び出します。たとえば、Simulink Function ブロックを呼び出すには、次を入力します。
{y1=timestwo_sf(x1);}
メモ
Stateflow チャートへの入力信号は、連続または離散のどちらであっても構いません。
Simulink Function ブロックを使用した Simulink 関数の作成で説明しているように Simulink Function ブロックを追加して設定します。
関数呼び出しのテスト
入力にテスト データを供給する Sine Wave ブロックと、出力から結果を表示する Scope ブロックを追加します。
Sine Wave ブロックの場合、[サンプル時間] を
0.01
に設定します。モデルの場合、[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインを開きます。[タイプ] を[固定ステップ]
、[固定ステップ サイズ] を0.01
に設定します。シミュレーションを実行します。
複数のサイトからの Simulink Function ブロックの呼び出し
複数のサイトから Simulink Function ブロックを呼び出す場合、すべての呼び出しサイトが関数の状態を共有します。たとえば、2 つの呼び出しを含む Stateflow チャートと同じ関数の呼び出しを含む 2 つの Function Caller ブロックがあると仮定します。
Simulink Function ブロックで定義される関数は 1
の入力で呼び出されるたびに 1
ずつインクリメントされるカウンターです。
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
ずつインクリメントします。Scope2
、Scope3
、Scope4
も似たような動作を示します。関数呼び出しの実行シーケンスによる観測信号のシフトが唯一の違いです。
複数の呼び出しがある診断設定
1 つの関数を共有し、サンプル時間レートが異なる複数の呼び出しでは、データの整合性とリアルタイム コードの一貫性が問題になる場合があります。診断の重大度を制御することを検討します。
[固定ステップ]
ソルバーを選択します。[各離散レートを個別のタスクとして扱う] パラメーターを以下のように設定します。
オフにし (シングルタスク)、[シングルタスク データ転送] パラメーターを
[なし]
(既定)、[警告]
または[エラー]
に設定する。オンにし (マルチタスク)、[マルチタスク データ転送] パラメーターを
[エラー]
(既定) または[警告]
に設定する。
参考
Simulink Function | Argument Inport | Argument Outport | Function Caller | MATLAB Function