Algoritma PID: cara menghitung perubahan nilai input cepat setelah penundaan lama

15

Saya mencoba menerapkan algoritma PID dasar pada Arduino Leonardo untuk mencampur air keran panas dan dingin menggunakan katup yang dikontrol servo. Tujuannya adalah menahan suhu sedekat mungkin dengan setpoint. Terutama penting adalah mencegah suhu output dari overshooting setpoint untuk melindungi pengguna dari luka bakar. Yang penting kedua adalah mendapatkan suhu di dekat setpoint secepat mungkin.

Untuk perubahan kecil dalam suhu, implementasi standar dari algoritma PID tampaknya berfungsi dengan baik. Tetapi saya tidak tahu bagaimana menghitung keterlambatan lama yang mungkin terjadi ketika menunggu air panas mencapai katup, karena penundaan ini jauh lebih lama daripada penundaan standar setelah mengubah posisi katup.

Jelas tergantung pada panjang saluran air panas dan waktu sejak penggunaan terakhir air panas, perlu beberapa puluh detik agar air panas mencapai katup, sehingga selama waktu ini, suhu air tetap cukup konstan pada suhu rendah. dan katup air panas segera terbuka 100%. Komponen integral mulai mengakumulasi nilai kesalahan besar.

Ketika air panas akhirnya mencapai katup, suhu yang terdeteksi naik dengan sangat cepat ke suhu air panas maks. Karena kesalahan integral yang besar, katup air panas ditahan pada 100% untuk waktu yang lama setelah suhu melebihi setpoint, karena menunggu nilai integral dikurangi menjadi level normal. Dengan demikian hasilnya adalah air bersuhu maksimum selama beberapa (puluhan) detik.

Saya tidak yakin bagaimana menjelaskan kemungkinan keterlambatan yang lama ini. Dalam kasus seperti itu, apakah lebih bijaksana untuk menetapkan batas atas (dan bawah) pada nilai kesalahan integral, untuk membatasi waktu respons maks? Ini tampaknya mengalahkan tujuan komponen integral, dan juga masih akan memaksakan beberapa kelambatan setelah mencapai setpoint.

Atau apakah ada cara yang lebih baik untuk menangani perubahan input cepat setelah penundaan yang lama?

Terima kasih atas sarannya!

Ryan Griggs
sumber
1
Sebenarnya, saya bertanya-tanya apakah Anda memerlukan aksi-sama sekali, karena saya pikir perubahan suhu air relatif lambat dibandingkan dengan aktuasi katup. Lebih buruk lagi, Anda mungkin mendapatkan perilaku berosilasi karena margin fase yang sangat buruk kemungkinan besar Anda dapatkan (sistem Anda mungkin stabil secara teori, tetapi mungkin tidak pernah berhenti berosilasi dalam praktik, karena tindakan-I menambah fase lag). Juga, karena Anda mungkin akan membakar orang, saya tidak bisa cukup menekankan untuk melihat komentar Chu dan JonRB!
Sanchises

Jawaban:

15

Masalah Anda disebut Integral Windup , itu masalah kontrol yang umum. Di wilayah non-linier atau berbatasan lain, pengontrol tidak dapat melacak setpoint, dan integral meningkat ke nilai besar. Ini menyebabkan overshoot besar ketika setpoint akhirnya tercapai, yang persisnya yang Anda simpulkan adalah masalahnya.

Solusi paling sederhana adalah membatasi nilai Integrator itu sendiri hingga maksimum yang masuk akal. Membatasi kontribusi integral tidak akan berfungsi juga, karena integrator masih akan mencapai beberapa nilai besar.

Mathworks memiliki halaman dengan beberapa solusi lain untuk windup integral.

Dalam kontroler PID, Anda biasanya ingin istilah integral sesedikit mungkin. Dalam katup kontrol suhu mekanis standar, hanya kontrol proporsional yang digunakan, dan berfungsi dengan baik. Simpan istilah integral sekecil mungkin - pengguna tidak akan melihat kesalahan kecil pada suhu akhir. Anda mungkin menemukan bahwa Anda mendapatkan kinerja yang dapat diterima hanya dengan PD.

Karena ini adalah kasus yang sangat istimewa dan diketahui, Anda mungkin mempertimbangkan memiliki mode yang berbeda untuk pengontrol. Ukur suhu inlet panas, dan saat itu di bawah setpoint, jalankan hot 100%, dingin 20%. Saat memanas, alihkan ke PID, dengan kondisi awal yang baik.

tomnexus
sumber
1
Iya. Idealnya Anda dapat mengukur suhu saluran masuk panas secara mandiri, dan menghambat putaran seperti itu.
Brian Drummond
2
Wind-up mungkin menjadi masalah, tetapi jika integrator tidak diterapkan, misalnya, efek destabilisasi dari penundaan masih tetap ada. Smith Predictor adalah metode yang baik untuk mengurangi efek dari penundaan waktu murni. Mengatasi integrator wind-up saja tidak melakukan apa pun untuk mengatasi kelambatan fase inheren yang diperkenalkan oleh penundaan waktu.
Chu
2
tepatnya, saya tidak berpikir ini adalah windup integrator murni, bahkan jika itu. ini merupakan kekhawatiran sah yang harus selalu dimitigasi untuk BAHKAN jika operasi normal tidak mengenai kondisi yang diperlukan
JonRB
Wow, jawaban yang bagus! Saya berpikir sepanjang garis ini (membatasi nilai maksimum integrator) tetapi tidak mengucapkan pertanyaan dengan benar sehingga saya salah paham. Sangat bagus untuk melihat bahwa saya setidaknya di stadion baseball dengan solusi. Saya pikir solusi paling sederhana adalah dengan menonaktifkan faktor "I" sampai suhu mencapai kisaran yang dapat dikontrol. Ini akan memungkinkan respons yang sangat cepat terhadap perubahan. Kemudian ketika kita melihat beberapa perubahan suhu aktual dan mendekati hasil yang diinginkan, aktifkan kembali integral untuk menambahkan dorongan tambahan yang dibutuhkan. Terima kasih atas jawaban terinci!
Ryan Griggs
Tetapi istilah integral tidak ada di sana untuk mempercepatnya, ada di sana untuk memperbaiki kesalahan sistematis, terutama koefisien proporsional yang tidak tepat. Tidak? Dan dalam situasi ini P. coef. tidak bisa sempurna sepanjang waktu karena akan bervariasi tergantung pada tekanan air di kedua pipa.
Roman Starkov
4

Kunci untuk mengendalikan proses ini secara efisien adalah menyadari bahwa keran panas dan dingin tidak beroperasi secara simetris, dan algoritma optimal apa pun harus mempertimbangkan hal ini.

Ketika Anda tidak menggunakan air panas untuk sementara waktu, itu akan mendingin di dalam pipa.

Ketika Anda tidak menggunakan air dingin untuk sementara waktu, itu tetap sama seperti sebelumnya (kecuali air dingin berasal dari tangki air dingin dengan chiller, yang akan luar biasa untuk dimiliki pada hari-hari musim panas tetapi saya taruhan sangat jarang terjadi dalam latihan).

Jadi kita berasumsi kita tidak tahu apa yang kita dapatkan dari pipa air panas, tetapi kita dapat bergantung pada pipa air dingin yang cukup konstan selama menjalankan.

Jadi, dari suhu air campuran, dan dari mengetahui pengaturan katup, dan dari perkiraan suhu air dingin, kita dapat memperkirakan seberapa panas air yang berasal dari pipa air panas. Kemudian Anda dapat menyesuaikan katup untuk mendapatkan suhu keluaran yang benar tanpa PID, hanya berdasarkan evaluasi formula termodinamika.

Untuk mendapatkan "perkiraan suhu air dingin" Anda dapat menjalankan air dingin untuk waktu yang singkat (mungkin beberapa detik) di awal siklus dan membaca suhu. Kemudian asumsikan itu tidak akan berubah setelahnya, karena Anda tidak memiliki cukup data untuk menyelesaikan kedua suhu.

Skema ini tidak akan benar-benar akurat, tetapi saya memperkirakan itu akan masuk dengan aman di ballpark tanpa kemungkinan overshooting drastis. Kemudian Anda menjalankan PID di atas skema ini untuk menyempurnakan hasilnya, tetapi batasi perubahan pada pengaturan katup yang PID diizinkan untuk menghasilkan. Dan mungkin mengatur ulang status PID ketika Anda memiliki perubahan signifikan dalam suhu input air panas.

Solusi yang lebih bagus dimungkinkan dengan beberapa sensor suhu.

Atsby
sumber
Jawaban hebat lainnya - berpikir di luar kotak PID. Saya telah mempertimbangkan hanya menguji suhu air dan membuat semacam tabel pencarian dengan perkiraan posisi katup untuk menghasilkan suhu keluaran yang diinginkan. Anda benar bahwa dingin relatif konstan, meskipun mungkin lebih dingin di musim dingin. Garis air terkubur sekitar 24-36 inci dan kami biasanya memiliki suhu sedang di sini. Kemudian saya juga bisa menjelaskan suhu output air panas maksimum (sekitar 120 F) dan membuat tabel pencarian yang menempatkan katup dengan tepat, menggunakan PID untuk fine-tuning setelah pemanasan.
Ryan Griggs
1
Air sumur dapat tetap sangat dingin bahkan selama musim panas yang hangat tergantung pada kedalaman / sumbernya. Air "dingin" yang berada di pipa rumah lebih hangat daripada yang dipompa dari bawah. Jadi air dingin benar-benar menjadi lebih dingin dengan penggunaan (sampai mendekati suhu air bawah tanah). Saya selalu "terkejut" ketika saya pergi ke "kota besar" dan air dingin tidak pernah menjadi dingin.
rickhg12hs
2

Saya hanya ingin menambahkan satu detail pada jawaban-jawaban yang bagus di atas tentang apa yang dilakukan oleh para insinyur kontrol untuk kemungkinan akhir yang integral. Ini juga terjadi dalam banyak proses industri dan ini lebih merupakan seni daripada sains.

Ada tindakan buku teks khas terhadap ini tanpa mengorbankan dari keuntungan integral yang mungkin benar-benar diperlukan untuk spesifikasi kinerja.

  1. Setiap kali Anda melewati level kesalahan nol, Anda mengatur ulang integrator. Ini menjadikan integrator tipe integer on-demand elemen nonlinier alih-alih akumulator buta.

  2. Anda pada dasarnya menghubungkan blok input tindakan integral ke elemen indikatif dalam loop. Ini mungkin merupakan output integrator untuk menilai apakah ia memulai build-up (yang membutuhkan pemahaman proses untuk membuat penilaian menjadi tepat). Atau Anda memeriksa apakah aktuator Anda jenuh atau tidak dan membentuk loop umpan balik berdasarkan informasi itu. Saya baru saja secara acak memilih tautan pertama yang keluar dari google dan di akhir video ini ada penjelasan grafis tentang poin terakhir saya. https://www.youtube.com/watch?v=H4YlL3rZaNw

perkusi
sumber
Poin bagus, terima kasih telah memperluas ide. Terima kasih untuk videonya, ini menjelaskan masalahnya dengan sangat baik.
tomnexus
1

Kadang-kadang dapat bermanfaat untuk memiliki beberapa set parameter PID, untuk tahapan kasar dari rentang operasi sistem, yang Anda ubah dengan cepat saat sistem beralih dari satu tahap perilaku ke tahap perilaku lainnya. Misalnya, satu set Kp, Ki, & Kd untuk saat Anda menghidupkan keran panas & hanya mendapatkan air dingin; kemudian setelah Anda mulai melihat suhu naik, beralih ke perangkat Kp, Ki & Kd. Kemudian selaraskan keduanya.

Apakah Anda menggunakan PID Library di Arduino Playground oleh Brett Beauregard? Yang ini cukup bagus. Dan ada contoh 'adaptif' di sini juga.

Techydude
sumber
Terima kasih atas sarannya. Tidak menggunakan perpustakaan pid, saya menulis sendiri untuk mempelajari lebih lanjut tentang cara kerjanya.
Ryan Griggs
Apakah Anda mempertimbangkan umpan maju? Ini seperti perubahan cepat memengaruhi output melalui loop terbuka, jadi Anda tidak perlu menunggu loop tertutup untuk bereaksi.
Gregory Kornblum
Saya mencoba untuk membungkus otak saya di sekitar bagaimana "umpan maju" akan bekerja dalam hal ini. Apakah input menjadi suhu yang diinginkan, dan output akan mengatur katup ke posisi yang ditentukan sebelumnya (seperti yang dibahas dalam komentar saya yang lain di atas) menggunakan tabel pencarian atau persamaan sederhana?
Ryan Griggs
Anda dapat menggunakan feedforward sebagai tambahan umpan balik Anda (PID loop tertutup). Anda cukup menambahkan tindakan pengontrol umpan balik ke tindakan pengontrol feedforward. Idealnya pengontrol feedforward akan menjadi model terbalik dari katup. Feedforward pada dasarnya memberi Anda tindakan instan pada perubahan setpoint. Bahkan dengan umpan maju plus umpan balik Anda masih perlu menghitung untuk windup di kompensator kontrol umpan balik. Komponen umpan balik perlu diperhitungkan.
docscience
1

Sudahkah Anda memodelkan sistem?

Apakah Anda memiliki beberapa data berbasis waktu yang menunjukkan overshoot - terutama freq

Ini adalah dua pertanyaan yang harus ditanyakan dengan kueri berbasis kontrol.

Dari apa yang telah Anda jelaskan, keuntungan integral Anda terlalu tinggi, jalan menuju tinggi. Ini bisa disebabkan oleh integrator windup: kode yang ditampilkan memiliki beberapa keprihatinan praktis yang salah satunya adalah bukan integrator diskrit terbesar

  • Topologi integrator diskrit yang sangat buruk
  • Tidak ada klem / batas pada output I apalagi pada output P + I

Bisa juga karena sangat tinggi dan butuh waktu untuk turun.

Jadi ya nilai yang disimpan dalam register I bisa saja mengatakan ... 1000C karena P + I tidak diatur ke respons sistem dan kemudian harus ditutup.

Hal pertama yang akan saya lakukan adalah menangkap data realtime untuk pemrosesan pasca. Selanjutnya saya akan menjalankan P-only dan memastikan perolehan proporsional mencapai HAMPIR suhu yang diinginkan (teori kontrol menyatakan tidak akan). Tergantung pada apakah

  1. Analisis data penangkapan saat ini memfasilitasi dalam menentukan sesuai yang saya dapatkan
  2. Model pabrik diturunkan untuk menciptakan keuntungan yang sesuai

Saya akan mulai dengan mengubah kode PID menjadi implementasi yang lebih baik dan kemudian menambahkan sedikit dari saya, hanya untuk membuktikan suatu hal.

Anda benar-benar perlu menentukan apa yang dimaksudkan untuk menentang kenaikan ini. Input adalah suhu, outputnya ... mengalir? jadi harus ada transfer aliran / C dan fungsi transfer Flow / Cs.

JonRB
sumber
Jawaban yang bagus juga, terima kasih. Saya belum membuat model sistemnya, karena saya belum tahu caranya - baru mulai membuat kaki saya basah dalam penelitian ini. Anda benar bahwa nilai I meningkat melebihi batas yang wajar. Bisakah Anda mengarahkan saya ke algoritma implementasi yang lebih baik untuk Integrator? Pseudocode adalah yang terbaik, karena memungkinkan saya untuk belajar dan memasukkan kode ke kata-kata saya sendiri, daripada menyalin / menempel. Juga, dapatkah Anda mengarahkan saya ke perkenalan untuk memodelkan sistem sederhana seperti ini? Anda benar bahwa level aliran (campuran panas & dingin) adalah output dari sistem ini. Saat ini hanya berbanding terbalik H / C.
Ryan Griggs
1
Saya akan menambahkan tweak segera
JonRB
1

Salah satu cara yang saya sukai untuk menyelesaikan Integral Windup adalah dengan menghentikan akumulasi kesalahan setiap kali output kontrol Anda berada pada defleksi maksimum. . Atau skala dengan seberapa jauh dari defleksi maksimum. Jadi, setiap kali pengontrol Anda menghasilkan "air panas 100%, air dingin 0%", jangan mengakumulasi kesalahan, tetapi jangan mengatur ulang ke nol.

Saya tidak suka membatasi integral ke maksimum karena dengan demikian ada batas kesalahan sistematis yang dapat dikompensasi oleh PID Anda.

Saya juga menyarankan bahwa alih-alih membuat PID "bisu" yang hanya memiliki satu parameter yang coba dikontrol tanpa sepengetahuan sistem yang mendasarinya, Anda menginstal dua sensor suhu ekstra, pada input panas dan dingin. Anda kemudian mencoba untuk menemukan fungsi yang mendekati posisi yang diinginkan berdasarkan pada suhu input, dan Anda hanya menggunakan loop PID untuk menyesuaikan kesalahan. dalam output fungsi ini.

Kesalahannya akan signifikan karena Anda tidak mengukur aliran (yah, kecuali tentu saja Anda lakukan), yang tidak hanya bergantung pada posisi katup (diketahui) tetapi juga pada tekanan air (tidak diketahui).

Namun, ini akan banyak membantu dengan masalah air panas akhirnya mencapai keran karena dalam loop PID yang baik, Anda harus mengandalkan elemen D yang dikalibrasi dengan baik untuk dengan cepat mengurangi aliran panas. Dalam pengalaman saya mendapatkan koefisien turunan yang benar biasanya yang paling sulit. Tetapi jika Anda memiliki dua sensor tambahan, output utama akan berubah persis secepat suhu air input, jadi pada dasarnya instan, tanpa perlu elemen turunan sama sekali.

Roman Starkov
sumber