Stateflow チャートでの Simulink 関数の再利用
Simulink® 関数は、ステートと遷移のアクションにおいて Simulink サブシステムの呼び出しを可能にするグラフィカル オブジェクトです。Simulink 関数は、MATLAB® 内のスタンドアロンの Stateflow® チャートではサポートされません。
Simulink 関数を使用すると、設計の効率性が向上し、モデルの可読性も高くなります。代表的な使用例は、以下のとおりです。
Simulink ブロックを必要とする関数の定義
複数コントローラーの実行のスケジュール
Stateflow チャートで Simulink 関数を使用する利点は、以下のとおりです。
Function-Call Subsystem ブロックが不要
出力イベントが不要
信号線が不要
Simulink 関数は、チャート、ステート、またはサブチャート内の任意の場所に配置できます。関数の場所により、その関数を呼び出すことのできるステートと遷移が決まります。
単一のステート、またはサブチャートとそのサブステートの内部でのみ関数を呼び出す場合は、Simulink 関数をそのステートまたはサブチャートに配置します。その関数は、そのステートまたはサブチャートの親に含まれるその他すべての同じ名前の関数をオーバーライドします。
チャートの任意の位置から関数を呼び出す場合は、Simulink 関数をチャート レベルに配置します。
モデルの任意のチャートから関数を呼び出す場合は、Simulink Function (Simulink) ブロックを使用して、関数を Simulink キャンバスで直接定義します。詳細については、Simulink 関数の概要 (Simulink)を参照してください。
Simulink 関数から Stateflow のデータにアクセスするには、そのデータを Simulink 関数の入力として含める必要があります。
以下の Simulink 関数の名前は sim_fcn
です。3 つの引数 (a
、b
、c
) を取り、2 つの出力値 (x
と y
) を返します。
この関数には Simulink サブシステムがあり、最初の引数をゲイン 25 で乗算し、他の 2 つの引数を結合して複素数の出力信号を生成します。
Simulink 関数を定義したら、それを Stateflow チャートまたは Simulink モデル内の任意の位置に配置できます。さらに、同じモデルや異なるモデル内で、必要な回数だけこの関数を再利用できます。
メモ
モデル参照内の Stateflow チャートからグローバルな Simulink 関数を呼び出すことはできません。この問題を解決するには、Stateflow チャート内に新しい Simulink 関数を作成します。この Simulink 関数内に、元のグローバルな Simulink 関数を呼び出す Function Caller ブロックを含めます。Function Caller ブロックの詳細については、Function Caller (Simulink)を参照してください。
Simulink 関数の定義
オブジェクト パレットで、Simulink 関数のアイコン をクリックします。
チャート キャンバスで、新しい Simulink 関数の位置をクリックします。
関数のシグネチャ ラベルを入力します。
関数のシグネチャ ラベルは、関数の名前と、その引数と戻り値の正式名称を指定します。シグネチャ ラベルの構文は以下のとおりです。
複数の戻り値と複数の入力引数を指定できます。戻り値と入力引数として、値のスカラー、ベクトル、または行列を指定できます。戻り値が 1 つのみの関数では、シグネチャ ラベルの大かっこを省略します。[return_val1,return_val2,...] = function_name(arg1,arg2,...)
すべての引数と戻り値に一意の変数名を使用しなければなりません。
関数をプログラミングするには、関数ボックスをダブルクリックして Simulink エディターを開きます。初期状態では、エディターには関数呼び出し Trigger (Simulink) ブロック、および関数シグネチャと一致する Inport (Simulink) および Outport (Simulink) ブロックがあります。Trigger ブロックは削除できません。
Simulink エディターで、ブロックを追加して Simulink サブシステムを作成し、それらのブロックを Inport ブロックと Outport ブロックに接続します。
Inport および Outport ブロックを構成します。
各ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。
[信号属性] タブで、入力パラメーターまたは戻り値の [データ型] および [端子の次元] を入力します。
[OK] をクリックします。
メモ
Simulink 関数の Inport ブロックは、[データ型] と [端子の次元] を継承できません。詳細については、Simulink 関数の使用方法のガイドラインを参照してください。
ステートと遷移における Simulink 関数の呼び出し
Simulink 関数は、任意のステートまたは遷移のアクション、または他の関数から呼び出すことができます。
Simulink 関数を呼び出すには、関数シグネチャを使用し、関数シグネチャの仮引数のそれぞれについて引数の値を含めます。
[return_val1,return_val2,...] = function_name(arg1,arg2,...)
2 つの引数のデータ型が異なる場合、関数は引数を仮引数のデータ型にキャスト (変換) します。
Simulink 関数のプロパティの指定
Simulink 関数のプロパティは、[ブロック パラメーター] ダイアログ ボックスで変更できます。
Stateflow エディターで、Simulink 関数を右クリックします。
[プロパティ] を選択します。
Simulink 関数のプロパティを編集します。
これらのプロパティは、モデル エクスプローラーで変更することもできます。詳細については、モデル エクスプローラー (Simulink)を参照してください。
Simulink 関数のプロパティの説明については、Subsystem (Simulink) を参照してください。
Stateflow.SLFunction
オブジェクトを使用して、Simulink 関数の追加のプロパティをプログラムで指定できます。Stateflow プログラム インターフェイスの詳細については、Stateflow API の概要を参照してください。
Simulink 関数を使用した Simulink ブロックへのアクセス
この例では、車両システムのシフト ロジックのモデル化を比較できます。最初のモデルでは Simulink 関数を使用していませんが、2 番目のモデルでは使用しています。
Simulink 関数を使用しないモデル
次のモデルでは、Simulink モデル内で Function-Call Subsystem run()
を使用して、ギア シフトのしきい値を計算します。その後、Stateflow チャートは出力イベント CALC_TH()
を使用して、このサブシステムを呼び出します。
Function-Call Subsystem の詳細については、Function-Call Subsystem の使用 (Simulink)を参照してください。
Simulink 関数を使用したモデル
Simulink 関数を使用して、同じ機能を実現できます。次の Stateflow チャートでは、Simulink 関数 calc_th
を使用してしきい値が計算されます。
selection_state
の during
アクションには、calc_th
の関数呼び出しが含まれています。これは Simulink ブロックを含む関数です。
このモデル化方法を採用すると、モデル内のオブジェクト数を最小限に抑えることができます。
Simulink 関数を使用した、複数コントローラーの実行のスケジュール
この例では、複数コントローラーの実行をスケジュールする 2 つの方法を比較できます。最初のモデルでは Simulink 関数を使用していませんが、2 番目のモデルでは使用しています。
Simulink 関数を使用しないモデル
次のモデルでは、Function-Call Subsystem を使用して各コントローラーをモデル化しています。このモデルの Stateflow チャートには、サブシステムの実行をスケジュールするための出力イベントが含まれています。
それぞれの出力イベントについて、Stateflow チャートを対応する Function-Call Subsystem に接続する信号線が 1 本必要です。
Simulink 関数を使用したモデル化方法
各コントローラーは、Stateflow チャート内の Simulink 関数を使用してモデル化することもできます。次のモデルでは、関数呼び出しを使用してサブシステムの実行をスケジュールしています。
このモデル化方法を採用すると、モデル内のオブジェクト数を最小限に抑えることができます。
Simulink 関数の使用方法のガイドライン
Moore チャートでは Simulink 関数を使用しない
チャートの初期化中に実行されるデフォルト遷移で Simulink を呼び出さない
参考
Simulink Function (Simulink) | Trigger (Simulink) | Inport (Simulink) | Outport (Simulink) | Signal Conversion (Simulink) | Bus Creator (Simulink) | Mux (Simulink)
関連するトピック
- 再利用のための Stateflow 関数のエクスポート
- Simulink 関数の概要 (Simulink)
- モデルへの Simulink 関数の追加 (Simulink)
- 共有プリンター サーバーのキューの管理