最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

ドラム ボイラーの圧力の調整

この例では、応用例にドラム ボイラーを使って、Simulink® Control Design ソフトウェアの使用方法を説明します。この例は操作点探索関数を使用して、モデルの線形化だけでなく、それ以降の状態オブザーバーおよび LQR の設計についても説明します。このドラム ボイラー モデルにおける制御上の問題は、給水の流量と適用する熱量のノミナル値を調整することで、炉からのランダムな熱変動に対してボイラーの圧力を安定化することです。この例の場合、ランダムな熱変動の 95% は熱量のノミナル値の 50% 未満であり、炉による燃焼ボイラーとしては異常ではありません。

モデルを開く

Simulink モデルを開きます。

mdl = 'Boiler_Demo';
open_system(mdl)

ボイラー制御モデルを開くと、ソフトウェアによりコントローラーのサイズが初期化されます。u0y0 は操作点計算の後に設定されるため、最初は 0 に設定されます。オブザーバーと制御器も、コントローラーの設計手順で計算されるため、最初は 0 に設定されます。

定格操作点の探索とモデルの線形化

モデルの初期状態値は、Simulink モデルで定義されます。これらの状態値を使用して、関数 findop で定常状態の操作点を見つけます。

状態値がわかっている操作点の仕様を作成します。

opspec = operspec(mdl);
opspec.States(1).Known = 1;
opspec.States(2).Known = 1;
opspec.States(3).Known = [1;1];

操作点の仕様を調整して、入力を計算しなければならないこと、および入力が下限であることを示します。

opspec.Inputs(1).Known = [0;0];     % Inputs unknown
opspec.Inputs(1).Min = [0;0];       % Input minimum value

出力の仕様を操作点の仕様に追加します。これは、出力の操作点が処理時に必ず計算されるようにするために必要です。

opspec = addoutputspec(opspec,[mdl '/Boiler'],1);
opspec.Outputs(1).Known = 0;    % Outputs unknown
opspec.Outputs(1).Min = 0;      % Output minimum value

操作点を計算し、操作点探索レポートを生成します。

[opSS,opReport] = findop(mdl,opspec);
 Operating point search report:
---------------------------------

 Operating point search report for the Model Boiler_Demo.
 (Time-Varying Components Evaluated at time t=0)

Operating point specifications were successfully met.
States: 
----------
(1.) Boiler_Demo/Boiler/Steam volume
      x:           5.6      dx:      7.85e-13 (0)
(2.) Boiler_Demo/Boiler/Temperature
      x:           180      dx:     -5.93e-14 (0)
(3.) Boiler_Demo/Observer/Internal
      x:             0      dx:             0 (0)
      x:             0      dx:             0 (0)

Inputs: 
----------
(1.) Boiler_Demo/Input
      u:      2.41e+05    [0 Inf]
      u:           100    [0 Inf]

Outputs: 
----------
(1.) Boiler_Demo/Boiler
      y:         1e+03    [0 Inf]

この点の周りのモデルを線形化する前に、線形モデルの入力信号と出力信号を指定します。最初に、線形化の入力ポイントを指定します。

Boiler_io(1) = linio([mdl '/Sum'],1,'input');
Boiler_io(2) = linio([mdl '/Demux'],2,'input');

次に、線形化の開ループ出力ポイントを指定します。

Boiler_io(3) = linio([mdl '/Boiler'],1,'openoutput');
setlinio(mdl,Boiler_io);

選択した操作点の周りの線形モデルを見つけます。

Lin_Boiler = linearize(mdl,opSS,Boiler_io);

最後に、関数 minreal を使用して、モデルが最小実現であることを確認します。

Lin_Boiler = minreal(Lin_Boiler);
1 state removed.

制御器と状態オブザーバーの設計

この線形モデルを使用して、LQR 制御器と Kalman フィルター状態オブザーバーを設計します。最初に、コントローラーのオフセットを検出し、コントローラーが、計算された操作点を取得することで、選択した線形化ポイントの周りで動作していることを確認します。

u0 = opReport.Inputs.u;
y0 = opReport.Outputs.y;

ここで、関数 lqry を使用して制御器を設計します。入力の変動は制限されており、出力の厳密なレギュレーションが必要です。

Q = diag(1e8);                  % Output regulation
R = diag([1e2,1e6]);            % Input limitation
[K,S,E] = lqry(Lin_Boiler,Q,R);

関数 kalman を使用して、Kalman 状態オブザーバーを設計します。この例では、主なノイズ源はプロセス ノイズです。ノイズは 1 つの入力を介してのみシステムに入るため、GH の形式になります。

[A,B,C,D] = ssdata(Lin_Boiler);
G = B(:,1);
H = 0;
QN = 1e4;
RN = 1e-1;
NN = 0;
[Kobsv,L,P] = kalman(ss(A,[B G],C,[D H]),QN,RN);

モデルのシミュレーション

設計されたコントローラー用にモデルをシミュレートします。

sim(mdl)

プロセスの入力信号と出力信号をプロットします。次の図は、給水の作動信号 (単位は kg/s) を示しています。

plot(FeedWater.time/60,FeedWater.signals.values)
title('Feedwater flow rate [kg/s]');
ylabel('Flow [kg/s]')
xlabel('time [min]')
grid on

次のプロットは、熱の作動信号 (単位は kJ) を示しています。

plot(Heat.time/60,Heat.signals.values/1000)
title('Applied heat [kJ]');
ylabel('Heat [kJ]')
xlabel('time [min]')
grid on

次の図は、熱の外乱 (単位は kJ) を示しています。外乱は、熱量のノミナル値の 50% も変動します。

plot(HeatDist.time/60,HeatDist.signals.values/1000)
title('Heat disturbance [kJ]');
ylabel('Heat [kJ]')
xlabel('time [min]')
grid on

次の図は、対応するドラム圧力 (単位は kPa) を示しています。外乱が比較的大きい場合でも、圧力はノミナル値の約 1% 変動します。

plot(DrumPressure.time/60,DrumPressure.signals.values)
title('Drum pressure [kPa]');
ylabel('Pressure [kPa]')
xlabel('time [min]')
grid on

bdclose(mdl)