Main Content

デジタル モーション制御システムの調整

この例では、Control System Toolbox™ を使用して、デジタル モーション制御システムを調整する方法について説明します。

モーション制御システム

考慮するモーション システムを次に示します。

図 1: デジタル モーション制御ハードウェア

このデバイスは生産機械の一部で、ある角度位置から別の角度位置へ負荷 (グリッパー、工具、ノズル、想像できるその他すべてのもの) を動かし、それを元に戻すために使用されます。このタスクは、各製品または一連の製品を作成するために完了する必要がある "生産サイクル" の一部です。

デジタル コントローラーを調整して、精度や製品の品質を低下させずに機械の生産速度を最大化しなければなりません。これを行うには、最初に慣性とフレキシブル シャフトの 4 次モデルを使用して Simulink® で制御システムをモデル化します。

open_system('rct_dmc')

"Tunable Digital Controller" は、リード/ラグ コントローラーと直列のゲインで構成されています。

図 2: デジタル コントローラー

調整は、プラントの 350 rad/s 付近に柔軟なモードがあることで複雑になっています。

G = linearize('rct_dmc','rct_dmc/Plant Model');
bode(G,{10,1e4}), grid

補償器の調整

角度位置のステップ コマンドに対して、最小のオーバーシュートで 0.5 秒の応答時間を求めています。これは、約 5 rad/s のターゲット帯域幅に相当します。looptune コマンドを使うと、この適用例のような固定構造補償器を簡単に調整できます。looptune を使用するには、まず slTuner インターフェイスをインスタンス化して Simulink から制御構造を自動的に取得します。対象の信号が Simulink モデルで既に線形解析ポイントとしてマークされていることに注意してください。

ST0 = slTuner('rct_dmc',{'Gain','Leadlag'});

次に、looptune を使用して、5 rad/s のターゲット ゲイン交差周波数で補償器パラメーターを調整します。

Measurement = 'Measured Position';  % controller input
Control = 'Leadlag';                % controller output
ST1 = looptune(ST0,Control,Measurement,5);
Final: Peak gain = 0.979, Iterations = 19
Achieved target gain value TargetGain=1.

最終的な値が 1 を下回るまたは 1 に近い場合、成功を示します。ゲインおよびリード/ラグ フィルターの調整後の値を検査します。

showTunable(ST1)
Block 1: rct_dmc/Tunable Digital Controller/Gain =
 
  D = 
              u1
   y1  1.869e-05
 
Name: Gain
Static gain.

-----------------------------------

Block 2: rct_dmc/Tunable Digital Controller/Leadlag =
 
  3.855 s + 6.322
  ---------------
     s + 13.35
 
Name: Leadlag
Continuous-time transfer function.

設計の検証

設計を検証するには、slTuner インターフェイスを使用して対象の閉ループ伝達関数にすばやくアクセスし、調整前と調整後の応答を比較します。

T0 = getIOTransfer(ST0,'Reference','Measured Position');
T1 = getIOTransfer(ST1,'Reference','Measured Position');
step(T0,T1), grid
legend('Original','Tuned')

調整後の応答はオーバーシュートが大幅に削減され、応答時間要件を満たしています。ただし、これらのシミュレーションは連続時間進み/遅れ補償器 (looptune は連続時間で動作) を使用して取得されるため、進み/遅れ補償器のデジタル実装を使用して Simulink でさらに設計を検証する必要があります。writeBlockValue を使用して調整後の値を Simulink モデルに適用し、進み/遅れ補償器を Simulink で指定されたレートに自動的に離散化します。

writeBlockValue(ST1)

これで、デジタル コントローラーで連続時間プラントの応答をシミュレーションできます。

sim('rct_dmc');  % angular position logged in "yout" variable
t = yout.time;
y = yout.signals.values;
step(T1), hold, plot(t,y,'r--')
legend('Continuous','Hybrid (Simulink)')
Current plot held

シミュレーションはほぼ一致し、デジタル リード/ラグの係数は Simulink で "Leadlag" ブロックから読み取ることができます。

追加のノッチ フィルターの調整

次に、制御帯域幅を 5 rad/s から 50 rad/s へ増やしてみます。350 rad/s 付近のプラントの共振により、進み/遅れ補償器は、適切な安定余裕と小さなオーバーシュートを実現するには不十分になりました。1 つの修正方法として、図 3 に示すようにノッチ フィルターを追加します。

図 3: ノッチ フィルターを含むデジタル コントローラー

この変更された制御アーキテクチャを調整するには、3 つの調整可能なブロックをもつ slTuner インスタンスを作成します。

ST0 = slTuner('rct_dmcNotch',{'Gain','Leadlag','Notch'});

既定では、"Notch" ブロックは 2 次伝達関数としてパラメーター化されます。ノッチ構造体を維持するには、次のようにします。

$$N(s) = {s^2 + 2 \zeta_1 \omega_n s + \omega_n^2 \over s^2 + 2 \zeta_2 \omega_n s + \omega_n^2} , $$

係数 $\omega_n, \zeta_1, \zeta_2$ を実数パラメーターとして指定し、上に示す伝達関数のパラメトリック モデル N を作成します。

wn = realp('wn',300);
zeta1 = realp('zeta1',1);
zeta2 = realp('zeta2',1);
zeta1.Minimum = 0;   zeta1.Maximum = 1;   % 0 <= zeta1 <= 1
zeta2.Minimum = 0;   zeta2.Maximum = 1;   % 0 <= zeta2 <= 1
N = tf([1 2*zeta1*wn wn^2],[1 2*zeta2*wn wn^2]);  % tunable notch filter

次に、このパラメトリック ノッチ モデルを Simulink モデルの "Notch" ブロックと関連付けます。制御システムは連続時間で調整されるため、"Notch" ブロックそのものが離散であっても、ノッチ フィルターの連続時間パラメーター化を使用できます。

setBlockParam(ST0,'Notch',N);

次に、looptune を使用して、50 rad/s のターゲット交差周波数で "Gain" ブロック、"Leadlag" ブロック、および "Notch" ブロックを一緒に調整します。プラントの共振から残差発振を排除するには、50 rad/s を超える -40 dB/decade のロールオフでターゲットのループ整形を指定します。

% Specify target loop shape with a few frequency points
Freqs = [5 50 500];
Gains = [10 1 0.01];
TLS = TuningGoal.LoopShape('Notch',frd(Gains,Freqs));

Measurement = 'Measured Position';  % controller input
Control = 'Notch';                  % controller output
ST2 = looptune(ST0,Control,Measurement,TLS);
Final: Peak gain = 1.05, Iterations = 60

最終的なゲインは 1 に近くなり、すべての要件が満たされていることを示しています。閉ループ ステップ応答を前の設計と比較します。

T2 = getIOTransfer(ST2,'Reference','Measured Position');
clf
step(T0,T1,T2,1.5), grid
legend('Original','Lead/lag','Lead/lag + notch')

ノッチ フィルターが想定どおり動作しているか検証するには、次のように補償器全体 C と開ループ応答 L を評価し、GCL のボード線図を比較します。

% Get tuned block values (in the order blocks are listed in ST2.TunedBlocks)
[g,LL,N] = getBlockValue(ST2,'Gain','Leadlag','Notch');
C = N * LL * g;

L = getLoopTransfer(ST2,'Notch',-1);

bode(G,C,L,{1e1,1e3}), grid
legend('G','C','L')

ボード線図では、プラントの共振が正しく "ノッチ アウト" されています。

ノッチ フィルターの離散化

この場合も、writeBlockValue を使用して調整後のリード/ラグ フィルターとノッチ フィルターを離散化し、それらの値を Simulink に書き戻します。MATLAB® と Simulink の応答を比較します。

writeBlockValue(ST2)

sim('rct_dmcNotch');
t = yout.time;
y = yout.signals.values;
step(T2), hold, plot(t,y,'r--')
legend('Continuous','Hybrid (Simulink)')
Current plot held

Simulink 応答は、小さな残差発振を示しています。ノッチ周波数がナイキスト周波数 pi/0.002=1570 rad/s に近いため、ノッチ フィルターの離散化が原因である可能性があります。既定では、ノッチは ZOH メソッドを使用して離散化されます。これを、次のノッチ周波数でプリワープされた Tustin メソッドと比較します。

wn = damp(N);  % natural frequency of the notch filter
Ts = 0.002;    % sample time of discrete notch filter

Nd1 = c2d(N,Ts,'zoh');
Nd2 = c2d(N,Ts,'tustin',c2dOptions('PrewarpFrequency',wn(1)));

clf, bode(N,Nd1,Nd2)
legend('Continuous','Discretized with ZOH','Discretized with Tustin',...
    'Location','NorthWest')

ZOH メソッドには大きな歪みがあるため、代わりにプリワープされた Tustin を使用しなければなりません。これを行うには、ノッチ フィルター ブロックの目的のレート変換メソッドを指定します。

setBlockRateConversion(ST2,'Notch','tustin',wn(1))

writeBlockValue(ST2)

writeBlockValue ではノッチ周波数でプリワープされた Tustin を使用して、ノッチ フィルターを離散化し、Simulink に書き戻します。これによって発振が除去されることを検証します。

sim('rct_dmcNotch');
t = yout.time;
y = yout.signals.values;
step(T2), hold, plot(t,y,'r--')
legend('Continuous','Hybrid (Simulink)')
Current plot held

直接離散時間の調整

または、離散時間でコントローラーを直接調整することで、ノッチ フィルターでの離散の問題を回避できます。これを行うには、Simulink モデルを線形化し、コントローラーのサンプル時間 0.002 秒で調整する必要があることを指定します。

ST0 = slTuner('rct_dmcNotch',{'Gain','Leadlag','Notch'});
ST0.Ts = 0.002;

高ゲイン制御および飽和を回避するため、制御信号 (Notch ブロックの出力) への参照からのゲインを制限する要件を追加します。

GL = TuningGoal.Gain('Reference','Notch',0.01);

次に、指定したサンプリング レートでコントローラーを再調整し、調整後の開ループ応答と閉ループ応答を検証します。

ST2 = looptune(ST0,Control,Measurement,TLS,GL);

% Closed-loop responses
T2 = getIOTransfer(ST2,'Reference','Measured Position');
clf
step(T0,T1,T2,1.5), grid
legend('Original','Lead/lag','Lead/lag + notch')
Final: Peak gain = 1.04, Iterations = 36

% Open-loop responses
[g,LL,N] = getBlockValue(ST2,'Gain','Leadlag','Notch');
C = N * LL * g;
L = getLoopTransfer(ST2,'Notch',-1);
bode(G,C,L,{1e1,2e3}), grid
legend('G','C','L')

結果は、連続時間でコントローラーを調整したときに得られる結果と似たものになります。Simulink で連続時間プラントに対してデジタル コントローラーを検証します。

writeBlockValue(ST2)

sim('rct_dmcNotch');
t = yout.time;
y = yout.signals.values;
step(T2), hold, plot(t,y,'r--')
legend('Discrete','Hybrid (Simulink)')
Current plot held

今回は、ハイブリッド応答がその離散時間近似とほぼ一致し、ノッチ フィルターのさらなる調整は不要です。

参考

(Simulink Control Design)

関連するトピック