Main Content

状態遷移表を使用したバンバン制御器のモデル化

状態遷移表は、順序モーダル ロジック用の有限ステート マシンを表形式で表現します。ステートと遷移を Stateflow® チャートで描画する代わりに、状態遷移表を使用して、グラフィカル オブジェクトのメンテナンスが必要最小限で済む簡潔でコンパクトな形式でステート マシンをモデル化できます。詳細については、Stateflow の状態遷移表を参照してください。

設計要件

この例では、状態遷移表を使用して、ボイラーの温度調節に用いるバンバン制御器をモデル化する方法を示します。制御器は、以下の設計要件を満たすためにボイラーのオン/オフを切り替えなければなりません。

  • 高温は摂氏 25 度を超えることはできない。

  • 低温は摂氏 23 度を下回ることはできない。

  • 定常状態での動作には 10 秒間のウォームアップが必要である。

  • アラーム信号が発生した場合、ボイラーはただちにシャットダウンしなければならない。

  • アラーム解除信号が発生した場合には、ボイラーを再度オンにすることができる。

システム属性の特定

このバンバン制御器の動作モードとデータ要件は、設計要件に基づいて特定できます。

動作モード

ボイラーの上位レベルの動作モードは次のとおりです。

  • Normal (ノーマル) 動作: アラーム信号が発生していない場合。

  • Alarm (アラーム) ステート: アラーム信号が発生している場合。

ノーマルの動作中には、ボイラーは次の 3 つのいずれかのステートにあります。

  • Off (オフ): 温度が摂氏 25 度を超えている場合。

  • Warmup (ウォームアップ): オンになってから最初の 10 秒間。

  • On (オン): 温度が摂氏 23 度未満になった場合の10 秒間のウォームアップ後の定常状態。

データ要件

バンバン制御器では次のデータが必要です。

スコープ説明変数名
入力高温の指定値reference_high
入力低温の指定値reference_low
入力アラーム インジケーターALARM
入力アラーム解除インジケーターCLEAR
入力ボイラーの現在の温度temp
ローカルボイラーのウォームアップ完了のインジケーターdoneWarmup
出力ボイラーのモードを設定するコマンド (オフ、ウォームアップまたはオン)boiler_cmd

新しい状態遷移表の追加

この演習では、バンバン制御器以外の必要な Simulink ブロックを含む Simulink モデルに状態遷移表を追加します。

モデルを自分で実装するには、以下の手順に従います。それ以外の場合は、完成したモデルを開くことができます。

1. 例を開きます。

2.5 つの Outport ブロックと 1 つの Inport ブロックを削除します。

3. モデルに State Transition Table ブロックを追加します。

ステートと階層の追加

ボイラーの動作モードを表現するには、状態遷移表にステートと階層を追加します。

  1. 状態遷移表を開きます。

  2. 上位レベルの動作モード (ノーマル モードとアラーム モード) を表現します。

    1. state1 をダブルクリックして、ステート名を「Normal」に変更します。

    2. state2 をダブルクリックして、ステート名を「Alarm」に変更します。

  3. ノーマル動作の 3 つのステートを Normal のサブステートとして表現します。

    1. Normal ステートを右クリックして、[行の挿入][子ステート行] を選択し、新しいステートに Off という名前を付けます。

    2. 手順 a をあと 2 回繰り返して、子ステート WarmupOn をこの順番で作成します。

    既定の設定では、ステートを明確に判断できない場合、階層の各レベルにおける一番上の排他的 (OR) ステートがまずアクティブになります。この理由により、デフォルト遷移は Normal ステートと Off ステートに表示されます。この構成は、このモデルの設計要件を満たします。デフォルト ステートを設定するには、ステートを右クリックして [デフォルトとして設定] を選択します。

状態遷移表は次のようになります。

State transition table with two top-level states called Normal and Alarm. Normal has three substates called Off, Warmup, and On.

これで、各ステートのアクションを指定する準備ができました。

ステート アクションの指定

各ステートで発生する動作を記述するには、表でステート アクションを指定します。この演習では、変数 boiler_cmd と変数 doneWarmup (データ要件を参照) を使用して、ボイラーが Normal ステートと Alarm ステートに入る際の動作モードを初期化します。

  1. 次のステートで、ステート名の後ろをクリックし、Enter キーを押して、指定する entry アクションを入力します。

    ステート:入力する内容:結果の動作
    Off
    entry:
    boiler_cmd = 0;
    doneWarmup = false;
    ボイラーをオフにし、ボイラーがウォームアップしていないことを示します。
    Warmup
    entry:
    boiler_cmd = 2;
    ボイラーのウォームアップを開始します。
    On
    entry:
    boiler_cmd = 1;
    ボイラーをオンにします。
    Alarm
    entry:
    boiler_cmd = 0;
    ボイラーをオフにします。
  2. 状態遷移表を保存します。

状態遷移表は次のようになります。

State transition table with specified entry actions.

これで、あるステートから別のステートへ遷移する場合の条件とアクションを指定する準備が整いました。

遷移の条件とアクションの指定

ある動作モードから別の動作モードに切り替えるタイミングを記述するには、表で遷移の条件とアクションを指定します。この演習ではデータ要件で説明した変数を使用して、ステートメントを作成します。

  1. Normal ステートの行で次のように入力します。

    if
    [ALARM]
     
    Alarm

    シミュレーション中:

    1. チャートでは Normal ステートがアクティブになります。

    2. 各タイム ステップにおいて、ノーマル動作は ALARM の条件が真になるまで OffWarmupOn のステートを繰り返します。

    3. ALARM の条件が真になった場合、ボイラーは Alarm ステートに遷移し、ただちにシャットダウンします。

  2. Off ステートの行で次のように入力します。

    if
    [temp <= reference_low]
     
    Warmup

    シミュレーション中に現在のボイラーの温度が摂氏 23 度を下回ると、ボイラーはウォームアップを開始します。

  3. Warmup ステートの行で次のように入力します。

    ifelse-if
    [doneWarmup][after(10, sec)]
     {doneWarmup = true;}
    OnOn

    シミュレーション中にボイラーが 10 秒間ウォームアップすると、On ステートに遷移します。

  4. On ステートの行で次のように入力します。

    if
    [temp >= reference_high]
     
    Off

    シミュレーション中に現在のボイラーの温度が摂氏 25 度を上回ると、ボイラーはオフになります。

  5. Alarm ステートの行で次のように入力します。

    if
    [CLEAR]
     
    Normal

    シミュレーション中にアラーム解除の条件が真になると、ボイラーはノーマル モードに戻ります。

  6. 状態遷移表を保存します。

状態遷移表は次のようになります。

State transition table with specified transition conditions and actions.

これで、シンボル ウィザードを使用してデータ定義を追加する準備ができました。

データの定義

MATLAB 構文を使用する状態遷移表を作成するときは、C/C++ コードの生成のための言語要件があります。これらの要件の 1 つとして、すべての MATLAB® 変数のサイズ、型、実数/複素数を定義しなければなりません。こうすることで、コンパイル時にこれらのプロパティが特定されます。作成した状態遷移表ではまだ明示的にデータを定義していませんが、ここでシンボル ウィザードを使用することができます。シミュレーション中に未解決のシンボルが見つかった場合は、シンボル ウィザードによってアラートが表示されてプロパティが推測され、欠損データが表に追加されます。

  1. Simulink® モデルで、[実行] を選択します。

    次の 2 つのダイアログ ボックスが表示されます。

    • 診断ビューアー: 状態遷移表に未解決のシンボルがあることを示します。

    • シンボル ウィザード: 欠損データの解決を試みます。ウィザードでは、入力 ALARM and CLEAR 以外のすべてのデータのスコープが正しく推測されます。

      Symbols Wizard showing unresolved symbols in state transition table.

  2. シンボル ウィザードの [スコープ] ドロップダウン リストから [入力] を選択して、ALARMCLEAR のスコープを修正します。

  3. モデル エクスプローラーが開いたら、シンボル ウィザードによって必要なデータ定義がすべて正しく追加されたかどうかを検証します。

    入力の一部が誤った端子に割り当てられています。

  4. モデル エクスプローラーの [コンテンツ] ペインで、以下のように入力端子を再度割り当てます。

    割り当て:端子:
    reference_low2
    reference_high1
    temp5
    ALARM3
    CLEAR4
  5. 状態遷移表を保存します。

  6. 診断ビューアーとモデル エクスプローラーを閉じます。

Simulink モデルの State Transition Table ブロックに、定義した入力と出力が表示されます。これで、これらの入出力を Simulink 信号に接続し、モデルを実行する準備ができました。

状態遷移表の接続とモデルの実行

  1. Simulink モデルで、状態遷移表を Simulink の入出力に接続します。

    Completed Simulink model.

  2. モデルを保存します。

  3. 状態遷移表を再度開きます。

  4. [実行] を選択して、シミュレーションを開始します。

    シミュレーションが実行されている間、状態遷移表のアニメーションによって、さまざまなステートが有効になる様子を確認できます。

Scope ブロックに次の出力が表示されます。

Scope showing simulation results.

対話型のデバッグを実行する場合は、さまざまなステートにブレークポイントを設定して、シミュレーションにおける異なった点でのデータ値を表示できます。デバッグの詳細については、チャートのデバッグのためのブレークポイントの設定を参照してください。

グラフィカルな表現の表示

Stateflow では、作成した状態遷移表のグラフィカルな表現が読み取り専用で自動的に生成されます。

  1. [デバッグ] タブで、[自動チャートの表示] をクリックします。

    最上部の状態遷移図は以下のようになります。

    Stateflow chart with two top-level states called Normal and Alarm.

    Normal ステートがサブチャートとして表示されます。

  2. チャートに含まれるステートおよび遷移を表示するには、Normal ステートをダブルクリックします。

関連するトピック