ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ステートと遷移でサポートされているアクション タイプ

ステート アクション タイプ

ステートには、様々なアクション タイプを設定できます。具体的には、entryduringexitbind、および on event_name アクションです。ステート アクションには、以下のような一般的な形式のラベル表記法に基づいて、アクション タイプが割り当てられます。

name/
entry:entry actions
during:during actions
exit:exit actions
bind:data_name, event_name
on event_name:on event_name actions

たとえば、様々なステート アクション タイプが以下のチャートに表示されます。

ステートのラベルに名前を入力してから、キャリッジ リターンを入力し、ステートに対するアクションを指定します。ラベルのアクション タイプは、任意の順序で入力できます。ステートメントに対するアクション タイプをはっきりと指定しない場合、チャートではそのステートメントを entry アクションとして取り扱います。

以下の表は、様々なステート アクション タイプをまとめたものです。

ステート アクション省略形説明
entryenステートがアクティブになった時点で実行する
exitexステートがアクティブになり、ステートからの遷移が発生した時点で実行する
duringduステートがアクティブになり、特定のイベントが発生した時点で実行する
bindなしイベントまたはデータ オブジェクトをバインドして、イベントのブロードキャストまたはデータ値の変更をステートとその子のみに限定する

on event_name

なしステートがアクティブになり、event_name のブロードキャストを受信した時点で実行する

on after(n, event_name)

なしステートがアクティブになり、event_name のブロードキャストを n 回、受信してから実行する

on before(n, event_name)

なしステートがアクティブになり、event_name のブロードキャストを n 回、受信する前に実行する

on at(n, event_name)

なしステートがアクティブになり、event_name のブロードキャストを n 回、受信した時点で実行する

on every(n, event_name)

なしステートがアクティブになり、event_name のブロードキャストを n 回、受信するたびに実行する

entryexitduringbind および on event_name の各アクションの詳細は、以下の節を参照してください。afterbeforeat、および every 時相論理演算子の詳細については、時相論理を使用したチャート実行の制御 を参照してください。

前述の表では、時相論理演算子にイベントベースの時相論理の構文が使用されています。絶対時間の時相論理では、演算子に異なる構文が使用されています。詳細については、絶対時間の時相論理演算子 を参照してください。

entry アクション

entry アクションの前には接頭辞 entry または en (省略形) が追加され、その後に必須のコロン (:)、さらに 1 つまたは複数のアクションが続きます。複数のアクションは、キャリッジ リターン、セミコロン (;) またはコンマ (,) で区切ります。名前とスラッシュに続けてアクションを直接入力した場合は、そのアクションは entry アクションとして解釈されます。この省略表現は、entry アクションのみを指定する場合に便利です。

entry アクションは、ステートへの入力が発生した (ステートがアクティブになった) ときに、そのステートに対して実行されます。ステート アクション タイプ の前述の例では、デフォルト遷移によってステート A への入力が発生したときに、entry アクション id = x+y が実行されます。

ステートへの入力のセマンティクスに関する詳細については、ステートに入る手順ステートの実行の例 を参照してください。

exit アクション

exit アクションの前には接頭辞 exit または ex (省略形) が追加され、その後に必須のコロン (:)、さらに 1 つまたは複数のアクションが続きます。複数のアクションは、キャリッジ リターン、セミコロン (;) またはコンマ (,) で区切ります。

ステートに対する exit アクションは、ステートがアクティブになって、そのステートからの遷移が発生したときに実行されます。

ステートからの出力のセマンティクスに関するの詳細については、アクティブなステートから出る手順ステートの実行の例 を参照してください。

during アクション

during アクションの前には接頭辞 during または du (省略形) が追加され、その後に必須のコロン (:)、さらに 1 つまたは複数のアクションが続きます。複数のアクションは、キャリッジ リターン、セミコロン (;) またはコンマ (,) で区切ります。

during アクションは、ステートがアクティブで、イベントが発生し、他のステートへの有効な遷移が存在しないときに、ステートに対して実行されます。

アクティブなステートの実行のセマンティクスに関する詳細については、アクティブなステートを実行する手順ステートの実行の例 を参照してください。

bind アクション

bind アクションの前には接頭辞 bind が追加され、その後に必須のコロン (:)、さらに 1 つまたは複数のイベントやデータが続きます。複数のデータ/イベントを区分するには、キャリッジ リターン、セミコロン (;)、またはコンマ (,) を入力します。

bind アクションは、指定されたデータやイベントをステートにバインドします。ステートにバインドされたデータは、そのステートまたはその子のアクションによる変更が可能です。あるステートにバインドされたデータは、他のステートやその子からは、自由に読み取ることができますが、変更はできません。ステートにバインドされたイベントは、そのステートまたはその子によってのみブロードキャストが可能です。あるステートにバインドされたイベントは、他のステートやその子からは、自由に受信できますが、送信はできません。

bind アクションは、バインド ステートがアクティブかどうかにかかわらず、チャートに対して適用されます。ステート アクション タイプ の前述の例では、ステート A に対する bind アクション bind: id, time_out は、データ id とイベント time_out をステート A にバインドします。これにより、チャートの他のステート (およびその子) による id の変更や、イベント time_out のブロードキャストは禁止されます。

データを変更したりまたはその他のステートにバインドするイベントをブロードキャストしたりするアクションがその他のステートに含まれている場合は、解析エラーが発生します。以下の例では、これらのエラー状況の一部を示しています。

ステート アクション解析エラーの理由
bind: id ステート Bただ 1 つのステートがステート A にバインドするデータ id を変更することができる
entry: time_out ステート Cただ 1 つのステートが、ステート A にバインドするイベント time_out をブロードキャストすることができます。

Function-Call イベントをステートにバインドすると、呼び出し元の Function-Call Subsystem もバインドされます。この場合、Function-Call Subsystem は、バインド ステートへの入力が発生したときに有効になり、バインド ステートからの出力が発生したときに無効になります。この動作に関する詳細は、bind アクションによる Function-Call Subsystem の制御 を参照してください。

on event_name アクション

on event_name アクションの前には接頭辞 on が追加され、その後に一意のイベント event_name、さらに 1 つまたは複数のアクションが続きます。複数のアクションは、キャリッジ リターン、セミコロン (;) またはコンマ (,) で区切ります。イベントごとに on event_name 行を追加することで、複数のイベントに対するアクションを指定できます。イベントごとに異なるアクションをトリガーする必要がある場合は、それぞれ特定または一連のイベントを指定する複数の on event_name アクション ステートメントをステートのラベルに入力します。たとえば、以下のようになります。

on ev1: action1();
on ev2: action2();

on event_name アクションは、ステートがアクティブな場合に、そのステートでイベント event_name が受信されたときに実行されます。このアクションは、ステートの during アクションと同時に実行されます。

アクティブなステートの実行のセマンティクスに関する詳細については、アクティブなステートを実行する手順 を参照してください。

遷移アクション タイプ

ステート アクション タイプ では、アクションをステートのラベルに追加する方法について説明しました。アクションをラベル上の遷移に追加することも可能です。遷移は、イベント トリガー、条件、条件アクション、遷移アクションをもつことができます。アクション タイプは一般的な形式のラベル表記法に従っています。

event_trigger[condition]{condition_action}/transition_action

以下の例は、典型的な遷移ラベルの構文を示しています。

遷移イベント トリガー条件条件アクション遷移アクション
ステート A からステート Cevent1temp > 50func1()なし
ステート A からステート Bevent2なしなしdata1 = 5

イベント トリガー

遷移ラベル構文では、イベント トリガーがイベント名として先頭に現れます。遷移ラベル内の他のアクションと区別する目的で、特殊文字が使用されることはありません。遷移アクション タイプ の例では、ステート A からの遷移の両方にイベント トリガーが設定されています。ステート A からステート B への遷移にはイベント トリガー event2、ステート A からステート C への遷移にはイベント トリガー event1 がそれぞれ設定されています。

条件 (指定してある場合) が真であれば、イベント トリガーは遷移を発生させるイベントを指定します。イベントの指定はオプションです。イベントが指定されていない場合は、何らかのイベントが発生したときに遷移が発生します。複数のイベントを指定するには、OR 論理演算子 (|) を使用します。

条件

遷移ラベル構文では、条件は大かっこ ([]) で囲まれた論理式として表現されます。遷移アクション タイプ の例では、ステート A からステート C への遷移に条件 temp > 50 が設定されています。

条件とは、指定した式が真である場合に遷移が発生するように指定する論理式です。条件を定義および使用する際には、以下のガイドラインに従ってください。

  • 条件式は、真 (1) または偽 (0) として評価される論理式として指定しなければなりません。

  • 条件式は、以下のいずれかの要素で構成されます。

    • データと数値を比較する boolean 演算子

    • 論理値を返す関数

    • 引数として指定されたステートがアクティブである場合に真として評価される in(state_name) 条件 (ステート アクティビティのチェック を参照)

        メモ:   チャートでは、他のチャートに含まれるステートのアクティビティに基づいてアクションをトリガーする in 条件は使用できません。

    • 時相論理条件 (時相論理を使用したチャート実行の制御 を参照)

  • 条件式では、数値を返す、グラフィカル関数、真理値表関数、または MATLAB® 関数を呼び出すことができます。

    たとえば、[test_function(x, y) < 0] は、有効な条件式です。

      メモ:   複数の値を返す関数を条件式で呼び出した場合は、最初の値のみが適用されます。その他の戻り値は使用されません。

  • 条件式では、チャートによるステートの変更や変数の修正を引き起こす関数を呼び出さないでください。

  • 論理式は、AND 関係を表す & と OR 関係を表す | を使用してグループ化できます。

  • 代入ステートメントは、有効な条件式ではありません。

  • 単項増分および単項減分アクションは、有効な条件式ではありません。

条件アクション

遷移ラベル構文では、条件アクションは遷移条件に続いて、中かっこ ({}) で囲まれて表現されます。遷移アクション タイプ の例では、ステート A からステート C への遷移に条件アクション func1() (関数呼び出し) が設定されています。

条件アクションは、条件が真として評価された時点で、遷移先が有効であると判定されるよりも前に実行されます。条件を指定していない場合、暗黙の条件は真であると評価されて条件アクションが実行されます。

    メモ:   条件は、イベント トリガーがアクティブな場合にのみチェックされます。

遷移アクション

遷移ラベル構文では、遷移アクションの前にスラッシュ (/) が追加されます。遷移アクション タイプ の例では、ステート A からステート B への遷移に遷移アクション data1 = 5 が設定されています。

遷移アクションは完全な遷移パスが実行された後でのみ実行されます。遷移先が有効であると判定され、かつ、条件がある場合には、それが真になった後に実行されます。遷移が複数のセグメントで構成されている場合、遷移アクションが実行されるのは、最終的な遷移先に至るまでの遷移パス全体が有効であると判定された後に限定されます。

ステートと遷移でのアクションの実行

アクション言語として C 言語を使用している以下のチャートチャートは、シミュレーション中にさまざまな構成要素がどのように相互作用するかを示しています。

このモデルのシミュレーションを実行すると、以下の結果が得られます。

以下のアクションが TransAction ステート内で発生します。

時間TransAction ステート内の動作
0.0ステート TA がアクティブになります。
TA において、entry アクションが実行され outVal の値を 0 に設定します。
0.1パスが無条件のため、TA からジャンクション J1 への遷移が発生します。
J1 と J2 間の条件評価が起こり、真を返します。
J1 から TB への遷移パス全体が完了していないので、遷移アクションは実行しません
J2 と TB 間の条件評価が起こり、偽を返します。そのため、実行は J1 に戻ります。
パスが無条件のため、J1 から J3 への遷移が発生します。
J3 と TB 間の条件評価が起こり、偽を返します。そのため、TA に戻ります。
TA において、during アクションを実行し、1 つ分だけ outVal の値を減算します。
0.2 – 1.0t = 0.1 のパターンを各タイム ステップごとに繰り返します。
1.1パスが無条件のため、TA からジャンクション J1 への遷移が発生します。
J1 と J2 間の条件評価が起こり、真を返します。
J1 から TB への遷移パス全体が完了していないので、遷移アクションは実行しません
J2 と TB 間の条件評価が起こり、偽を返します。そのため、実行は J1 に戻ります。
パスが無条件のため、J1 から J3 への遷移が発生します。
J3 と TB 間の条件評価が起こり、真を返します。
ステート TB がアクティブになります。
J3 から TB への遷移が完了しているので、遷移アクションを実行し、outVal の値を 0 に設定します。

以下のアクションが CondAction ステート内で発生します。

時間CondAction ステート内の動作
0.0ステート CA がアクティブになります。
CA において、entry アクションを実行し、outVal_2 の値を 0 に設定します。
0.1パスが無条件のため、CA からジャンクション J1 への遷移が発生します。
J1 と J2 間の条件評価が起こり、真を返します。
条件アクションを実行し、2 つ分だけ outVal_2 の値を減算します。
J2 と CB 間の条件評価が起こり、偽を返します。そのため、実行は J1 に戻ります。
パスが無条件のため、J1 から J3 への遷移が発生する。
J3 と CB 間の条件評価が起こり、偽を返します。そのため、CA に戻ります。
CA において、during アクションが実行され、1 つ分だけ outVal_2 の値を減算します。
0.2 – 0.3t = 0.1 のパターンを各タイム ステップごとに繰り返します。
0.4パスが無条件のため、CA からジャンクション J1 への遷移が発生します。
J1 と J2 間の条件評価が起こり、真を返します。
条件アクションを実行し、2 つ分だけ outVal_2 の値を減算します。
J2 と CB 間の条件評価が起こり、偽を返します。そのため、実行は J1 に戻ります。
パスが無条件のため、J1 から J3 への遷移が発生します。
J3 と CB 間の条件評価が起こり、真を返します。
条件アクションを実行し、outVal_2 の値を 0 に設定します。
ステート CB がアクティブになります。

この情報は役に立ちましたか?