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 ずつ増加します。

  • 時間 t = 1 で、y1 の値が 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 チャート: [ローカル] のみ

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

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

引数 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 と正確に一致する構造体の値として解決されなければなりません。

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

エッジ検出演算子

式がしきい値を上回るか下回る時点を判別するには、次の表に挙げる演算子を使用します。

演算子構文説明
crossingtf = crossing(expression)

次の場合に 1 (true) を返します。

  • expression の前の値が正で、現在の値がゼロまたは負である。

  • expression の前の値がゼロで、現在の値が非ゼロである。

  • expression の前の値が負で、現在の値がゼロまたは正である。

それ以外の場合、演算子は 0 (false) を返します。

この演算子は、[トリガー タイプ]either に設定された Trigger (Simulink) ブロックの動作を模倣します。

入力データ signal の値がしきい値 2.5 を超えると、ステートから遷移します。

[crossing(signal-2.5)]

signal-2.5 の値が、正から負、負から正、ゼロから非ゼロ、または非ゼロからゼロに変化するときにエッジが検出されます。

fallingtf = falling(expression)

次の場合に 1 (true) を返します。

  • expression の前の値が正で、現在の値がゼロまたは負である。

  • expression の前の値がゼロで、現在の値が負である。

それ以外の場合、演算子は 0 (false) を返します。

この演算子は、[トリガー タイプ]falling に設定された Trigger (Simulink) ブロックの動作を模倣します。

入力データ signal の値がしきい値 2.5 を下回ると、ステートから遷移します。

[falling(signal-2.5)]

signal-2.5 の値が、正から負、正からゼロ、またはゼロから負に変化するときに立ち下がりエッジが検出されます。

risingtf = rising(expression)

次の場合に 1 (true) を返します。

  • expression の前の値が負で、現在の値がゼロまたは正である。

  • expression の前の値がゼロで、現在の値が正である。

それ以外の場合、演算子は 0 (false) を返します。

この演算子は、[トリガー タイプ]rising に設定された Trigger (Simulink) ブロックの動作を模倣します。

入力データ signal の値がしきい値 2.5 を上回ると、ステートから遷移します。

[rising(signal-2.5)]

signal-2.5 の値が、負から正、負からゼロ、またはゼロから正に変化するときに立ち上がりエッジが検出されます。

メモ

Trigger ブロックと同様に、これらの演算子は、3 つの連続するタイム ステップで引数 expression の値が、正→ゼロ→負、または負→ゼロ→正に変化するときに単一エッジを検出します。式の値がゼロになるときにエッジが発生します。

エッジ検出をもつチャートの例

このモデルは、入力信号におけるエッジを演算子 crossingfalling および rising がどのように検出するかを示しています。この例では、Pulse Generator (Simulink)ブロックが矩形波をチャートに送信します。

このモデルは、ステップ サイズ 1 の固定ステップ ソルバーを使用しています。2 タイム ステップごとに、入力信号 u の値が 0 と 5 の 2 値を交互にとります。チャートは、以下のエッジについて入力信号 u を解析します。

  • しきい値 2.5 をまたぐ立ち下がりエッジまたは立ち上がりエッジ

  • しきい値 2.5 を上回る立ち上がりエッジ

  • しきい値 2.5 を下回る立ち下がりエッジ

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

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

  • 1 タイム ステップごとに、信号 u の値が 0 と 5 の 2 値を交互にとります。

  • 時間 t = 1357 で、式 u-2.5 の値の符号が変化すると、y1 の値が 0 から 1 に変化します。y1 の値は、1 タイム ステップ後に 0 に戻ります。

  • 時間 t = 15 で、式 u-2.5 の値が負から正に変化すると、y2 の値が 0 から 1 に変化します。y2 の値は、1 タイム ステップ後に 0 に戻ります。

  • 時間 t = 37 で、式 u-2.5 の値が正から負に変化すると、y3 の値が 0 から 1 に変化します。y3 の値は、1 タイム ステップ後に 0 に戻ります。

エッジ検出の制限

エッジ検出は、Simulink モデル内の Stateflow チャートでのみサポートされます。

引数 expression は次のとおりです。

  • スカラー値の式である必要がある

  • チャートの入力データ、定数、調整不可能なパラメーター、ローカルの連続時間データ、および Simulink ベースのステートのステート データを組み合わせることができる

  • スカラー変数、行列要素、構造体のフィールド、または構造体フィールドと行列要素の任意の有効な組み合わせの加算、減算および乗算を含むことができる

数字、または定数の整数として評価される式を使用して、行列の要素にインデックス付けします。

ローカルの連続時間データ、および Simulink ベースのステートのステート データのエッジ検出は、遷移条件でのみサポートされます。

Atomic サブチャートでは、エッジ検出の式で使用するすべての入力データを、メイン チャートの入力データまたは調整不可能なパラメーターにマッピングします。これらの入力データを出力データ、ローカル データ、または調整可能なパラメーターにマッピングすると、意図しない動作が引き起こされる可能性があります。

エッジ検出演算子を使用する Stateflow チャートは、操作点をサポートしません。

変化検出とエッジ検出の実装

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

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

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

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

x_start

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

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

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

エッジ検出演算子は同様に動作します。ただし、直前のタイム ステップの開始時における式の値 (xprev) と現在の値 (x) を比較します。この実装の違いにより、連続時間チャートはマイナー タイム ステップ間でローカル データのエッジを検出できます。

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

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

一方、エッジ検出演算子は、マイナー タイム ステップ間でローカルの連続時間データにおけるエッジを検出できます。たとえば、p が負の微分をもつローカルの連続時間変数であるとします。この場合、演算子 falling(p) は、マイナー タイム ステップ間で p の符号が正から負に変化したときに true を返します。

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

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

参考

| | | | | |

関連するトピック