マルチループ制御システムの調整
この例では、systune
コマンドを使ってカスケード アーキテクチャの内側と外側のループを一緒に調整する方法を説明します。
カスケード式の PID ループ
カスケード制御は、多くの場合、高速な外乱の抑制による滑らかな追従を実現するために使用されます。非常にシンプルなカスケード アーキテクチャには、次のブロック線図に示すように、2 つの制御ループ (内側および外側) が含まれています。内側のループを外側のループよりも高速にして、外乱が外側のループに伝播する前に抑制するのが一般的です (Simulink® は MATLAB® Online ではサポートされていません)。
open_system('rct_cascade')
プラント モデルと帯域幅の要件
この例では、内側のループのプラント G2
は次のようになります。
外側のループのプラント G1
は次のとおりです。
G2 = zpk([],-2,3); G1 = zpk([],[-1 -1 -1],10);
ここでは、内側のループでは PI コントローラーを使用し、外側のループでは PID コントローラーを使用します。外乱の抑制を適切に行うために、外側のループの帯域幅は少なくとも 0.2 rad/s、内側のループの帯域幅はその 10 倍にしなければなりません。
systune による PID コントローラーの調整
Simulink でモデル化された制御システムの場合は、Simulink Control Design™ の slTuner
インターフェイスを使用して調整タスクを設定します。調整可能なブロックをリストし、信号 r
および d2
を対象の入力としてマークし、信号 y1
および y2
を開ループ伝達を測定してループ整形を指定する位置としてマークします。
ST0 = slTuner('rct_cascade',{'C1','C2'}); addPoint(ST0,{'r','d2','y1','y2'})
Simulink モデルの C1
および C2
の現在の値は、showTunable
を使用してクエリできます。Simulink モデルをシミュレーションして確認すると、この制御システムがこれらの初期値に対して不安定であることがわかります。
showTunable(ST0)
Block 1: rct_cascade/C1 = 1 Kp + Ki * --- s with Kp = 0.1, Ki = 0.1 Name: C1 Continuous-time PI controller in parallel form. ----------------------------------- Block 2: rct_cascade/C2 = 1 Kp + Ki * --- s with Kp = 0.1, Ki = 0.1 Name: C2 Continuous-time PI controller in parallel form.
次に、"LoopShape" 要件を使用して、内側と外側のループの目的の帯域幅を指定します。外側のループについては、ターゲットのループ整形として を使用して、ゲイン交差周波数を 0.2 rad/s とする積分動作を適用します。
% Outer loop bandwidth = 0.2 s = tf('s'); Req1 = TuningGoal.LoopShape('y1',0.2/s); % loop transfer measured at y1 Req1.Name = 'Outer Loop';
内側のループについては、 を使用して、外側のループの 10 倍の速さ (より高い帯域幅) にします。内側のループ伝達を制約するために、必ずループ開始点として
y1
を指定して外側のループを開きます。
% Inner loop bandwidth = 2 Req2 = TuningGoal.LoopShape('y2',2/s); % loop transfer measured at y2 Req2.Openings = 'y1'; % with outer loop opened at y1 Req2.Name = 'Inner Loop';
これで、systune
を使用して C1
および C2
の PID ゲインを調整できます。
ST = systune(ST0,[Req1,Req2]);
Final: Soft = 0.859, Hard = -Inf, Iterations = 67
調整後の PID ゲインを表示するには、showTunable
を使用します。
showTunable(ST)
Block 1: rct_cascade/C1 = 1 s Kp + Ki * --- + Kd * -------- s Tf*s+1 with Kp = 0.0521, Ki = 0.0186, Kd = 0.0473, Tf = 0.00696 Name: C1 Continuous-time PIDF controller in parallel form. ----------------------------------- Block 2: rct_cascade/C2 = 1 Kp + Ki * --- s with Kp = 0.721, Ki = 1.23 Name: C2 Continuous-time PI controller in parallel form.
設計の検証
最終値は 1 未満であり、systune
で両方のループ整形要件が正常に満たされたことがわかります。これを確認するために、viewGoal
を使って調整後の制御システム ST
を検査します。
viewGoal([Req1,Req2],ST)
内側と外側のループのゲイン交差周波数が目的の値になっていることに注目してください。設計をさらに詳しく検証するために、ステップ コマンド r およびステップ外乱 d2 に対する調整後の応答をプロットします。
% Response to a step command H = getIOTransfer(ST,'r','y1'); clf, step(H,30), title('Step command')
% Response to a step disturbance H = getIOTransfer(ST,'d2','y1'); step(H,30), title('Step disturbance')
線形解析で満足な結果が得られたら、writeBlockValue
を使用して調整後の PID ゲインを Simulink ブロックに書き戻します。これにより、Simulink でより詳細な検証を実行できるようになります。
writeBlockValue(ST)
MATLAB での同等のワークフロー
制御システムの Simulink モデルがない場合は、プラントの LTI モデルと制御設計ブロックを使用して同じ手順を実行し、調整可能な要素をモデル化することができます。
図 1: カスケード アーキテクチャ
まず、調整可能な PI コントローラーと PID コントローラーのパラメトリック モデルを作成します。
C1 = tunablePID('C1','pid'); C2 = tunablePID('C2','pi');
次に、"解析ポイント" ブロックを使用して、ループ開始位置 y1
および y2
をマークします。
LS1 = AnalysisPoint('y1'); LS2 = AnalysisPoint('y2');
最後に、各フィードバック ループを閉じて、制御システム全体の閉ループ モデル T0
を作成します。その結果は、調整可能な要素 C1
および C2
に依存する一般化状態空間モデルです。
InnerCL = feedback(LS2*G2*C2,1); T0 = feedback(G1*InnerCL*C1,LS1); T0.InputName = 'r'; T0.OutputName = 'y1';
これで、systune
を使用して C1
および C2
の PID ゲインを調整できます。
T = systune(T0,[Req1,Req2]);
Final: Soft = 0.859, Hard = -Inf, Iterations = 118
前と同様、getIOTransfer
を使用して、ステップ コマンド r および位置 y2
に入るステップ外乱に対する調整後の応答を計算し、プロットします。
% Response to a step command H = getIOTransfer(T,'r','y1'); clf, step(H,30), title('Step command')
% Response to a step disturbance H = getIOTransfer(T,'y2','y1'); step(H,30), title('Step disturbance')
また、内側と外側のループの開ループ ゲインをプロットして帯域幅要件を検証することもできます。負のフィードバックの開ループ伝達を計算するための -1 の符号に注目してください。
L1 = getLoopTransfer(T,'y1',-1); % crossover should be at .2 L2 = getLoopTransfer(T,'y2',-1,'y1'); % crossover should be at 2 bodemag(L2,L1,{1e-2,1e2}), grid legend('Inner Loop','Outer Loop')
参考
slTuner
(Simulink Control Design) | systune (slTuner)
(Simulink Control Design)