PID algoritması: Uzun bir gecikmeden sonra hızlı giriş değeri değişikliklerinin nasıl hesaplanacağı


15

Servo kontrollü vanalar kullanarak sıcak ve soğuk musluk suyunu karıştırmak için bir Arduino Leonardo üzerine temel bir PID algoritması uygulamaya çalışıyorum. Amaç, sıcaklığı mümkün olduğunca bir ayar noktasına yakın tutmaktır. Özellikle önemli olan, kullanıcıyı yanıklardan korumak için çıkış sıcaklığının ayar noktasını aşmasını önlemektir. İkincil olarak önemli olan, sıcaklığı istenen değere olabildiğince çabuk çıkarmaktır.

Sıcaklıktaki küçük değişiklikler için , PID algoritmasının standart bir uygulaması iyi çalışıyor gibi görünüyor. Ancak sıcak suyun vanaya ulaşmasını beklerken oluşabilecek uzun gecikmeleri nasıl hesaplayacağımı bilmiyorum, çünkü bu gecikmeler vana konumlarını değiştirdikten sonra standart gecikmelerden çok daha uzundur.

Açıkçası, sıcak su hattının uzunluğuna ve sıcak suyun son kullanımından bu yana geçen süreye bağlı olarak, sıcak suyun vanaya ulaşması onlarca saniye sürebilir, bu nedenle su sıcaklığı düşük bir sıcaklıkta oldukça sabit kalır ve sıcak su vanası yakında% 100 açılıyor. İntegral bileşeni büyük bir hata değeri biriktirmeye başlar.

Sıcak su nihayetinde vanaya ulaştığında, algılanan sıcaklık çok hızlı bir şekilde maksimum sıcak su sıcaklığına yükselir. Büyük integral hatası nedeniyle, sıcaklık ayar noktasını aştıktan sonra sıcak su vanası,% 100'de tutulur, çünkü integral değerinin beklenmesi normal seviyelere düşürülür. Böylece sonuç birkaç (on) saniye boyunca maksimum sıcaklık suyudur.

Bu olası uzun gecikmeyi nasıl açıklayacağımı bilmiyorum . Böyle bir durumda, maksimum yanıt süresini sınırlamak için integral hata değerine bağlı bir üst (ve alt) sınır ayarlamak akıllıca olur mu? Bu, integral bileşenin amacını yeniyor gibi görünüyor ve aynı zamanda ayar noktasına ulaştıktan sonra da biraz gecikme sürüyor.

Yoksa uzun bir gecikmeden sonra hızlı giriş değişikliklerini ele almanın daha iyi bir yolu var mı?

Herhangi bir tavsiye için teşekkürler!


1
Aslında, I-eylemine hiç ihtiyacınız olup olmadığını merak ediyorum, çünkü su sıcaklığı değişikliklerinin vana tahrikine kıyasla nispeten yavaş olduğunu düşünüyorum. Daha da kötüsü, alacağınız aşırı zayıf faz marjı nedeniyle salınım davranışı alabilirsiniz (sisteminiz teoride kararlı olabilir, ancak uygulamada salınımı asla durduramaz, çünkü I-eylem faz gecikmesini ekler). Ayrıca, muhtemelen insanları yakacağınız için Chu'nun ve JonRB'nin yorumlarını inceleyecek kadar stresli olamıyorum!
7'de Sanchises

Yanıtlar:


15

Sorununuza Integral Windup deniyor , bu yaygın bir kontrol problemidir. Doğrusal olmayan veya başka şekilde sınırlanmış bir bölgede, denetleyici ayar noktasını izleyemez ve integral büyük bir değere yükselir. Bu, ayar noktasına nihayet ulaşıldığında büyük bir aşırılığa neden olur, bu da tam olarak çıkardığınız şeydir.

En basit çözüm, Integrator değerinin kendisini makul bir maksimuma sınırlamaktır . İntegral katkıyı sınırlamak da işe yaramaz, çünkü entegratör hala büyük bir değere sarılır.

Mathworks, ayrıştırmayı entegre etmek için başka çözümler içeren bir sayfaya sahiptir.

Bir PID kontrol cihazında genellikle mümkün olduğunca az integral terimi istiyorsunuz. Standart bir mekanik sıcaklık kontrol vanasında, sadece oransal kontrol kullanılır ve düzgün çalışırlar. İntegral terimini olabildiğince küçük tutun - kullanıcı son sıcaklıkta küçük bir hata fark etmez. Sadece PD ile kabul edilebilir bir performans elde edebilirsiniz.

Bu çok özel, bilinen bir durum olduğundan, denetleyici için farklı bir moda sahip olmayı düşünebilirsiniz. Sıcak giriş sıcaklığını ölçün ve ayar noktasının altındayken, sadece% 100 sıcak,% 20 soğuk çalıştırın. Isındığında, iyi başlangıç ​​koşulları ile PID'ye geçin.


1
Evet. İdeal olarak sıcak giriş sıcaklığını bağımsız olarak ölçebilir ve sargıyı bu şekilde engelleyebilirsiniz.
Brian Drummond

2
Kurma bir sorun olabilir, ancak eğer entegratör uygulanmazsa, örneğin, gecikmenin dengesizleştirici etkisi devam edecektir. Smith Predictor, saf zaman gecikmesinin etkilerini azaltmak için iyi bir yöntemdir. Entegratör sargısının tek başına ele alınması, zaman gecikmesinin getirdiği doğal faz gecikmesini aşmak için hiçbir şey yapmaz.
Chu

2
tam olarak, bu olsa bile, bunun tamamen bütünleştirici kurgu olduğunu düşünmüyorum. normal operasyonlar gerekli koşullara
ulaşmazsa

Vay be, harika cevap! Bu çizgide düşünüyordum (entegratör maksimum değerini sınırlayan) ama soruyu doğru bir şekilde ifade etmedim, bu yüzden yanlış anlaşıldım. En azýndan bir balo ile baloda olduđumu görmek güzel. En basit çözüm, sıcaklık kontrol edilebilir bir aralığa ulaşana kadar "I" faktörünü devre dışı bırakmak olacaktır. Bu, değişikliklere çok hızlı yanıt verilmesini sağlayacaktır. Ardından gerçek sıcaklık değişikliğini gördüğümüzde ve istenen sonuca yaklaştığımızda, gerekli ekstra itmeyi eklemek için integrali yeniden etkinleştirin. Ayrıntılı bir cevap için teşekkürler!
Ryan Griggs

Ancak ayrılmaz terim onu ​​hızlandırmak için orada değil, sistematik bir hatayı düzeltmek için orada, özellikle de doğru olmayan orantılı bir katsayı için. Hayır? Ve bu durumda P resifi. her zaman mükemmel olamaz çünkü her iki borudaki su basıncına bağlı olarak değişecektir.
Roman Starkov

4

Bu süreci verimli bir şekilde kontrol etmenin anahtarı, sıcak ve soğuk muslukların simetrik olarak çalışmadığını ve herhangi bir optimal algoritmanın bunu dikkate alması gerektiğini anlamaktır.

Sıcak suyu bir süre kullanmadığınızda, boruda soğur.

Bir süre soğuk suyu kullanmadığınızda, olduğu gibi kalır (soğuk su, bir soğuk su deposundan bir chiller ile değilse, sıcak yaz günlerinde olması harika olurdu ama ben Bahis pratikte oldukça nadirdir).

Bu nedenle, sıcak su borusundan ne aldığımızı bilmediğimizi varsayıyoruz, ancak soğuk su borusunun bir çalışma boyunca hemen hemen sabit olmasına bağlı olabiliriz.

Böylece, karışık suyun sıcaklığından ve vana ayarının bilinmesinden ve soğuk suyun sıcaklığının bir tahmininden, sıcak su borusundan gelen suyun ne kadar sıcak olduğunu tahmin edebiliriz. Ardından, sadece bir termodinamik formülün değerlendirmesine dayanarak, PID olmadan doğru çıkış sıcaklığını elde etmek için vanayı ayarlayabilirsiniz.

"Soğuk suyun sıcaklığının tahminini" elde etmek için, döngünün başlangıcında kısa bir süre (belki birkaç saniye) soğuk su aktarabilir ve sıcaklığı okuyabilirsiniz. Ardından, her iki sıcaklık için çözülecek yeterli veriye sahip olmadığınız için daha sonra değişmeyeceğini varsayın.

Bu şema mükemmel bir şekilde doğru olmayacak, ancak sert bir aşım olasılığı olmadan basketbol sahasına gireceğini tahmin ediyorum. Ardından, sonuçlara ince ayar yapmak için PID'yi bu şemanın üstünde çalıştırırsınız, ancak değişikliği PID'nin üretmesine izin verilen vana ayarıyla sınırlandırırsınız. Sıcak su giriş sıcaklığında önemli değişiklikler olduğunda muhtemelen PID durumunu sıfırlayın.

Daha fazla sıcaklık sensörü ile daha ince çözümler mümkündür.


Başka bir harika cevap - PID kutusunun dışında düşünmek. Sadece su sıcaklıklarını test etmeyi ve istenen çıkış sıcaklığını sağlamak için yaklaşık vana pozisyonları ile bir çeşit arama tablosu oluşturmayı düşünmüştüm. Kışın soğuk olsa da, soğuğun nispeten sabit olduğu konusunda haklısınız. Su hatları yaklaşık 24-36 inçte gömülüdür ve burada genellikle ılıman sıcaklıklarımız vardır. Daha sonra maksimum sıcak su çıkış sıcaklığını (yaklaşık 120 F) hesaplayabilir ve ısınmadan sonra ince ayar için PID kullanarak vanaları uygun şekilde konumlandıran bir arama tablosu oluşturabilirim.
Ryan Griggs

1
Kuyu suyu derinliğe / kaynağa bağlı olarak sıcak yaz aylarında bile çok serin kalabilir. Ev borularında bulunan "soğuk" su, aşağıdan pompalanacak olandan daha sıcaktır. Böylece soğuk su aslında kullanımla soğur (yeraltı suyu sıcaklığına ulaşıncaya kadar). "Büyük şehre" gittiğimde hep "şaşırıyorum" ve soğuk su asla soğumaz.
rickhg12hs

2

Sadece kontrol mühendislerinin entegre sarma olanakları için ne yaptıklarıyla ilgili güzel cevaplara bir ayrıntı eklemek istedim. Bu aynı zamanda birçok endüstriyel süreçte de gerçekleşir ve bilimden ziyade bir sanattır.

Performans spesifikasyonu için gerçekten gerekli olabilecek integral kazançtan ödün vermeden buna karşı tipik ders kitabı eylemleri vardır.

  1. Sıfır hata seviyesini her geçtiğinizde entegratörü sıfırlarsınız. Bu, entegratörü kör bir akümülatör yerine isteğe bağlı bir doğrusal olmayan eleman tipi bir entegratör yapar.

  2. Temel olarak integral eylem giriş bloğunu döngüdeki gösterge elemanına bağlarsınız. Bu ya bütünleştiricinin birikime başlayıp başlamadığını yargılamak için çıktısı olabilir (bu da yargıyı uygun hale getirmek için sürecin anlaşılmasını gerektirir). Veya aktüatörlerinizin doymuş olup olmadığını kontrol edin ve bu bilgilere dayanarak bir geri bildirim döngüsü oluşturun. Google'dan gelen ilk bağlantıyı rastgele seçtim ve bu videonun sonunda son noktamın grafiksel bir açıklaması var. https://www.youtube.com/watch?v=H4YlL3rZaNw


İyi noktalar, fikri genişlettiğiniz için teşekkürler. Video için teşekkürler, sorunu çok iyi açıklıyor.
tomnexus

1

Bazen, sistem davranış aralığından diğerine geçerken anında değiştirdiğiniz, sistemin çalışma aralığının iri taneli aşamaları için birden fazla PID parametresi kümesine sahip olmak yardımcı olabilir. Örneğin, sıcak musluğu açtığınızda ve sadece soğuk su aldığınızda bir set Kp, Ki ve Kd; sıcaklık yükselişini görmeye başladığınızda, başka bir Kp, Ki & Kd setine geçin. Sonra ikisini buna göre ayarlayın.

Brett Beauregard'ın Arduino Oyun Parkı'ndaki PID Kütüphanesini mi kullanıyorsunuz? Bu oldukça hoş. Ve orada da bunun 'uyarlanabilir' bir örneği var.


Önerileriniz için teşekkürler. Pid kütüphanesini kullanmadığımda, nasıl çalıştığı hakkında daha fazla bilgi edinmek için kendim yazdım.
Ryan Griggs

İleri beslemeyi düşündünüz mü? Hızlı değişiklikler açık döngüden çıktıyı etkiler, bu nedenle tepki vermek için kapalı döngüyü beklemezsiniz.
Gregory Kornblum

Beynimi "ileri beslemenin" bu örnekte nasıl çalışacağına sarmaya çalışıyorum. Giriş istenen sıcaklık olur ve çıkış, bir arama tablosu veya basit bir denklem kullanarak valfleri önceden belirlenmiş bir konuma (yukarıdaki diğer açıklamamda tartışıldığı gibi) ayarlayacaktır?
Ryan Griggs

Geri bildiriminize ek olarak ileri beslemeyi de kullanabilirsiniz (kapalı döngü PID). Geri besleme denetleyicisinin eylemini, ileri beslemeli denetleyicinin eylemine eklemeniz yeterlidir. İdeal olarak, ileri beslemeli kontrolör vananın ters bir modeli olacaktır. Feedforward, temel olarak bir ayar noktası değişikliği üzerinde anında işlem yapmanızı sağlar. İleri besleme ve geri bildirimde bile, geri besleme kontrol kompansatöründeki düşüşü hesaba katmanız gerekir. Geri bildirim bileşeninin hesaba
katılması

1

Sistemi modelleydiniz mi?

Hedefi aşmayı gösteren bazı zamana dayalı verileriniz var mı?

Bunlar, herhangi bir kontrol tabanlı sorgu ile sorulması gereken iki sorudur.

Açıkladığınız kadarıyla, integral kazancınız çok yüksek, çok yüksek. Entegratör sargısından kaynaklanıyor olabilir: gösterilen kodun bazı gerçek pratik endişeleri vardır, bunlardan biri ayrı entegratörlerin en büyüğü değildir

  • Çok zayıf ayrık integratör topolojisi
  • P + I çıkışında yalnız I çıkışında kelepçe / limit yok

Eşit derecede olabilir, çünkü çok yüksektir ve azalması zaman alır.

Bu yüzden evet, I kaydında depolanan değerin ... 1000C kadar yaralanması olabilir, çünkü P + I, sistemin yanıtına ayarlanmadı ve sonra sarılması gerekiyor.

Yapacağım ilk şey, işlem sonrası için gerçek zamanlı verileri yakalamaktır.Sonraki sadece P'yi çalıştıracak ve orantılı kazancın ALMOST'a istenen sıcaklığa ulaşmasını sağlayacağım (kontrol teorisi bunu yapmayacağını belirtir). Bağlı olarak

  1. Uygun I kazancını belirlemeyi kolaylaştıran mevcut yakalama verilerinin analizi
  2. Uygun kazançlar elde etmek için bir bitki modeli türetilir

Daha iyi bir uygulama olmak için PID kodunu değiştirerek başlayacağım ve sonra sadece bir noktayı kanıtlamak için küçük bir parça ekleyeceğim.

Bu kazançların neye karşı olduğunu gerçekten belirlemeniz gerekir. Giriş sıcaklık, çıkış ... akış? bu nedenle bir akış / C transferi ve bir Akış / C transferi işlevi olmalıdır.


İyi cevap, teşekkürler. Sistemi henüz modelleyemedim, çünkü henüz nasıl olduğunu bilmiyorum - bu çalışmada ayaklarımı ıslatmaya başladım. I değerinin makul sınırların dışına çıkması konusunda haklısınız. Beni Entegratör için daha iyi bir uygulama algoritmasına yönlendirebilir misiniz? Pseudocode en iyisidir, çünkü kodu kopyala / yapıştır yerine kendi kelimelerime yerleştirmeme izin verir. Ayrıca, böyle basit sistemleri modellemek için beni herhangi bir girişe yönlendirebilir misiniz? Akış seviyelerinin (sıcak ve soğuk karışım) bu sistemin çıktıları olduğu doğrudur. Şu anda ters orantılı H / C.
Ryan Griggs

1
Kısa süre sonra bir tweak ekleyeceğim
JonRB

1

İntegral Windup'ı çözmeyi sevdiğim bir yol , kontrol çıktınız maksimum sapmada olduğunda hatayı biriktirmeyi bırakmaktır . Veya maksimum sapmadan ne kadar uzakta olduğunu ölçeklendirin. Bu nedenle, kontrol cihazınız "% 100 sıcak su,% 0 soğuk su" çıkardığında, hatayı biriktirmeyin, ancak sıfıra sıfırlamayın.

İntegrali maksimuma sınırlamaktan hoşlanmam çünkü PID'nizin hangi sistematik hatanın telafi edebileceği konusunda bir sınır var.

Ayrıca, altta yatan sistem hakkında bilgi sahibi olmadan kontrol etmeye çalıştığı sadece bir parametreye sahip bir "aptal" PID yapmak yerine, hem sıcak hem de soğuk girdiye iki ekstra sıcaklık sensörü taktığınızı öneririm. Daha sonra, giriş sıcaklıklarına göre istenen konuma yaklaşan bir işlev bulmaya çalışırsınız ve bu işlevin çıkışındaki hatayı ayarlamak için yalnızca PID döngüsünü kullanırsınız .

Hata önemli olacaktır, çünkü sadece vana konumlarına (bilinen) değil, aynı zamanda su basıncına da (bilinmeyen) bağlı olan akışı (tabii ki yapmazsanız iyi) ölçmezsiniz.

Yine de, bu, sıcak su probleminin nihayetinde musluğa ulaşmasıyla çok yardımcı olacaktır, çünkü iyi sönümlü bir PID döngüsünde, sıcak akışı hızlı bir şekilde azaltmak için D elemanının iyi kalibre edilmesine güvenmeniz gerekir. Deneyimlerime göre, türev katsayısını doğru elde etmek genellikle en zor olandır. Ancak, iki ekstra sensöre sahip olsaydınız, ana çıkış, giriş suyu sıcaklığı kadar hızlı bir şekilde değişecekti, bu yüzden temelde anında, türev elemente hiç gerek kalmadan.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.