アクションを使用したチャート動作の定義
"ステート アクションと遷移アクション" は、シミュレーション中に Stateflow® チャートがどのように動作するかを定義するためにステート内または遷移の横に書き込む指示です。詳細については、有限ステート マシンのモデル化を参照してください。
ステート アクションと遷移アクションの例
次のチャートのアクションは、コラッツ予想の 1 つのインスタンスを経験的に検証するステート マシンを定義しています。与えられた数値入力 について、チャートは次のルールを反復することによってヘイルストーン数列
… を計算します。
が偶数の場合は、
が奇数の場合は、
コラッツ予想では、すべての正の整数は、最終的に 1 に到達するヘイルストーン数列をもつことが主張されています。
チャートは 3 つのステートで構成されています。シミュレーションの開始時に、Init
ステートによってチャート データが初期化されます。
ローカル データ
n
は入力u
の値に設定される。ローカル データ
n2
はn
を 2 で除算した余りに設定される。出力データ
y
はfalse
に設定される。
入力のパリティに応じて、チャートは Even
または Odd
のステートに遷移します。ステート アクティビティが Even
と Odd
のステート間で切り替わると、チャートはヘイルストーン数列内の数値を計算します。数列が 1 の値に達すると出力データ y
は true
になり、Simulink® モデルでStop Simulation (Simulink)ブロックがトリガーされます。
ステート アクション タイプ
ステート アクションは、ステートがアクティブな間の Stateflow チャートの動作を定義します。最もよく使用されるタイプのステート アクションは entry
、during
、および exit
の各アクションです。
ステート アクションのタイプ | 省略形 | 説明 |
---|---|---|
entry | en | ステートがアクティブになるときのタイム ステップでアクションが発生します。 |
during | du | ステートが既にアクティブでチャートがステート外に遷移しないときのタイム ステップで、アクションが発生します。 |
exit | ex | チャートがステート外に遷移するときのタイム ステップでアクションが発生します。 |
ステート アクションのタイプの指定には、その完全なキーワード (entry
、during
、exit
) か、その省略形 (en
、du
、ex
) を使用できます。コンマを使ってステート アクション タイプを組み合わせることもできます。たとえば、entry,during
という組み合わせタイプのアクションは、ステートがアクティブになるときのタイム ステップと、それ以降、ステートがアクティブな間の各タイム ステップで発生します。
次の表は、ヘイルストーン チャートにおける各ステート アクションの結果をまとめています。
ステート | アクション | 結果 |
---|---|---|
Init |
entry: n2 = rem(n,2); y = false; | Init がシミュレーションの開始時にアクティブになると、n のパリティを判定して y を false に設定します。 |
exit: y = isequal(n,1); | 1 タイム ステップ後に Init から外へ遷移するときに、n が 1 に等しいかどうかを判定します。 | |
Even |
entry,during: n = n/2; n2 = rem(n,2); | ヘイルストーン数列の次の数値 (
|
Odd |
entry,during: n = 3*(n-y)+1; n2 = rem(n,2); | ヘイルストーン数列の次の数値 (3
シミュレーションの大部分で |
遷移アクション タイプ
遷移アクションは、遷移によってアクティブ ステートから離れるときの Stateflow チャートの動作を定義します。最も一般的なタイプの遷移アクションは、条件と条件付きアクションです。遷移アクションを指定するには、ラベルを次の構文で使用します。
[condition]{conditional_action}
condition
は、遷移が発生するかどうかを判定する論理式です。条件を指定しない場合は、真と評価される暗黙的な条件が仮定されます。
conditional_action
は、遷移を保護する条件が真の場合に実行される手順です。条件付きアクションは条件の後に、しかし、どの exit
ステート アクションや entry
ステート アクションよりも前に発生します。
次の表は、ヘイルストーン チャートにおける各遷移アクションの結果をまとめています。
遷移 | アクション | アクション タイプ | 結果 |
---|---|---|---|
Init へのデフォルト遷移 |
n = u | 条件付きアクション | シミュレーションの開始時に、入力値 u をローカル データ n に代入します。 |
Init から Even への遷移 |
n2 == 0 | 条件 | n が偶数の場合、遷移が発生します。この遷移の遷移元にある数値 1 は、これが Odd への遷移の前に評価されることを示します。 |
Init から Odd への遷移 | なし | n が奇数の場合、遷移が発生します。この遷移の遷移元にある数値 2 は、これが Even への遷移の前に評価されることを示します。 | |
Odd から Even への遷移 |
n2 == 0 | 条件 | n が偶数の場合、遷移が発生します。 |
Even から Odd への遷移 |
n2 ~= 0 | 条件 | n が奇数の場合、遷移が発生します。 |
y = isequal(n,1) | 条件付きアクション | 遷移の発生時に、n が 1 に等しいかどうかを判定します。 |
チャートの動作の確認
9 の値から始まるヘイルストーン数列を計算するとします。
Constant (Simulink) ブロックで、値
9
を入力します。[シミュレーション] タブで、[実行]
をクリックします。
チャートは以下のアクションによって応答します。
時間 t = 0 に、
Init
へのデフォルト遷移が発生する。遷移アクションにより
n
の値が 9 に設定される。Init
ステートがアクティブになる。Init
内のentry
アクションにより、n2
が 1 に、y
がfalse
に設定される。
時間 t = 1 に、条件
n2 == 0
が偽であるためチャートはOdd
への遷移を準備する。Init
内のexit
アクションにより、y
がfalse
に設定される。Init
ステートが非アクティブになる。Odd
ステートがアクティブになる。Odd
内のentry
アクションにより、n
が 28 に、n2
が 0 に設定される。
時間 t = 2 に、条件
n2 == 0
が真であるためチャートはEven
への遷移を準備する。Odd
ステートが非アクティブになる。Even
ステートがアクティブになる。Even
内のentry
アクションにより、n
が 14 に、n2
が 0 に設定される。
時間 t = 3 には、条件
n2 ~= 0
が偽であるためチャートは遷移を行わない。Even
ステートはアクティブなままとなる。Even
内のduring
アクションにより、n
が 7 に、n2
が 1 に設定される。
時間 t = 4 に、条件
n2 ~= 0
が真であるためチャートはOdd
への遷移を準備する。遷移アクションにより、
y
がfalse
に設定される。Even
ステートが非アクティブになる。Odd
ステートがアクティブになる。Odd
内のentry
アクションにより、n
が 22 に、n2
が 0 に設定される。
時間 t = 19 に
n
= 1 の値に達するまで、チャートはヘイルストーン数列の計算を継続する。時間 t = 20 に、チャートは
Even
からOdd
への遷移を準備する。Even
ステートが非アクティブになる前に、遷移アクションによってy
がtrue
に設定される。Odd
ステートがアクティブになる。Odd
内のentry
アクションでは、n
やn2
は変更されない。出力信号
y
に接続されている Stop Simulation (Simulink) ブロックによってシミュレーションが停止する。
[シミュレーション] タブで、[結果の確認] にある [データ インスペクター]
をクリックします。
ヘイルストーン数列の値を確認するには、シミュレーション データ インスペクターで、ログ信号
n
を選択します。
ヘイルストーン数列は 19 回の反復後に値 1 に達しています。