シミュレーション時の一般的なモデリング エラーの検出
一般的な設計エラーを回避するために、コンパイルおよびシミュレーション時の Stateflow® チャートの完全性をテストする診断チェックを実行できます。Stateflow 診断は、Simulink® モデルの Stateflow チャートで、ステートの矛盾、データ範囲の違反、循環動作を検出します。
モデルのシミュレーション時に、Stateflow パーサーは、各 Stateflow マシンのグラフィカル オブジェクトと非グラフィカル オブジェクト、およびデータを、サポートされるチャート表記法とアクション言語の構文に照らして評価します。Stateflow ツールストリップの [モデル化] タブにある [チャートの更新] を選択することでもチャートの構文をチェックできます。
チャートに構文エラーがある場合、チャートでは最初のエラーの原因となったオブジェクトが自動的に強調表示されます。診断ウィンドウでエラーを選択すると、ソース オブジェクトが強調表示された状態でソース チャートが前面に表示されます。チャート内の未解決のデータやイベントには、シンボル ウィザードでフラグが設定されます。
ヒント
チャートの編集中、Stateflow エディターでは、オブジェクトを赤またはオレンジで強調表示することによってエラーの原因となっている可能性のある箇所を示します。詳細については、編集時のモデリング エラーの検出を参照してください。
ステートの矛盾の検出
Stateflow チャートでは、以下のいずれかのルールに違反している場合にステートの矛盾が発生します。
排他的 (OR) 構造と少なくとも 1 つのサブステートを含むアクティブ ステートは、アクティブ サブステートを 1 つだけもちます。
パラレル (AND) 構造を含むアクティブなステートのサブステートはすべてアクティブです。
非アクティブ ステートのサブステートは、ステート構造にかかわらず、すべて非アクティブです。
たとえば、次のチャートにはステートの矛盾が含まれています。どのサブステートが最初にアクティブになるかを示すデフォルト遷移がないためです。
無条件のデフォルト遷移をいずれかのステートに追加することで、ステートの矛盾が解決されます。
コンパイル時に、Stateflow チャートは、無条件のデフォルト遷移の欠落によって発生したステートの矛盾を検出します。診断アクションのレベルを制御するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[診断] 、 [Stateflow] ペインで、[無条件のデフォルト遷移がない] パラメーターを [エラー]
、[警告]
、または [なし]
に設定します。既定の設定は [エラー]
です。詳細については、No unconditional default transitions (Simulink)を参照してください。
データ範囲違反の検出
シミュレーション中、次の場合にデータ範囲違反が発生します。
整数演算または固定小数点演算が、結果タイプの数値容量をオーバーフローする。チャート データの整数オーバーフローと列挙オーバーフローの処理とStateflow チャートでの固定小数点演算を参照してください。
データ オブジェクトの値が、[初期値]、[最小値]、[最大値] のプロパティで指定されている値の範囲外である。初期値と制限範囲を参照してください。
たとえば、次のチャートには、[最小値] が 0 で [最大値] が 2 のローカル データ a
が含まれています。ステート A
の entry
アクションが、a
を 1 に初期化します。during
アクションは、a
の値を 1 つインクリメントします。2 タイム ステップ後に、a
の値は指定された範囲を超え、データ範囲違反となります。
実行時に、Stateflow チャートはデータ範囲違反を検出します。診断アクションのレベルを制御するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[診断] 、 [データ有効性] ペインで、次のパラメーターを [エラー]
、[警告]
、または [なし]
に設定します。
[シミュレーション範囲のチェック] は、最小値と最大値の範囲のチェックに基づいて違反を検出します。既定の設定は
[なし]
です。[オーバーフロー時にラップ] と [オーバーフローで飽和] は、整数演算または固定小数点演算が結果タイプの数値容量を超えたときに発生する違反を検出します。既定の設定は
[警告]
です。
詳細については、シミュレーション範囲のチェック (Simulink)、オーバーフロー時にラップ (Simulink)およびオーバーフローで飽和 (Simulink)を参照してください。
循環動作の検出
循環動作は、チャートのシミュレーション時にステップまたはステップのシーケンスが無限に繰り返される場合に発生します。
たとえば、以下のチャートのアクションでは、再帰的なイベント ブロードキャストの無限サイクルが発生します。
ステート
C
のduring
アクションが、イベントE1
をブロードキャストします。イベント
E1
が、ステートA.A1
からステートA.A2
への遷移をトリガーします。この遷移の条件アクションが、イベントE2
をブロードキャストします。イベント
E2
が、ステートB.B1
からステートB.B2
への遷移をトリガーします。この遷移の条件アクションが、イベントE1
をブロードキャストします。
ステート A
および B
のイベント ブロードキャストは条件アクションで発生するため、結果のイベントをチャートが処理するまで遷移は行われません。サブステート A.A1
および B.B1
はアクティブなままであるため、新しいイベント ブロードキャストが遷移をトリガーし続け、プロセスは無限に繰り返されます。
チャートのシミュレーション時に、Stateflow チャートは、循環検出アルゴリズムを使用して、イベント ブロードキャストが原因で無限再帰が発生しているクラスを検出します。循環検出を有効にするには、Stateflow チャートを開きます。[デバッグ] タブで、[診断] 、 [周期的動作の検出] を選択します。循環動作チェックは既定で選択されています。
Stateflow チャートは、指示のないローカル イベント ブロードキャストも検出します。診断アクションのレベルを制御するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[診断] 、 [Stateflow] ペインで、[指示のないイベント ブロードキャスト] パラメーターを error
、warning
、または none
に設定します。既定の設定は warning
です。詳細については、Undirected event broadcasts (Simulink)を参照してください。
ヒント
指示のないローカル イベント ブロードキャストは不要な再帰的動作の原因となる可能性があるため、send
演算子を使った、指示のあるローカル イベント ブロードキャストが推奨されます。詳細については、チャートでの望ましくない再帰の回避を参照してください。
フロー チャート内の循環動作の修正
実行時の循環動作の検出は、イベント ブロードキャストによる再帰の場合に制限されており、他のタイプの循環動作には拡張されません。たとえば、次のフロー チャートの無限サイクルは循環検出では検出されません。この例では、デフォルト遷移がローカル データ i
を 0 に初期化します。次の遷移セグメントは i
をインクリメントします。最初のジャンクションに戻る遷移は、i
が正の場合に有効になります。この条件は常に真になるため、無限サイクルという結果になります。
多くの場合、フロー チャートにおける循環動作は、サイクルからの無条件エスケープ パスがないジャンクションが原因で発生します。Stateflow エディターでは、それらのジャンクションが赤で強調表示されます。たとえば、このフロー チャートでは、ループの上位 2 つのジャンクションに終端ジャンクションへの無条件パスがありません。
この問題を解決するには、c2
を含む遷移に条件 c1
の否定を組み込みます。これにより、結果のブロック線図にループから抜け出す無条件パスが含まれます。
同様に、このフロー チャートの最上位のジャンクションには終端ジャンクションへの無条件パスがありません。
この問題を解決するには、最上位のジャンクションから終端ジャンクションへの無条件遷移を作成します。