ドキュメンテーション

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

デバッガーで検出される一般的なモデリング エラー

チャートにおけるステートの矛盾

ステートの矛盾の定義

以下のいずれかのルールに違反した場合に、Stateflow® チャートでステートの矛盾が発生します。

  • 排他的 (OR) 構造を含むアクティブなステート (少なくとも 1 つのサブステートで構成) は、アクティブ サブステートを 1 つのみもちます。

  • パラレル (AND) 構造を含むアクティブなステートのサブステートはすべてアクティブです。

  • 排他的 (OR) またはパラレル (AND) 構造を含む非アクティブなステートのサブステートはすべて非アクティブです。

ステートの矛盾の原因

次の条件がすべて真となると、コンパイル時にエラーが発生します。

  • 排他的 (OR) 構造と複数のサブステートをもつステートに遷移し、任意のサブステートのエントリを指す既定のパスがない。この状況では、ステートの矛盾エラーが発生します(ただし、このステートへのすべての遷移が、サブステートに直接通じるスーパートランジションの場合は、エラーは発生しません)。

  • 複数のサブステートをもつステートに、ヒストリ ジャンクションが含まれていない。

デフォルト遷移が省略されたために発生する診断アクションのレベルは、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [診断][Stateflow] ペインで制御できます。詳細は、「既定遷移に条件がない」 診断のドキュメンテーションを参照してください。

ステートの矛盾の例

以下のチャートには、ステートの矛盾が発生しています。

アクティブになるサブステートを指定するデフォルト遷移が存在しない場合は、ステートの矛盾エラーが発生します。

デフォルト遷移をいずれかのサブステートに追加することで、ステートの矛盾が解決されます。

チャートにおける遷移の競合

競合した遷移とは

競合した遷移とは、シミュレーション時に Stateflow チャート内の同じソースから派生する均等に有効な 2 つのパスを指します。競合が発生している場合、Stateflow ソフトウェアは、均等に有効な遷移をチャート内の順序に基づいて評価します。つまり、明示的にまたは暗黙的にです。

  • 明示的な順序 (既定のモード) では、競合した遷移の評価は、各遷移に対して指定した順序に基づいて実行されます。詳細は、出力遷移の明示的な順序付け を参照してください。

  • C チャートの暗黙的な順序では、競合した遷移の評価は、「出力遷移の暗黙的な順序付け」で説明する内部ルールに基づいて実行されます。

競合した遷移の検出

暗黙的な順序をもつ C チャート内で競合する遷移をシミュレーション時に検出するには、次の手順に従います。

  1. デバッグを有効にしておいて、ターゲットをビルドします。

  2. デバッガーを開き、[遷移の競合] を選択します。

  3. シミュレーションを開始します。

競合した遷移の例

以下のチャートには、競合した遷移が 2 つ含まれています。

遷移の競合が発生する仕組み-  ステート A へのデフォルト遷移は、データ a は 1 に等しく、データ b は 10に等しく割り当てます。 ステート Aduring アクションは各タイム ステップ中に、a を増加させ、 b を減少させます。ステート A からステート B への遷移は、条件 [a > 4] が真の場合に有効になります。ステート A からステート C への遷移は、条件 [b < 7] が真の場合に有効になります。シミュレーション中に、ステート A がアクティブになり、両方のステートが真であるようなタイム ステップが存在します。これが遷移の競合です。

明示的な順序の競合解決-  明示的な順序の場合、チャートは、明示的に指定した順序で出力遷移を評価することで、競合を解決します。たとえば、ステート A からステート C への遷移を右クリックし、コンテキスト メニューから [実行順序][1] を選択すると、チャートによってまずこの遷移が評価されます。このケースでは、ステート A からステート C への遷移が発生します。

チェック ボックスが選択されていない場合の暗黙的な順序の競合解決-  暗黙的な順序の場合、チャートは、ラベル優先順位が等しい複数の出力遷移を、ステートの上の 12 時の位置から時計回りの順序で評価します。このケースでは、ステート A からステート B への遷移が発生します。

チャートにおけるデータ範囲違反

データ範囲違反のタイプ

Stateflow デバッガーは、シミュレーション時に以下のデータ範囲違反を検出します。

  • データのプロパティ ダイアログ ボックスで設定された [初期値] フィールド、[最小値] フィールド、および [最大値] フィールドの値の範囲内にデータ オブジェクトの値が収まっていない。

    データのプロパティ ダイアログ ボックスの [初期値] フィールド、[最小値] フィールド、および [最大値] フィールドの詳細は、データ プロパティの設定 を参照してください。

  • 固定小数点演算の結果がビット サイズを超過している。

    固定小数点のオーバーフロー条件の詳細は、固定小数点型のオーバーフローの検出 を参照してください。

チャートで [整数オーバーフローで飽和] を選択すると、シミュレーション中にデバッガーによって整数オーバーフローにフラグが立てられることはありません。ただし、最小値と最大値の範囲のチェックに基づくデータ範囲外違反には、引き続きフラグが立てられます。詳細は、「飽和がデバッガーのチェックに与える影響」を参照してください。

データ範囲違反の検出

シミュレーション時にデータ範囲違反を検出するには、以下の手順に従います。

  1. デバッグを有効にしておいて、ターゲットをビルドします。

  2. デバッガーを開き、[データの範囲] を選択します。

  3. シミュレーションを開始します。

データ範囲違反の例

以下のチャートには、データ範囲違反が含まれています。

データ a[初期値][最小値] が 0 で、[最大値] が 2 であると仮定します。このチャートがイベントで呼び出されるたびに、ステート A がアクティブになり、a が増分します。a の値は、短時間でデータ範囲違反になります。

チャートでの巡回動作

巡回動作とは

巡回動作は、無限 (再帰的) に反復されるステップまたはステップのシーケンスです。Stateflow デバッガーは、巡回検出アルゴリズムを使用して、イベント ブロードキャストが原因で無限再帰が発生しているクラスを検出します。

シミュレーション時の巡回動作の検出

シミュレーション時に巡回動作を検出するには、以下の手順に従います。

  1. デバッグを有効にしておいて、ターゲットをビルドします。

  2. デバッガーを開き、[巡回検出] を選択します。

  3. シミュレーションを開始します。

巡回動作の例

このチャートは、イベント ブロードキャストによって無限の再帰的サイクルが発生する様子を示します。

ステート C during アクションが実行されると、イベント E1 がブロードキャストされます。イベント E1 がブロードキャストされた時点で、ステート A.A1 からステート A.A2 への遷移が有効になります。イベント E2 が遷移の条件アクションとしてブロードキャストされます。イベント E2 がブロードキャストされた時点で、ステート B.B1 からステート B.B2 への遷移が有効になります。イベント E1 がステート B.B1 からステート B.B2 への遷移の条件アクションとしてブロードキャストされます。上記の E1E2 のイベント ブロードキャストは条件アクションに含まれているため、イベント ブロードキャストの再帰条件が発生しています。このため、どちらの遷移も完了しません。

    ティップ   指示のないローカル イベント ブロードキャストは、チャート内で不要な再帰的動作が発生する場合があるので使用しないでください。直接ローカル イベント ブロードキャストには send 演算子を使用します。詳細は、「イベントのブロードキャストによるステートの同期」を参照してください。

    指示のないローカル イベント ブロードキャストを検出する診断レベルを設定できます。[モデル コンフィギュレーション パラメーター] ダイアログ ボックスで、[診断][Stateflow] ペインに移動し、[指示のないイベント ブロードキャスト] 診断を [なし][警告] または [エラー] に設定します。既定の設定は [警告] です。

検出されないフローの巡回動作の例

このチャートでは、デバッガーが検出できないフロー チャート表記での巡回動作の例を説明します。

データ オブジェクト i は、デフォルト遷移の条件アクションで 0 に設定されます。i は、次の遷移セグメントの条件アクションで増分されます。3 番目のコネクティブ ジャンクションへの遷移は、条件 [i < 0] が真の場合にのみ有効です。この条件はこのフロー チャートで真になることはないため、サイクルが発生します。

イベントのブロードキャストに起因する再帰が関係していないため、デバッガーはこのサイクルを検出することはできません。デバッガーはデータ値によって異なるサイクルを検出することはできないため、シミュレーション時に次のような別の診断エラーが表示されます。

Junction is part of a cycle and does not have an 
unconditional path leading to termination.

フロー チャートの巡回動作の修正方法については、MATLAB® コマンド プロンプトで次のように入力します。

sfhelp('cycle_error');

非巡回動作に巡回動作としてフラグが設定される例

以下のチャートは、非巡回動作がデバッガーによって巡回動作としてフラグが設定される例を示しています。

ステート A がアクティブになり、i は 0 に初期化されます。遷移のテストが実行されると、条件 [i < 5] が真になります。i を増分してイベント E をブロードキャストする条件アクションが実行されます。ステート A がアクティブな場合に E がブロードキャストされると、条件が真でなくなるまで、テストの反復実行 (および i の増分) が発生します。デバッガーはこの動作をサイクルとしてフラグを設定しますが、いわゆるサイクルは i が 5 を超えると壊れます。

    ティップ   指示のないローカル イベント ブロードキャストは、チャート内で不要な再帰的動作が発生する場合があるので使用しないでください。直接ローカル イベント ブロードキャストには send 演算子を使用します。詳細は、「イベントのブロードキャストによるステートの同期」を参照してください。

    指示のないローカル イベント ブロードキャストを検出する診断レベルを設定できます。[モデル コンフィギュレーション パラメーター] ダイアログ ボックスで、[診断][Stateflow] ペインに移動し、[指示のないイベント ブロードキャスト] 診断を [なし][警告] または [エラー] に設定します。既定の設定は [警告] です。

この情報は役に立ちましたか?