Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ステート アクションと遷移ラベルを使用したチャート動作の定義

"ステート アクション""遷移アクション" は、シミュレーション中に Stateflow® チャートがどのように動作するかを定義するために、それぞれステート内または遷移上に書き込む指示です。たとえば、次のチャートのアクションは、コラッツ予想の 1 つのインスタンスを経験的に検証するステート マシンを定義しています。与えられた数値入力 $u$ について、チャートは次のルールを反復することによってヘイルストーン数列 $n_0 = u,$ $n_1,$ $n_2,$ $n_3,$ … を計算します。

  • $n_i$ が偶数の場合は、$n_{i+1} = n_i / 2$

  • $n_i$ が奇数の場合は、$n_{i+1} = 3n_i+1$

コラッツ予想では、すべての正の整数は、最終的に 1 に到達するヘイルストーン数列をもつことが主張されています。

チャートは 3 つのステートで構成されています。シミュレーションの開始時に、以下を設定することで Init ステートによってチャート データが初期化されます。

  • ローカル データ n を入力 u の値に設定。

  • ローカル データ n2n を 2 で除算した余りに設定。

  • 出力データ yfalse に設定。

入力のパリティに応じて、チャートは Even または Odd のステートに遷移します。ステート アクティビティが EvenOdd のステート間で切り替わると、チャートはヘイルストーン数列内の数値を計算します。数列が 1 の値に達すると出力データ ytrue になり、Simulink® モデルでStop Simulation (Simulink)ブロックがトリガーされます。

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

ステート アクションは、ステートがアクティブな間の Stateflow チャートの動作を定義します。最もよく使用されるタイプのステート アクションは entryduring、および exit の各アクションです。

  • entry アクションは、ステートがアクティブになると発生します。

  • during アクションは、ステートが既にアクティブでチャートがステート外に遷移しないときのタイム ステップで発生します。

  • exit アクションは、チャートがステート外に遷移すると発生します。

ステート アクションのタイプの指定には、完全なキーワード (entryduringexit) か、省略形 (enduex) を使用できます。コンマを使ってステート アクション タイプを組み合わせることもできます。たとえば、entry, during という組み合わせタイプのアクションは、ステートがアクティブになるときのタイム ステップと、それ以降、ステートがアクティブな間の各タイム ステップで発生します。

ヘイルストーン チャートには、以下のステート内のアクションが含まれています。

  • Init — このステートがシミュレーションの開始時にアクティブになると、entry アクションは、n のパリティを判定して yfalse に設定します。チャートが 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.[シミュレーション] タブで、[実行] をクリックします。チャートは以下のアクションによって応答します。

  • 時間 $t = 0$ に、Init へのデフォルト遷移が発生する。遷移アクションにより n の値が 9 に設定される。ステート Init がアクティブになる。Init 内の entry アクションにより、n2 が 1 に、yfalse に設定される。

  • 時間 $t = 1$ に、条件 n2 == 0 が偽であるためチャートは Odd への遷移を準備する。Init 内の exit アクションにより、yfalse に設定される。ステート 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 への遷移を準備する。遷移アクションにより、ytrue に設定される。ステート Even が非アクティブになり、ステート Odd がアクティブになる。Odd 内の entry アクションでは、nn2 は変更されない。出力信号 y に接続されている Stop Simulation ブロックによってシミュレーションが停止する。

3. [シミュレーション] タブで、[結果の確認] にある [データ インスペクター] をクリックします。

4. ヘイルストーン数列の値を確認するには、シミュレーション データ インスペクターで、ログ信号 n を選択します。

ヘイルストーン数列は 19 回の反復後に値 1 に達しています。

関連するトピック