時相論理を使用したチャート実行の制御
R2026b時相論理は、時間の観点からチャートの実行を制御します。ステート アクションと遷移において、次の 2 つのタイプの時相論理を使用できます。
イベントベースの時相論理はイベントの反復実行を追跡します。ベース イベントとしては、どの明示的および暗黙的イベントでも使用できます。
絶対時間の時相論理は、ステートがアクティブになってからのシミュレーションの経過時間を追跡します。
時相論理演算子
時相論理に基づいて Stateflow® チャートの動作を定義するには、次の表にある演算子を使用します。これらの演算子を使用できる場所は次のとおりです。
ステート
onアクションステートを起点とする遷移パス上のアクション
各時相論理演算子にはステートが関連付けられています。これは、アクションが実行されるステート、または遷移パスの起点となるステートです。Stateflow チャートは、関連付けられたステートが再びアクティブになるたびに、各演算子で使用されるカウンターをリセットします。
| 演算子 | 構文 | 説明 | 例 |
|---|---|---|---|
after |
| 関連付けられたステートがアクティブになってからのイベント E の発生回数が n 回以上である場合に true を返します。それ以外の場合、演算子は false を返します。 | チャートがイベント |
チャートがイベント after(5,E) | |||
| 関連付けられたステートがアクティブになってからのチャートの起動回数が 暗黙的なイベント | 関連付けられたステートがアクティブになってからチャートが 7 回以上起動すると、このステートから遷移します。ただし、変数 after(7,tick)[temp > 98.6] | |
| 関連付けられたステートがアクティブになってから少なくとも 時間は、秒 ( | 関連付けられたステートが 12.3 秒以上アクティブになった時点から、チャートが起動するたびに変数 | |
at |
| 関連付けられたステートがアクティブになってからのイベント E の発生回数が厳密に n 回である場合に true を返します。それ以外の場合、演算子は false を返します。 | ステートがアクティブになってから 3 番目のイベント |
ステートがアクティブになってから 5 番目のイベント at(5,E) | |||
| 関連付けられたステートがアクティブになってからのチャートの起動回数が厳密に 暗黙的なイベント | 関連付けられたステートがアクティブになってからチャートが 7 回起動すると、このステートから遷移します。ただし、変数 at(7,tick)[temp > 98.6] | |
before |
| 関連付けられたステートがアクティブになってからのイベント | ステートがアクティブになってから 1 番目と 2 番目のイベント |
チャートがイベント before(5,E) | |||
| 関連付けられたステートがアクティブになってからのチャートの起動回数が 暗黙的なイベント | チャートが起動すると、関連付けられたステートから遷移します。ただし、変数 before(7,tick)[temp > 98.6] | |
| 関連付けられたステートがアクティブになってから 時間は、秒 ( | チャートが起動するたびに変数 | |
every |
| 関連付けられたステートがアクティブになってから、イベント | ステートがアクティブになった後のイベント |
ステートがアクティブになった後のイベント every(5,E) | |||
| 関連付けられたステートがアクティブになってからチャートが 暗黙的なイベント | ステートがアクティブになった後に every(7,tick)[temp > 98.6] | |
temporalCount |
| 関連付けられたステートがアクティブになってからのイベント | イベント |
temporalCount(tick) | 関連付けられたステートがアクティブになってからチャートが起動した回数を返します。 暗黙的なイベント | 配列 en,du: M(temporalCount(tick)+1) = u; | |
| 関連付けられたステートがアクティブになってから経過した時間を返します。 時間は、秒 ( | ステートがアクティブになってからの経過時間をミリ秒単位で格納します。 en,du: y = temporalCount(msec); | |
elapsed |
| 関連付けられたステートがアクティブになってから経過した時間を返します。
| ステートがアクティブになってからの経過時間を秒単位で格納します。 en,du: y = elapsed(sec); |
et | elapsed(sec) の、代替の実行方法です。 | チャートがイベント E{disp(et);} | |
count |
| 条件式 Stateflow チャートは、条件式
| 5 回を超えるチャートの実行で変数 [count(x>=2) > 5] |
変数 en,du: y = count(x>5); | |||
duration |
| 条件式 時間は、秒 ( Stateflow チャートは、条件式 | 変数 [duration(x>=0) > 0.1] |
変数 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 つの絶対時間遅延を定義する方法を示します。

チャートの実行は次の手順に従って行われます。
チャートが起動すると、ステート
Inputが最初にアクティブになります。シミュレーション時間 5.33 ミリ秒の経過後、
InputからOutputへの遷移が発生します。ステート
Inputが非アクティブになり、ステートOutputがアクティブになります。シミュレーション時間 10.5 秒の経過後、
OutputからInputへの遷移が発生します。ステート
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) を使用して時間遅延を定義する必要があるとします。

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

大きいパラメーター値に対する予期しない結果
after(x,sec) のような Stateflow の絶対時間での時相論理条件は、以下の条件をもつステートに入った後、想定された時間において true にならない場合があります。
チャートに周期的離散サンプル時間がある。
チャートのロジックによって、ステートが時間単位
2147418より長い間アクティブなままとなる。時間単位とは、そのステートで使用されるすべての時相論理式において最小の時間単位です。たとえば、ステートに 2 つの出力遷移があり、その 1 つがafter(x,sec)を使用し、もう 1 つがafter(x,msec)を使用する場合、時間単位はmsec (milliseconds)になります。
一般に、ステートの時間の長さが 2147418 より長い場合に、予期しない結果が発生します。ただし、これは、チャートのサンプル時間によって異なる場合があります。
絶対時間の時相論理に every を使用しない
every を絶対時間の時相論理演算子として使用することはサポートされていません。代わりに、after 演算子を含む外部自己ループ遷移を使用してください。たとえば、チャート実行時に 2.5 秒間隔でアクティブ ステートのステータス メッセージを印刷する必要があると仮定します。

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

ステートにヒストリ ジャンクションを追加して、各自己ループ遷移の前にステート設定がチャートで記憶されるようにします。詳細については、ヒストリ ジャンクションを使用した前のサブステート アクティビティの再開を参照してください。
より効率的なコード生成のための離散サンプル時間によるチャートの使用
Triggered Subsystem または Enabled Subsystem 内にない離散チャート用に生成されたコードでは、Simulink が提供する時間ではなく、整数カウンターを使用して時間を追跡します。この動作により、オーバーヘッドおよびメモリの観点からより効率的なコード生成が可能になり、また SIL (ソフトウェアインザループ) および PIL (プロセッサインザループ) のシミュレーション モードでこのコードが使用可能になります。詳細については、SIL シミュレーションおよび PIL シミュレーション (Embedded Coder)を参照してください。
スタンドアロン チャートにおける時相論理
MATLAB® のスタンドアロン チャートでは、次の時相論理演算子がサポートされています。
これらの演算子は、絶対時間の時相論理を経過実時間で定義します。この時間の精度は 1 ミリ秒に制限されています。スタンドアロン チャートの詳細については、MATLAB オブジェクトとして実行する Stateflow チャートの作成を参照してください。
複数の遷移元がある遷移パスで時相論理を使用しない
スタンドアロン チャートでは、遷移元ステートが複数ある遷移パスでの時相論理演算子の使用はサポートされません。たとえば、次のスタンドアロン チャートでは、時相論理式 after(10,sec) が複数の遷移元ステートをもつ遷移パスをトリガーするため、実行時エラーが発生します。

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

遷移パスで絶対時間の時相論理と条件を併用しない
スタンドアロン チャートでは、絶対時間の時相論理演算子 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 です。

チャートを実行すると、ステート 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! を表示します。
参考
after | at | before | every | temporalCount | elapsed | count | duration | timer | Signal Editor (Simulink) | Step (Simulink)