Main Content

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

bind アクションによる Function-Call Subsystem の制御

bind アクションを使用すると、指定されたデータおよびイベントをステートにバインドできます。ステートにバインドされたイベントは、ステートまたはその子のアクションによってのみブロードキャストが可能です。Function-Call イベントをステートにバインドして、イベントがトリガーする Function-Call Subsystem を有効または無効にすることも可能です。Function-Call Subsystem は、バインドされたイベントを含むステートへ入った場合に有効になり、このステートから出た場合に無効になります。Function-Call Subsystem の実行は、呼び出し元のステートのアクティビティに完全にバインドされています。

Function-Call Subsystem のステートへのバインド

既定の設定では、Function-Call Subsystem は、関連する関数呼び出し出力イベントが定義されているチャートによって制御されます。この関連付けは、Function-Call Subsystem はチャートが起動したときに有効になり、チャートがスリープ状態に移行するまでアクティブなままであることを意味します。さらに詳細に制御するには、bind アクションを使用して、Function-Call Subsystem をチャート階層内のステートにバインドします (bind アクションを参照)。

関数呼び出し出力イベントをステートにバインドできます。このタイプのバインドを設定すると、イベントによって呼び出される Function-Call Subsystem もステートにバインドされます。この場合、Function-Call Subsystem は、ステートへの入力が発生したときに有効になり、ステートからの出力が発生したときに無効になります。

Function-Call Subsystem をステートにバインドする際、以下の節の説明に従って、有効および無効な場合のサブシステムの動作を微調整できます。

サブシステムが無効な場合の出力の処理

Function-Call Subsystem が無効な場合は実行されませんが、その出力信号はモデル内の他のブロックで使用できます。Function-Call Subsystem がステートにバインドされている場合は、前のタイム ステップからの値で出力を保持することも、Function-Call Subsystem が無効な場合の初期値に出力をリセットすることも可能です。以下の手順に従います。

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

    Block Parameters dialog box for Outport block.

  2. [ディセーブル時の出力] の場合は以下のオプションを選択します。

    選択目的
    保持最新の出力値を保持
    リセット出力を初期値にリセット
  3. [OK] をクリックし、設定を記録します。

    メモ

    [ディセーブル時の出力] の設定は、Function-Call Subsystem のステートへのバインド で説明するように、Function-Call Subsystem がステートにバインドされている場合にのみ有効です。

Function-Call Subsystem が有効な場合でのステートの動作の制御

Function-Call Subsystem がステートにバインドされている場合は、前のタイム ステップからの値で Function-Call Subsystem の状態変数を保持することも、Function-Call Subsystem の実行時の初期条件に状態変数をリセットすることも可能です。この方法では、バインド ステートは Function-Call Subsystem の状態変数を完全に制御することになります。次の手順に従います。

  1. サブシステムのトリガー端子をダブルクリックし、[ブロック パラメーター ダイアログ] ボックスを開きます。

    Block Parameters dialog box for Trigger port.

  2. [イネーブル時の状態] の場合は以下のオプションを選択します。

    選択目的
    保持トリガー端子を含む Function-Call Subsystem の状態を最新値に保持。
    リセットトリガー端子を含む Function-Call Subsystem の状態を初期条件に戻す。
    継承

    この設定を関数呼び出しイニシエーターの親サブシステムから継承。イニシエーターの親がモデルの root に該当する場合は、継承した設定が保持されます。トリガーに複数のイニシエーターが存在している場合は、すべてのイニシエーターの親で設定が同じでなければなりません (すべて [保持] またはすべて [リセット])。

  3. [OK] をクリックし、設定を記録します。

    メモ

    [イネーブル時の状態] の設定は、Function-Call Subsystem のステートへのバインド で説明するように、Function-Call Subsystem がステートにバインドされている場合にのみ有効です。

Function-Call Subsystem のステートへのバインド

以下のモデルは、チャートのステートにバインドするトリガー イベント E によって、Function-Call Subsystem をトリガーします。このモデルは、固定ステップ サイズ 1 の固定ステップ ソルバーを使用しています。

チャートには 2 つのステートが含まれています。イベント E は、次のアクションでステート A にバインドします。

  bind:E

イベント E は、スコープが Output to Simulink、トリガー タイプが function-call のチャートに対して定義されています。

上記の Function-Call Subsystem は、トリガー端子ブロック、入力端子、出力端子、およびシンプルなブロック線図で構成されています。ブロック線図は、Unit Delay ブロックを使用して、タイム ステップごとにカウンターを 1 増分します。

トリガー端子の [ブロック パラメーター] ダイアログ ボックスには、以下の設定が含まれています。

  • トリガー タイプ: function-call

  • イネーブル時の状態: reset。この設定では、有効な場合に Function-Call Subsystem の状態値がゼロにリセットされます。

  • サンプル時間タイプ: triggered。この設定では、Function-Call Subsystem は有効な場合に、呼び出し元のイベントによってトリガーされたときにのみ実行されます。

[サンプル時間タイプ]periodic に設定すると、その下の [サンプル時間] フィールド (既定値 1) が有効になります。この設定により、Function-Call Subsystem は、それが有効な間、[サンプル時間] フィールドで指定されたタイム ステップごとに実行されます。これを行うには、Function-Call Subsystem の呼び出し元イベントをバインドするステートは、[サンプル時間] フィールドで指定されたサンプリング レートと一致するタイム ステップのイベントを送信しなければなりません。ステートは、シミュレーションのサンプル レートで entry アクションまたは during アクションを含むイベントを送信できます。

  • 固定ステップ サンプリングの場合、[サンプル時間] 値には、固定ステップ サイズの整数倍を指定しなければなりません。

  • 可変ステップ サンプリングの場合、[サンプル時間] 値には制限がありません。

バインドされた Function-Call Subsystem をステートがどのように制御するのかを確認するには、モデルのシミュレーションを開始します。

  • 時間 t = 0 で、ステート A へのデフォルト遷移が発生します。ステート A が自身の bind アクションと entry アクションを実行します。bind アクションは、イベント E をステート A にバインドし、Function-Call Subsystem を有効にして、その状態変数を 0 にリセットします。entry アクションは Function-Call Subsystem をトリガーし、そのブロック線図を実行します。ブロック線図は、Unit Delay ブロックを使用してカウンターを 1 増分します。Unit Delay ブロックは値 0 を出力し、サブシステムが次回呼び出されるまで新しい値 1 を保持します。

  • 時間 t = 1 で、モデルの次回の更新イベントは、ステート A の出力遷移をテストします。ステート B への遷移は発生しません。時相演算子 after(10,tick) では、更新イベントが 10 回受信された時点で初めて遷移の実行が可能になるためです。ステート A がアクティブなままとなり、その during アクションによって Function-Call Subsystem がトリガーされます。Unit Delay ブロックは、保持している値 1 を出力します。サブシステムも自身のカウンターを増分して値 2 を生成します。この値が、次回実行がトリガーされるまで、Unit Delay ブロックによって保持されます。

  • 次の 8 回の更新イベントで、サブシステムの出力はタイム ステップごとに 1 増分します。

  • 時間 t = 10 で、ステート A からステート B への遷移が発生します。ステート A へのバインドは非アクティブになっているため、Function-Call Subsystem は無効であり、出力は 0 に戻ります。

  • 時間 t = 11 で、ステート B からステート A への遷移が発生します。再度、bind アクションによって Function-Call Subsystem が有効になります。その後の更新イベントで、サブシステムの出力はタイム ステップごとに 1 インクリメントします。これが、時間 t = 21 でステート B への次の遷移が発生するまで続きます。

バインドによるトリガー イベントの多重化の回避

イベントをバインドすると、チャート内の単一のステートに Function-Call Subsystem の制御が与えられます。Mux による Function-Call Subsystem のトリガーを他のイベントに対して許可した場合は、この制御は動作しません。たとえば、以下のモデルは、Mux ブロックを使用して Function-Call Subsystem をトリガーする 2 つの関数呼び出しイベントを定義しています。

チャートでは、E1 はステート A にバインドしますが、E2 はバインドしません。ステート B は、その entry アクションでトリガー イベント E2 を送信します。

このモデルをシミュレートすると、ステート A からステート B への遷移が発生したときに、出力はリセットされません。

MuxによりFunction-Call Subsystem に対して複数のトリガー イベントを設定している場合は、バインドは推奨されません。トリガー イベントを多重化すると、イベントのバインドが妨げられて、予期しない動作が発生する可能性があります。