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

アクションを使用したチャート動作の定義

"ステート アクションと遷移アクション" は、シミュレーション中に 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ブロックがトリガーされます。

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

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

ステート アクションのタイプ省略形説明
entryenステートがアクティブになるときのタイム ステップでアクションが発生します。
duringduステートが既にアクティブでチャートがステート外に遷移しないときのタイム ステップで、アクションが発生します。
exitexチャートがステート外に遷移するときのタイム ステップでアクションが発生します。

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

次の表は、ヘイルストーン チャートにおける各ステート アクションの結果をまとめています。

ステートアクション結果
Init

entry:
 n2 = rem(n,2);
 y = false;

Init がシミュレーションの開始時にアクティブになると、n のパリティを判定して yfalse に設定します。

exit:
 y = isequal(n,1);

1 タイム ステップ後に Init から外へ遷移するときに、n が 1 に等しいかどうかを判定します。
Even

entry,during:
 n = n/2;
 n2 = rem(n,2);

ヘイルストーン数列の次の数値 (n / 2) を計算し、そのパリティを以下のタイミングで更新します。

  • Even が最初にアクティブになるタイム ステップ

  • Even がアクティブになった以降の各タイム ステップ

Odd

entry,during:
 n = 3*(n-y)+1;
 n2 = rem(n,2);

ヘイルストーン数列の次の数値 (3n+1) を計算し、そのパリティを以下のタイミングで更新します。

  • Odd が最初にアクティブになるタイム ステップ

  • Odd がアクティブになった以降の各タイム ステップ

シミュレーションの大部分で y はゼロとして評価されます。最後のタイム ステップで n = 1 になると、y は 1 として評価されるため、このアクションはシミュレーションの停止前に n または n2 を変更しません。

遷移アクション タイプ

遷移アクションは、遷移によってアクティブ ステートから離れるときの 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 の値から始まるヘイルストーン数列を計算するとします。

  1. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] で、次のオプションを選択します。

    • 開始時間: 0.0

    • 終了時間: inf

    • タイプ: 固定ステップ

    • 固定ステップ サイズ: 1

  2. [シンボル] ペインで、ローカル データ n を選択します。プロパティ インスペクターの [ログ] で、[信号データのログ] を選択します。

  3. Constant ブロックで、入力値 u = 9 を入力します。

  4. [シミュレーション] タブで、[実行] をクリックします。

    チャートは以下のアクションによって応答します。

    • 時間 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 への遷移を準備する。

      • 遷移アクションにより、yfalse に設定される。

      • Even ステートが非アクティブになる。

      • Odd ステートがアクティブになる。

      • Odd 内の entry アクションにより、n が 22 に、n2 が 0 に設定される。

    • 時間 t = 19n = 1 の値に達するまで、チャートはヘイルストーン数列の計算を継続する。

    • 時間 t = 20 に、チャートは Even から Odd への遷移を準備する。

      • Even ステートが非アクティブになる前に、遷移アクションによって ytrue に設定される。

      • Odd ステートがアクティブになる。

      • Odd 内の entry アクションでは、nn2 は変更されない。

      • 出力信号 y に接続されている Stop Simulation ブロックによってシミュレーションが停止する。

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

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

参考

関連するトピック