このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
slTuner
インターフェイスでの複数の設計点
ゲイン スケジュール制御システムを調整する場合、設計点であるさまざまな操作条件に対応する LTI モデルの配列に Simulink® モデルを線形化しなければなりません。したがって、ゲイン スケジュール コントローラー調整のプラント モデルの説明に従って線形プラント モデル群を取得した後、Simulink モデルの slTuner
インターフェイスに関連付けなければなりません。そのためには、ブロック置換を使用して、slTuner
がモデルのプラント サブシステムを線形モデルの配列に置き換えるようにします。このプロセスは、slTuner
インターフェイス内に調整可能な閉ループ モデル群を構築します。
プラントのブロック置換
設計グリッドの各操作点で取得した線形プラント モデルの配列があると仮定します。最も単純なケースでは、以下の条件が満たされます。
配列内の線形モデルはモデル内のプラント サブシステムに正確に対応する。
調整する要素を除き、モデル内にスケジューリング変数によって変化するものがない。
プラント サブシステム G
と、設計点のグリッドでのプラントを表す線形モデル配列 Garr
を含む Simulink モデル mdl
の場合、以下のコマンドで slTuner
インターフェイスが作成されます。
BlockSubs = struct('Name','mdl/G','Value',Garr); st0 = slTuner('mdl',{'Kp','Ki'},BlockSubs);
st0
は、それぞれが設計点で線形化され、G
に対応する線形プラントが挿入された、閉ループ線形モデル群を含んでいます。'Kp'
と 'Ki'
がルックアップ テーブルなどの調整対象となるゲイン スケジュールである場合、ゲイン スケジュールのパラメーター化の説明に従って調整可能なゲイン曲面でこれらをパラメーター化し、調整することができます。
複数のブロック置換
その他のケースでは、線形化されたプラント モデル配列が Simulink モデル内のプラント サブシステムに正確に対応しないことがあります。あるいは、操作条件によって変化するモデルの他の部分を置換しなければならない場合もあります。その場合、正しいブロック置換を構築するにはより慎重な作業が必要です。以下の節では、そのようないくつかのケースについて説明します。
たとえば、次の図のモデルを考えてみます。
このモデルには、比例のみのゲイン スケジュール コントローラーをもつ内側のループがあります。コントローラーはルックアップ テーブル Kp_in
と Product ブロック prod
で表されます。外側のループには、ゲイン スケジュールの比例および積分係数をもつ PI コントローラーがあります。これはルックアップ テーブル Kp
および Ki
で表されます。すべてのゲイン スケジュールが同じスケジューリング変数 alpha
に依存します。
外側のループを開いた状態で内側のループのゲイン スケジュール Kp_in
を調整すると仮定します。そのためには、入力 u
から出力 {q,alpha}
への線形モデルの配列 G_in
を取得します。このモデル配列の I/O 次元は、G
のブロック置換に使用するには適していません。したがって、G_in
を追加の出力次元で "パディング" しなければなりません。
Garr = [0; G_in]; BlockSubs1 = struct('Name','mdl/G','Value',Garr);
さらに、Varying PID Controller ブロックをすべての操作条件でゼロに線形化されるシステムに置換して、外側のループのすべての影響を除去できます。このブロックには 3 つの入力があるので、3 入力 1 出力のゼロのシステムで置き換えます。
BlockSubs2 = struct('Name','mdl/Varying PID Controller','Value',ss([0 0 0]));
これらのブロック置換を使用して、以下のコマンドで内側のループのゲイン スケジュールの調整に使用できる slTuner
インターフェイスを作成します。
st0 = slTuner('mdl','Kp_in'); st0.BlockSubstitutions = [BlockSubs1; BlockSubs2];
プラント自体以外にいくつかの要素がブロック置換で置き換えられるもう 1 つのケースについては、HL-20 の自動操縦における角速度の制御の例を参照してください。
スケジューリング変数に依存するブロックの置換
次に、内側のループのゲイン スケジュールが調整済みで、各設計点 (プラントを線形化した alpha
の各値) に対応する Kp_in
の値からなる配列 Kp_in_tuned
を既に取得してあると仮定します。さらに、調整後の内側のループを閉じて線形化された、u
から {y,q,alpha}
への完全なプラントである新しい Garr
があるとします。外側のループのゲイン スケジュールを調整するには、Product ブロックを配列 Kp_in_tuned
で置換しなければなりません。ルックアップ テーブル Kp_in
ではなく、インジェクション ポイントである Product ブロック prod
を置換するという点に注意してください。Product ブロックの置換により、これが実質的に可変ゲインに変換されます。また、Product ブロックの最初の入力をゼロに設定して、ルックアップ テーブル Kp_in
の影響を除去しなければなりません。
prodsub = [0 ss(Kp_in_tuned)]; BlockSubs1 = struct('Name','mdl/prod','Value',prodsub); BlockSubs2 = struct('Name','mdl/G','Value',Garr); st0 = slTuner('mdl',{'Kp','Ki'}); st0.BlockSubstitutions = [BlockSubs1; BlockSubs2];
次のモデル部分図は、スケジューリング変数により変化するブロックを置換する必要のある別のシナリオを示しています。スケジューリング変数が alpha
で、モデルのどこかで信号 u
が alpha
で除算されると仮定します。
slTuner
が設計グリッドのすべての alpha
値で必ずこのブロックを正しく線形化するようにするには、alpha
の値ごとに 1 つの線形モデルをもつ配列に置換しなければなりません。このブロックは、u
を 1/alpha
のゲインを通して送ることと等価です。
したがって、slTuner
インターフェイスで次のブロック置換を使用できます。ここで alphagrid
は設計点での alpha
値の配列です。
divsub = ss[(1/alphagrid), 0] BlockSubs = struct('Name','mdl/div-by-alpha','Value',divsub); st0.BlockSubstitutions = [st0.BlockSubstitutions; BlockSubs]
モデル配列 divsub
の各エントリは、その最初の入力を alphagrid
の対応するエントリで除算して、2 番目の入力をゼロに設定します。したがって、この置換で目的の結果 y = u/alpha
が得られます。
ブロックとその置換の不一致の解決
モデルの置換対象となる部分を線形モデル配列で正確に置き換えることができない場合もあります。たとえば、次の図にある 3 入力、1 出力のサブシステムを考えてみます。
G
に対応する、線形化されたモデルの配列 Garr
があるとします。次のように 3 つの入力を平均した場合の効果を再現する置換モデルを構築することで、サブシステム G_full
全体にブロック置換を設定できます。
Gsub = Garr*[1/3 1/3 1/3]; BlockSubs = struct('Name','mdl/G_full','Value',Gsub);
場合によっては複数のブロック置換で示すように、入力や出力をゼロでパディングして I/O 次元の不一致を解決することが可能です。あるいは、series
、feedback
、connect
などのコマンドを使って他のモデル演算を行い、適切な置換を作成しなければならない場合もあります。
LPV ブロックのブロック置換
Simulink モデルにあるプラントが LPV System で表されている場合でも、ゲイン スケジュールの調整用に slTuner
インターフェイスを作成するときにブロック置換を実行しなければなりません。slTuner
は LPV System ブロックから線形モデル配列を直接読み取ることはできません。ただし、調整対象の設計点に対応していれば、ブロックに指定された線形モデル配列をブロック置換のために使用することができます。たとえば、モデル配列 PlantArray
を指定する LPV System ブロック LPVPlant
がプラントであるとします。LPVPlant
のブロック置換を次のように構成できます。
BlockSubs = struct('Name','mdl/LPVPlant','Value',PlantArray);