ドキュメンテーション

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

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

時相論理は、時間の観点からチャートの実行を制御します。ステート アクションと遷移において、次の 2 つのタイプの時相論理を使用できます。イベント ベースと絶対時間です。イベントベースの時相論理はイベントの反復実行を追跡します。絶対時間の時相論理はチャートのシミュレーション時間に基づいて期間を定義します。イベントの反復実行やシミュレーション時間に基づいて演算を実行するには、時相論理演算子と呼ばれる組み込み関数を使用します。

時相論理演算子の使用ルール

  • 時相論理演算子は、次の場所でのみ使用されます。

    • ステート アクション

    • ステートから派生する遷移

    • 遷移パス全体が 2 つのステートに接続されているときに、ジャンクションから派生する遷移セグメント

    メモ

    この制限は、デフォルト遷移やフロー チャート遷移には時相論理演算子を使用できないことを意味します。

    各時相論理演算子には、以下のような関連するステートがあります。アクションの原因となるステートまたは遷移の起点となるステートです。

  • ステート アクションでイベントベースの時相論理を表現するには、イベント表記法を使用します。イベントベースの時相論理表記法を参照してください。

  • 時相演算子のベース イベントとしては、明示的なイベントと暗黙的なイベントのどちらも使用できます。。ベース イベントとは、時相演算子の演算時に反復実行されるイベントに該当します。

  • 入力イベントが設定されていないチャートでは、チャート起動の暗黙的なイベントを表すには、tick または wakeup イベントを使用します。

  • キーワード secmsec または usec のいずれかを使用して、ステートがアクティブになってから経過したシミュレーション時間を秒、ミリ秒またはマイクロ秒単位で定義します。これらのキーワードは、ステート アクションと、ステートから派生する遷移のみで有効です。

    暗黙的な tick イベントの代わりに絶対時間の時相論理を使用する理由は、以下のとおりです。

    • 絶対時間の時相論理を使用する delay 式は、モデルのサンプル時間とは無関係です。これに対し、tick イベントはサンプル時間に左右されます。

    • 絶対時間の時相論理は、関数呼び出し入力イベントを含むチャートで機能します。tick イベントは関数呼び出し入力を伴うチャートでは機能しません。

イベントベースの時相論理演算子

イベントベースの時相論理では、次の表に説明する演算子を使用します。

演算子構文説明
after

after(n,E)

Eafter 演算子のベース イベントで、n は次のいずれかです。

  • 正の整数

  • 正の整数値として評価される式

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

入力イベントが設定されていないチャートでは、after(n,tick) または after(n,wakeup) は、関連付けられたステートがアクティブになってから、チャートの起動回数が n 以上である場合に true を返します。

関連付けられたステートが再びアクティブになるたびに、E のカウンターを 0 にリセットします。

at

at(n,E)

Eat 演算子のベース イベントで、n は次のいずれかです。

  • 正の整数

  • 正の整数値として評価される式

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

入力イベントが設定されていないチャートでは、at(n,tick) または at(n,wakeup) は、関連付けられたステートがアクティブになってから、チャートの起動回数が n 回目である場合に true を返します。

関連付けられたステートが再びアクティブになるたびに、E のカウンターを 0 にリセットします。

before

before(n,E)

Ebefore 演算子のベース イベントで、n は次のいずれかです。

  • 正の整数

  • 正の整数値として評価される式

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

入力イベントが設定されていないチャートでは、before(n,tick) または before(n,wakeup) は、関連付けられたステートがアクティブになってから、チャートの起動回数が n 未満である場合に true を返します。

関連付けられたステートが再びアクティブになるたびに、E のカウンターを 0 にリセットします。

every

every(n,E)

Eevery 演算子のベース イベントで、n は次のいずれかです。

  • 正の整数

  • 正の整数値として評価される式

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

入力イベントが設定されていないチャートでは、every(n,tick) または every(n,wakeup) は、関連付けられたステートがアクティブになってから、チャートの起動回数が整数の n 倍である場合に true を返します。

関連付けられたステートが再びアクティブになるたびに、E のカウンターを 0 にリセットします。

temporalCount

temporalCount(E)

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

関連付けられたステートがアクティブになってから、ベース イベント E が発生するたびに、増分値 1 で増加し、正の整数値を返します。その他の場合は、演算子は値 0 を返します。

入力イベントが設定されていないチャートでは、temporalCount(tick) または temporalCount(wakeup) は、関連付けられたステートがアクティブになってからのチャートの起動回数を返します。

関連付けられたステートが再びアクティブになるたびに、E のカウンターを 0 にリセットします。

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

メモ

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

イベントベースの時相論理の例

以下の例は、ステート アクションと遷移でのイベントベースの時相論理の用法を示しています。

演算子使用方法説明

after

ステート アクション (on after)

on after(5,CLK): status('on');

ステートがアクティブになってから、5 クロック サイクル目以降の CLK サイクルごとにステータス メッセージが表示されます。

after

遷移

ROTATE[after(10,CLK)]

ステートがアクティブになってから 10 CLK サイクル後に、ROTATE イベントのブロードキャストでのみ、関連付けられたステートから遷移が発生します。

before

ステート アクション (on before)

on before(MAX,CLK): temp++;

ステートが MAX リミットに達するまで、temp 変数が CLK サイクルごとに 1 回増分されます。

before

遷移

ROTATE[before(10,CLK)]

ステートがアクティブになってから 10 CLK サイクル前に、ROTATE イベントのブロードキャストでのみ、関連付けられたステートから遷移が発生します。

at

ステート アクション (on at)

on at(10,CLK): status('on');

ステートがアクティブになってから 10 CLK サイクル目にステータス メッセージが表示されます。

at

遷移

ROTATE[at(10,CLK)]

ステートがアクティブになってから 10 CLK サイクル目に、ROTATE イベントのブロードキャストでのみ、関連付けられたステートから遷移が発生します。

every

ステート アクション (on every)

on every(5,CLK): status('on');

ステートがアクティブになってから 5 CLK サイクルごとにステータス メッセージが表示されます。

temporalCount

ステート アクション (during)

du: y = mm[temporalCount(tick)];

このアクションは、ステートがアクティブになってから経過した tick 数をカウントし、そのカウント (整数) を返します。次に、temporalCount 演算子の返した値がインデックスに該当する mm 配列の値を変数 y に代入します。

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

イベントベースの時相論理を表現するには、2 種類の表記法のいずれかを使用します。

イベント表記法

ベース イベントのみに依存するステート アクションまたは遷移条件を定義するには、イベント表記法を使用します。

イベント表記法は、以下の構文に従います。

tlo(n,E)[C]

ここで、

  • tlo は boolean 時相論理演算子 (afterbeforeat、または every)

  • n は演算子の出現カウント

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

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

条件表記法

ベース イベントと非ベース イベントに依存する遷移条件を定義するには、条件表記法を使用します。

条件表記法は、以下の構文に従います。

E1[tlo(n,E2) && C]

ここで、

  • E1 は非ベース イベント

  • tlo は boolean 時相論理演算子 (afterbeforeat、または every)

  • n は演算子の出現カウント

  • E2 は演算子のベース イベント

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

イベントと条件の表記法の例

表記法用法説明

イベント

ステート アクション (on after)

on after(5,CLK): temp = WARM;

ステートがアクティブになってから、temp 変数は WARM 5 CLK サイクルになります。

イベント

遷移

after(10,CLK)[temp == COLD]

ステートがアクティブになってから 10 CLK サイクル後に、temp 変数が COLD である場合に、関連付けられたステートから遷移が発生します。

条件

遷移

ON[after(5,CLK) && temp == COLD]

ステートがアクティブになってから 5 CLK サイクル後に、temp 変数が COLD である場合にのみ、ON イベントのブロードキャストに対してのみ、関連付けられたステートから遷移が発生します。

メモ

ステート アクションの構文は条件表記法をサポートしていないため、ステート アクションでは、イベント表記法を使用しなければなりません。

絶対時間の時相論理演算子

絶対時間の時相論理では、次の表に説明する演算子を使用します。

演算子構文説明
after

after(n,sec)

after(n,msec)

after(n,usec)

n は任意の正の数値または式です。secmsec および usec は、関連付けられたステートがアクティブになってからの経過シミュレーション時間を表すキーワードです。

関連付けられたステートがアクティブになってから n 単位のシミュレーション時間が経過している場合、true を返します。それ以外の場合、演算子は false を返します。シミュレーション時間は、秒 (sec)、ミリ秒 (msec) またはマイクロ秒 (usec) で指定します。

関連付けられたステートが再びアクティブになるたびに、secmsec および usec のカウンターを 0 にリセットします。

before

before(n,sec)

before(n,msec)

before(n,usec)

n は任意の正の数値または式です。secmsec および usec は、関連付けられたステートがアクティブになってからの経過シミュレーション時間を表すキーワードです。

関連付けられたステートがアクティブになってから、シミュレーションの経過時間が n 単位未満である場合、true を返します。それ以外の場合、演算子は false を返します。シミュレーション時間は、秒 (sec)、ミリ秒 (msec) またはマイクロ秒 (usec) で指定します。

関連付けられたステートが再びアクティブになるたびに、secmsec および usec のカウンターを 0 にリセットします。

every

every(n,sec)

every(n,msec)

every(n,usec)

n は任意の正の数値または式です。secmsec および usec は、関連付けられたステートがアクティブになってからの経過シミュレーション時間を表すキーワードです。

関連付けられたステートがアクティブになってから、n 単位のシミュレーション時間ごとに、true を返します。それ以外の場合、演算子は false を返します。シミュレーション時間は、秒 (sec)、ミリ秒 (msec) またはマイクロ秒 (usec) で指定します。

関連付けられたステートが再びアクティブになるたびに、secmsec および usec のカウンターを 0 にリセットします。

every を絶対時間の時相論理演算子として使用することは、スタンドアロン チャートでのみ、MATLAB® オブジェクトとして実行するためにサポートされています。

temporalCount

temporalCount(sec)

temporalCount(msec)

temporalCount(usec)

secmsec および usec は、関連付けられたステートがアクティブになってからの経過シミュレーション時間を表すキーワードです。

関連付けられたステートがアクティブになってから経過したシミュレーション時間の指定秒数 (sec)、ミリ秒数 (msec) またはマイクロ秒数 (usec) をカウントして返します。

関連付けられたステートが再びアクティブになるたびに、secmsec および usec のカウンターを 0 にリセットします。

elapsed

elapsed(sec)

temporalCount(sec) と等価です。関連付けられたステートがアクティブになってから経過したシミュレーション時間を、秒単位 (sec) で返します。

関連付けられたステートが再びアクティブになるたびに、sec のカウンターを 0 にリセットします。

count

count(C)

条件式 Ctrue になってからの目盛りの数を返します。count 演算子は、条件式が false になるとリセットされます。ステート内で count 演算子が使用されている場合、それを含むステートへの移行に際してこの演算子はリセットされます。遷移で count 演算子が使用されている場合、その遷移の遷移元ステートへの移行に際してこの演算子はリセットされます。

Simulink® モデルでは、count の値はステップ サイズに依存します。モデルのソルバーまたはステップ サイズを変更すると、count 演算子を含む Stateflow® チャートの結果に影響します。

duration

duration(C)

条件式 Ctrue になってからの秒数を返します。duration 演算子は、条件式が false になるとリセットされます。ステート内で duration 演算子が使用されている場合、それを含むステートへの移行に際してこの演算子はリセットされます。遷移で duration 演算子が使用されている場合、その遷移の遷移元ステートへの移行に際してこの演算子はリセットされます。

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

メモ

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

絶対時間の時相論理の例

以下の例は、ステート アクションと遷移での絶対時間の時相論理を示しています。

演算子使用方法説明

after

ステート アクション (on after)

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

ステートがアクティブになってから、シミュレーション時間 12.3 秒の経過後、temp 変数は LOW になります。

after

遷移

after(8,msec)

ステートがアクティブになってから、シミュレーション時間 8 ミリ秒の経過後、関連付けられたステートからの遷移が発生します。

after

遷移

after(5,usec)

ステートがアクティブになってから、シミュレーション時間 5 ミリ秒の経過後、関連付けられたステートからの遷移が発生します。

before

遷移

[temp > 75 && before(12.34,sec)]

変数 temp が 75 を上回り、ステートがアクティブになってからの経過時間が 12.34 秒に達していない場合に、関連付けられたステートからの遷移が発生します。

temporalCount

ステート アクション (exit)

exit: y = temporalCount(sec);

このアクションは、ステートがアクティブになってから非アクティブになる間に経過したシミュレーション時間の秒数をカウントして返します。

時間遅延の定義例

以下の連続時間チャートでは、遷移における 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 ブロックがチャートに単位ステップ入力を与えています。

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

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

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

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

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

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

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

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

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

  • 信号は t = 0 でサブシステムを有効化。

  • 信号は t =2 でサブシステムを無効化。

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

次のグラフは、有効なステート (A または B) での経過時間の合計を示しています。

入力信号によってサブシステムが t = 0 の時点で有効になると、ステート A がアクティブ (有効) になります。ステートがアクティブな間は、経過時間は増加します。ただし、サブシステムが t = 2 で無効になると、チャートはスリープ状態に移行して、ステート A が非アクティブになります。

2 < t < 6 では、有効なステートで経過する時間は、どちらのステートも非アクティブであるため、2 秒のままです。チャートが t = 6 で起動すると、ステート A が再びアクティブになり、経過時間が増加します。ステート A からステート B への遷移は、シミュレーション時間ではなく、ステート A が有効な間に経過した時間に依存します。このため、t = 9 までステート A はアクティブであり、このステートで経過する時間は合計で 5 秒になります。

A から B への遷移が t = 9 で発生すると、出力値 y が 0 から 1 に変化します。

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

これらのセマンティクスは、before 演算子にも当てはまります。

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

after 演算子による at 演算子の置き換え

絶対時間の時相論理で at 演算子を使用した場合は、モデルのシミュレーションを試みると、エラー メッセージが表示されます。after 演算子を代わりに使用してください。

遷移 at(5.33, sec) を使用して時間遅延を定義する必要があるとします。

次のチャートに示すように、遷移を after(5.33, sec) に変更します。

after 演算子を含む外部自己ループ遷移による every 演算子の置き換え

Stateflow モデルで、絶対時間の時相論理で every 演算子を使用した場合は、モデルのシミュレーションを試みると、エラー メッセージが表示されます。代わりに、after 演算子を含む外部自己ループ遷移を使用してください。

Check_status のステート アクションで示すように、チャート実行時に 2.5 秒間隔でアクティブなステートのステータス メッセージを印刷する必要があると仮定します。

次のチャートに示すように、ステート アクションを外部自己ループ遷移で置き換えます。

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

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

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

参考

| | | | | | |

関連するトピック