Main Content

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

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

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

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

  • 絶対時間の時相論理はステートがアクティブになってからの経過時間を追跡します。絶対時間の時相論理演算子のタイミングは Stateflow® チャートのタイプによって異なります。

    • Simulink® モデル内のチャートは、絶対時間時相論理をシミュレーション時間で定義します。

    • MATLAB® のスタンドアロン チャートは、絶対時間時相論理を時計時間で定義します。この時間の精度は 1 ミリ秒に制限されています。

時相論理演算子

時相論理に基づいて 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 を返します。

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

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

after(7,tick)[temp > 98.6]

after(n,sec)

after(n,msec)

after(n,usec)

n は正の実数、または正の実数値として評価される式です。

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

Simulink モデルのチャートでは、時間を秒単位 (sec)、ミリ秒単位 (msec)、またはマイクロ秒単位 (usec) で指定します。

MATLAB のスタンドアロン チャートでは、時間を秒単位 (sec) で指定します。演算子は、チャートを起動するための暗黙的イベントを生成する MATLAB timer オブジェクトを作成します。MATLAB timer オブジェクトの精度は 1 ミリ秒に制限されます。詳細については、スタンドアロン チャートのイベントを参照してください。

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

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 を返します。

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

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

at(7,tick)[temp > 98.6]

at(n,sec)

n は正の実数、または正の実数値として評価される式です。

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

at を絶対時間の時相論理演算子として使用することは、MATLAB のスタンドアロン チャートでのみサポートされています。演算子は、チャートを起動するための暗黙的イベントを生成する MATLAB timer オブジェクトを作成します。MATLAB timer オブジェクトの精度は 1 ミリ秒に制限されます。詳細については、スタンドアロン チャートのイベントを参照してください。

ステートが厳密に 12.3 秒アクティブだった場合に、変数 tempHIGH に設定します。

on at(12.3,sec):
   temp = HIGH;
before

before(n,E)

n は正の整数、または正の整数値として評価される式です。

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

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

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

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

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

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

before(5,E)

before(n,tick)

n は正の整数、または正の整数値として評価される式です。

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

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

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

チャートが起動すると、関連付けられたステートから遷移します。ただし、変数 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) で指定します。

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

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

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

every(n,E)

n は正の整数、または正の整数値として評価される式です。

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

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

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

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

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

every(5,E)

every(n,tick)

n は正の整数、または正の整数値として評価される式です。

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

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

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

every(7,tick)[temp > 98.6]

every(n,sec)

n は正の実数、または正の実数値として評価される式です。

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

every を絶対時間の時相論理演算子として使用することは、MATLAB のスタンドアロン チャートでのみサポートされています。演算子は、チャートを起動するための暗黙的イベントを生成する MATLAB timer オブジェクトを作成します。MATLAB timer オブジェクトの精度は 1 ミリ秒に制限されます。詳細については、スタンドアロン チャートのイベントを参照してください。

ステートがアクティブである時間が 12.3 秒経過するごとに変数 temp の値を 5 増やします。

on every(12.3,sec):
   temp = temp+5;
temporalCount

temporalCount(E)

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

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

temporalCount をイベントベースの時相論理演算子として使用することは、MATLAB のスタンドアロン チャートではサポートされていません。

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

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

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

Simulink モデル内の Stateflow チャートに入力イベントがある場合、暗黙的イベント tick はサポートされません。

temporalCount をイベントベースの時相論理演算子として使用することは、MATLAB のスタンドアロン チャートではサポートされていません。

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

en:
   M[0] = u;
du:
   M[temporalCount(tick)] = u;

temporalCount(sec)

temporalCount(msec)

temporalCount(usec)

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

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

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

exit:
   y = temporalCount(msec);
elapsed

elapsed(sec)

temporalCount(sec) と等価です。関連付けられたステートがアクティブになってから経過した時間を返します。

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

en,du:
   y = elapsed(sec);

count

count(C)

C は、true または false として評価される式です。

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

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

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

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

exit:
   y = count(x>5)

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

[count(x>=2) > 5]

duration

duration(C)

C は、true または false として評価される式です。

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

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

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

[duration(x>=0) > 0.1]

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

メモ

時相論理演算子 afteratbefore、および 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ブロックにより、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ブロックは、以下の特性をもつ入力信号を提供します。

  • この信号は 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 にリセットされます。

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

Simulink モデルの Stateflow チャートでは、演算子 afteratbefore は遷移でイベントベースの時相論理を表現するための 2 種類の異なる表記をサポートしています。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    時相論理演算子の条件表記法は、MATLAB のスタンドアロンのチャートではサポートされていません。

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

after(5,E)

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

[after(5,E)]

メモ

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

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

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

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

  • ステート on アクション

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

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

Simulink モデルのチャートでは tick の代わりに絶対時間の時相論理を使用する

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

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

Simulink モデルのチャートで絶対時間の時相論理に at を使用しない

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

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

Simulink モデルのチャートで絶対時間の時相論理に after を使用しない

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

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

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

MATLAB のスタンドアロン チャート内において複数の遷移元がある遷移パスで時相論理を使用しない

MATLAB のスタンドアロン チャートでは、遷移元ステートが複数ある遷移パスでの時相論理の使用はサポートされません。たとえば、次のスタンドアロン チャートでは、時相論理式 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.

MATLAB のスタンドアロン チャートの遷移パスで絶対時間の時相論理と条件を併用しない

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

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

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

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

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

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

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

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

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

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

参考

| | | | | | | | | |

関連するトピック