このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ステート アクションと遷移ラベルを使用したチャート動作の定義
"ステート アクション" と "遷移アクション" は、シミュレーション中に 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
アクションは、ステートがアクティブになると発生します。during
アクションは、ステートが既にアクティブでチャートがステート外に遷移しないときのタイム ステップで発生します。exit
アクションは、チャートがステート外に遷移すると発生します。
ステート アクションのタイプの指定には、完全なキーワード (entry
、during
、exit
) か、省略形 (en
、du
、ex
) を使用できます。コンマを使ってステート アクション タイプを組み合わせることもできます。たとえば、entry, during
という組み合わせタイプのアクションは、ステートがアクティブになるときのタイム ステップと、それ以降、ステートがアクティブな間の各タイム ステップで発生します。
ヘイルストーン チャートには、以下のステート内のアクションが含まれています。
Init
— このステートがシミュレーションの開始時にアクティブになると、entry
アクションは、n
のパリティを判定してy
をfalse
に設定します。チャートが 1 タイム ステップ後にInit
から外へ遷移するときに、exit
アクションはn
が 1 に等しいかどうかを判定します。Even
— このステートがアクティブになるときと、それ以降、ステートがアクティブな各タイム ステップで、組み合わせアクションentry, during
は、ヘイルストーン数列の次の数値n/2
とそのパリティを計算します。Odd
— このステートがアクティブになるときと、それ以降、ステートがアクティブな各タイム ステップで、組み合わせアクションentry, during
は、n
が 1 より大きいかどうかをチェックし、大きい場合はヘイルストーン数列の次の数値3*n+1
とそのパリティを計算します。
遷移ラベルのタイプ
遷移ラベルは、アクティブ ステートが変化するときの Stateflow チャートの動作を定義します。遷移ラベルの最も一般的なタイプは、条件と条件アクションです。
[Condition]{ConditionAction}
Condition
は、遷移が発生するかどうかを判定する論理式です。条件を指定しない場合、遷移は遷移元ステートがアクティブになった 1 タイム ステップ後に発生します。
ConditionAction
は、遷移をガードする条件が真の場合に実行される手順です。条件アクションは条件の後に、しかし、どの exit
ステート アクションや entry
ステート アクションよりも前に発生します。
ヘイルストーン チャートには、以下の遷移上のアクションが含まれています。
Init
へのデフォルト遷移 — シミュレーションの開始時に、条件アクションn = u
は、入力値u
をローカル データn
に代入します。Init
からEven
への遷移 — 条件n2 == 0
は、n
が偶数の場合に遷移が発生すると判定します。この遷移の遷移元にある数値 1 は、この遷移がInit
からOdd
への遷移の前に評価されることを示します。Odd
からEven
への遷移 — 条件n2 == 0
は、n
が偶数の場合に遷移が発生すると判定します。Even
からOdd
への遷移 — 条件n2 ~= 0
は、n
が奇数の場合に遷移が発生すると判定します。この場合、条件アクションy = isequal(n,1)
は、n
が 1 に等しいかどうかを判定します。
チャートの動作の確認
9 の値から始まるヘイルストーン数列を計算するには、次を行います。
1. Constant ブロックで、値「9
」を入力します。
2.[シミュレーション] タブで、[実行] をクリックします。チャートは以下のアクションによって応答します。
時間 に、
Init
へのデフォルト遷移が発生する。遷移アクションによりn
の値が 9 に設定される。ステートInit
がアクティブになる。Init
内のentry
アクションにより、n2
が 1 に、y
がfalse
に設定される。時間 に、条件
n2 == 0
が偽であるためチャートはOdd
への遷移を準備する。Init
内のexit
アクションにより、y
がfalse
に設定される。ステートInit
が非アクティブになり、ステートOdd
がアクティブになる。Odd
内のentry
アクションにより、n
が 28 に、n2
が 0 に設定される。時間 に、条件
n2 == 0
が真であるためチャートはEven
への遷移を準備する。ステートOdd
が非アクティブになり、ステートEven
がアクティブになる。Even
内の entry アクションにより、n
が 14 に、n2
が 0 に設定される。時間 には、条件
n2 ~= 0
が偽であるためチャートは遷移を行わない。ステートEven
はアクティブなままとなる。Even
内のduring
アクションにより、n
が 7 に、n2
が 1 に設定される。時間 に、条件
n2 ~= 0
が真であるためチャートはOdd
への遷移を準備する。遷移アクションにより、y
が false に設定される。ステートEven
が非アクティブになり、ステートOdd
がアクティブになる。Odd
内のentry
アクションにより、n
が 22 に、n2
が 0 に設定される。時間 に
n
の値に達するまで、チャートはヘイルストーン数列の計算を継続する。時間 に、チャートは
Even
からOdd
への遷移を準備する。遷移アクションにより、y
がtrue
に設定される。ステートEven
が非アクティブになり、ステートOdd
がアクティブになる。Odd
内のentry
アクションでは、n
やn2
は変更されない。出力信号y
に接続されている Stop Simulation ブロックによってシミュレーションが停止する。
3. [シミュレーション] タブで、[結果の確認] にある [データ インスペクター] をクリックします。
4. ヘイルストーン数列の値を確認するには、シミュレーション データ インスペクターで、ログ信号 n
を選択します。
ヘイルストーン数列は 19 回の反復後に値 1 に達しています。