このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
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 が無効な場合の初期値に出力をリセットすることも可能です。以下の手順に従います。
サブシステムの Outport ブロックをダブルクリックして、[ブロック パラメーター] ダイアログ ボックスを開きます。
[ディセーブル時の出力] の場合は以下のオプションを選択します。
選択 目的 保持
最新の出力値を保持 リセット
出力を初期値にリセット [OK] をクリックし、設定を記録します。
メモ
[ディセーブル時の出力] の設定は、Function-Call Subsystem のステートへのバインド で説明するように、Function-Call Subsystem がステートにバインドされている場合にのみ有効です。
Function-Call Subsystem が有効な場合でのステートの動作の制御
Function-Call Subsystem がステートにバインドされている場合は、前のタイム ステップからの値で Function-Call Subsystem の状態変数を保持することも、Function-Call Subsystem の実行時の初期条件に状態変数をリセットすることも可能です。この方法では、バインド ステートは Function-Call Subsystem の状態変数を完全に制御することになります。次の手順に従います。
サブシステムのトリガー端子をダブルクリックし、[ブロック パラメーター ダイアログ] ボックスを開きます。
[イネーブル時の状態] の場合は以下のオプションを選択します。
選択 目的 保持
トリガー端子を含む Function-Call Subsystem の状態を最新値に保持。 リセット
トリガー端子を含む Function-Call Subsystem の状態を初期条件に戻す。 継承
この設定を関数呼び出しイニシエーターの親サブシステムから継承。イニシエーターの親がモデルの root に該当する場合は、継承した設定が保持されます。トリガーに複数のイニシエーターが存在している場合は、すべてのイニシエーターの親で設定が同じでなければなりません (すべて
[保持]
またはすべて[リセット]
)。[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 に対して複数のトリガー イベントを設定している場合は、バインドは推奨されません。トリガー イベントを多重化すると、イベントのバインドが妨げられて、予期しない動作が発生する可能性があります。