PIDアルゴリズム:長い遅延後の高速な入力値の変化を考慮する方法


15

Arduino Leonardoに基本的なPIDアルゴリズムを実装して、サーボ制御バルブを使用して温水と冷水を混合しようとしています。目標は、温度を可能な限り設定点に近づけることです。特に重要なのは、ユーザーを火傷から保護するために、出力温度が設定値をオーバーシュートしないようにすることです。第二に重要なことは、温度を可能な限り迅速に設定点に近づけることです。

温度のわずかな変化に対して、PIDアルゴリズムの標準的な実装は正常に機能するようです。しかし、お湯がバルブに到達するのを待つときに発生する可能性のある長い遅延を考慮する方法はわかりません。これらの遅延は、バルブ位置を変更した後の標準遅延よりもはるかに長いためです。

明らかに、温水ラインの長さと最後に温水を使用してからの時間に応じて、温水がバルブに到達するまでに数十秒かかることがあるため、この間、水温は低温でほぼ一定のままです温水バルブはすぐに100%開きます。積分成分は大きなエラー値を蓄積し始めます。

お湯が最終的にバルブに到達すると、検出された温度は非常に急速に上昇し、最大お湯温度になります。積分誤差が大きいため、温度が設定値を超えた後、積分値が通常レベルに低下するのを待つため、温水バルブは長時間100%に保持されます。したがって、結果は数秒(10秒間)の最高温度の水になります。

この可能性のある長い遅延を説明する方法がわかりません。そのような場合、最大応答時間を制限するために、積分誤差値の上限(および下限)を設定するのが賢明でしょうか?これは、積分コンポーネントの目的を無効にしているようであり、設定点に到達した後もまだいくらかの遅延を課します。

または、長い遅延後の高速入力変更を処理するより良い方法はありますか?

アドバイスをありがとう!


1
実際、水温の変化はバルブの作動に比べて比較的遅いと思うので、I-アクションが必要かどうか疑問に思っています。さらに悪いことに、非常に貧弱な位相マージンが得られる可能性があるため、振動動作が発生する可能性があります(理論的にはシステムは安定しているかもしれませんが、I-actionは位相遅れを追加するため、実際には発振を停止することはありません)。また、人を焼く可能性があるため、ChuとJonRBのコメントを見るほどストレスを感じることはできません!
-Sanchises

回答:


15

あなたの問題はIntegral Windupと呼ばれ、一般的な制御の問題です。非線形またはその他の境界領域では、コントローラーは設定点を追跡できず、積分値が大きくなります。これにより、設定値に最終的に到達したときに大きなオーバーシュートが発生しますが、これが問題であると推測できます。

最も簡単な解決策は、Integrator値自体を適切な最大に制限することです。積分の寄与を制限してもうまくいきません。これは、積分器がまだ大きな値になるためです。

Mathworksには、統合ワインドアップに対する他のソリューションのページがあります

PIDコントローラーでは、通常、積分項はできるだけ少なくします。標準的な機械式温度制御バルブでは、比例制御のみが使用され、正常に機能します。積分項はできる限り小さくしてください-ユーザーは最終温度の小さな誤差に気付かないでしょう。PDだけで許容可能なパフォーマンスが得られることがあります。

これは非常に特殊な既知のケースであるため、コントローラーに別のモードを使用することを検討できます。ホットインレットの温度を測定し、セットポイントを下回っている間、ホット100%、コールド20%で運転します。ウォームアップしたら、良好な初期状態でPIDに切り替えます。


1
はい。理想的には、ホットインレットの温度を個別に測定し、そのようにワインドアップを抑制することができます。
ブライアンドラモンド

2
ワインドアップが問題になる可能性がありますが、積分器が実装されていない場合、たとえば、遅延の不安定化効果は依然として残ります。スミス予測子は、純粋な時間遅延の影響を軽減するための優れた方法です。積分器のワインドアップに対処するだけでは、時間遅延によって生じる固有の位相遅れを克服することはできません。
チュー

2
正確に言えば、それが単なる積分器のワインドアップだとは思いません。通常の操作が必要とされる条件にヒットしない場合は、常にEVEN用軽減する必要があり、その有効な懸念
JonRB

うわー、素晴らしい答えです!私はこの線に沿って考えていました(積分器の最大値を制限します)が、質問を適切に表現しなかったため、誤解されました。私が少なくとも解決策を求めて球場にいるのを見るのは良いことです。最も簡単な解決策は、温度が制御可能な範囲に達するまで「I」係数を無効にすることだと考えています。これにより、変更に対する非常に高速な応答が可能になります。その後、実際の温度変化が見られ、目的の結果に近づいたら、積分を再度有効にして、必要な追加のプッシュを追加します。詳細な回答をありがとう!
ライアングリッグス

しかし、積分項はそれを高速化するためのものではなく、系統誤差、特に正しくない比例係数を補正するためのものです。番号?そして、この状況ではP coef。両方のパイプの水圧に応じて変化するため、常に完璧になることはできません。
ローマンスターコフ

4

このプロセスを効率的に制御するための鍵は、ホットタップとコールドタップが対称的に動作しないことを認識することであり、最適なアルゴリズムではこれを考慮する必要があります。

お湯をしばらく使用しないと、パイプで冷えます。

しばらく冷水を使用しない場合、それは以前と同じままです(冷水がチラー付きの冷水タンクからのものである場合を除き、暑い夏の日に持つのは素晴らしいですが、私はベットは実際には非常にまれです)。

したがって、温水パイプから何が得られるのかわからないと想定しますが、実行中は冷水パイプがほぼ一定であることを信頼できます。

したがって、混合水の温度から、バルブの設定を知ることから、そして冷水の温度の推定から、温水パイプから現在来ている水がどれほど熱いかを推定することができます。その後、熱力学公式の評価に基づいて、PIDを使用せずにバルブを調整して正しい出力温度を取得できます。

「冷水の温度の推定値」を取得するには、サイクルの開始時に短時間(おそらく数秒)冷水を実行し、温度を読み取ります。その後、両方の温度について解くのに十分なデータがないため、その後は変化しないと仮定します。

このスキームは完全に正確ではありませんが、急激なオーバーシュートの可能性なしに球場内に確実に到達すると推定します。次に、このスキームの上でPIDを実行して結果を微調整しますが、PIDが生成できるバルブ設定への変更を制限します。お湯の入力温度が大幅に変化した場合は、PID状態をリセットすることもできます。

複数の温度センサーを使用して、より洗練されたソリューションが可能です。


別の素晴らしい答え-PIDボックスの外側を考える。私は単に水温をテストし、おおよそのバルブ位置である種のルックアップテーブルを作成して、希望の出力温度を得ることを検討していました。冬は寒いかもしれませんが、寒さは比較的一定です。喫水線は約24〜36インチで埋められており、通常ここの温度は穏やかです。次に、最大温水出力温度(約120 F)を考慮し、PIDを使用してウォームアップ後の微調整を行い、バルブを適切に配置するルックアップテーブルを作成します。
ライアングリッグス

1
井戸の水は、深さ/水源によっては、暖かい夏でも非常に冷たい状態を保つことができます。家のパイプにある「冷たい」水は、下から汲み上げられるものよりも暖かいです。そのため、実際に使用すると冷水はより冷たくなります(地下水の温度に近づくまで)。「大都会」に行くといつも「びっくり」してしまい、冷たい水が冷たくなることはありません。
rickhg12hs

2

私は、制御エンジニアが不可欠なワインドアップの可能性のために何をするかについて、上記の良い答えに1つの詳細を追加したかっただけです。これは多くの産業プロセスでも起こり、科学ではなく芸術です。

これに対する典型的な教科書のアクションがありますが、パフォーマンス仕様に実際に必要とされる可能性のある積分ゲインを犠牲にすることはありません。

  1. ゼロエラーレベルを超えるたびに、積分器をリセットします。これにより、積分器はブラインドアキュムレータではなく、積分器オンデマンド型の非線形要素になります。

  2. 基本的に、積分アクション入力ブロックをループ内の指示要素に接続します。これは、ビルドアップを開始したかどうかを判断するインテグレーターの出力の場合があります(判断を適切に行うにはプロセスを理解する必要があります)。または、アクチュエータが飽和しているかどうかを確認し、その情報に基づいてフィードバックループを形成します。Googleから出てきた最初のリンクをランダムに選んだところです。このビデオの最後に、最後のポイントの図解があります。https://www.youtube.com/watch?v=H4YlL3rZaNw


良い点、アイデアを広げてくれてありがとう。ビデオのおかげで、問題を非常によく説明しています。
トムネクサス

1

システムの動作範囲の粗視化段階では、システムが動作のある段階から別の段階に移行するときにオンザフライで変更するため、複数セットのPIDパラメーターを使用すると役立つ場合があります。たとえば、ホットタップをオンにして冷水のみを取得する場合のKp、Ki、およびKdの1セット。温度が上昇し始めたら、Kp、Ki、Kdの別のセットに切り替えます。次に、それに応じて2つを調整します。

Brett BeauregardによるArduino PlaygroundでPIDライブラリを使用していますか?これはとてもいいです。そして、これの「適応的」な例もあります。


提案をありがとう。pidライブラリを使用せず、それがどのように機能するかについてさらに学ぶために自分で作成しました。
ライアングリッグス

フィードフォワードを検討しましたか?速い変化はオープンループを介した出力に影響を与えるので、クローズループに反応するのを待つ必要はありません。
グレゴリーコーンブラム

この場合、「フィードフォワード」がどのように機能するかについて、脳をラップしようとしています。入力は望ましい温度になり、出力はルックアップテーブルまたは単純な方程式を使用して、バルブを所定の位置に設定しますか(上記の他のコメントで説明したように)?
ライアングリッグス

フィードバック(閉ループPID)に加えてフィードフォワードを使用できます。フィードバックコントローラーのアクションをフィードフォワードコントローラーのアクションに追加するだけです。理想的には、フィードフォワードコントローラーはバルブの逆モデルになります。フィードフォワードは、基本的に設定値の変更に対して即座にアクションを提供します。フィードフォワードとフィードバックを使用しても、フィードバック制御補償器でワインドアップを考慮する必要があります。フィードバックコンポーネントを考慮する必要があります
。– docscience

1

システムをモデル化しましたか?

オーバーシュート、特に周波数を示す時間ベースのデータはありますか

これらは、コントロールベースのクエリで尋ねられる2つの質問です。

あなたが説明したことから、あなたの積分ゲインは高すぎます。積分器のワインドアップが原因である可能性があります。示されているコードには、実際の実用上の懸念がいくつかあります。

  • 非常に貧弱な離散積分器トポロジー
  • P + I出力はもちろん、I出力にもクランプ/制限はありません

同様に、非常に高く、減少するのに時間がかかるためです。

そうです。P+ Iがシステムの応答に設定されていなかったため、Iレジスタに格納された値が... 1000Cになった可能性があります。

最初に行うことは、後処理用のリアルタイムデータをキャプチャすることです。次に、Pのみを実行し、比例ゲインが目的の温度にALMOSTを達成することを確認します(制御理論ではそうはなりません)。かどうかによって

  1. 適切なIゲインの決定を容易にする現在のキャプチャデータの分析
  2. 適切なゲインを作成するためのプラントモデルが導出されます

私は、PIDコードをより良い実装に変更することから始めて、それからほんの少しだけ追加して、ポイントを証明します。

これらの利益が何を意味するのかを本当に判断する必要があります。入力は温度、出力は...流れですか?したがって、フロー/ C転送とフロー/ Cs転送機能が必要です。


良い答えもありがとう。まだ方法がわからないので、システムのモデル化は行っていません-この研究で足が濡れ始めたばかりです。I値が妥当な範囲を超えて増加することは正しいです。インテグレーターのより良い実装アルゴリズムを教えてもらえますか?コピー/貼り付けではなく、コードを学習して自分の言葉に入れることができるため、擬似コードが最適です。また、このような単純なシステムのモデリングの紹介をお願いできますか?流量レベル(ホット&コールドミックス)がこのシステムの出力であることは正しいです。現在、これはH / Cに反比例しています。
ライアングリッグス

1
すぐに微調整を追加します
-JonRB

1

積分ワインドアップを解決する1つの方法は、制御出力が最大たわみにあるときは常にエラーの蓄積停止することです。または、最大たわみからどれだけ離れているかでスケーリングします。したがって、コントローラーが「お湯100%、冷水0%」を出力する場合は、エラーを蓄積しないでください。ゼロにリセットしないでください。

積分を最大に制限するのは好きではありません。なぜなら、PIDが補正できる系統誤差には限界があるからです。

また、基礎となるシステムの知識なしに制御しようとしているパラメーターが1つだけの「ダム」PIDを作成する代わりに、ホット入力とコールド入力の両方に2つの追加の温度センサーをインストールすることをお勧めします。次に、入力温度に基づいて目的の位置に近似する関数を見つけようとし、PIDループのみを使用してこの関数の出力の誤差を調整します。

流量を測定しないため(もちろん、そうでない場合)、エラーは重大です。これは、バルブ位置(既知)だけでなく、水圧(不明)にも依存します。

それでも、これは、お湯が最終的に蛇口に到達するという問題に大いに役立つはずです。十分に減衰されたPIDループでは、熱流量を迅速に減らすためにDエレメントを十分に較正する必要があります。私の経験では、微分係数を正しくすることが通常最も困難です。ただし、2つのセンサーが追加されている場合、メイン出力は入力水温とまったく同じくらい迅速に変化するため、基本的に瞬時であり、微分要素はまったく必要ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.