LQG レギュレーター: 圧延機のケース スタディ
設計のケース スタディの概要
このケース スタディでは、プロセス制御アプリケーションにおける LQG 設計ツールの使用方法を示します。目標は、熱間圧延機で製作するビームの水平、垂直方向の厚さを調整することです。この例は、[1] から採用したものです。プラント モデル全体は MIMO であり、例では、各軸に対する別々の SISO 設計と比較した場合の MIMO LQG 設計の利点を示しています。次のように入力します。
milldemo
これで、このデモを対話形式で実行できます。
プロセスと外乱モデル
圧延機は、高温 (再結晶温度以上) の矩形ビーム成形に使用します。目的とする成形後の形状を下に示します。
この形状は、油圧アクチュエータで位置を調整する、2 つの組み合わせの圧延シリンダー (各軸に 1 個) で圧延加工されます。2 つのシリンダーの隙間のことを "圧延ギャップ" といいます。
目的は、x- 軸および y- 軸方向のビームの厚さを品質保証の許容誤差内に維持することです。出力の厚さの変動要因としては、次のものがあります。
入力ビームの厚さ/硬さの違い
圧延シリンダーの偏心
これらの外乱の影響を抑えるには、フィードバック制御が必要です。圧延ギャップは、圧延機スタンドの近くでは測定できないため、フィードバック用としてその代わりに圧延力を使用します。
入力の厚さの外乱は、ホワイト ノイズで励起されるロー パス フィルターとしてモデル化します。偏心外乱は、ほぼ周期的で、その周波数は圧延速度の関数です。この外乱に対する合理的モデルは、ホワイト ノイズで励起される 2 次のバンドパス フィルターです。
これにより、圧延プロセスの各軸に対して、次の一般化モデルが導かれます。
測定した圧延力変動 f は、油圧アクチュエータによって生み出される増分力と、偏心および入力の厚さの変動による外乱力との組み合わせです。次の点に注意してください。
H(s)、Fe(s) および Fi(s) の出力は、各構成要素によって生み出される増分力です。
油圧または偏心力の増加は、出力の厚さギャップ δ を減少させます。
入力の厚さの増加は、このギャップを増加させます。
各軸に対するモデル データを以下に要約します。
X 軸に対するモデル データ
Y 軸に対するモデル データ
X 軸に対する LQG 設計
最初の近似として、x 軸と y 軸間の相互干渉を無視し、各軸を独立に扱います。つまり、各軸に対して、1 つの SISO LQG レギュレーターを設計します。設計目的は、偏心と入力外乱による厚さの変動 δx と δy を抑えることです。
x 軸から開始します。まず、モデル構成要素を伝達関数オブジェクトとして設定します。
% Hydraulic actuator (with input "u-x") Hx = tf(2.4e8,[1 72 90^2],'inputname','u-x') % Input thickness/hardness disturbance model Fix = tf(1e4,[1 0.05],'inputn','w-ix') % Rolling eccentricity model Fex = tf([3e4 0],[1 0.125 6^2],'inputn','w-ex') % Gain from force to thickness gap gx = 1e-6;
次に、プロセスと外乱モデルに示す開ループ モデルを作成します。このために関数 connect
を使用できますが、このモデルは基本的な関数 append
または series
を使用する接続で作成する方が簡単です。
% I/O map from inputs to forces f1 and f2 Px = append([ss(Hx) Fex],Fix) % Add static gain from f1,f2 to outputs "x-gap" and "x-force" Px = [-gx gx;1 1] * Px % Give names to the outputs: set(Px,'outputn',{'x-gap' 'x-force'})
メモ
状態空間の最小実現を得るには、伝達関数モデルを接続する前に必ず状態空間に変換します。伝達関数の接続後に状態空間に変換すると、非最小状態空間モデルが作成される場合があります。
ここで、変数 Px
は、入力名と出力名を含む開ループ状態空間モデルを含んでいます。
Px.inputname ans = 'u-x' 'w-ex' 'w-ix' Px.outputname ans = 'x-gap' 'x-force'
第 2 出力 'x-force'
は、圧延力の測定値です。LQG レギュレーターは、この測定値を使用して油圧アクチュエータを駆動し、外乱による厚さの変動 δx を抑えます。
LQG 設計には、2 つのステップが含まれます。
次の形式の LQ 性能測定を最小にする全状態フィードバック ゲインを設計します。
力の測定値
'x-force'
を使用して状態ベクトルを推定するカルマン フィルターを設計します。
性能規範 J(ux) によって、低周波数と高周波数が同等に制限されます。低周波数変動が最大の関心事のため、ローパス フィルター 30/(s + 30) を使用して、δx の高周波成分を除去し、LQ 評価関数にフィルター処理した値を使用します。
lpf = tf(30,[1 30]) % Connect low-pass filter to first output of Px Pxdes = append(lpf,1) * Px set(Pxdes,'outputn',{'x-gap*' 'x-force'}) % Design the state-feedback gain using LQRY and q=1, r=1e-4 kx = lqry(Pxdes(1,1),1,1e-4)
メモ
関数 lqry
では、すべての入力が指令値であり、すべての出力が測定値であると仮定されます。ここで、指令値 'u-x'
および測定値 'x-gap*'
(フィルター処理したギャップ) は、関数 Pxdes
の第 1 入力と第 1 出力です。したがって、構文 Pxdes(1,1)
を使用して、'u-x'
と 'x-gap*'
の I/O 関係のみを設定します。
次に、関数 kalman
を使用して、カルマン推定器を設計します。プロセス ノイズ
は、構造上単位共分散を含んでいます。測定ノイズ共分散を 1,000 に設定して、高周波数ゲインを制限し、推定器設計用に測定した出力 'x-force'
のみを観測量とします。
estx = kalman(Pxdes(2,:),eye(2),1000)
最後に、状態フィードバック ゲイン kx
と状態推定器 estx
を接続して、LQG レギュレーターを構成します。
Regx = lqgreg(estx,kx)
これで、x 軸用の LQG 設計は完了です。
ここで、0.1 ~ 1,000 ラジアン/秒の範囲でレギュレーターのボード応答を確認します。
h = bodeplot(Regx,{0.1 1000}) setoptions(h,'PhaseMatching','on')
位相応答については、興味深い物理解釈ができます。まず、入力の厚さの増加について考えます。この低周波数外乱は、出力の厚さと圧延力のいずれも高めます。レギュレーター位相は、低周波数で約 0 度なので、油圧力を増加することによって、フィードバック ループは適切に反応し、厚さの増加を相殺します。ここで、偏心の影響について考えます。偏心は、圧延ギャップ (圧延シリンダー間のギャップ) の変動の原因となります。圧延ギャップが最小のとき、圧延力は増加し、ビームの厚さは減少します。この場合には、油圧力を減少させて (負の力のフィードバック)、目的の厚さに戻さなければなりません。これは、まさに偏心外乱 (6 ラジアン/秒) の固有振動数近辺で位相が -180o まで遅れるときに、LQG レギュレーターが実行することに他なりません。
次に、外乱から厚さギャップへの開ループ応答と閉ループ応答を比較します。関数 feedback
を使用してループを閉じます。フィードバック接続の設定を容易にするには、プラント Px
とレギュレーター Regx
の I/O 名を参照します。
Px.inputname ans = 'u-x' 'w-ex' 'w-ix' Regx.outputname ans = 'u-x' Px.outputname ans = 'x-gap' 'x-force' Regx.inputname ans = 'x-force'
このことは、Px
の第 1 入力と第 2 出力をレギュレーターに接続しなければならないことを意味します。
clx = feedback(Px,Regx,1,2,+1) % Note: +1 for positive feedback
これで、外乱から厚さギャップへの開ループ ボード線図と閉ループ ボード応答の比較を行う準備ができました。
h = bodeplot(Px(1,2:3),'--',clx(1,2:3),'-',{0.1 100}) setoptions(h,'PhaseMatching','on')
破線は、開ループ応答を示しています。偏心からギャップへの応答のピーク ゲインと入力の厚さからギャップへの応答の低周波数ゲインが、約 20 dB 減少したことに注目してください。
最後に、lsim
を使用してホワイト ノイズ入力 wex と wix に対する開ループおよび閉ループの時間応答をシミュレーションします。シミュレーションのサンプル時間として dt=0.01
を選択し、このサンプリング レートに対する等価な離散ホワイト ノイズ入力を導出します。
dt = 0.01 t = 0:dt:50 % time samples % Generate unit-covariance driving noise wx = [w-ex;w-ix]. % Equivalent discrete covariance is 1/dt wx = sqrt(1/dt) * randn(2,length(t)) lsim(Px(1,2:3),':',clx(1,2:3),'-',wx,t)
表示されるプロットを右クリックし、[入力の表示] を選択して、入力の表示をオフにします。
点線は、開ループ応答に対応します。このシミュレーションでは、LQG レギュレーターにより、厚さの変動がピークの 4 分の 1 に抑えられます。
Y 軸に対する LQG 設計
y 軸に対する LQG 設計 (y の厚さのレギュレーション) は、x 軸に対するレギュレーションとまったく同じ手順に従います。
% Specify model components Hy = tf(7.8e8,[1 71 88^2],'inputn','u-y') Fiy = tf(2e4,[1 0.05],'inputn','w-iy') Fey = tf([1e5 0],[1 0.19 9.4^2],'inputn','w-ey') gy = 0.5e-6 % force-to-gap gain % Build open-loop model Py = append([ss(Hy) Fey],Fiy) Py = [-gy gy;1 1] * Py set(Py,'outputn',{'y-gap' 'y-force'}) % State-feedback gain design Pydes = append(lpf,1) * Py % Add low-freq. weigthing set(Pydes,'outputn',{'y-gap*' 'y-force'}) ky = lqry(Pydes(1,1),1,1e-4) % Kalman estimator design esty = kalman(Pydes(2,:),eye(2),1e3) % Form SISO LQG regulator for y-axis and close the loop Regy = lqgreg(esty,ky) cly = feedback(Py,Regy,1,2,+1)
ホワイト ノイズ入力外乱に対する開ループ応答と閉ループ応答を比較します。
dt = 0.01 t = 0:dt:50 wy = sqrt(1/dt) * randn(2,length(t)) lsim(Py(1,2:3),':',cly(1,2:3),'-',wy,t)
表示されるプロットを右クリックし、[入力の表示] を選択して、入力の表示をオフにします。
点線は、開ループ応答に対応します。シミュレーション結果は、x 軸に対する結果に匹敵します。
軸同士の相互干渉
x/y の厚さのレギュレーションは、本質的に MIMO 問題に属します。これまで各軸を独立して扱い、一度に 1 つの SISO ループを閉じました。この設計は、2 つの軸がまったく切り離されている場合に限り有効です。ただし、圧延機プロセスには、軸間にある程度の相互干渉が見られます。物理的に、x 軸上の油圧力の増加により材料は圧縮され、それによって、y シリンダー上の反発力が増加します。その結果、y 軸方向の厚さが増加し、その分 y 軸上の油圧力が (相対的に) 減少します。
次の図は、軸同士の干渉を示します。
したがって、厚さのギャップと圧延力は、x 軸と y 軸モデルの出力 に次のように関連します。
相互干渉を考慮した場合は、前の分離した LQG 設計がどのようになるかを確認します。上に示す、2 軸モデルを作成するために、x 軸と y 軸に対して、モデル Px
と Py
を並べます。
P = append(Px,Py)
便宜上、入力と出力を並べ替えて指令値と厚さギャップが最初に来るようにします。
P = P([1 3 2 4],[1 4 2 3 5 6]) P.outputname ans = 'x-gap' 'y-gap' 'x-force' 'y-force'
最後に、出力と直列に相互干渉行列を配置します。
gxy = 0.1; gyx = 0.4; CCmat = [eye(2) [0 gyx*gx;gxy*gy 0] ; zeros(2) [1 -gyx;-gxy 1]] Pc = CCmat * P Pc.outputname = P.outputname
また、閉ループ応答をシミュレーションするために、以下のように閉ループ モデルを作成します。
feedin = 1:2 % first two inputs of Pc are the commands feedout = 3:4 % last two outputs of Pc are the measurements cl = feedback(Pc,append(Regx,Regy),feedin,feedout,+1)
これで、励起ホワイト ノイズ wx
(x 軸に対して) と wy
(y 軸に対して) の開ループ応答と閉ループ応答をシミュレーションする準備ができました。
wxy = [wx ; wy] lsim(Pc(1:2,3:6),':',cl(1:2,3:6),'-',wxy,t)
表示されるプロットを右クリックし、[入力の表示] を選択して、入力の表示をオフにします。
応答は x 軸方向に制御性能の重大な劣化 (ピークの厚さの変動が相互干渉なしのシミュレーションの約 4 倍) を示しています。したがって、それぞれに 1 つのループで設計することは、このレベルの相互干渉には不適切であり、干渉の影響に対処するには軸を連成させた MIMO 設計を実行しなければなりません。
MIMO LQG 設計
軸同士の相互干渉で導いた完全な 2 軸状態空間モデル Pc
から開始します。モデルの入力と出力は、次のとおりです。
Pc.inputname ans = 'u-x' 'u-y' 'w-ex' 'w-ix' 'w_ey' 'w_iy' P.outputname ans = 'x-gap' 'y-gap' 'x-force' 'y-force'
前と同様、'x-gap'
と 'y-gap'
の出力に直列にローパス フィルターを接続し、低周波数の厚さ変動のみを抑制します。
Pdes = append(lpf,lpf,eye(2)) * Pc Pdes.outputn = Pc.outputn
次に、前と同様、LQ ゲインと状態推定器を設計します (ここには、2 つの指令値と 2 つの測定値があります)。
k = lqry(Pdes(1:2,1:2),eye(2),1e-4*eye(2)) % LQ gain est = kalman(Pdes(3:4,:),eye(4),1e3*eye(2)) % Kalman estimator RegMIMO = lqgreg(est,k) % form MIMO LQG regulator
生成される LQG レギュレーター RegMIMO
には、2 つの入力と 2 つの出力があります。
RegMIMO.inputname ans = 'x-force' 'y-force' RegMIMO.outputname ans = 'u-x' 'u-y'
その特異値応答 (主ゲイン) をプロットします。
sigma(RegMIMO)
次に、(フィードバックに対する MIMO LQG レギュレーターを使用して) ホワイト ノイズ入力に対する開ループ時間応答と閉ループ時間応答をプロットします。
% Form the closed-loop model cl = feedback(Pc,RegMIMO,1:2,3:4,+1); % Simulate with lsim using same noise inputs lsim(Pc(1:2,3:6),':',cl(1:2,3:6),'-',wxy,t)
表示されるプロットを右クリックし、[入力の表示] を選択して、入力の表示をオフにします。
MIMO 設計は、各軸に対する個別の SISO 設計より明らかに強化されています。特に、x/y 軸の厚さ変動のレベルは、分離したケースで得られるレベルに匹敵するものです。この例は、多変数システムに対する MIMO 設計の利点を示しています。
参照
[1] Grimble, M.J., Robust Industrial Control: Optimal Design Approach for Polynomial Systems, Prentice Hall, 1994, p. 261 and pp. 443-456.