Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

データ値の変化の検出

Stateflow® チャートはタイム ステップ間でのデータと式の値の変化を検出できます。変化検出演算子を使用すると、変数の値が変化したときに判別することができます。

チャートが変数の値を設定したときに暗黙的ローカル イベントを生成するには、change 演算子を使用します。詳細については、暗黙的イベントを使用したチャート動作の制御を参照してください。

変化検出演算子

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

演算子構文説明
hasChangedtf = hasChanged(data_name)現在のタイム ステップの開始時における data_name の値が、前のタイム ステップの開始時における data_name の値と異なる場合、1 (true) を返します。それ以外の場合、演算子は 0 (false) を返します。

最後のタイム ステップまたは入力イベント以降、行列 M のいずれかの要素の値が変化した場合にステートから遷移します。

[hasChanged(M)]

最後のタイム ステップまたは入力イベント以降、行列 M の行 1、列 3 の要素の値が変化した場合にステートから遷移します。

MATLAB® をアクション言語として使用するチャートの場合、次を使用します。

[hasChanged(M(1,3))]

C をアクション言語として使用するチャートの場合、次を使用します。

[hasChanged(M[0][2])]
hasChangedFromtf = hasChangedFrom(data_name,value)data_name の値が前のタイム ステップの開始時点では指定した value と等しく、現在のタイム ステップの開始時点では別の値になっている場合に 1 (true) を返します。それ以外の場合、演算子は 0 (false) を返します。

構造体 struct の前の値が structValue に等しく、最後のタイム ステップまたは入力イベント以降に struct のいずれかのフィールドの値が変化した場合にステートから遷移します。

[hasChangedFrom(struct,structValue)]
hasChangedTotf = hasChangedTo(data_name,value)data_name の値が前のタイム ステップの開始時点では指定した value とは異なり、現在のタイム ステップの開始時点で value と等しくなっている場合に 1 (true) を返します。それ以外の場合、演算子は 0 (false) を返します。

最後のタイム ステップまたは入力イベント以降に構造体フィールド struct.field が値 5 に変化した場合にステートから遷移します。

[hasChangedTo(struct.field,5)]

メモ

同じタイム ステップで複数の入力イベントが発生する場合、これらの演算子は入力イベント間のデータ値の変化を検出できます。

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

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

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

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

  • 値 3 への変化

  • 値 3 からの変化

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

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

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

  • y1 の値は t = 1 で 0 から 1 に変化します。u はそれ以降も引き続きタイム ステップごとに変化するため、y1 の値は 1 のままになります。

  • t = 4 で u の値が 3 から 4 に変化し、y2 の値が 0 から 1 に変化します。y2 の値は、1 タイム ステップ後に 0 に戻ります。

  • t = 3 で u の値が 2 から 3 に変化し、y3 の値が 0 から 1 に変化します。y3 の値は、1 タイム ステップ後に 0 に戻ります。

変化検出の制限

Stateflow チャートの種類により、変化検出でサポートされるデータの範囲が決まります。

  • MATLAB のスタンドアロン Stateflow チャート: [ローカル] のみ

  • Simulink® モデルで、MATLAB をアクション言語として使用するチャートの場合: [入力] のみ

  • Simulink モデルで、C をアクション言語として使用するチャートの場合: [入力][出力][ローカル]、または [データ ストア メモリ]

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

  • スカラー変数。

  • 行列または行列の要素。

    • data_name が行列の場合、演算子は data_name の要素の変化を検出すると true を返します。

    • 数字、または定数の整数として評価される式を使用して、行列の要素にインデックス付けします。ベクトルおよび行列でサポートされている演算を参照してください。

  • 構造体または構造体のフィールド。

    • data_name が構造体の場合、変化検出演算子は data_name のいずれかのフィールドで変化を検出すると true を返します。

    • ドット表記を使用して構造体内のフィールドにインデックス付けします。Stateflow 構造体へのインデックス付けと値の割り当てを参照してください。

  • 構造体のフィールドまたは行列の要素の有効な組み合わせ。

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

メモ

MATLAB のスタンドアロン チャートは、行列の要素または構造体内のフィールドでの変化検出をサポートしません。

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

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

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

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

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

行優先の配列レイアウトが有効な間は、チャートで変化検出演算子を使用すると、コード生成でエラーが発生します。変化検出演算子を使用するチャートでコードを生成する前に、列優先の配列レイアウトを有効にします。生成コード内の行列の配列レイアウトを選択を参照してください。

変化検出の実装

チャートは、タイム ステップの境界で値を評価してチャート データの変化を検出します。チャートは前の実行手順における開始時点の値と、現在の実行手順における開始時点の値を比較します。

たとえば、hasChanged 演算子の呼び出しに引数 x を使用すると、Stateflow チャートは x の値をローカル変数にダブルバッファリングします。

ローカル バッファー説明
x_prev

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

x_start

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

変化を検出するため、チャートをトリガーした "後"、かつチャートが実行を開始する "前" に、チャートはデータ値のダブルバッファリングを実行します。変化検出演算子は、xprevxstart の値が一致する場合は false を返し (変化が発生しなかったことを示します)、それ以外の場合は true を返します (変化が発生したことを示します)。次の図では、チャートのライフ サイクルの観点から、上記のタスクを配置しています。

Flowchart detailing double-buffering of data values for change detection.

ローカル データの過渡値変化

変化検出演算子は、時間の境界でのみ値を評価することで、ローカル チャート変数の過渡的な変化をフィルターで除外しようと試みます。チャートは、指定されたローカル変数を実行ステップの最後に 1 回だけ評価します。ローカル変数の値が特定のタイム ステップ内で変動しても、変化検出演算子の戻り値は一定した値のままです。たとえば、現在のタイム ステップで、ローカル変数 temp が前のタイム ステップにおける値から変化したにもかかわらず、元の値に戻ったと仮定します。演算子 hasChanged(temp) は次のタイム ステップに false を返し、変化が発生していないことを示します。

入力イベント間またはスーパー ステップの反復間の値の変化の検出

同じタイム ステップで複数の入力イベントが発生した場合、またはスーパー ステップ セマンティクスを有効にした場合、チャートを実行するたびに xprev および xstart バッファーが更新されます。チャートは入力イベント間およびスーパー ステップの反復間の変化を検出します。これは特定のタイム ステップ内で変化が複数回発生した場合でも同様です。詳細については、イベントを使用してチャートを実行スーパー ステップのセマンティクスを参照してください。

参考

| | |

関連するトピック