チャートのデバッグにアクティブ ステートの出力を使用
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
ステートを選択します。[シミュレーション] タブで [子アクティビティのログ記録] をクリックして、アクティブ ステートのログ記録をオフにします。