外部実行の状態マシンのシミュレーション機能では、入場点と退場点要素や定義との参照設定を利用できます。この内容について、下の図のような具体的な例で説明します。
- State1はコンポジット状態であり、3つの領域RegionA, RegionB, RegionCを持っています。
- State2はSubMachineを呼び出す状態マシンの呼び出し状態であり、状態マシンには3つの領域RegionX, RegionY, RegionZを持ちます。
- State1のEntryPoint1は2つの領域につながる入場点です。同様に、SubMachineのEntryPoint2は2つの領域につながる入場点です。
- State1には退場点ExitPoint1が定義され、SubMachineには2つの退場点 ExitPoint2 と ExitPoint3 が定義されています。
- State2が持つ入場点・退場点はSubMachineが持つ入場点・退場点に参照設定されています。
- 初期状態を、既定の領域を示すために利用しています。
入場点に入る場合の動作
State1のEntryPoint1
遷移がEntryPoint1に到達すると、State1がアクティブになります。
- RegionAとRegionBは入場点からの遷移先となっているので、明示的にアクティブになります。
- RegionCには初期状態があるので、State1がアクティブになると暗黙的にこの領域もアクティブになります。
SubMachineのEntryPoint2
シミュレーションを継続するために、トリガEVENT_Cとトリガ EVENT_Aをこの順番で実行します。
State2の入場点CPR_Entryに遷移すると、State2がアクティブになります。これにより、参照設定されているSubMachineに処理が移ります。
- RegionXとRegionYは入場点からの遷移先となっているので、明示的にアクティブになります。
- Regionzには初期状態があるので、State2アクティブになると暗黙的にこの領域もアクティブになります。
領域内への直接遷移
領域内の状態への遷移が行われると、その状態が持つ領域はアクティブになります。
State2への既定の遷移
シミュレーションを継続するために、トリガEVENT_Aとトリガ EVENT_Cをこの順番で実行します。
この場合は、State2への遷移が有効となりますので、State2がアクティブになり、初期状態を持つ領域がアクティブになります。
- RegionXの内容が実行されないのは、初期状態要素が配置されていないからです。
- RegionYは初期状態を持つためアクティブとなり、初期状態につながるStateY2に遷移します。
- RegionZも初期状態を持つためアクティブとなり、初期状態につながるStateZ2に遷移します。
状態から抜ける場合の動作
State1からの退出
- トリガを [EVENT_C, EVENT_A]: の順番で実行した場合にはRegionCが最初に非アクティブとなり、その後RegionAとRegionBが非アクティブになります。State1のexitアクションが実行された後は、退場点ExitPoint1が有効になります。
- トリガを [EVENT_A, EVENT_C]: の順番で実行した場合にはRegionA と RegionBが最初に非アクティブとなり、その後RegionCが非アクティブになります。State1のexitアクションが実行された後は、State1からの遷移が有効になります。
State2からの退出
トリガを [EVENT_C, EVENT_A] の順番で実行した場合には、次のようになります。
- トリガを [EVENT_A, EVENT_C, EVENT_C, EVENT_B, EVENT_B]:の順番で実行した場合には、 RegionX が最初に非アクティブとなり、その後 RegionYが非アクティブとなり、最後に RegionZが非アクティブになります。State2のexitアクションを実行後には、 State2から出る遷移が有効になります。
- トリガを [EVENT_A, EVENT_B, EVENT_B, EVENT_C, EVENT_C]:の順番で実行した場合には、 RegionX が最初に非アクティブとなり、その後 RegionZが非アクティブとなり、最後に RegionYが非アクティブになります。State2のexitアクションを実行後には、退場点CPR_Exit3が有効になります。
- トリガを [EVENT_C, EVENT_C, EVENT_B, EVENT_B, EVENT_A]:の順番で実行した場合には、 RegionY fが最初に非アクティブとなり、その後 RegionZが非アクティブとなり、最後に RegionXが非アクティブになります。State2のexitアクションを実行後には、退場点CPR_Exit2が有効になります。