メインコンテンツ

時相論理を使用したチャート実行の制御

R2026b

時相論理は、時間の観点からチャートの実行を制御します。ステート アクションと遷移において、次の 2 つのタイプの時相論理を使用できます。

  • イベントベースの時相論理はイベントの反復実行を追跡します。ベース イベントとしては、どの明示的および暗黙的イベントでも使用できます。

  • 絶対時間の時相論理は、ステートがアクティブになってからのシミュレーションの経過時間を追跡します。

時相論理演算子

時相論理に基づいて Stateflow® チャートの動作を定義するには、次の表にある演算子を使用します。これらの演算子を使用できる場所は次のとおりです。

  • ステート on アクション

  • ステートを起点とする遷移パス上のアクション

各時相論理演算子にはステートが関連付けられています。これは、アクションが実行されるステート、または遷移パスの起点となるステートです。Stateflow チャートは、関連付けられたステートが再びアクティブになるたびに、各演算子で使用されるカウンターをリセットします。

演算子構文説明例
after

after(n,E)

n は正の整数、または正の整数値になる式です。

E は演算子のベース イベントです。

関連付けられたステートがアクティブになってからのイベント E の発生回数が n 回以上である場合に true を返します。それ以外の場合、演算子は false を返します。

チャートがイベント E のブロードキャストを処理すると、ステータス メッセージを表示します。この処理はステートがアクティブになってから 3 番目以降の E のブロードキャストで実行されます。

on after(3,E):
   disp("ON");

チャートがイベント E のブロードキャストを処理すると、関連付けられたステートから遷移します。この処理はステートがアクティブになってから 5 番目以降の E のブロードキャストで実行されます。

after(5,E)

after(n,tick)

n は正の整数、または正の整数値になる式です。

関連付けられたステートがアクティブになってからのチャートの起動回数が n 回以上である場合に true を返します。それ以外の場合、演算子は false を返します。

暗黙的なイベント tick は、入力イベントがあるチャートではサポートされていません。詳細については、暗黙的イベントを使用したチャート動作の制御を参照してください。

関連付けられたステートがアクティブになってからチャートが 7 回以上起動すると、このステートから遷移します。ただし、変数 temp が 98.6 より大きい場合に限られます。

after(7,tick)[temp > 98.6]

after(n,sec)

after(n,msec)

after(n,usec)

n は正の実数、または正の実数値になる式です。

関連付けられたステートがアクティブになってから少なくとも n 単位の時間が経過した場合に true を返します。それ以外の場合、演算子は false を返します。

時間は、秒 (sec)、ミリ秒 (msec) またはマイクロ秒 (usec) で指定します。

関連付けられたステートが 12.3 秒以上アクティブになった時点から、チャートが起動するたびに変数 temp を LOW に設定します。

on after(12.3,sec):
   temp = LOW;
at

at(n,E)

n は正の整数、または正の整数値になる式です。

E は演算子のベース イベントです。

関連付けられたステートがアクティブになってからのイベント E の発生回数が厳密に n 回である場合に true を返します。それ以外の場合、演算子は false を返します。

ステートがアクティブになってから 3 番目のイベント E のブロードキャストをチャートが処理すると、ステータス メッセージが表示されます。

on at(3,E):
   disp("ON");

ステートがアクティブになってから 5 番目のイベント E のブロードキャストをチャートが処理すると、関連付けられたステートから遷移します。

at(5,E)

at(n,tick)

n は正の整数、または正の整数値になる式です。

関連付けられたステートがアクティブになってからのチャートの起動回数が厳密に n 回である場合に true を返します。それ以外の場合、演算子は false を返します。

暗黙的なイベント tick は、入力イベントがあるチャートではサポートされていません。詳細については、暗黙的イベントを使用したチャート動作の制御を参照してください。

関連付けられたステートがアクティブになってからチャートが 7 回起動すると、このステートから遷移します。ただし、変数 temp が 98.6 より大きい場合に限られます。

at(7,tick)[temp > 98.6]
before

before(n,E)

n は正の整数、または正の整数値になる式です。

E は演算子のベース イベントです。

関連付けられたステートがアクティブになってからのイベント E の発生回数が n 回未満の場合に true を返します。それ以外の場合、演算子は false を返します。

ステートがアクティブになってから 1 番目と 2 番目のイベント E のブロードキャストをチャートが処理すると、ステータス メッセージが表示されます。

on before(3,E):
   disp("ON");

チャートがイベント E のブロードキャストを処理すると、このステートから遷移します。ただし、ステートがアクティブだったイベント E のブロードキャストが 5 回未満の場合に限られます。

before(5,E)

before(n,tick)

n は正の整数、または正の整数値になる式です。

関連付けられたステートがアクティブになってからのチャートの起動回数が n 回未満の場合に true を返します。それ以外の場合、演算子は false を返します。

暗黙的なイベント tick は、入力イベントがあるチャートではサポートされていません。詳細については、暗黙的イベントを使用したチャート動作の制御を参照してください。

チャートが起動すると、関連付けられたステートから遷移します。ただし、変数 temp が 98.6 より大きく、ステートがアクティブになってからのチャートの起動回数が 7 回未満の場合に限られます。

before(7,tick)[temp > 98.6]

before(n,sec)

before(n,msec)

before(n,usec)

n は正の実数、または正の実数値になる式です。

関連付けられたステートがアクティブになってから n 単位未満の時間が経過した場合に true を返します。それ以外の場合、演算子は false を返します。

時間は、秒 (sec)、ミリ秒 (msec) またはマイクロ秒 (usec) で指定します。

チャートが起動するたびに変数 temp を MED に設定します。ただし、関連付けられたステートがアクティブである時間が 12.3 秒未満である場合に限られます。

on before(12.3,sec):
   temp = MED;
every

every(n,E)

n は正の整数、または正の整数値になる式です。

E は演算子のベース イベントです。

関連付けられたステートがアクティブになってから、イベント E が n 回発生するごとに true を返します。それ以外の場合、演算子は false を返します。

ステートがアクティブになった後のイベント E のブロードキャストをチャートが 3 回処理するたびに、ステータス メッセージが表示されます。

on every(3,E):
   disp("ON");

ステートがアクティブになった後のイベント E のブロードキャストをチャートが 5 回処理するたびに、関連付けられたステートから遷移します。

every(5,E)

every(n,tick)

n は正の整数、または正の整数値になる式です。

関連付けられたステートがアクティブになってからチャートが n 回起動するたびに true を返します。それ以外の場合、演算子は false を返します。

暗黙的なイベント tick は、入力イベントがあるチャートではサポートされていません。詳細については、暗黙的イベントを使用したチャート動作の制御を参照してください。

ステートがアクティブになった後に tick イベントが 7 回発生するたびに、関連付けられたステートから遷移します。ただし、変数 temp が 98.6 より大きい場合に限られます。

every(7,tick)[temp > 98.6]
temporalCount

temporalCount(E)

E は演算子のベース イベントです。

関連付けられたステートがアクティブになってからのイベント E の発生回数を返します。

イベント E のブロードキャストをチャートが処理するたびに、配列 M の連続する要素にアクセスします。

on E:
   y = M(temporalCount(E));
temporalCount(tick)

関連付けられたステートがアクティブになってからチャートが起動した回数を返します。

暗黙的なイベント tick は、入力イベントがあるチャートではサポートされていません。

配列 M の連続する要素における入力データ u の値を格納します。

en,du:
   M(temporalCount(tick)+1) = u;

temporalCount(sec)

temporalCount(msec)

temporalCount(usec)

関連付けられたステートがアクティブになってから経過した時間を返します。

時間は、秒 (sec)、ミリ秒 (msec) またはマイクロ秒 (usec) で指定します。

ステートがアクティブになってからの経過時間をミリ秒単位で格納します。

en,du:
   y = temporalCount(msec);
elapsed

elapsed(sec)

関連付けられたステートがアクティブになってから経過した時間を返します。

temporalCount(sec) と等価です。

ステートがアクティブになってからの経過時間を秒単位で格納します。

en,du:
   y = elapsed(sec);
etelapsed(sec) の、代替の実行方法です。

チャートがイベント E のブロードキャストを処理するときに、関連付けられたステートから遷移し、ステートがアクティブになってからの経過時間を表示します。

E{disp(et);}
count

count(C)

C は、true または false になる式です。

条件式 C が true になり、かつ関連付けられたステートがアクティブになってからの、チャートが起動した回数を返します。

Stateflow チャートは、条件式 C が false になるか、関連付けられたステートが非アクティブになると、count 演算子の値をリセットします。

count の値はステップ サイズに依存する場合があります。モデルのソルバーまたはステップのサイズを変更すると、count 演算子により生成される結果に影響が生じます。

5 回を超えるチャートの実行で変数 x の値が 2 以上になった場合、関連付けられたステートから遷移します。

[count(x>=2) > 5]

変数 x の値が 5 より大きくなってからのチャートの実行回数を格納します。

en,du:
   y = count(x>5);
duration

duration(C)

duration(C,sec)

duration(C,msec)

duration(C,usec)

  • C は、true または false になる式です。

条件式 C が true になり、かつ関連付けられたステートがアクティブになってからの経過時間を返します。

時間は、秒 (sec)、ミリ秒 (msec) またはマイクロ秒 (usec) で指定します。既定の単位は秒です。

Stateflow チャートは、条件式 C が false になるか、関連付けられたステートが非アクティブになると、duration 演算子の値をリセットします。

変数 x の値が 0.1 秒より長く 0 以上であった場合に、ステートから遷移します。

[duration(x>=0) > 0.1]

変数 x が 5 より大きくなり、かつステートがアクティブになってからの経過時間をミリ秒単位で格納します。

en,du:
   y = duration(x>5,msec);

引用符を使用してキーワード 'tick'、'sec'、'msec' および 'usec' を囲むことができます。たとえば、after(5,'tick') は after(5,tick) と等価です。

メモ

時相論理演算子 after、at、before、および every は、しきい値 n を整数型の内部カウンターと比較します。n が、2 の整数乗でない傾きまたは非ゼロのバイアスにより定義された固定小数点数である場合、丸めにより、比較の結果が予期しないものになる可能性があります。詳細については、固定小数点データの関係演算を参照してください。

時相論理の例

時間遅延の定義

次の例では、連続時間チャートで 2 つの絶対時間遅延を定義する方法を示します。

チャートの実行は次の手順に従って行われます。

  1. チャートが起動すると、ステート Input が最初にアクティブになります。

  2. シミュレーション時間 5.33 ミリ秒の経過後、Input から Output への遷移が発生します。

  3. ステート Input が非アクティブになり、ステート Output がアクティブになります。

  4. シミュレーション時間 10.5 秒の経過後、Output から Input への遷移が発生します。

  5. ステート Output が非アクティブになり、ステート Input がアクティブになります。

シミュレーションが終了するまで、手順 2 ~ 5 が繰り返されます。

チャートに離散サンプル時間が設定されている場合は、チャートのすべてのアクションはこのサンプル時間の整数倍で発生します。たとえば、Simulink® ソルバーでサイズ 0.1 秒の固定ステップを使用する場合、ステート Input からステート Output への最初の遷移は t = 0.1 秒で発生します。この動作が当てはまる理由は、ソルバーが t = 5.33 ミリ秒の時点でチャートを起動しないからです。代わりに、ソルバーは 0.1 秒の整数倍 (t = 0.0 や 0.1 秒など) でチャートを起動します。

経過時間の検出

次の例では、Step (Simulink)ブロックにより、Stateflow チャートへの単位ステップ入力が提供されています。

チャートは入力 u が 1 に等しくなるときを判断します。

  • t = 2 秒より前に入力が 1 に等しくなる場合は、Start から Fast への遷移が発生します。

  • t = 2 ~ 5 秒の間に入力が 1 に等しくなる場合は、Start から Medium への遷移が発生します。

  • t = 5 秒より後に入力が 1 に等しくなる場合は、Start から Slow への遷移が発生します。

Enabled Subsystem における絶対時間の時相論理の使用

条件付きで実行されるサブシステムに存在するチャートでは、絶対時間の時相論理を使用できます。サブシステムが無効になると、チャートが非アクティブになり、チャートがスリープ状態である間は時相論理演算子は停止します。サブシステムが再び有効になって、チャートが起動するまで、演算子はシミュレーション時間のカウントを停止します。

このモデルには、[イネーブル時の状態] パラメーターが held に設定されている Enabled Subsystem が含まれています。

このサブシステムには after 演算子を使用して遷移をトリガーするチャートが含まれています。

Signal Editor (Simulink)ブロックは、以下の特性をもつ入力信号を提供します。

  • この信号は t = 0 でサブシステムを有効化します。

  • この信号は t = 2 でサブシステムを無効化します。

  • この信号は t = 6 でサブシステムを再有効化します。

このグラフは、チャートで経過した時間の合計を示しています。入力信号によってサブシステムが t = 0 の時点で有効になると、ステート A がアクティブになります。システムが有効である間は、経過時間は増加します。サブシステムが t = 2 で無効になると、チャートはスリープ状態に移行して、経過時間の増加が停止します。2 < t < 6 の間は、システムが無効になっているため、経過時間は 2 秒のまま変わりません。t = 6 でチャートが起動すると、経過時間は再度増加を始めます。

ステート A からステート B への遷移は、シミュレーション時間ではなく、ステート A がアクティブである間の経過時間に依存します。そのため、遷移は t = 9、つまりステート A での経過時間が 5 秒に等しくなった時点で発生します。遷移が発生すると、出力値 y は 0 から 1 に変化します。

Enable ブロックのパラメーター [イネーブル時の状態] を held に設定したサブシステムでのみ、このモデルの動作が当てはまります。パラメーターを reset に設定した場合は、チャートはサブシステムが再び有効になった時点で完全に再初期化されます。デフォルト遷移が実行されて、時相論理のカウンターは 0 にリセットされます。

遷移でのイベントベースの時相論理表記法

演算子 after、at、before は、遷移でイベントベースの時相論理を表現するための 2 種類の異なる表記をサポートしています。

  • "トリガー表記法" は、時相論理演算子のベース イベントのみに依存する遷移を定義します。トリガー表記法は、以下の構文に従います。

    temporalLogicOperator(n,E)[C]
    ここで、

    • temporalLogicOperator は boolean 時相論理演算子です。

    • n は演算子の出現回数です。

    • E は演算子のベース イベントです。

    • C はオプションの条件式です。

    トリガー表記法を使用する場合、遷移が発生する可能性があるのは、チャートがベース イベント E のブロードキャストを処理する時点のみです。

  • "条件表記法" は、ベース イベントと非ベース イベントに依存する遷移条件を定義します。条件表記法は、以下の構文に従います。

    F[temporalLogicOperator(n,E) && C]
    ここで、

    • temporalLogicOperator は boolean 時相論理演算子です。

    • n は演算子の出現回数です。

    • E は演算子のベース イベントです。

    • F はオプションの非ベース イベントです。

    • C はオプションの条件式です。

    非ベース イベント F による条件表記法を使用する場合、遷移が発生する可能性があるのは、チャートが F のブロードキャストを処理する時点のみです。非ベース イベントを省略した場合、遷移が発生する可能性があるのは、チャートが明示的または暗黙的イベントを処理している時点のみです。

たとえば、次の遷移ラベルはトリガー表記法を使用して、チャートがベース イベント E のブロードキャストを処理した時点で発生する、関連付けられたステートからの遷移を示します。ステートがアクティブになってから 5 番目以降の E のブロードキャストが対象となります。

after(5,E)

一方で、次の遷移ラベルは条件表記法を使用して、5 回以上のベース イベント E のブロードキャストでステートがアクティブだった場合に関連付けられたステートから遷移することを示します。この遷移はチャートが E のブロードキャストを処理中でない場合でも実行されます。

[after(5,E)]

メモ

演算子 every はトリガー表記法と条件表記法をサポートしています。ただし、この演算子については、この両方の表記法は等価です。遷移ラベル every(5,E) および [every(5,E)] は、ステートがアクティブになってからベース イベント E のブロードキャストを k 回処理すると (k は 5 の倍数)、関連付けられたステートから遷移することを示します。

時相論理のベスト プラクティス

遷移元ステートがない遷移パスで時相論理を使用しない

時相論理演算子の値は、関連付けられたステートがアクティブになった時点により異なります。すべての時相論理演算子に一意のステートが関連付けられるようにするには、これらの演算子を次の場所でのみ使用してください。

  • ステート on アクション

  • ステートを起点とする遷移パス上のアクション

時相論理演算子は、デフォルト遷移や、グラフィカル関数での遷移で使用しないでください。これらの遷移はステートから発生していません。

tick の代わりに絶対時間の時相論理を使用する

絶対時間の時相論理を使用する delay 式の値は、意味的にモデルのサンプル時間に依存しません。一方、明示的イベント tick に基づいて時相論理を使用する delay 式は、Simulink® ソルバーで使用されるステップ サイズに依存します。

さらに、絶対時間の時相論理は、入力イベントがあるチャートでサポートされています。暗黙的なイベント tick は、入力イベントがあるチャートではサポートされていません。

絶対時間の時相論理に at を使用しない

at を絶対時間の時相論理演算子として使用することはサポートされていません。代わりに after 演算子を使用します。たとえば、式 at(5.33,sec) を使用して時間遅延を定義する必要があるとします。

Chart with a transition that uses at as an absolute-time temporal logic operator.

実行時エラーを回避するには、遷移ラベルを after(5.33,sec) に変更します。

Chart with a transition that uses after as an absolute-time temporal logic operator.

大きいパラメーター値に対する予期しない結果

after(x,sec) のような Stateflow の絶対時間での時相論理条件は、以下の条件をもつステートに入った後、想定された時間において true にならない場合があります。

  • チャートに周期的離散サンプル時間がある。

  • チャートのロジックによって、ステートが時間単位 2147418 より長い間アクティブなままとなる。時間単位とは、そのステートで使用されるすべての時相論理式において最小の時間単位です。たとえば、ステートに 2 つの出力遷移があり、その 1 つが after(x,sec) を使用し、もう 1 つが after(x,msec) を使用する場合、時間単位は msec (milliseconds) になります。

一般に、ステートの時間の長さが 2147418 より長い場合に、予期しない結果が発生します。ただし、これは、チャートのサンプル時間によって異なる場合があります。

絶対時間の時相論理に every を使用しない

every を絶対時間の時相論理演算子として使用することはサポートされていません。代わりに、after 演算子を含む外部自己ループ遷移を使用してください。たとえば、チャート実行時に 2.5 秒間隔でアクティブ ステートのステータス メッセージを印刷する必要があると仮定します。

Chart with a state action that uses every as an absolute-time temporal logic operator.

実行時エラーを回避するには、ステート アクションを外部の自己ループ遷移に置き換えます。

Chart with a self-loop transition that uses after as an absolute-time temporal logic operator.

ステートにヒストリ ジャンクションを追加して、各自己ループ遷移の前にステート設定がチャートで記憶されるようにします。詳細については、ヒストリ ジャンクションを使用した前のサブステート アクティビティの再開を参照してください。

より効率的なコード生成のための離散サンプル時間によるチャートの使用

Triggered Subsystem または Enabled Subsystem 内にない離散チャート用に生成されたコードでは、Simulink が提供する時間ではなく、整数カウンターを使用して時間を追跡します。この動作により、オーバーヘッドおよびメモリの観点からより効率的なコード生成が可能になり、また SIL (ソフトウェアインザループ) および PIL (プロセッサインザループ) のシミュレーション モードでこのコードが使用可能になります。詳細については、SIL シミュレーションおよび PIL シミュレーション (Embedded Coder)を参照してください。

スタンドアロン チャートにおける時相論理

MATLAB® のスタンドアロン チャートでは、次の時相論理演算子がサポートされています。

  • after、at、every は入力イベント数、チャートの呼び出し回数 (tick)、絶対時間 (sec) に対して演算を行います。

  • count は、チャートの呼び出し回数 (tick) に対して演算を行います。

  • temporalCount は、絶対時間 (sec、msec、usec) に対して演算を行います。

  • elapsed は、絶対時間 (sec) に対して演算を行います。

これらの演算子は、絶対時間の時相論理を経過実時間で定義します。この時間の精度は 1 ミリ秒に制限されています。スタンドアロン チャートの詳細については、MATLAB オブジェクトとして実行する Stateflow チャートの作成を参照してください。

複数の遷移元がある遷移パスで時相論理を使用しない

スタンドアロン チャートでは、遷移元ステートが複数ある遷移パスでの時相論理演算子の使用はサポートされません。たとえば、次のスタンドアロン チャートでは、時相論理式 after(10,sec) が複数の遷移元ステートをもつ遷移パスをトリガーするため、実行時エラーが発生します。

Standalone chart containing a temporal logic expression on the transition path originating from states Positive and Negative to state End.

この問題を解決するには、それぞれ 1 つの遷移元ステートをもつ複数の遷移パスに、個別に時相論理式を使用します。

Standalone chart using temporal logic expressions on separate transition paths.

遷移パスで絶対時間の時相論理と条件を併用しない

スタンドアロン チャートでは、絶対時間の時相論理演算子 after、at、および every は、チャートを起動するための暗黙的イベントを生成する MATLAB timer オブジェクトを作成します。同じ遷移パスでこれらの演算子を条件と組み合わせて使用すると、予期しない動作が発生する場合があります。

  • timer がチャートを起動した時点で遷移パスの条件が偽である場合、チャートはアクティブ ステートの during および on アクションを実行します。

  • チャートは演算子 after および at に関連付けられている timer オブジェクトをリセットしません。この遷移パスの条件が後で真になった場合、別の明示的または暗黙的イベントがチャートを起動するまで、遷移は発生しません。

たとえば、次のチャートでは、ステート A からステート B への遷移パスにより、絶対時間の時相論理トリガー after(1,sec) と条件 [guard] が組み合わされます。ステート A からステート C への遷移には、絶対時間の時相論理トリガー after(5,sec) があります。各遷移は、暗黙的イベントを生成する timer オブジェクトに関連付けられます。初期状態では、ローカル変数 guard は false です。

Chart combining an absolute-time temporal logic trigger and a condition on the same transition path.

チャートを実行すると、ステート A がアクティブになります。チャートは entry アクションを実行し、メッセージ Hello! が表示されます。1 秒後、A から B への遷移に関連付けられた timer がチャートを起動します。遷移が無効なので、チャートはステート A の during アクションを実行し、メッセージ Hello! がもう一度表示されます。

2 秒後にチャートが入力イベント E を受け取るものと仮定します。チャートはステート A で on を実行し、guard の値を true に変更します。チャートは演算子 after に関連付けられている timer をリセットしないため、A から B への遷移は、別のイベントがチャートを起動するまで発生しません。

5 秒後、A から C への遷移に関連付けられた timer がチャートを起動します。A から B への遷移が有効で、実行順序も高いため、チャートはステート C への遷移を実行せず、メッセージ Farewell! も表示されません。代わりに、ステート B がアクティブになり、チャートはメッセージ Good bye! を表示します。

参考

| | | | | | | | | (Simulink) | (Simulink)

トピック