ドキュメンテーション

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

マルチループ制御システムの調整

この例では、systune コマンドを使用してカスケード アーキテクチャの内側と外側のループを一緒に調整する方法を示します。

カスケード式の PID ループ

カスケード制御は、多くの場合、高速な外乱の抑制による滑らかな追従を実現するために使用されます。非常にシンプルなカスケード アーキテクチャには、次のブロック線図に示すように、2 つの制御ループ (内側および外側) が含まれています。内側のループを外側のループよりも高速にして、外乱が外側のループに伝播する前に抑制するのが一般的です。

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.86, Hard = -Inf, Iterations = 70

調整後の PID ゲインを表示するには、showTunable を使用します。

showTunable(ST)
Block 1: rct_cascade/C1 =
 
             1            s    
  Kp + Ki * --- + Kd * --------
             s          Tf*s+1 

  with Kp = 0.0519, Ki = 0.0187, Kd = 0.0471, Tf = 0.0138
 
Name: C1
Continuous-time PIDF controller in parallel form.

-----------------------------------

Block 2: rct_cascade/C2 =
 
             1 
  Kp + Ki * ---
             s 

  with Kp = 0.722, Ki = 1.25
 
Name: C2
Continuous-time PI controller in parallel form.

設計の検証

最終値が 1 未満であり、systune で両方のループ整形要件が満たされたことがわかります。これを確認するために、viewSpec を使用して調整後の制御システム ST を検証します。

viewSpec([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');

次に、"Analysis Point" ブロックを使用して、ループ開始位置 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 = 90

前述のように、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')