ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

計算遅延とサンプリング効果のモデル化

この例では、Simulink Control Design を使用して計算遅延とサンプリング効果をモデル化する方法を説明します。

はじめに

計算遅延とサンプリング効果は、制御システムの性能に大きな影響を与える可能性があります。通常、これらの要素を考慮しなければ、システムの閉ループ応答は、振動して不安定になります。したがって、制御システムをモデル化する場合、計算遅延とサンプリング効果を考えて、閉ループ システムを正確に設計してシミュレートする必要があります。

計算遅延とサンプリングの効果を使用して、補償器を設計する方法は 2 つあります。1 つ目は、離散領域でコントローラーを設計し、プラントを離散化することでサンプリングの効果を得る方法です。2 つ目は、連続領域でコントローラーを設計する方法です。後者の方法が便利なときもありますが、この場合は、計算遅延とサンプリングの効果を考慮する必要があります。この例では、両方の方法を適用し、Simulink Control Design を使用して制御システムを再設計します。

離散コントローラーと連続コントローラーを使用したシミュレーション

次の例のモデルでは、当初の補償器に「単ループのフィードバック/プレフィルターの設計」の例における補償器からの次のゲインがあります。

         P = 0.0018222
         I = 0.0052662

最初のモデルには、制御システムの離散的実装があります。

mdl = 'scdspeed_compdelay';
open_system(mdl);

このモデルでは、scdspeed_compdelay/Computational Delay ブロックは計算遅延の効果をモデル化します。遅延は、コントローラーのサンプル時間に等しく、これは最悪の場合です。ゼロ次ホールド ブロック scdspeed_compdelay/Zero-Order Hold は、システムの応答に対するサンプリングの効果をモデル化します。最後に、速度コントローラー (PID Controller ブロックを使用して実現) は、前進オイラー サンプリング法を使用して離散化されます。

サンプリングの効果は、システムの応答をシミュレートすることで確認できます。

最初に、コントローラーを Ts = 0.1 で離散化します。

Ts = 0.1;
sim(mdl);
T2 = simout.time;
Y2 = simout.signals.values;

次に、コントローラーを増加したサンプル時間 Ts = 0.25 秒で離散化します。

Ts = 0.25;
sim(mdl);
T3 = simout.time;
Y3 = simout.signals.values;

2 つ目のモデルは、連続モデルです。

mdl_continuous = 'scdspeed_contcomp';
open_system(mdl_continuous);

連続モデルの応答をシミュレートします。

sim(mdl_continuous);
T1 = simout.time;
Y1 = simout.signals.values;

離散モデルと連続モデルの両方のシミュレーションをプロットします。応答は、サンプル時間が増加するとより振動するようになることに注意してください。

plot(T1,Y1,'k',T2,Y2,'r',T3,Y3,'g')
xlabel('Time (sec.)')
ylabel('Engine Speed Response');
legend('Continuous Controller','Ts = 0.1','Ts = 0.25');
grid

離散領域での補償器の設計

一番遅いサンプル時間 (Ts = 0.25) を使用して、閉ループ システムの振動効果を取り除くには、補償器を再設計する必要があります。最初に、プラントの離散化したものを使用して再設計します。「単ループのフィードバック/プレフィルターの設計」の例と同様の方法で補償器を再設計できます。調整した補償器には、次のゲインがあります。

         P = 0.00066155
         I = 0.0019118795
set_param('scdspeed_compdelay/PID Controller','P','0.00066155');
set_param('scdspeed_compdelay/PID Controller','I','0.0019118795');

結果の閉ループ システムをサンプル時間 Ts = 0.25 でシミュレートします。これらの結果は、この例の後の手順で調べます。

Ts = 0.25;
sim(mdl);
Td = simout.time;
Yd = simout.signals.values;

遅延とサンプリング連続時間領域の説明

2 つ目の方法として、単位遅延とゼロ次ホールドの連続等価を使用して、コントローラーを再設計します。

ゼロ次ホールドのダイナミクス

$$ZOH(s) = \frac{1-e^{-sT_s}}{sT_s}$$

をブロック scdspeed_compdelay/Zero-Order Hold を右クリックして設定し、[線形解析]、[線形化を指定] を選択します。ゼロ次ホールドのダイナミクスを指定する次のブロック ダイアログが表示されます。

また、連続表現を使用して、線形化をゼロ次ホールド scdspeed_compdelay/Zero-Order Hold として指定します。次のコードは、これらの仕様を指定ダイアログに入れるのと同じです。

zohblk = 'scdspeed_compdelay/Zero-Order Hold';
set_param(zohblk,'SCDEnableBlockLinearizationSpecification','on');
rep = struct('Specification','(1-ss(1,''InputDelay'',Ts))*ss(0,1,1,0)/Ts',...
             'Type','Expression',...
             'ParameterNames','',...
             'ParameterValues','');
set_param(zohblk,'SCDBlockLinearizationSpecification',rep);

連続転送遅延を使用して、遅延ブロック scdspeed_compdelay/Computational Delay の線形化を指定します。

$$DELAY(s) = e^{-sT_s}$$

次のコマンドを使用して、ブロックの線形化を指定します。

delayblk = 'scdspeed_compdelay/Computational Delay';
set_param(delayblk,'SCDEnableBlockLinearizationSpecification','on');
rep = struct('Specification','ss(1,''InputDelay'',Ts)',...
             'Type','Expression',...
             'ParameterNames','',...
             'ParameterValues','');
set_param(delayblk,'SCDBlockLinearizationSpecification',rep);

コントローラー設計の解析は、連続領域に残ります。次に、Ts = 0.1 および 0.25 の遅延を使用して、モデルを線形化します。まず、線形化 I/O ポイントを設定します。

io(1) = linio('scdspeed_compdelay/PID Controller',1,'input');
io(2) = linio('scdspeed_compdelay/Zero-Order Hold',1,'openoutput');

モデルを Ts = 0.1 で線形化します。

Ts = 0.1;
sys2 = linearize(mdl,io);

モデルを Ts = 0.25 で線形化します。

Ts = 0.25;
sys3 = linearize(mdl,io);

最後に、サンプリングおよび計算遅延の効果を使用しないで、モデルを線形化します。

io(1) = linio('scdspeed_contcomp/PID Controller',1,'input');
io(2) = linio('scdspeed_contcomp/rad//s to rpm',1,'openoutput');
sys1 = linearize(mdl_continuous,io);

エンジンの線形モデルを使用すると、周波数応答に対する計算遅延の効果を調べることができます。この場合、システムの位相応答は、サンプリングによって導入された遅延により大幅に減少します。

p = bodeoptions('cstprefs');
p.Grid = 'on';
p.PhaseMatching = 'on';
bodeplot(sys1,'k',sys2,'r',sys3,'g', {1e-2,1e2},p);
legend('Continuous Model','Ts = 0.1','Ts = 0.25','Location','SouthWest');

一番遅いサンプル時間でモデルを使用して、「単ループのフィードバック/プレフィルターの設計」の例の手法で補償器を再設計します。これにより、次の PI ゲインが得られます。

set_param('scdspeed_compdelay/PID Controller','P','0.00065912');
set_param('scdspeed_compdelay/PID Controller','I','0.001898342');

結果の閉ループ システムをサンプル時間 Ts = 0.25 でシミュレートします。

sim(mdl);
Tc = simout.time;
Yc = simout.signals.values;

応答の比較

設計の応答をプロットします。両方の方法を使用して制御システムを再設計すると、同様のコントローラーが得られます。この例では、計算遅延と離散化の効果を示します。これらの効果により、システムの安定余裕は減少しますが、制御システムを適切にモデル化すると、目的の閉ループ動作を実現できます。

plot(T1,Y1,'k',T3,Y3,'b',Td,Yd,'m',Tc,Yc,'r')
xlabel('Time (sec.)')
ylabel('Engine Speed Response');
h = legend('cont. compensator (orig)','disc. compensator (orig)', ...
    'disc. compensator (disc. redesign)',...
    'disc. compensator (cont. redesign)',...
    'Location','SouthEast');
grid

bdclose('scdspeed_contcomp')
bdclose('scdspeed_compdelay')

この情報は役に立ちましたか?