Main Content

Simulink での制御システムの調整

この例では、Simulink® でモデル化された制御システムを systune または looptune を使用して自動的に調整する方法を説明します。

エンジン速度の制御

この例では、次のようなエンジン速度制御システムのモデルを使用します。

open_system('rct_engine_speed')

この制御システムは、PID ループ 1 つで構成されており、PID コントローラーのゲインを調整することで、望ましいスピードがステップ変化した場合に適切に応答できるようにしなければなりません。具体的には、応答を 5 秒未満に、オーバーシュートなし (あるいはほとんどなし) で整定させるのが目標です。単一の PID コントローラーの調整には pidtune の方が高速ですが、Simulink の systune ワークフローと looptune ワークフローの初めての導入には、ここでのシンプルな例が適しています。

systune によるコントローラーの調整

slTuner のインターフェイスでは、Simulink でモデル化された制御システム用に systune への便利なゲートウェイが提供されています。このインターフェイスを使用して、Simulink モデルの中で調整可能とするブロックと、開ループまたは閉ループ検証で対象とする信号を指定することができます。rct_engine_speed モデルの slTuner インスタンスを作成し、"PID Controller" ブロック (オレンジで強調表示) を調整可能としてリストします。モデル内の線形解析ポイント (ここでは信号 "Ref" と "Speed") はすべて、調整の対象となるポイントとして自動的に使用可能になります。

ST0 = slTuner('rct_engine_speed','PID Controller');

PID ブロックは Simulink モデルでの値で初期化されます。この値には getBlockValue でアクセスできます。比例ゲインと微分ゲインがゼロに初期化されている点に留意してください。

getBlockValue(ST0,'PID Controller')
ans =
 
        1 
  Ki * ---
        s 

  with Ki = 0.01
 
Name: PID_Controller
Continuous-time I-only controller.

次に、5 秒のターゲット整定時間を取得するためのステップ追従要件を作成します。Simulink モデル内の信号名を使用して基準信号と出力信号を参照し、ターゲット応答を時定数が 1 秒である 1 次応答として指定します。

TrackReq = TuningGoal.StepTracking('Ref','Speed',1);

これで、要件 TrackReq に従って制御システム ST0 を調整できるようになりました。

ST1 = systune(ST0,TrackReq);
Final: Soft = 0.282, Hard = -Inf, Iterations = 65

最終値が 1 に近い値になり、追従要件が満たされたことがわかります。systune からは ST0 によって記述される制御システムの "調整済み" バージョン ST1 が返されます。再度 getBlockValue を使用して、PID ゲインの調整後の値にアクセスします。

getBlockValue(ST1,'PID Controller')
ans =
 
             1            s    
  Kp + Ki * --- + Kd * --------
             s          Tf*s+1 

  with Kp = 0.00217, Ki = 0.00341, Kd = 0.000513, Tf = 1.29e-06
 
Name: PID_Controller
Continuous-time PIDF controller in parallel form.

スピードのステップ コマンドに対する閉ループ応答をシミュレーションで取得するには、次のとおり、スピード コマンド "Ref" から "Speed" までの初期の伝達関数と調整後の伝達関数の出力を取得し、それらのステップ応答をプロットします。

T0 = getIOTransfer(ST0,'Ref','Speed');
T1 = getIOTransfer(ST1,'Ref','Speed');
step(T0,T1)
legend('Initial','Tuned')

looptune によるコントローラーの調整

Simulink でモデル化された制御システムを looptune を使用して調整することもできます。looptune のワークフローは systune のワークフローとよく似ています。唯一異なるのは、looptune では、"制御" 信号と "測定" 信号によって指定されるプラントとコントローラーの境界が認識される必要があるという点です。ループが 1 つの場合、性能は基本的に応答時間によって取得することができます。同じく、開ループの交差周波数でも判断できます。1 次の特性に基づくと、閉ループ応答が 5 秒未満で整定するためには、交差周波数が 1 rad/s を超える必要があります。したがって、0 dB の交差周波数のターゲットとして 1 rad/s を使用して、PID ループを調整することができます。

% Mark the signal "u" as a point of interest
addPoint(ST0,'u')

% Tune the controller parameters
Control = 'u';
Measurement = 'Speed';
wc = 1;
ST1 = looptune(ST0,Control,Measurement,wc);
Final: Peak gain = 0.979, Iterations = 4
Achieved target gain value TargetGain=1.

今回も最終値は 1 に近く、ターゲットの制御帯域幅が達成できたことが示されています。systune と同様に、getIOTransfer を使用して、速度コマンドから実速度への閉ループ応答を計算し、プロットします。結果は、systune で得られたものと極めて類似しています。

T0 = getIOTransfer(ST0,'Ref','Speed');
T1 = getIOTransfer(ST1,'Ref','Speed');
step(T0,T1)
legend('Initial','Tuned')

開ループ解析の実行も可能で、たとえば、プラント入力 u におけるゲイン余裕と位相余裕を計算します。

% Note: -1 because |margin| expects the negative-feedback loop transfer
L = getLoopTransfer(ST1,'u',-1);

margin(L), grid

Simulink での検証

systune または looptune で満足な結果が得られたら、調整したコントローラーのパラメーターを Simulink にアップロードし、非線形モデルでさらに検証することができます。

writeBlockValue(ST1)

この段階で、調整した PID コントローラーを使用してエンジンの応答をシミュレーションできるようになりました。

非線形シミュレーションの結果は、MATLAB® で得られた線形応答にほぼ一致しています。

PID ゲインの制約

調整パラメーターの範囲を制約して不要な解を排除すると便利です。たとえば、PID コントローラーの比例ゲインと微分ゲインを非負になるように強制することがあります。これを行うには、調整ブロックのパラメーター化にアクセスします。

C = getBlockParam(ST0,'PID Controller')
Tunable continuous-time PID controller "PID_Controller" with formula:

             1            s    
  Kp + Ki * --- + Kd * --------
             s          Tf*s+1 

and tunable parameters Kp, Ki, Kd, Tf.

Type "pid(C)" to see the current value.

調整可能なパラメーター Kp および Kd の "最小" 値を 0 に設定します。

C.Kp.Minimum = 0;
C.Kd.Minimum = 0;

最後に、修正されたパラメーター化を調整ブロックに関連付けます。

setBlockParam(ST0,'PID Controller',C)

PID ゲインを再調節して比例ゲインと微分ゲインが確かに非負になっていることを検証します。

ST1 = looptune(ST0,Control,Measurement,wc);

showTunable(ST1)
Final: Peak gain = 0.971, Iterations = 4
Achieved target gain value TargetGain=1.

Block 1: rct_engine_speed/PID Controller =
 
             1            s    
  Kp + Ki * --- + Kd * --------
             s          Tf*s+1 

  with Kp = 0.000899, Ki = 0.00252, Kd = 0.000146, Tf = 0.01
 
Name: PID_Controller
Continuous-time PIDF controller in parallel form.

PI コントローラーと PID コントローラーの比較

調整後の PID ゲインを詳しく検査すると、微分項の寄与は微小であることがわかります。よりシンプルな PI コントローラーを代わりに使用することが考えられます。そのためには、次のように "PID Controller" ブロックの既定のパラメーター化をオーバーライドします。

setBlockParam(ST0,'PID Controller',tunablePID('C','pi'))

これで、"PID Controller" ブロックを単なる PI コントローラーとしてパラメーター化するように指定されました。次に、このシンプルなコントローラーに対して制御システムを再調整します。

ST2 = looptune(ST0,Control,Measurement,wc);
Final: Peak gain = 0.95, Iterations = 4
Achieved target gain value TargetGain=1.

今回も最終値は 1 未満になっており、成功したことが示されています。以下に、この閉ループ応答と以前の応答を比較します。

T2 = getIOTransfer(ST2,'Ref','Speed');
step(T0,T1,T2,'r--')
legend('Initial','PID','PI')

この使用目的の場合、PI コントローラーで十分であることがわかります。

参考

(Simulink Control Design) | (Simulink Control Design) |

関連するトピック