Main Content

チャートのデバッグにアクティブ ステートの出力を使用

Stateflow® のバグは、特定、診断、修正が難しい場合があります。チャートのデータとステートの経時的な変化を追跡することで、バグの発生原因を解明できます。

この例では、サブチャートのアクティブ ステートをログに記録し、ブレークポイントを使用してシミュレーションをステップ実行することにより、薬品タンクの制御ロジックをデバッグします。

モデルを開く

この例では、組み立てラインの薬品タンクをモデル化しています。

プロジェクトの要件では、モデルは次のステップを実行する必要があります。

  1. 電源が入ると、タンクへの液体の注入を開始します。

  2. 液量が maxVolume を超えると、タンクは液体を撹拌します。

  3. mixTime 秒間の撹拌後、タンクから排液します。

  4. タンクは coolTime 秒間冷却されます。

  5. タンクは自動的にオフになります。

しかし、モデルをシミュレーションすると、チャートが Power_Off ステートに戻ることはありません。

問題の特定

チャートが Power_Off ステートに戻ることはないため、チャートのエラーは Power_On ステートで発生することになります。シミュレーション データ インスペクターでアクティブな子のステートをプロットして、エラーの発生場所を特定します。

  1. チャートを開きます。

  2. Power_On ステートを選択します。[シミュレーション] タブで [子アクティビティのログ記録] をクリックします。ログ バッジ Power_On の左下隅に表示されます。

  3. モデルのシミュレーションを実行します。

  4. [シミュレーション] タブの [結果の確認] セクションで、[データ インスペクター] をクリックします。

  5. [Power_On:ActiveChild] を選択します。シミュレーション データ インスペクターで、Power_On のアクティブな子ステートをシミュレーション時間に対してプロットします。

    The chart progresses from "None," to "Fill," to "Mix," to "Drain." For the rest of the simulation, the chart remains at "Drain."

プロットは、シミュレーションが Drain の子ステートに到達しても、それ以上は進まないことを示しています。

原因の特定

バグの発生場所を特定できたため、今度はブレークポイントを使用して原因を特定します。

  1. Drain ステートを右クリックし、[ブレークポイントの設定] を選択します。ブレークポイントは、Drain の左下隅に赤色の円で表示されます。

  2. ブレークポイントをクリックし、On State Entry をクリアします。

  3. モデルのシミュレーションを実行します。

  4. ブレークポイントでシミュレーションが一時停止したら、Drain ステートをポイントします。[データ情報] ウィンドウに、drainRate の値が -1770、liquid の値が 4536 と表示されます。

    The Data information window shows the values of all data accessed or modified by a state.

  5. [続行] をクリックしてシミュレーションを再開します。次のブレークポイントでは、値は -1770 と 6306 です。

  6. [デバッグを中止] をクリックしてシミュレーションを終了します。

liquid の値は、減少するよりもむしろ増加します。したがって、liquid が 0 になることはなく、チャートは次のステートに進みません。

バグの修正

drainRate ステートが負の値であるため、liquid の値は増加し続けます。この問題を解決するには、drainRate に正の値を割り当てます。

  1. [モデル化] タブで [[シンボル] ペイン] をクリックします。

  2. [シンボル] ペインで、drainRate の値の負の符号を削除します。

  3. Drain ステートを右クリックし、[ブレークポイントの設定] をクリックしてブレークポイントを削除します。

  4. [デバッグ] タブで、[アニメーション速度] の下で [標準] を選択します。

  5. モデルのシミュレーションを実行します。シミュレーションが停止する前に、チャートは Power_Off ステートに戻ります。

  6. Power_On ステートを選択します。[シミュレーション] タブで [子アクティビティのログ記録] をクリックして、アクティブ ステートのログ記録をオフにします。

参考

関数

オブジェクト

関連するトピック