ドラム ボイラーの圧力の調整
この例では、応用例にドラム ボイラーを使って、Simulink® Control Design™ ソフトウェアの使用方法を説明します。この例は操作点探索関数を使用して、モデルの線形化だけでなく、それ以降の状態オブザーバーおよび LQR の設計についても説明します。このドラム ボイラー モデルにおける制御上の問題は、給水の流量と適用する熱量のノミナル値を調整することで、炉からのランダムな熱変動に対してボイラーの圧力を安定化することです。この例の場合、ランダムな熱変動の 95% は熱量のノミナル値の 50% 未満であり、炉による燃焼ボイラーとしては異常ではありません。
モデルを開く
Simulink モデルを開きます。
mdl = 'Boiler_Demo';
open_system(mdl)
ボイラー制御モデルを開くと、ソフトウェアによりコントローラーのサイズが初期化されます。u0
と y0
は操作点計算の後に設定されるため、最初は 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: --------------------------------- opreport = Operating point search report for the Model Boiler_Demo. (Time-Varying Components Evaluated at time t=0) Operating point specifications were successfully met. States: ---------- Min x Max dxMin dx dxMax ___________ ___________ ___________ ___________ ___________ ___________ (1.) Boiler_Demo/Boiler/Steam volume 5.6 5.6 5.6 0 7.8501e-13 0 (2.) Boiler_Demo/Boiler/Temperature 180 180 180 0 -5.9262e-14 0 (3.) Boiler_Demo/Observer/Internal 0 0 0 0 0 0 0 0 0 0 0 0 Inputs: ---------- Min u Max ___________ ___________ ___________ (1.) Boiler_Demo/Input 0 241069.0782 Inf 0 100.1327 Inf Outputs: ---------- Min y Max ________ ________ ________ (1.) Boiler_Demo/Boiler 0 1002.381 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 つの入力を介してのみシステムに入るため、G
と H
の形式になります。
[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) を示しています。
figure plot(FeedWater.time/60,FeedWater.signals.values) title('Feedwater flow rate [kg/s]'); ylabel('Flow [kg/s]') xlabel('time [min]') grid on
次のプロットは、熱の作動信号 (単位は kJ) を示しています。
figure plot(Heat.time/60,Heat.signals.values/1000) title('Applied heat [kJ]'); ylabel('Heat [kJ]') xlabel('time [min]') grid on
次の図は、熱の外乱 (単位は kJ) を示しています。外乱は、熱量のノミナル値の 50% も変動します。
figure plot(HeatDist.time/60,HeatDist.signals.values/1000) title('Heat disturbance [kJ]'); ylabel('Heat [kJ]') xlabel('time [min]') grid on
次の図は、対応するドラム圧力 (単位は kPa) を示しています。外乱が比較的大きい場合でも、圧力はノミナル値の約 1% 変動します。
figure plot(DrumPressure.time/60,DrumPressure.signals.values) title('Drum pressure [kPa]'); ylabel('Pressure [kPa]') xlabel('time [min]') grid on bdclose(mdl)
参考
kalman
| lqry
| findop
| linearize