このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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 コントローラーで十分であることがわかります。
参考
systune (slTuner)
| slTuner
| TuningGoal.Tracking