ドキュメンテーション

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

データ値の変化の検出

Stateflow® チャートでは、データ値のタイム ステップ間の変化を検出できます。すべての Stateflow チャートで、チャート入力データの変化を検出できます。C をアクション言語として使用するチャートでは、チャート出力データ、ローカル チャート変数、およびデータ ストア メモリのデータの変化も検出できます。

変化の検出は、Simulink® モデルの Stateflow チャートでのみサポートされます。

変化検出演算子

Stateflow データの変化を検出するには、次の表に示す演算子を使用します。

演算子構文説明
hasChangedtf = hasChanged(u)

最後のタイム ステップの開始時点から現在のタイム ステップの開始時点までのデータ値の変化を検出します。

u の値が変化した場合に true を返します。

hasChanged(u)
hasChangedFromtf = hasChangedFrom(u,v)

最後のタイム ステップの開始時点における特定の値から、現在のタイム ステップの開始時点における異なる値へのデータ値の変化を検出します。

u が値 v から変化した場合に true を返します。

hasChangedFrom(u,v)
hasChangedTotf = hasChangedTo(u,v)

最後のタイム ステップの開始時点における異なる値から、現在のタイム ステップの開始時点における特定の値へのデータ値の変化を検出します。

u が値 v に変化した場合に true を返します。

hasChangedTo(u,v)

変化検出演算子は、データ値に変化があった場合に true を返し、データ値に変化がない場合に false を返します。

引数 u には次を指定できます。

インデックスには、スカラー値として評価される数値または式を指定できます。

hasChangedFrom 演算子と hasChangedTo 演算子の場合、2 つ目の引数 v には、u と同程度の値として解決される任意の式を指定できます。

  • u がスカラーの場合、v はスカラー値として解決されなければなりません。

  • u が行列の場合、v は、u と同じ次元の行列値として解決されなければなりません。

    あるいは、C をアクション言語として使用するチャートで、v をスカラー値として解決することができます。チャートはスカラー拡張を使用して、要素がすべて v によって指定されている値に等しい行列と u を比較します。スカラー拡張を使用したスカラーから非スカラーへの変換を参照してください。

  • u が構造体の場合、v は、フィールドの仕様が u と正確に一致する構造体の値として解決されなければなりません。

u のスコープは、チャートのアクション言語によって異なります。

  • MATLAB® がアクション言語の場合: Input のみ

  • C がアクション言語の場合: InputOutputLocal または Data Store Memory

引数 u には、自明ではない式やカスタム コード変数は指定できません。

変化検出をもつチャートの例

このモデルでは、入力信号における特定の変化を演算子 hasChangedhasChangedFrom および hasChangedTo によって検出する方法を示します。この例では、Ramp ブロックは離散増分時間信号をチャートに送信します。

このモデルは、ステップ サイズ 1 の固定ステップ ソルバーを使用しています。信号は、タイム ステップごとに 1 ずつインクリメントします。タイム ステップごとに、チャートは、以下の変化に対する入力信号 u を解析します。

  • 前のタイム ステップからの変化

  • 値 3 への変化

  • 値 3 からの変化

信号をチェックするために、チャートは 3 種類の変化検出演算子を遷移アクションで呼び出します。チャートは戻り値を y1y2 および y3 として出力します。

シミュレーション中に、Scope ブロックにはチャートに対する入出力信号が表示されます。

  • u は、タイム ステップごとに 1 ずつ増加します。

  • y1 は時間 t = 1 で 1 の値に遷移します。後続の各タイム ステップで u が引き続き変化するため、y1 は 1 のままになります。

  • y2 は、u の値が 3 から 4 に変わる時間 t = 4 で 1 に遷移します。u が 4 から 5 に増える時間 t = 5 で、y2 は 0 に戻ります。

  • y3 は、u の値が 2 から 3 に変わる時間 t = 3 で 1 に遷移します。u が 3 から 4 に増える時間 t = 4 で、y3 は 0 に戻ります。

変化検出の実装

チャートは、タイム ステップの境界で値を評価してチャート データの変化を検出します。チャートは前の実行手順における開始時点の値と、現在の実行手順における開始時点の値を比較します。変化を検出するため、チャートは、ローカル変数に各値をダブルバッファリングします。

ローカル バッファー説明

var_name_prev

最後のタイム ステップの開始時におけるデータ var_name の値

var_name_start

現在のタイム ステップの開始時におけるデータ var_name の値

ダブルバッファリングは、同じタイム ステップ内で複数の入力イベントが発生する場合を除いて、タイム ステップごとに 1 回実行されます。同じタイム ステップ内で複数の入力イベントが発生する場合は、ダブルバッファリングは入力イベントごとに 1 回実行されます。入力イベント間の値の変化の検出を参照してください。

アクションで変化検出演算子を呼び出すと、Stateflow チャートは次を行います。

  • Simulink イベントがチャートをトリガーした "後" で、チャートが実行を開始する "前" に、データ値のダブルバッファリングを実行します。

  • _prev バッファーと _start バッファーの値を比較します。値が一致した場合、変化検出演算子は false (変化なし) を返します。そうでない場合は、true (変化) を返します。

次の図では、チャートのライフ サイクルの観点から、上記のタスクを配置しています。

次の場合は、バッファリングはチャート実行前に発生し、変化検出に影響します。

  • ローカル変数の値に過渡的な変化がある場合

  • 同じタイム ステップで複数の入力イベントが発生する場合

過渡値変化のフィルターによる除外

Stateflow チャートは、時間の境界でのみ値を評価することで、ローカル チャート変数の過渡的な変化をフィルターで除外しようと試みます。チャートは、指定されたローカル変数を実行ステップの最後に 1 回だけ評価します。ローカル変数の値が特定のタイム ステップ内で変動しても、変化検出演算子の戻り値は一定した値のままです。

たとえば、現在のタイム ステップで、ローカル変数 temp が前のタイム ステップにおける値から変化したにもかかわらず、元の値に戻ったと仮定します。演算子 hasChanged(temp) は次のタイム ステップに false を返し、変化が発生していないことを示します。

入力イベント間の値の変化の検出

同じタイム ステップ内で複数の入力イベントが発生すると、Stateflow チャートはイベントごとに 1 回、_prev バッファーと _start バッファーを更新します。特定のタイム ステップ内で変化が複数回発生した場合でも、チャートは入力イベント間の変化を検出します。

参考

| |

関連するトピック