時相論理を使用したチャート実行の制御
時相論理は、時間の観点からチャートの実行を制御します。ステート アクションと遷移において、次の 2 つのタイプの時相論理を使用できます。
イベントベースの時相論理はイベントの反復実行を追跡します。ベース イベントとしては、どの明示的および暗黙的イベントでも使用できます。
絶対時間の時相論理はステートがアクティブになってからの経過時間を追跡します。絶対時間の時相論理演算子のタイミングは Stateflow® チャートのタイプによって異なります。
Simulink® モデル内のチャートは、絶対時間時相論理をシミュレーション時間で定義します。
MATLAB® のスタンドアロン チャートは、絶対時間時相論理を時計時間で定義します。この時間の精度は 1 ミリ秒に制限されています。
時相論理演算子
時相論理に基づいて Stateflow チャートの動作を定義するには、次の表にある演算子を使用します。これらの演算子を使用できる場所は次のとおりです。
ステート
on
アクションステートを起点とする遷移パス上のアクション
各時相論理演算子にはステートが関連付けられています。これは、アクションが実行されるステート、または遷移パスの起点となるステートです。Stateflow チャートは、関連付けられたステートが再びアクティブになるたびに、各演算子で使用されるカウンターをリセットします。
演算子 | 構文 | 説明 | 例 |
---|---|---|---|
after |
| 関連付けられたステートがアクティブになってからのイベント E の発生回数が n 回以上である場合に true を返します。それ以外の場合、演算子は false を返します。 | チャートがイベント
|
チャートがイベント after(5,E) | |||
| 関連付けられたステートがアクティブになってからのチャートの起動回数が Simulink モデル内の Stateflow チャートに入力イベントがある場合、暗黙的イベント | 関連付けられたステートがアクティブになってからチャートが 7 回以上起動すると、このステートから遷移します。ただし、変数 after(7,tick)[temp > 98.6] | |
| 関連付けられたステートがアクティブになってから少なくとも Simulink モデルのチャートでは、時間を秒単位 ( MATLAB のスタンドアロン チャートでは、時間を秒単位 ( | 関連付けられたステートが 12.3 秒以上アクティブになった時点から、チャートが起動するたびに変数
| |
at |
| 関連付けられたステートがアクティブになってからのイベント E の発生回数が厳密に n 回である場合に true を返します。それ以外の場合、演算子は false を返します。 | ステートがアクティブになってから 3 番目のイベント
|
ステートがアクティブになってから 5 番目のイベント at(5,E) | |||
| 関連付けられたステートがアクティブになってからのチャートの起動回数が厳密に Simulink モデル内の Stateflow チャートに入力イベントがある場合、暗黙的イベント | 関連付けられたステートがアクティブになってからチャートが 7 回起動すると、このステートから遷移します。ただし、変数 at(7,tick)[temp > 98.6] | |
| 関連付けられたステートがアクティブになってからの経過時間が厳密に
| ステートが厳密に 12.3 秒アクティブだった場合に、変数
| |
before |
| 関連付けられたステートがアクティブになってからのイベント 時相論理演算子 | ステートがアクティブになってから 1 番目と 2 番目のイベント
|
チャートがイベント before(5,E) | |||
| 関連付けられたステートがアクティブになってからのチャートの起動回数が Simulink モデル内の Stateflow チャートに入力イベントがある場合、暗黙的イベント 時相論理演算子 | チャートが起動すると、関連付けられたステートから遷移します。ただし、変数 before(7,tick)[temp > 98.6] | |
| 関連付けられたステートがアクティブになってから 時間は、秒 ( 時相論理演算子 | チャートが起動するたびに変数
| |
every |
| 関連付けられたステートがアクティブになってから、イベント | ステートがアクティブになった後のイベント
|
ステートがアクティブになった後のイベント every(5,E) | |||
| 関連付けられたステートがアクティブになってからチャートが Simulink モデル内の Stateflow チャートに入力イベントがある場合、暗黙的イベント | ステートがアクティブになった後に every(7,tick)[temp > 98.6] | |
| 関連付けられたステートがアクティブになってから
| ステートがアクティブである時間が 12.3 秒経過するごとに変数
| |
temporalCount |
| 関連付けられたステートがアクティブになってからのイベント
| イベント
|
temporalCount(tick) | 関連付けられたステートがアクティブになってからチャートが起動した回数を返します。 Simulink モデル内の Stateflow チャートに入力イベントがある場合、暗黙的イベント
| 配列 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 チャートは、条件式 Simulink モデルのチャートでは、 | 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 にリセットされます。
遷移でのイベントベースの時相論理表記法
Simulink モデルの Stateflow チャートでは、演算子 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
のブロードキャストを処理する時点のみです。非ベース イベントを省略した場合、遷移が発生する可能性があるのは、チャートが明示的または暗黙的イベントを処理している時点のみです。時相論理演算子の条件表記法は、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)
に変更します。
大きいパラメーター値に対する予期しない結果
after(x,sec)
のような Stateflow の絶対時間での時相論理条件は、以下の条件をもつステートに入った後、想定された時間において true
にならない場合があります。
チャートに周期的離散サンプル時間がある。
チャートのロジックによって、ステートが時間単位
2147418
より長い間アクティブなままとなる。時間単位とは、そのステートで使用されるすべての時相論理式において最小の時間単位です。たとえば、ステートに 2 つの出力遷移があり、その 1 つがafter(x,sec)
を使用し、もう 1 つがafter(x,msec)
を使用する場合、時間単位はmsec (milliseconds)
になります。
一般に、ステートの時間の長さが 2147418
より長い場合に、予期しない結果が発生します。ただし、これは、チャートのサンプル時間によって異なる場合があります。
Simulink モデルのチャートで絶対時間の時相論理に every
を使用しない
Simulink モデルのチャートでは、every
を絶対時間の時相論理演算子として使用することはサポートされていません。代わりに、after
演算子を含む外部自己ループ遷移を使用してください。たとえば、チャート実行時に 2.5 秒間隔でアクティブ ステートのステータス メッセージを印刷する必要があると仮定します。
実行時エラーを回避するには、ステート アクションを外部の自己ループ遷移に置き換えます。
ステートにヒストリ ジャンクションを追加して、各自己ループ遷移の前にステート設定がチャートで記憶されるようにします。ヒストリ ジャンクションを使用した前のサブステート アクティビティの再開を参照してください。
MATLAB のスタンドアロン チャート内において複数の遷移元がある遷移パスで時相論理を使用しない
MATLAB のスタンドアロン チャートでは、遷移元ステートが複数ある遷移パスでの時相論理の使用はサポートされません。たとえば、次のスタンドアロン チャートでは、時相論理式 after(10,sec)
が複数の遷移元ステートをもつ遷移パスをトリガーするため、実行時エラーが発生します。
この問題を解決するには、それぞれ 1 つの遷移元ステートをもつ複数の遷移パスに、個別に時相論理式を使用します。
MATLAB のスタンドアロン チャートの遷移パスで絶対時間の時相論理と条件を併用しない
MATLAB のスタンドアロン チャートでは、演算子 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!
を表示します。
より効率的なコード生成のための離散サンプル時間によるチャートの使用
Triggered Subsystem または Enabled Subsystem 内にない離散チャート用に生成されたコードでは、Simulink が提供する時間ではなく、整数カウンターを使用して時間を追跡します。この動作により、オーバーヘッドおよびメモリの観点からより効率的なコード生成が可能になり、また SIL (ソフトウェアインザループ) および PIL (プロセッサインザループ) のシミュレーション モードでこのコードが使用可能になります。詳細については、SIL シミュレーションおよび PIL シミュレーション (Embedded Coder)を参照してください。
参考
after
| at
| before
| every
| temporalCount
| elapsed
| count
| duration
| timer
| Signal Editor (Simulink) | Step (Simulink)