チャートのデバッグにアクティブ ステートの出力を使用
Stateflow® のバグは、特定、診断、修正が難しい場合があります。チャートのデータとステートの経時的な変化を追跡することで、バグの発生原因を解明できます。
この例では、サブチャートのアクティブ ステートをログに記録し、ブレークポイントを使用してシミュレーションをステップ実行することにより、薬品タンクの制御ロジックをデバッグします。
モデルを開く
この例では、組み立てラインの薬品タンクをモデル化しています。

プロジェクトの要件では、モデルは次のステップを実行する必要があります。
電源が入ると、タンクへの液体の注入を開始します。
液量が
maxVolumeを超えると、タンクは液体を撹拌します。mixTime秒間の撹拌後、タンクから排液します。タンクは
coolTime秒間冷却されます。タンクは自動的にオフになります。
しかし、モデルをシミュレーションすると、チャートが Power_Off ステートに戻ることはありません。
問題の特定
チャートが Power_Off ステートに戻ることはないため、チャートのエラーは Power_On ステートで発生することになります。シミュレーション データ インスペクターでアクティブな子のステートをプロットして、エラーの発生場所を特定します。
チャートを開きます。
Power_Onステートを選択します。[シミュレーション] タブで [子アクティビティのログ記録] をクリックします。ログ バッジ
が Power_Onの左下隅に表示されます。モデルのシミュレーションを実行します。
[シミュレーション] タブの [結果の確認] セクションで、[データ インスペクター]
をクリックします。[Power_On:ActiveChild] を選択します。シミュレーション データ インスペクターで、
Power_Onのアクティブな子ステートをシミュレーション時間に対してプロットします。
プロットは、シミュレーションが Drain の子ステートに到達しても、それ以上は進まないことを示しています。
原因の特定
バグの発生場所を特定できたため、今度はブレークポイントを使用して原因を特定します。
Drainステートを右クリックし、[ブレークポイントの設定] を選択します。ブレークポイントは、Drainの左下隅に赤色の円で表示されます。ブレークポイントをクリックし、
On State Entryをクリアします。モデルのシミュレーションを実行します。
ブレークポイントでシミュレーションが一時停止したら、
Drainステートをポイントします。[データ情報] ウィンドウに、drainRateの値が -1770、liquidの値が 4536 と表示されます。
[続行] をクリックしてシミュレーションを再開します。次のブレークポイントでは、値は -1770 と 6306 です。
[デバッグを中止] をクリックしてシミュレーションを終了します。
liquid の値は、減少するよりもむしろ増加します。したがって、liquid が 0 になることはなく、チャートは次のステートに進みません。
バグの修正
drainRate ステートが負の値であるため、liquid の値は増加し続けます。この問題を解決するには、drainRate に正の値を割り当てます。
[モデル化] タブで [[シンボル] ペイン] をクリックします。
[シンボル] ペインで、
drainRateの値の負の符号を削除します。Drainステートを右クリックし、[ブレークポイントのクリア] をクリックしてブレークポイントを削除します。[デバッグ] タブで、[アニメーション速度] の下で [中速] を選択します。
モデルのシミュレーションを実行します。シミュレーションが停止する前に、チャートは
Power_Offステートに戻ります。Power_Onステートを選択します。[シミュレーション] タブで [子アクティビティのログ記録] をクリックして、アクティブ ステートのログ記録をオフにします。