Main Content

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

チャート シミュレーション時の一般的なモデリング エラーの検出

一般的な設計エラーを回避するために、コンパイルおよびシミュレーション時の Stateflow® チャートの完全性をテストする診断チェックを実行できます。Stateflow 診断は、Simulink® モデルの Stateflow チャートで、ステートの矛盾、データ範囲の違反、循環動作を検出します。

モデルをシミュレートすると、Stateflow は自動的に Stateflow マシンを解析します。パーサーは、各 Stateflow マシンのグラフィカル/非グラフィカル オブジェクトおよびデータを、サポートされるチャート表記法やアクション言語構文と比較対照して評価します。Stateflow ツールストリップの [モデル化] タブにある [チャートの更新] を選択することでもチャートの構文をチェックできます。

チャートに構文エラーがある場合、チャートでは最初のエラーの原因となったオブジェクトが自動的に強調表示されます。診断ウィンドウでエラーを選択すると、ソース オブジェクトが強調表示された状態でソース チャートが前面に表示されます。チャート内の未解決のデータやイベントには、シンボル ウィザードでフラグが設定されます。

ステートの矛盾

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

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

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

  • 非アクティブ ステートのサブステートは、ステート構造にかかわらず、すべて非アクティブです。

チャートの編集中、Stateflow エディターでは、オブジェクトを赤またはオレンジで強調表示することによってステートの矛盾の原因となっている可能性のある箇所を示します。詳細については、編集時のモデリング エラーの検出を参照してください。

ステートの矛盾の原因

以下のすべての条件に該当する場合、1 種類のステートの矛盾が発生します。

  • 複数のサブステートをもつステートに排他的 (OR) 構造が含まれている。

  • そのステートに、ヒストリ ジャンクションが含まれていない。

  • サブステートにつながる既定のパスは、条件によって保護されるか、イベントによってトリガーされる。

  • ステートへの遷移の中に、サブステートに直接つながるスーパートランジションではないものが含まれる。

たとえば、次のチャートにはステートの矛盾が含まれています。どのサブステートが最初にアクティブになるかを示すデフォルト遷移がないためです。

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

ステートの矛盾の検出

コンパイル時に、Stateflow チャートは、無条件のデフォルト遷移の欠落によって発生したステートの矛盾を検出します。診断アクションのレベルを制御するには、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[診断][Stateflow] ペインで、診断 [無条件のデフォルト遷移がない] に対して、[エラー][警告] または [なし] を選択できます。既定の設定は [エラー] です。詳細については、無条件のデフォルト遷移がないを参照してください。

データ範囲違反

シミュレーション中、次の場合にデータ範囲違反が発生します。

たとえば、次のチャートには、[最小値] が 0 で [最大値] が 2 のローカル データ a が含まれています。ステート Aentry アクションが、a を 1 に初期化します。during アクションは、a の値を 1 つインクリメントします。2 タイム ステップ後に、a の値は指定された範囲を超え、データ範囲違反となります。

データ範囲違反の検出

実行時に、Stateflow チャートはデータ範囲違反を検出します。診断アクションのレベルを制御するには、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[診断][データ有効性] ペインで、以下の診断に対して [エラー][警告] または [なし] を選択できます。

  • [シミュレーション範囲のチェック] は、最小値と最大値の範囲のチェックに基づいて違反を検出します。既定の設定は [なし] です。

  • [オーバーフロー時にラップ][オーバーフローで飽和] は、整数演算または固定小数点演算が結果タイプの数値容量を超えたときに発生する違反を検出します。既定の設定は [警告] です。

詳細については、シミュレーション範囲のチェックオーバーフロー時にラップおよびオーバーフローで飽和を参照してください。

循環動作

循環動作は、チャートのシミュレーション時にステップまたはステップのシーケンスが無限に繰り返される場合に発生します。

たとえば、以下のチャートのアクションでは、再帰的なイベント ブロードキャストの無限サイクルが発生します。

  • ステート Cduring アクションが、イベント E1 をブロードキャストします。

  • イベント E1 が、ステート A.A1 からステート A.A2 への遷移をトリガーします。この遷移の条件アクションが、イベント E2 をブロードキャストします。

  • イベント E2 が、ステート B.B1 からステート B.B2 への遷移をトリガーします。この遷移の条件アクションが、イベント E1 をブロードキャストします。

ステート A および B のイベント ブロードキャストは条件アクションで発生するため、結果のイベントをチャートが処理するまで遷移は行われません。サブステート A.A1 および B.B1 はアクティブなままであるため、新しいイベント ブロードキャストが遷移をトリガーし続け、プロセスは無限に繰り返されます。

指示のないローカル イベント ブロードキャストは不要な再帰的動作の原因となる可能性があるため、send 演算子を使った、指示のあるローカル イベント ブロードキャストが推奨されます。詳細については、ローカル イベントをブロードキャストしてパラレル ステートを同期を参照してください。

シミュレーション時の循環動作の検出

チャートのシミュレーション時に、Stateflow チャートは、循環検出アルゴリズムを使用して、イベント ブロードキャストが原因で無限再帰が発生しているクラスを検出します。循環検出を有効にするには、Stateflow チャートを開きます。[デバッグ] タブで、[診断][周期的動作の検出] を選択します。循環動作チェックは既定で選択されています。

Stateflow チャートは、指示のないローカル イベント ブロードキャストも検出します。診断アクションのレベルを制御するには、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[診断][Stateflow] ペインで、[指示のないイベント ブロードキャスト] 診断に対して、[エラー][警告] または [なし] を選択できます。既定の設定は [警告] です。詳細については、指示のないイベント ブロードキャストを参照してください。

循環動作検出の制限

Stateflow 循環検出は、イベント ブロードキャストによる再帰の場合に制限されており、他のタイプの循環動作には拡張されません。

たとえば、Stateflow は、次のフロー チャートの無限サイクルは検出できません。この例では、デフォルト遷移がローカル データ i を 0 に初期化します。次の遷移セグメントは i をインクリメントします。終端ジャンクションへの遷移は、条件 [i < 0] が真の場合にのみ有効です。この条件が真になることはないため、無限サイクルという結果になります。

モデル sf_cycle_error_fix では、フロー チャート内の循環動作を修正するための推奨事項が提供されています。MATLAB® コマンド プロンプトで、次のように入力します。

sfhelp('cycle_error');

関連するトピック