Pythonで微分先行型PID制御、比例微分先行型PID制御をシミュレーションしてみた。

プラントのプロセス制御で使われる微分先行型PID制御(PI-D制御)比例微分先行型PID制御(I-PD制御)Pythonでシミュレーションしてそれぞれの挙動を比較してみました。PythonTCLab というライブラリを利用してみました。

通常のPID制御

制御工学の教科書に出てくる基本のPIDの演算式は以下の通りです。

 \displaystyle u(t) = K_P e(t) + K_I \int e(t) dt + K_D \dfrac {d e(t)}{dt}
 u(t):操作量(MV)
 e(t) = r(t) - y(t):偏差(SP-PV)
 r(t):目標値(SP)
 y(t):測定値(PV)

PID制御の基本の式になりますが上記式の欠点として、目標値SPを値を変えたときMVが急変してしまいます。なぜかというとステップ変化を微分するとインパルス応答となるからです。手動でSPの値を変えた(=ステップ変化した)とき、右辺第3項が非常に大きくなってしまいます。

微分制御によって操作量MVが急変することをキックと言います。プラントの制御においてキックが発生するのは望ましくありません。MVが急変するということは例えばバルブの開度が急激に変化するということなので。キックを抑制するために開発されたのが微分先行型PID制御(PI-D制御)や比例微分先行型PID制御(I-PD)です。実際、プラントの制御においてはPID制御より PI-D制御や I-PD制御が一般的に使われてます。

微分先行型PID制御(PI-D制御)

微分先行型PID制御の演算式は以下に示します。

 \displaystyle u(t) = K_P e(t) + K_I \int e(t) dt - K_D \dfrac {d y(t)}{dt}

通常のPID制御と違うのは右辺第3項です。微分制御が働くのは y(t)(測定値PV)だけなので、SPの値を変えても微分制御には影響しません。

比例微分先行型PID制御(I-PD制御)

比例微分先行型PID制御の演算式は以下に示します。

 \displaystyle u(t) = - K_P y(t) + K_I \int e(t) dt - K_D \dfrac {d y(t)}{dt}

右辺第3項だけでなく第1項も y(t)(測定値PV)としています。つまり、目標値SPを変えても影響があるのは積分制御だけで、比例制御と微分制御はPVの変化のみを見ています。

Pythonを使ってシミュレーションをしてみる。

PID制御、PI-D制御、I-PD制御を Python でシミュレーションしてみました。TCLab というライブラリをネットでたまたま見つけたのでそれを使ってみました。

TCLabとは何ぞやというと、Arduino用に開発されたプロセス制御学習キット用のPythonのモジュールらしいです。温度センサーとヒーターを搭載したキットを使って、プロセス制御を学ぶことができるようです。ヒーターを模擬で操作して温度の応答を見るシミュレーション機能もあるみたいで今回はそれを使ってみました。

詳細は以下リンクを参照ください。なかなか面白そう。

apmonitor.com

プログラムのコードは以下のページを参考にして、適当にパラメータを変えてみました。

CBE30338 Chemical Process Control 4.2 PID Control with Setpoint Weighting
https://jckantor.github.io/CBE30338/04.02-PID_Control_with_Setpoint_Weighting.html

シミュレーション結果

ヒーターOFFでPVが約20℃の状態(SP=PVとする)から、温度目標値SPを50℃に変更したときの結果を以下に示します。※一番下のグラフはヒーターの出力(MVの上下限を0~100%としたもの)です。

通常のPID制御

通常のPID制御

通常のPID制御は目標値SPがステップ状に変化したタイミング(t = 100 sec)で微分要素が大きく効いてしまいます。そのため、MVのキックが発生してしまいます。

PVの応答を見るとシミュレーション上ではちゃんと制御出来ているように見えます。しかし、実用面で言うとプラントの制御で操作量MVがこれだけ急激に変わるような制御はよろしくありません。

微分先行型PID制御

微分先行型PID制御

PID制御よりはマシになりました。それでもまだMVが大きく出ています。偏差(SP-PV)が比例要素として働くので当たり前ですが、SPの値を変えた直後のMVはかなり大きくなります。(今回はKpを2としたので、Kp(SP-PV) = 2*(50 - 20) = 60)

比例微分先行型PID制御

比例微分先行型PID制御

比例微分先行型PID制御ではMVの変化がPI-D制御よりも更に緩慢になりました。これだけゆるやかな変化であれば、実用(プラント)においても問題ないと思います。

ただし、目標値への追従性はPI-D制御よりも劣っています。MVの挙動をゆるやかにさせたのでこれは仕方ありません。プラントの制御においては安定性を特に重視するので、オペレーターが設定値を変更するようなコントローラでは、3つのうちI-PD制御が最もベターです。

まとめ

Python で PID制御と PI-D制御と I-PD制御の3種類をシミュレーションしてそれぞれの挙動を確認してみました。I-PD制御を採用した場合、SPを変化させたときのMVの挙動が緩慢になることが確認できました。