Scilab/Xcosのデモを動かしながら「制御」を学ぼうと、前回は「基本制御器」、状態空間システム使った「モダンな感じ」のモデルでした。前々回がバンバン制御だったので、PID制御くらいの「古典な感じ」が良かったのに、とブーたれたらありました。次の「水タンク」、もろ積分、もろPIDレギュレータです。やったね?
※「ブロックを積みながら」投稿順 index はこちら
※動作確認にはWindows 11の パソコン(64bit)上にインストールしたScilabの以下バージョンを使用しています。
Scilab 2024.0.0
PID制御
以下の過去回でPID「レギュレータ」ブロックの使い方はやってみたことがあるのです。わざわざPID制御のためにフローを組み立てなくてもP(比例)、I(積分)、D(微分)の各欄にゲインを記入すればお楽。
ブロックを積みながら(151) Scilab/Xcos、PID「レギュレータ」ブロック
お惚け老人がPID制御を説明するのはなし、いつものようにGoogleの生成AI、Gemini様にお願いいたします。
いつものごとく、分かったような、分からぬような。
今回練習してみるデモ
入力は水タンクの目標レベル(水深)、mなんだかcmなんだか分かりはしません。2つの同等な水タンクをならべ、どちらもフィードバックをかけてますが、上の方のSystem without control側ではPIDレギュレータは無、下のWater-Tank SystemではPIDレギュレータ有で、2つの挙動を比較という趣向みたいです。
さて肝心の水タンク本体はSuperBlock内に隠れてます。内部を開いてみるとこんな感じ。まず上側のブロック。
つづいて下側のブロック。
比較する意図なので、当然ながら同じものみたいです。なお、このSuperBlock内のフィードバックループにはSQRT含まれています。ここについては検索エンジンが即座に解答してくれます。
つまり今回は目標レベル(深さ)を与えてますが、水深レベル=圧力の関係が想定できるので、圧力の平方根をとれば「流量」になります。なお流量を積分すればタンクに溜まった水量、(タンクの面積で割れば)深さという関係かと。その割に目標レベルはSQRTとってないじゃん。ごもっとも。
デモの実行
「水タンク」そのものは内部のフィードバックループにより、水深レベルが高くなると水が入り難くなる傾向あり。これを外側のフィードバックかけながら外部目標値に近付けていく感じかと。
上側の “System without control” の方は、内在する比例制御的なフィードバックのみであり、目標値10の赤い線(当方で引いたもの)にオフセットが残ってしまっている感じ。
一方、緑のPIDレギュレータ付きのシステムは、ちょっとオーバーシュートがありますが、急速に立ち上がって、オフセットもない感じ。
シミュレーション後、Superブロックの内部に「!」マーク(警告)が出ていることに気づきました。どうも理由はa, b, Aとさらっと書かれているゲインブロックの係数が定義されていないことにあるみたいです。
御勝手修正
ゲイン・ブロックが正常に動作するように、コンテキストのところに a, b, Aの値を定義してみました。こんな感じ。
値はゲイン1になるようにエイヤーです。
再度シミュレーションした結果、警告のビックリマークは消えました。そして結果は同じ。ゲインが未定、でも警告は出るものの、良きように勝手に計らって動いているのみたい? ホントか?