Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

時相論理を使用したチャート アクションのスケジューリング

Stateflow チャートの動作をシミュレーション時間によって定義するには、チャートのステート アクションと遷移アクションに時相論理演算子を含めます。時相論理演算子は、ステートがアクティブのままであった時間や論理条件が真のままであった時間の長さを提示する組み込み関数です。時相論理を使って、以下のタイミングを制御できます。

  • ステート間の遷移

  • 関数の呼び出し

  • 変数値の変化

絶対時間の時相論理で最もよく使われる演算子は次のとおりです。

  • afterafter(n,sec) は、演算子を含むステートまたは演算子を含む遷移の遷移元ステートがアクティブになってから n 秒のシミュレーション時間が経過している場合、true を返します。それ以外の場合、演算子は false を返します。この演算子は、イベントベースの時相論理および絶対時間の時相論理を、秒 (sec)、ミリ秒 (msec)、およびマイクロ秒 (usec) 単位でサポートしています。

  • elapsedelapsed(sec) は、関連するステートがアクティブになってから経過したシミュレーション時間の秒数を返します。

  • durationduration(C) は、論理条件 Ctrue になってから経過したシミュレーション時間の秒数を返します。

バンバン温度制御器のモデル化

この例は、時相論理を使用して、ボイラーの内部温度を制御するバンバン制御器をモデル化します。

例は Stateflow チャートと Simulink® サブシステムで構成されています。Bang-Bang Controller チャートは、現在のボイラー温度を基準指定値と比較して、ボイラーをオンにするかどうかを判定します。Boiler Plant Model サブシステムは、制御器のステータスに従って温度を増減させることで、ボイラー内部のダイナミクスをモデル化します。その後、チャートではボイラーの温度がシミュレーションの次のステップに使用されます。

Bang-Bang Controller チャートは時相論理演算子 after を使用して以下を行います。

  • ボイラーのオン/オフが切り替わる際にバンバン サイクルのタイミングを調整する。

  • ボイラーの動作モードに応じてさまざまな速さで点滅するステータス LED を制御する。

ボイラー サブシステムと LED サブシステムの動作を定義するタイマーは、制御器のシミュレーションをブロックしたり中断することなく互いに独立して動作します。

バンバン サイクルのタイミング

Bang-Bang Controller チャートには、ボイラーの 2 つの動作モードを表す 1 組のサブステート OnOff が含まれています。このチャートはアクティブ ステートの出力データ boiler を使用して、どのサブステートがアクティブであるかを表しています。

On サブステートと Off サブステート間の遷移の条件が、バンバン制御器の動作を定義します。

  • On から Off への最初の遷移で、条件 after(20,sec) は、ボイラーを 20 秒間オンにした後オフにします。

  • Off から On への遷移で、条件 after(40,sec)[cold()] は、ボイラーの温度が基準指定値より低い状態が少なくとも 40 秒間続いたとグラフィカル関数 cold() によって示されたときに、ボイラーをオンにします。

  • On から Off への 2 番目の遷移で、On ステートの内部遷移ロジックによってボイラー温度が基準指定値以上であると判定された場合、自明な条件によってボイラーがオフになります。

これらの遷移アクションの結果、バンバン サイクルのタイミングは現在のボイラー温度に左右されることになります。シミュレーションの開始時、ボイラーは冷たく、制御器は Off ステートを 40 秒維持し、On ステートを 20 秒維持します。時間 $t = 478$ 秒に、ボイラーの温度は基準指定値に達します。それ以降、ボイラーは Off ステートにある間に失われた熱だけを補填する必要があります。その後、制御器は Off ステートを 40 秒維持し、On ステートを 4 秒維持します。

ステータス LED のタイミング

Off ステートには、アクション after(5,sec) でトリガーされた自己ループ遷移をもつサブステート Flash が含まれています。この遷移のため、Off ステートがアクティブな場合はサブステートがその entry アクションを実行してグラフィカル関数 flash_LED を 5 秒ごとに呼び出します。この関数は出力シンボル LED の値を 0 と 1 の間で切り替えます。

On ステートは、グラフィカル関数 flash_LED を組み合わせた entry, during ステート アクションとして呼び出します。On ステートがアクティブな場合は、このアクションによってシミュレーションの各タイム ステップで関数が呼び出され、出力シンボル LED の値が 0 と 2 の間で切り替わります。

その結果、ステータス LED のタイミングはボイラーの動作モードに左右されることになります。以下に例を示します。

  • $t = 0$ 秒から $t = 40$ 秒まではボイラーがオフになり、LED 信号は 5 秒ごとに 0 と 1 の間で切り替わる。

  • $t = 40$ 秒から $t = 60$ 秒まではボイラーがオンになり、LED 信号は毎秒 0 と 2 の間で切り替わる。

  • $t = 60$ 秒から $t = 100$ 秒まではボイラーがオフになり、LED 信号は 5 秒ごとに 0 と 1 の間で切り替わる。

例の確認

追加の時相論理を使用して、ボイラーの温度が基準指定値に近づくとバンバン サイクルのタイミングがどのように変化するかを調査します。

1. elapsed および duration 演算子を呼び出す新しいステート アクションを入力します。

  • On ステートで、Timer1On ステートがアクティブである時間の長さに設定します。

  en,du,ex: Timer1 = elapsed(sec);
  • Off ステートで、Timer2 をボイラーの温度が基準指定値以上である時間の長さに設定します。

  en,du,ex: Timer2 = duration(temp>=reference);

2.[シンボル] ペインで [未定義のシンボルを解決] をクリックします。Stateflow エディターが、シンボル Timer1Timer2 を出力データに解決します。

3. Timer1Timer2 のログを有効にします。[シンボル] ペインで、各シンボルを選択します。次に、[プロパティ インスペクター][ログ][信号データのログ] を選択します。

4. [シミュレーション] タブで、[実行] をクリックします。

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

6. シミュレーション データ インスペクターで、信号 boiler および Timer1 を同じ座標軸のセットに表示します。プロットは次のことを示しています。

  • バンバン サイクルの On フェーズは通常、ボイラーが冷たい場合は 20 秒、ボイラーが温かい場合は 4 秒続く。

  • ボイラーがはじめて基準温度に達する際は、サイクルが途中で中断され、制御器の On ステートは 18 秒間しか維持されない。

  • ボイラーが温かい場合、制御器の On ステートが 3 秒しか維持されないため、最初のサイクルはその後のサイクルよりもわずかに短くなる。

7. シミュレーション データ インスペクターで、信号 boiler および Timer2 を同じ座標軸のセットに表示します。プロットは次のことを示しています。

  • ボイラーが温まった後は、バンバン サイクルの Off フェーズで冷えるまでに通常 9 秒かかる。

  • ボイラーがはじめて基準温度に達する際は、冷却に 19 秒 (その他のサイクルよりも 2 倍以上の時間) かかる。

サイクルが短く冷却時間が長いのは、On ステート内のサブステート階層による影響です。ボイラーがはじめて基準温度に達する場合、HIGH から NORM への遷移によって制御器は追加のタイム ステップの間オンが維持されるため、ボイラーは通常より温かくなります。その後のサイクルでは、ヒストリ ジャンクションによって、On フェーズは NORM サブステートがアクティブな状態で開始されます。その後、制御器はボイラーが基準温度に達すると直ちにボイラーをオフにするので、ボイラーの温度はより低いものになります。

関連するトピック