Main Content

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 つの引数 (abc) を取り、2 つの出力値 (xy) を返します。

Stateflow chart with a Simulink function called sim_fcn.

この関数には Simulink サブシステムがあり、最初の引数をゲイン 25 で乗算し、他の 2 つの引数を結合して複素数の出力信号を生成します。

Simulink subsystem with a gain block and a magnitude-angle to complex block.

Simulink 関数を定義したら、それを Stateflow チャートまたは Simulink モデル内の任意の位置に配置できます。さらに、同じモデルや異なるモデル内で、必要な回数だけこの関数を再利用できます。

メモ

モデル参照内の Stateflow チャートからグローバルな Simulink 関数を呼び出すことはできません。この問題を解決するには、Stateflow チャート内に新しい Simulink 関数を作成します。この Simulink 関数内に、元のグローバルな Simulink 関数を呼び出す Function Caller ブロックを含めます。Function Caller ブロックの詳細については、Function Caller (Simulink)を参照してください。

Simulink 関数の定義

  1. オブジェクト パレットで、Simulink 関数のアイコン をクリックします。

  2. チャート キャンバスで、新しい Simulink 関数の位置をクリックします。

  3. 関数のシグネチャ ラベルを入力します。

    関数のシグネチャ ラベルは、関数の名前と、その引数と戻り値の正式名称を指定します。シグネチャ ラベルの構文は以下のとおりです。

    [return_val1,return_val2,...] = function_name(arg1,arg2,...)
    複数の戻り値と複数の入力引数を指定できます。戻り値と入力引数として、値のスカラー、ベクトル、または行列を指定できます。戻り値が 1 つのみの関数では、シグネチャ ラベルの大かっこを省略します。

    すべての引数と戻り値に一意の変数名を使用しなければなりません。

  4. 関数をプログラミングするには、関数ボックスをダブルクリックして Simulink エディターを開きます。初期状態では、エディターには関数呼び出し Trigger (Simulink) ブロック、および関数シグネチャと一致する Inport (Simulink) および Outport (Simulink) ブロックがあります。Trigger ブロックは削除できません。

  5. Simulink エディターで、ブロックを追加して Simulink サブシステムを作成し、それらのブロックを Inport ブロックと Outport ブロックに接続します。

  6. Inport および Outport ブロックを構成します。

    1. 各ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。

    2. [信号属性] タブで、入力パラメーターまたは戻り値の [データ型] および [端子の次元] を入力します。

    3. [OK] をクリックします。

    メモ

    Simulink 関数の Inport ブロックは、[データ型][端子の次元] を継承できません。詳細については、Simulink 関数の使用方法のガイドラインを参照してください。

ステートと遷移における Simulink 関数の呼び出し

Simulink 関数は、任意のステートまたは遷移のアクション、または他の関数から呼び出すことができます。

Simulink 関数を呼び出すには、関数シグネチャを使用し、関数シグネチャの仮引数のそれぞれについて引数の値を含めます。

[return_val1,return_val2,...] = function_name(arg1,arg2,...)

2 つの引数のデータ型が異なる場合、関数は引数を仮引数のデータ型にキャスト (変換) します。

Simulink 関数のプロパティの指定

Simulink 関数のプロパティは、[ブロック パラメーター] ダイアログ ボックスで変更できます。

  1. Stateflow エディターで、Simulink 関数を右クリックします。

  2. [プロパティ] を選択します。

  3. Simulink 関数のプロパティを編集します。

これらのプロパティは、モデル エクスプローラーで変更することもできます。詳細については、モデル エクスプローラー (Simulink)を参照してください。

Simulink 関数のプロパティの説明については、Subsystem (Simulink) を参照してください。

Stateflow.SLFunction オブジェクトを使用して、Simulink 関数の追加のプロパティをプログラムで指定できます。Stateflow プログラム インターフェイスの詳細については、Stateflow API の概要を参照してください。

Simulink 関数を使用した Simulink ブロックへのアクセス

この例では、車両システムのシフト ロジックのモデル化を比較できます。最初のモデルでは Simulink 関数を使用していませんが、2 番目のモデルでは使用しています。

Simulink 関数を使用しないモデル

次のモデルでは、Simulink モデル内で Function-Call Subsystem run() を使用して、ギア シフトのしきい値を計算します。その後、Stateflow チャートは出力イベント CALC_TH() を使用して、このサブシステムを呼び出します。

Model old_sf_car with a function-call subsystem .

Function-Call Subsystem の詳細については、Function-Call Subsystem の使用 (Simulink)を参照してください。

Simulink 関数を使用したモデル

Simulink 関数を使用して、同じ機能を実現できます。次の Stateflow チャートでは、Simulink 関数 calc_th を使用してしきい値が計算されます。

Stateflow chart with a Simulink function.

selection_stateduring アクションには、calc_th の関数呼び出しが含まれています。これは Simulink ブロックを含む関数です。

このモデル化方法を採用すると、モデル内のオブジェクト数を最小限に抑えることができます。

Modified Simulink model without function-call subsystems.

Simulink 関数を使用した、複数コントローラーの実行のスケジュール

この例では、複数コントローラーの実行をスケジュールする 2 つの方法を比較できます。最初のモデルでは Simulink 関数を使用していませんが、2 番目のモデルでは使用しています。

Simulink 関数を使用しないモデル

次のモデルでは、Function-Call Subsystem を使用して各コントローラーをモデル化しています。このモデルの Stateflow チャートには、サブシステムの実行をスケジュールするための出力イベントが含まれています。

Simulink model with three function-call subsystems.

それぞれの出力イベントについて、Stateflow チャートを対応する Function-Call Subsystem に接続する信号線が 1 本必要です。

Simulink 関数を使用したモデル化方法

各コントローラーは、Stateflow チャート内の Simulink 関数を使用してモデル化することもできます。次のモデルでは、関数呼び出しを使用してサブシステムの実行をスケジュールしています。

Stateflow chart with three Simulink functions.

このモデル化方法を採用すると、モデル内のオブジェクト数を最小限に抑えることができます。

Modified Simulink model without function-call subsystems.

Simulink 関数の使用方法のガイドライン

 引数名での英数字とアンダースコアの使用

 Inport ブロックのプロパティの明示的な設定

 不連続的な信号から連続的な信号への変換

 Moore チャートでは Simulink 関数を使用しない

 チャートの初期化中に実行されるデフォルト遷移で Simulink を呼び出さない

 連続時間チャートのステート During アクションまたは遷移ステートにおいては Simulink 関数を呼び出さない

 Simulink 関数用の HDL コードを生成しない

 値による引数の受け渡し

参考

(Simulink) | (Simulink) | (Simulink) | (Simulink) | (Simulink) | (Simulink) | (Simulink)

関連するトピック