データと式の値の変化の検出
Stateflow® チャートはタイム ステップ間でのデータと式の値の変化を検出できます。次のことが可能です。
変化検出演算子を使用して、変数の値が変化した時点を判別する。
エッジ検出演算子を使用して、式がしきい値を上回るか下回る時点を判別する。
チャートが変数の値を設定したときに暗黙的ローカル イベントを生成するには、change
演算子を使用します。詳細については、暗黙的イベントを使用したチャート動作の制御を参照してください。
変化検出演算子
Stateflow データの変化を検出するには、次の表に示す演算子を使用します。
演算子 | 構文 | 説明 | 例 |
---|---|---|---|
hasChanged | tf = hasChanged(data_name) | 現在のタイム ステップの開始時における data_name の値が、前のタイム ステップの開始時における data_name の値と異なる場合、1 (true ) を返します。それ以外の場合、演算子は 0 (false ) を返します。 | 最後のタイム ステップまたは入力イベント以降、行列 [hasChanged(M)] |
最後のタイム ステップまたは入力イベント以降、行列 MATLAB® をアクション言語として使用するチャートの場合、次を使用します。 [hasChanged(M(1,3))] C をアクション言語として使用するチャートの場合、次を使用します。 [hasChanged(M[0][2])] | |||
hasChangedFrom | tf = hasChangedFrom(data_name,value) | data_name の値が前のタイム ステップの開始時点では指定した value と等しく、現在のタイム ステップの開始時点では別の値になっている場合に 1 (true ) を返します。それ以外の場合、演算子は 0 (false ) を返します。 | 構造体 [hasChangedFrom(struct,structValue)] |
hasChangedTo | tf = hasChangedTo(data_name,value) | data_name の値が前のタイム ステップの開始時点では指定した value とは異なり、現在のタイム ステップの開始時点で value と等しくなっている場合に 1 (true ) を返します。それ以外の場合、演算子は 0 (false ) を返します。 | 最後のタイム ステップまたは入力イベント以降に構造体フィールド [hasChangedTo(struct.field,5)] |
メモ
同じタイム ステップで複数の入力イベントが発生する場合、これらの演算子は入力イベント間のデータ値の変化を検出できます。
変化検出をもつチャートの例
このモデルでは、入力信号における特定の変化を演算子 hasChanged
、hasChangedFrom
および hasChangedTo
によって検出する方法を示します。この例では、Ramp (Simulink)ブロックは離散増分時間信号をチャートに送信します。
このモデルは、ステップ サイズ 1 の固定ステップ ソルバーを使用しています。この信号はタイム ステップごとに 1 ずつ増加します。チャートは、以下の変化について入力信号 u
を解析します。
前のタイム ステップからの変化
値 3 への変化
値 3 からの変化
信号をチェックするために、チャートは 3 種類の変化検出演算子を遷移アクションで呼び出します。チャートは戻り値を y1
、y2
および 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
を返します。数字、または定数の整数になる式を使用して、行列の要素にインデックス付けします。Stateflow でのベクトルおよび行列の演算を参照してください。
構造体または構造体のフィールド。
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
と正確に一致する構造体の値として解決されなければなりません。
変化検出演算子を使用するチャートからコードを生成するときに行優先の配列レイアウトが有効な場合、コード生成でエラーが発生します。コードを生成する前に、列優先の配列レイアウトを有効にしてください。生成コード内の行列の配列レイアウトを選択を参照してください。
エッジ検出演算子
式がしきい値を上回るか下回る時点を判別するには、次の表に挙げる演算子を使用します。
演算子 | 構文 | 説明 | 例 |
---|---|---|---|
crossing | tf = crossing(expression) | 次の場合に 1 (
それ以外の場合、演算子は 0 ( この演算子は、[トリガー タイプ] が | 入力データ [crossing(signal-2.5)] 式 |
falling | tf = falling(expression) | 次の場合に 1 (
それ以外の場合、演算子は 0 ( この演算子は、[トリガー タイプ] が | 入力データ [falling(signal-2.5)] 式 |
rising | tf = rising(expression) | 次の場合に 1 (
それ以外の場合、演算子は 0 ( この演算子は、[トリガー タイプ] が | 入力データ [rising(signal-2.5)] 式 |
メモ
Trigger ブロックと同様に、これらの演算子は、3 つの連続するタイム ステップで引数 expression
の値が、正→ゼロ→負、または負→ゼロ→正に変化するときに単一エッジを検出します。式の値がゼロになるときにエッジが発生します。
エッジ検出をもつチャートの例
このモデルは、入力信号におけるエッジを演算子 crossing
、falling
および rising
がどのように検出するかを示しています。この例では、Pulse Generator (Simulink)ブロックが矩形波をチャートに送信します。
このモデルは、ステップ サイズ 1 の固定ステップ ソルバーを使用しています。2 タイム ステップごとに、入力信号 u
の値が 0 と 5 の 2 値を交互にとります。チャートは、以下のエッジについて入力信号 u
を解析します。
しきい値 2.5 をまたぐ立ち下がりエッジまたは立ち上がりエッジ
しきい値 2.5 を上回る立ち上がりエッジ
しきい値 2.5 を下回る立ち下がりエッジ
信号をチェックするために、チャートは遷移アクション内で 3 種類のエッジ検出演算子を呼び出します。チャートは戻り値を y1
、y2
および y3
として出力します。
シミュレーション中に、Scope (Simulink)ブロックにはチャートに対する入出力信号が表示されます。
1 タイム ステップごとに、信号
u
の値が 0 と 5 の 2 値を交互にとります。時間
t = 1
、3
、5
、7
で、式u-2.5
の値の符号が変化すると、y1
の値が 0 から 1 に変化します。y1
の値は、1 タイム ステップ後に 0 に戻ります。時間
t = 1
、5
で、式u-2.5
の値が負から正に変化すると、y2
の値が 0 から 1 に変化します。y2
の値は、1 タイム ステップ後に 0 に戻ります。時間
t = 3
、7
で、式u-2.5
の値が正から負に変化すると、y3
の値が 0 から 1 に変化します。y3
の値は、1 タイム ステップ後に 0 に戻ります。
エッジ検出の制限
エッジ検出は、Simulink モデル内の Stateflow チャートでのみサポートされます。
引数 expression
は次のとおりです。
スカラー値の式である必要がある
チャートの入力データ、定数、調整不可能なパラメーター、ローカルの連続時間データ、および Simulink ベースのステートのステート データを組み合わせることができる
スカラー変数、行列要素、構造体のフィールド、または構造体フィールドと行列要素の任意の有効な組み合わせの加算、減算および乗算を含むことができる
数字、または定数の整数になる式を使用して、行列の要素にインデックス付けします。
ローカルの連続時間データ、および Simulink ベースのステートのステート データのエッジ検出は、遷移条件でのみサポートされます。
Atomic サブチャートでは、エッジ検出の式で使用するすべての入力データを、メイン チャートの入力データまたは調整不可能なパラメーターにマッピングします。これらの入力データを出力データ、ローカル データ、または調整可能なパラメーターにマッピングすると、意図しない動作が引き起こされる可能性があります。
エッジ検出演算子を使用する Stateflow チャートは、操作点をサポートしません。
変化検出とエッジ検出の実装
チャートは、タイム ステップの境界で値を評価することにより、チャートのデータと式の変化を検出します。チャートは前の実行手順における開始時点の値と、現在の実行手順における開始時点の値を比較します。
たとえば、hasChanged
演算子の呼び出しに引数 x
を使用すると、Stateflow チャートは x
の値をローカル変数にダブルバッファリングします。
ローカル バッファー | 説明 |
---|---|
x_prev | 最後のタイム ステップの開始時におけるデータ |
x_start | 現在のタイム ステップの開始時におけるデータ |
変化を検出するため、チャートをトリガーした "後"、かつチャートが実行を開始する "前" に、チャートはデータ値のダブルバッファリングを実行します。変化検出演算子は、xprev
と xstart
の値が一致する場合に false
を返して変化が発生しなかったことを示します。それ以外の場合には true
を返して、変化が発生したことを示します。次の図では、チャートのライフ サイクルの観点から、上記のタスクを配置しています。
エッジ検出演算子は同様に動作します。ただし、直前のタイム ステップの開始時における式の値 (xprev
) と現在の値 (x
) を比較します。この実装の違いにより、連続時間チャートはマイナー タイム ステップ間でローカル データのエッジを検出できます。
ローカル データの過渡値変化
変化検出演算子は、時間の境界でのみ値を評価することで、ローカル チャート変数の過渡的な変化をフィルターで除外しようと試みます。チャートは、指定されたローカル変数を実行ステップの最後に 1 回だけ評価します。ローカル変数の値が特定のタイム ステップ内で変動しても、変化検出演算子の戻り値は一定した値のままです。たとえば、現在のタイム ステップで、ローカル変数 temp
が前のタイム ステップにおける値から変化したにもかかわらず、元の値に戻ったと仮定します。演算子 hasChanged(temp)
は次のタイム ステップに false
を返し、変化が発生していないことを示します。
一方、エッジ検出演算子は、マイナー タイム ステップ間でローカルの連続時間データにおけるエッジを検出できます。たとえば、p
が負の微分をもつローカルの連続時間変数であるとします。この場合、演算子 falling(p)
は、マイナー タイム ステップ間で p
の符号が正から負に変化したときに true
を返します。
入力イベント間またはスーパー ステップの反復間の値の変化の検出
同じタイム ステップで複数の入力イベントが発生した場合、またはスーパー ステップ セマンティクスを有効にした場合、チャートを実行するたびに xprev
および xstart
バッファーが更新されます。チャートは入力イベント間およびスーパー ステップの反復間での値の変化を検出します。これは特定のタイム ステップ内で変化が複数回発生した場合でも同様です。詳細については、イベントを使用してチャートを実行とスーパー ステップのセマンティクスを参照してください。
参考
change
| crossing
| falling
| hasChanged
| hasChangedFrom
| hasChangedTo
| rising