時相論理を使用したチャート アクションのスケジューリング
Stateflow® チャートの動作をシミュレーション時間によって定義するには、チャートのステート アクションと遷移アクションに "時相論理演算子" を含めます。時相論理演算子は、ステートがアクティブのままであった時間や論理条件が真のままであった時間の長さを提示できる組み込み関数です。時相論理を使って、以下のタイミングを制御できます。
ステート間の遷移
関数の呼び出し
変数値の変化
詳細については、アクションを使用したチャート動作の定義を参照してください。
時相論理演算子
絶対時間の時相論理で最もよく使われる演算子は after
、elapsed
、および duration
です。
演算子 | 構文 | 説明 |
---|---|---|
| 関連するステートがアクティブになってから | |
| 関連するステートがアクティブになってから経過したシミュレーション時間の秒数を返します。 | |
| 論理条件 |
以下が発生するたびに、各演算子はその関連タイマーを 0 にリセットします。
演算子を含むステートが再びアクティブになる。
演算子を含む遷移の遷移元ステートが再びアクティブになる。
duration
演算子内の論理条件がfalse
になる。
メモ
after
などの一部の演算子は、イベントベースの時相論理および絶対時間の時相論理を、秒 (sec
)、ミリ秒 (msec
)、およびマイクロ秒 (usec
) 単位でサポートしています。詳細については、時相論理を使用したチャート実行の制御を参照してください。
時相論理の例
この例は、時相論理を使用して、ボイラーの内部温度を制御するバンバン制御器をモデル化します。
例は Stateflow チャートと Simulink® サブシステムで構成されています。Bang-Bang Controller チャートは、現在のボイラー温度を基準指定値と比較して、ボイラーをオンにするかどうかを判定します。Boiler Plant Model サブシステムは、ボイラー内部のダイナミクスをモデル化し、制御器のステータスに従ってその温度を増減させます。その後、ボイラーの温度はシミュレーションの次のステップのために制御器のチャートに戻されます。
Bang-Bang Controller チャートは時相論理演算子 after
を使用して以下を行います。
ボイラーのオン/オフが切り替わる際にバンバン サイクルのタイミングを調整する。
ボイラーの動作モードに応じてさまざまな速さで点滅するステータス LED を制御する。
ボイラー サブシステムと LED サブシステムの動作を定義するタイマーは、制御器のシミュレーションをブロックしたり中断することなく互いに独立して動作します。
バンバン サイクルのタイミング
Bang-Bang Controller チャートには、ボイラーの 2 つの動作モードを表す 1 組のサブステート On
と Off
が含まれています。このチャートはアクティブ ステートの出力データ boiler
を使用して、どのサブステートがアクティブであるかを表しています。
On
サブステートと Off
サブステート間の遷移のラベルが、バンバン制御器の動作を定義します。
遷移 | ラベル | 説明 |
---|---|---|
On から Off へ | after(20,sec) | On ステートを 20 秒維持した後 Off ステートに遷移します。 |
Off から On へ | after(40,sec)[cold()] | ボイラーの温度が基準指定値より低いとグラフィカル関数 cold() が判定した場合、Off ステートを少なくとも 40 秒維持してから On ステートに遷移します。 |
On から Off へ | turnOff | ボイラー温度が基準指定値以上であるために、On ステートの内部遷移ロジックがボイラーをオフにするように要求した場合、Off ステートに遷移します。 |
これらの遷移アクションの結果、バンバン サイクルのタイミングは現在のボイラー温度に左右されることになります。シミュレーションの開始時、ボイラーは冷たく、制御器は 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
を en,du
タイプのステート アクションとして呼び出します。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 の間で切り替わる。
例の確認
追加の時相論理を使用して、ボイラーの温度が基準指定値に近づくとバンバン サイクルのタイミングがどのように変化するかを調査します。
elapsed
およびduration
演算子を呼び出す新しいステート アクションを入力します。On
ステートで、Timer1
をOn
ステートがアクティブである時間の長さに設定します。en,du,ex: Timer1 = elapsed(sec)
Off
ステートで、Timer2
をボイラーの温度が基準指定値以上である時間の長さに設定します。en,du,ex: Timer2 = duration(temp>=reference)
en,du,ex
というラベルは、対応するステートがアクティブになるたびにこれらのアクションが発生することを示します。[シンボル] ペインで [未定義のシンボルを解決]
をクリックします。Stateflow エディターが、シンボル
Timer1
とTimer2
を出力データに解決します。
Timer1
とTimer2
のログを有効にします。[シンボル] ペインで、各シンボルを選択します。次に、[プロパティ インスペクター] の [ログ] で [信号データのログ] を選択します。[シミュレーション] タブで、[実行]
をクリックします。
[シミュレーション] タブで、[結果の確認] にある [データ インスペクター]
をクリックします。
シミュレーション データ インスペクターで、信号
boiler
およびTimer1
を同じ座標軸のセットに表示します。プロットは次のことを示しています。バンバン サイクルの
On
フェーズは通常、ボイラーが冷たい場合は 20 秒、ボイラーが温かい場合は 4 秒続く。ボイラーがはじめて基準温度に達する際は、サイクルが途中で中断され、制御器の
On
ステートは 18 秒間しか維持されない。ボイラーが温かい場合、制御器の
On
ステートが 3 秒しか維持されないため、最初のサイクルはその後のサイクルよりもわずかに短くなる。
シミュレーション データ インスペクターで、信号
boiler
およびTimer2
を同じ座標軸のセットに表示します。プロットは次のことを示しています。ボイラーが温まった後は、バンバン サイクルの
Off
フェーズで冷えるまでに通常 9 秒かかる。ボイラーがはじめて基準温度に達する際は、冷却するよりも 2 倍以上の時間 (19 秒) がかかる。
サイクルが短く冷却時間が長いのは、On
ステート内のサブステート階層による影響です。ボイラーがはじめて基準温度に達する場合、HIGH
から NORM
への遷移によって制御器は追加のタイム ステップの間オンが維持されるため、ボイラーは通常より温かくなります。その後のサイクルでは、ヒストリ ジャンクション によって、
On
フェーズは NORM
サブステートがアクティブな状態で開始されます。その後、制御器はボイラーが基準温度に達すると直ちにボイラーをオフにするので、ボイラーの温度はより低いものになります。