Main Content

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];
前に調整したルックアップ テーブルについてこの種類の置換を示すもう 1 つの例については、HL-20 の自動操縦の姿勢制御 - SISO 設計を参照してください。

次のモデル部分図は、スケジューリング変数により変化するブロックを置換する必要のある別のシナリオを示しています。スケジューリング変数が alpha で、モデルのどこかで信号 ualpha で除算されると仮定します。

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 次元の不一致を解決することが可能です。あるいは、seriesfeedbackconnect などのコマンドを使って他のモデル演算を行い、適切な置換を作成しなければならない場合もあります。

LPV ブロックのブロック置換

Simulink モデルにあるプラントが LPV System で表されている場合でも、ゲイン スケジュールの調整用に slTuner インターフェイスを作成するときにブロック置換を実行しなければなりません。slTunerLPV System ブロックから線形モデル配列を直接読み取ることはできません。ただし、調整対象の設計点に対応していれば、ブロックに指定された線形モデル配列をブロック置換のために使用することができます。たとえば、モデル配列 PlantArray を指定する LPV System ブロック LPVPlant がプラントであるとします。LPVPlant のブロック置換を次のように構成できます。

BlockSubs = struct('Name','mdl/LPVPlant','Value',PlantArray);

参考

(Simulink Control Design)

関連するトピック