まとめスポンサーリンク自動制御の基礎であるPID制御モデルを解くプログラムをVBAで作成PID制御という言葉は、工学に携わったことのある人なら一度は聞いたことがあると思います。工学の目的は「適切な機械や装置を使って、その装置を意のままに操って必要なモノを作ること」です。この中で自動制御という考え方が重要になってきます。ラプラス変換を行って微分方程式を解きますが、VBAで書かれたルンゲクッタ法のプログラムがあるので、それを使用して直接微分方程式を解きます。制御とは?PID制御・・・とは言いますが、そもそも、制御とはどういう意味でしょうか?身近な例で制御のお話をしたいと思います。ストークオマエは「制御とは何ですか?」って聞かれたときにしっかり答えられるか?シママ制御?せ、制御は制御でしょ??ストーク例えばさ、オマエが東名に乗るためにETCレーンを20km/hで通過する。それでランプを進み40km/hまで加速する。このまま本線に入るか?シママ入るわけないでしょ!!?危ないでしょ!ストークじゃあどうする?シママどうするって・・・そんなのアクセル踏んで100km/hまで加速するに決まってるじゃない。ストークそれで、アクセルはずっと同じ踏み方でいいか?ずっとベタ踏みか?シママいや、アクセルは柔らかく踏んで加速してきたと同時に強く踏み込んでいくのよ。それで100km/h超えそうだなと思ったら少しアクセル緩めて、最終的に一定の強さで踏みつづけて100km/hで走り続けるのよ。当たり前でしょう?ストークその「あたりまえでしょう?」って言ったことが制御っていうたいね。シママ・・・どういうこと?ストーク時速40km/hの状態から時速100km/hで運転するために、アクセルを強弱の調整を加えながら目標のスピードに到達していく。いう風に制御というのは、装置を自分の意のままに操る。装置や機械を望み通りの運転状態にすることを言うたい。今の話で言う装置や機械というのは車だな。シママ装置や機械を望み通りの運転状態にする・・・?ストークせや。オマエがランプから本線に入るまでに100km/h巡航という目標に向かって車を意のままに操っているやろ?オマエが車を制御しているたい。シママ確かに、ワタシが車という装置を、アクセルを使って制御して、100km/hというを望み通りの運転状態を維持した。いう表現ができるわね。アクセルを踏むというのが因、100km/hのスピードが出るというのが果。因果はインプット、アウトプットという。機械や装置にインプットをしたら、何らかのアウトプットが返ってくるわけたい。ストークそして、これから、俺らがやろうとしている制御っていうのは、さっきオマエが言ったようなインプットの手順をアルゴリズム化してコンピュータでも動けるようにする。装置を意のままに操る手順をアルゴリズム化してコンピュータにプログラムして自動制御を作るということになるたい。~2槽タンクモデルの場合~シママなるほど・・。さっき、ワタシが「当たり前でしょ?」って言ったことはあくまでワタシだけの「当たり前」であって、その部分をちゃんとアルゴリズムにして、自動制御にすることで、誰がやっても同じ結果になるようにするのね。ストークそういうこと!制御というのは「装置や機械を意のままに操る」ことを言います。車を時速100km/hで走らせる、槽内温度を75°Cに保つ、回転数600rpmで攪拌する、タンク内水位を8mに保つ・・・それぞれの目的に合わせて、どのようにしたら、上記の目標を達成できるのか、その方法をアルゴリズム化してコンピュータにプログラムすることができれば、コンピュータによる自動制御ができるようになります。PID制御はそのアルゴリズムの1種と位置付けられます。問題設定(2槽タンクモデル)ストーク今回、制御してみようと思うプロセスは2槽のタンクで、その液面高さを制御するたい。ストークバルブの開度はそれぞれで固定で、2槽目の液面高さy2を俺らの好きなように調整したい。このとき、どうする?シママえっと・・・1槽目の流量、qin1ってやつを増やしたり減らしたりすれば、できそうね。ストークでは、今タンクの水面の高さは4mだが、水位を上げて8mにしたい。1槽目の流量はどうすればいい?シママえっと・・・とりあえず増やして・・・でもどれだけ増やせばいいか分からないし・・・増やし過ぎて1槽目のタンクが溢れたら大変・・・。ストークせやろ?普通はそうなるたい。何回もこの操作をやったことのあるベテランだったら、流入バルブはこのくらい開ければいいかな?って感覚がついとるかもしれんがな。実際には現場行くとさ、水位8mって設定してOKボタンクリックしたら、自動で8mになるような機械があるやろ?シママうん。ストークあれ、自動で流入流量を調節してんねん。その自動でされる部分がどういう仕組みになっているのかを知るって言うのが今回のテーマ。シママなるほど・・・。ストークプロセスのな、インプットをアルゴリズム化するには、プロセスのインプットとアウトプットを定量的に評価できなあかん。物質収支とエネルギー収支を立てる。インプットは1槽目の流量。アウトプットは2槽目の液面高さやな。今回は温度変化は考えない系だから物質収支だけでよか。1槽目、2槽目の物質収支式は以下の通り。蓄積量の時間変化=流入量―流出量よね。それで、それぞれの槽の底面積をA1,A2としたとき、体積は底面積×液面高さであることと、それぞれの槽の流出流量をバルブ抵抗R[hr/m2]を使って以下の様に定義する。シママこれ、1槽目の流出流量と2槽目の流入流量は一緒よね。1槽目の出口をそのまま2槽目につないどるからな。して、さっきの物質収支式はこんな風に式変形される。ストーク最後に両辺をρAで割れば、液面高さに関する2つの連立微分方程式ができる。シママおおっ、ルンゲクッタ法で解けそうな微分方程式になった!ストークとりあえず、系のモデル化はこれで終わりや。次からはこの系に制御系を組んで行く。スポンサーリンクPID制御とは?PID制御は、PはProportional、比例制御、IはIntegral、積分制御、Dはdifferental、微分制御を略してPIDと呼んでいます。何に比例し、何を積分し、何を微分しているのでしょうか?そしてその操作は系の制御にどのように貢献するのでしょうか?P制御ストークPIDを学ぶときはPとIとDそれぞれ分けて考えたほうがわかりやすい。Pだが、これは比例制御。シママ比例って・・・何を何に比例させるのよ・・?ストークおっ、ええ質問やなぁ~。オマエ、20km/hから100km/hに加速する時と60km/hから100km/hに加速する時とではどっちの方がアクセルを強く踏む?シママ20km/hの方に決まってるじゃない。ストーク何で?シママ何でって・・・・。何でっていわれても・・・。ストーク20~100と、60~100との間では前者の方が目標の速さとのギャップが大きいから、よりエンジンふかさないかんな。ポイントは今の値と設定値との差、つまり偏差やねん。ストークy2setって言うのは2槽目の液面高さの設定値、y2は現在の液面高さ。液面高さ4mで定常状態になっているプロセスに対して、8mの設定値を与えると偏差は4mになるな。これに比例する量だけ流入流量を増やす。いうのが比例制御たい。シママ流量qss、液面高さ4mで定常になってたところ、液面高さ8mに設定したら、上の式に従って流量が増えるような仕組みを表しているのね!ストークせや。偏差に比例する分だけ流入流量を追加しとるやろ?y=8mって設定したら上の式に従って流量を自動的に変えてくれるたい。ストークそれで、この式を微分すると・・・ストーク流入流量qin1に関する微分方程式ができる。流入流量は偏差に従って動く関数。その偏差と言うのは設定値と現在地の差のことやから、流入流量が2槽目のタンクの液面高さの関数になった。これが何を意味しているかわかるか?シママある目的の液面高さを達成するために必要な流入流量が一義に決まったってことでしょ?ストークそういうこと!インプットとアウトプットの関係がこれでハッキリしたよな!これと、さっきの2槽タンクの物質収支式ストークを、連立して解けば、P制御系がどのように動くかシミュレーションできる。問題1底面積30m2、高さ10m、バルブ抵抗0.08の2つのタンクを用いて以下のようなプロセスを組んだ。50m3/h、両タンクの液面高さ4mで定常状態になっている。ここで2槽目の液面高さの設定値を8m(y2set=8m)としたら、2槽目の液面高さはどのような応答をするか。比例ゲインKc=20とする。シママつまり、3つの連立微分方程式をこのシートで解くVBAプログラムを組めばいいわけね。シママqin1の初期条件は?ストークqin1はさっきの偏差の式に従う。t=0の時も例外なくこの式に従うから、以下の計算式で求めればいいのね。Functionシママけど、このままでいいのかしら・・・。ストーク設定値は8mのはずやが・・。それなのに6.5mくらいで安定しちゃって・・・・。ストーク比例制御やとこういう定常偏差、つまりオフセットが起こるたい。流量のグラフは?シママこれ。これ、流入流量80m3/h,液面高さ6.5mで安定しちゃったんやな。シママ比例制御じゃ制御できないのかしら・・・。一応、Kcを200まで大きくしたんだけど・・・ストークこれはイカン。振動が大きくて危険や!それに、オフセットは結局残る。言えば、850m3/hなんて流量が現存設備で達成できるか、怪しいやろ?シママそうね。比例以外の他の関数を入れないといけないってことなのかしら?ストークせやな。目標値に達するまでは、流入流量は常に変化させるという工夫が必要になるたいね。PI制御ストーク比例制御に積分制御を追加したのがPI制御。元々の流量qssに、偏差に比例した値とこれまでの偏差の積分値を足して流入流量qin1を決定する。シママ偏差の積分を追加することによって、偏差がある限り、qin1の値は一定にならないということ?ストークせや!仮にさっきみたいなオフセットができるような状況になったとしても、時間が経つにつれ、積分項の数値は大きくなっていくから、qin1の値は大きくなっていく。それが、偏差がなくなるまで続くたい。ストーク先ほどの偏差の式を微分して・・・ストークこれを2槽タンクの物質収支式と連立させて解けばPI制御の挙動がわかる。50m3/h、両タンクの液面高さ4mで定常状態になっている。ここで2槽目の液面高さの設定値を8m(y2set=8m)としたら、2槽目の液面高さはどのような応答をするか。PI制御系で予測せよ。比例ゲインKc=20、積分時間TI=2とする。シママこのエクセルシートで・・・シママこのプログラムを動かせばできるわよね。Functionシママできた!すごい!ちゃんと高さ8mに制御できてる!ストークせやな!ええ感じになってきた。ストーク・・・でもな~y2の値が大きく振動しているのが気になるねん。オーバーシュートしていて危険やし・・・。一応これ、計算上大丈夫だけど、実際何が起こるか分からないもんね・・・。現実には何らかの外乱があって、このオーバーシュートが拡大してしまった・・・なんてことが起きたら怖いやろ?オーバーシュートはなくさないかん。シママなるほど・・・。応答に振動をもたらすことがあるけん、それはプロセス制御の観点からして好いとうない。シママじゃあ、どうすればいいのかしら・・・。I制御を取り入れることによって、「P制御だけではオフセットが残る」という問題を解決することができました。I制御はこれまでの偏差の積分値を流入流量の値qin1に取り入れることによって、偏差がある限り、qin1は更新され続ける。いうアルゴリズムを作ることができました。PI制御ではゲインを大きくすると応答特性(今回の場合は液面高さ)が振動してしまうという問題点が出てきます。応答特性の振動を抑えるために微分制御、D制御という考え方を取り入れます。制御がそろったPID制御のお話です。PID制御ストークP制御ではプロセスの現在を制御する。I制御ではプロセスの過去を制御する。この感覚がわかるか?シママえっと、P制御では偏差にそのまま比例定数をかけているだけ、I制御では偏差を積分している。その積分の範囲って言うのは、偏差が発生してから現在までの時間だから、過去を見ているっていう感じなのかしら?ストークせやせや。PID制御って言うのは今までPI制御にDifferential、つまり微分の要素が加わった制御たい。シママ微分ってことは・・・未来を見ているってこと?ストークその通り!その部分の関数の傾きを見るということは、今後、その間数がどんな風に変化していくのかを予測しているってことたい。ストークそして、偏差の動きが激しい時を検出して、これを修正する働きをするのがD制御たい。ストーク例によってqin1を微分して・・・微分すると2階微分が出来るが、dy2/dtは既に定式化されてて、これを微分することができることに注意して、qin1に関する微分方程式を立てる。ストークこれを2槽タンクの物質収支式と連立させて解けばPID制御の挙動がわかる。50m3/h、両タンクの液面高さ4mで定常状態になっている。ここで2槽目の液面高さの設定値を8m(y2set=8m)としたら、2槽目の液面高さはどのような応答をするか。PID制御系で予測せよ。比例ゲインKc=20、積分時間TI=2、微分時間はTD=1.2とする。シママさっきと同じようにエクセルシートで・・・シママこのプログラムを動かせばできるわよね。Functionシママオーバーシュートがなくなることはないけど、さっきよりはマシになったね。最初の傾きが緩くなって2周期目からの振動がなくなったな。D制御とは、偏差の微分値を求め、それをインプット(qin1)へ反映する仕組みのことです。微分を求めるということは、未来のプロセスを予想することに相当します。ルンゲクッタ法でも、関数の傾きから、h/2だけ進んだところのyの値を求めていました。傾きを出すことによって、今後関数がどのように変化していくのか予測し、偏差が大きい方向に傾いていたらそれを修正することによって、応答特性を良くするのがD制御の役割です。チューニングシママこの問題、オーバーシュートをなくして、しっかりとy=8mに制御することってできるのかしら?ストークできるぜ。TD=1でシミュレーションしてみな。調整することをチューニングっていうたい。チューニングは昔から制御においては大きな課題でな。現場の作業員が上手いことチューニングしている場合も多いんや。水俣事業所で働く俺の知り合いにもおるけん、めっちゃチューニングプロってるベテランがな。最近は、限界感度法のような理論に基づくオートチューニングって言うのが普及し始めているけど、プロセスが複雑になるとやっぱり難しい。シママチューニングミスるとこんなカーブすることもあるでしょ?これ実際にやったら始末書よ。TD=0ストークだから、自動制御とはいえ、全て機械任せ、ブラックボックスにしてたらいけんくて、プロセスの動特性の理論をしっかりさせておかないといけんよな。理論がしっかりわかっていたらいたずらにKcを大きくしたり、TIを小さくしたりしないよな。スポンサーリンクまとめ今回は、PID制御モデルを解くVBAマクロの作成ということで、まず制御とは何なのかを説明したのち、P,I,D制御それぞれのアルゴリズムを説明しました。そのアルゴリズムに基づくVBAプログラムを作成し、2槽タンクの水位モデルにおいて、液面がどのように動くのかをシミュレーションしてみました。PID制御など、自動制御は普通、ラプラス変換を行い、微分方程式を代数方程式に変換して解を求めるのが一般的な解析法ですが、微分方程式を計算できるVBAプログラムを持っていたので、それを活用しました。Excelのグラフシートを使うことによって、リアルタイムでシミュレーションが可能になるのもこのVBAプログラムの利点です。コメントをキャンセルメールアドレスが公開されることはありません。