Algoritmo PID: come tenere conto delle variazioni rapide del valore di input dopo un lungo ritardo


15

Sto cercando di implementare un algoritmo PID di base su un Arduino Leonardo per miscelare acqua di rubinetto calda e fredda utilizzando valvole servocontrollate. L'obiettivo è mantenere la temperatura il più vicino possibile a un setpoint. Particolarmente importante è impedire che la temperatura di uscita superi il setpoint per proteggere l'utente dalle ustioni. Secondariamente importante è far arrivare la temperatura vicino al setpoint il più rapidamente possibile.

Per piccoli cambiamenti di temperatura, un'implementazione standard dell'algoritmo PID sembra funzionare correttamente. Ma non so come spiegare i lunghi ritardi che possono verificarsi quando si attende che l'acqua calda raggiunga la valvola, poiché questi ritardi sono molto più lunghi dei ritardi standard dopo aver cambiato le posizioni della valvola.

Ovviamente a seconda della lunghezza della linea dell'acqua calda e del tempo dall'ultimo utilizzo di acqua calda, possono essere necessarie più decine di secondi affinché l'acqua calda raggiunga la valvola, quindi durante questo periodo la temperatura dell'acqua rimane abbastanza costante a bassa temperatura e la valvola dell'acqua calda si apre presto al 100%. Il componente integrale inizia ad accumulare un valore di errore elevato.

Quando l'acqua calda raggiunge finalmente la valvola, la temperatura rilevata aumenta molto rapidamente fino alla temperatura massima dell'acqua calda. A causa del grande errore integrale, la valvola dell'acqua calda viene mantenuta al 100% per lungo tempo dopo che la temperatura supera il setpoint, a causa dell'attesa sul valore integrale ridotto a livelli normali. Pertanto il risultato è acqua a temperatura massima per diversi (decine) di secondi.

Non sono sicuro di come spiegare questo possibile lungo ritardo. In tal caso, sarebbe saggio impostare un limite superiore (e inferiore) sul valore di errore integrale, al fine di limitare il tempo massimo di risposta? Questo sembra vanificare lo scopo del componente integrale e imporrebbe comunque un certo ritardo dopo aver raggiunto il setpoint.

Oppure esiste un modo migliore per gestire le modifiche di input veloci dopo un lungo ritardo?

Grazie per qualsiasi consiglio!


1
In effetti, mi chiedo se hai bisogno dell'azione I, perché penso che i cambiamenti della temperatura dell'acqua siano relativamente lenti rispetto all'attuazione della valvola. Peggio ancora, potresti avere un comportamento oscillatorio a causa del margine di fase estremamente scarso che potresti ottenere (il tuo sistema potrebbe essere stabile in teoria, ma potrebbe non smettere mai di oscillare in pratica, perché I-action aggiunge ritardo di fase). Inoltre, poiché probabilmente brucerai le persone, non posso stressarmi abbastanza da dare un'occhiata ai commenti di Chu e JonRB!
Sanchises,

Risposte:


15

Il tuo problema si chiama Integral Windup , è un problema di controllo comune. In una regione non lineare o altrimenti limitata, il controller non è in grado di tracciare il setpoint e l'integrale aumenta a un valore elevato. Ciò provoca un grande superamento quando viene finalmente raggiunto il setpoint, che è esattamente quello che hai dedotto è il problema.

La soluzione più semplice è limitare il valore dell'integratore stesso a un massimo ragionevole. Limitazione del contributo integrale non funzionerà altrettanto bene, poiché l'integratore verrà comunque portato a un valore elevato.

Mathworks ha una pagina con alcune altre soluzioni per il windup integrale.

In un controller PID, in genere si desidera il minor numero possibile di termini integrali. In una valvola di controllo della temperatura meccanica standard, viene utilizzato solo il controllo proporzionale e funzionano bene. Mantieni il termine integrale il più piccolo possibile: l'utente non noterà un piccolo errore nella temperatura finale. Potresti scoprire di ottenere prestazioni accettabili solo con PD.

Dato che si tratta di un caso molto particolare e noto, potresti considerare di avere una modalità diversa per il controller. Misurare la temperatura dell'ingresso caldo e, mentre è al di sotto del setpoint, eseguire solo caldo 100%, freddo 20%. Quando si riscalda, passa al PID, con buone condizioni iniziali.


1
Sì. Idealmente, è possibile misurare la temperatura dell'ingresso caldo in modo indipendente e inibire l'avvolgimento in quel modo.
Brian Drummond,

2
Il wind-up può essere un problema, ma se l'integratore non fosse implementato, ad esempio, l'effetto destabilizzante del ritardo rimarrebbe comunque. Smith Predictor è un buon metodo per mitigare gli effetti di un puro ritardo. Affrontare da soli l'integratore wind-up non fa nulla per superare il ritardo di fase inerente introdotto dal ritardo.
Chu,

2
esattamente, non penso che questo sia puramente un integratore, anche se lo è. è una preoccupazione valida che dovrebbe sempre essere mitigata per ANCHE se le normali operazioni non raggiungono le condizioni necessarie
JonRB

Caspita, ottima risposta! Stavo pensando su questa linea (limitando il valore massimo dell'integratore) ma non ho formulato correttamente la domanda, quindi sono stato frainteso. È bello vedere che sono almeno nel campo da baseball con una soluzione. Sto pensando che la soluzione più semplice sarebbe quella di disabilitare il fattore "I" fino a quando la temperatura non raggiunge un intervallo controllabile. Ciò consentirebbe una risposta molto rapida ai cambiamenti. Quindi quando vediamo un effettivo cambiamento di temperatura e ci avviciniamo al risultato desiderato, riattiva l'integrale per aggiungere la spinta extra necessaria. Grazie per una risposta dettagliata!
Ryan Griggs,

Ma il termine integrale non è lì per accelerarlo, è lì per correggere un errore sistematico, in particolare un coefficiente proporzionale che non è del tutto corretto. No? E in questa situazione il P coef. non può essere sempre perfetto perché varierà a seconda della pressione dell'acqua in entrambi i tubi.
Roman Starkov,

4

La chiave per controllare efficacemente questo processo è rendersi conto che i rubinetti caldo e freddo non funzionano in modo simmetrico e qualsiasi algoritmo ottimale deve tenerne conto.

Quando non usi l'acqua calda per un po ', si raffredda nel tubo.

Quando non usi l'acqua fredda per un po ', rimane la stessa di sempre (a meno che l'acqua fredda non provenga da un serbatoio di acqua fredda con un refrigeratore, che sarebbe fantastico avere nelle calde giornate estive ma io sono le scommesse sono piuttosto rare in pratica).

Quindi supponiamo di non sapere cosa otteniamo dal tubo dell'acqua calda, ma possiamo dipendere dal fatto che il tubo dell'acqua fredda sia praticamente costante durante una corsa.

Pertanto, dalla temperatura dell'acqua miscelata e dalla conoscenza dell'impostazione della valvola e da una stima della temperatura dell'acqua fredda, possiamo stimare quanto sia calda l'acqua attualmente proveniente dal tubo dell'acqua calda. Quindi è possibile regolare la valvola per ottenere la temperatura di uscita corretta senza PID, basandosi solo sulla valutazione di una formula termodinamica.

Per ottenere la "stima della temperatura dell'acqua fredda" è possibile eseguire acqua fredda per un breve periodo (forse pochi secondi) all'inizio del ciclo e leggere la temperatura. Quindi supponi che non cambierà in seguito, poiché non hai abbastanza dati da risolvere per entrambe le temperature.

Questo schema non sarà perfettamente accurato, ma stima che entrerà in modo affidabile all'interno del campo da baseball senza la possibilità di un drastico superamento. Quindi si esegue PID sopra questo schema per ottimizzare i risultati, ma limitare la modifica all'impostazione della valvola che il PID è autorizzato a produrre. E possibilmente resettare lo stato PID in caso di cambiamenti significativi nella temperatura di ingresso dell'acqua calda.

Sono possibili soluzioni più elaborate con più sensori di temperatura.


Un'altra grande risposta: pensare fuori dagli schemi PID. Avevo preso in considerazione il solo test delle temperature dell'acqua e la creazione di una sorta di tabella di ricerca con posizioni approssimative della valvola per ottenere la temperatura di uscita desiderata. Hai ragione sul fatto che il freddo è relativamente costante, anche se forse più freddo in inverno. Le linee d'acqua sono sepolte a circa 24-36 pollici e di solito qui abbiamo temperature miti. Quindi potrei anche tenere conto della massima temperatura di uscita dell'acqua calda (circa 120 F) e creare una tabella di ricerca che posiziona le valvole in modo appropriato, usando PID per la regolazione fine dopo il riscaldamento.
Ryan Griggs,

1
L'acqua di pozzo può rimanere molto fresca anche durante le estati calde a seconda della profondità / sorgente. L'acqua "fredda" che riposa nei tubi della casa è più calda di quella che verrà pompata dal basso. Quindi l'acqua fredda diventa effettivamente più fredda con l'uso (fino a quando non si avvicina alla temperatura dell'acqua sotterranea). Sono sempre "sorpreso" quando vado nella "grande città" e l'acqua fredda non fa mai freddo.
rickhg12hs

2

Volevo solo aggiungere un dettaglio alle belle risposte sopra su cosa fanno gli ingegneri di controllo per le possibilità di liquidazione integrate. Ciò accade anche in molti processi industriali ed è un'arte piuttosto che una scienza.

Ci sono azioni tipiche da manuale contro questo senza sacrificare il guadagno integrale che potrebbe essere realmente richiesto per le specifiche di prestazione.

  1. Ogni volta che si supera il livello di errore zero, si reimposta l'integratore. Ciò rende l'integratore un tipo di elemento non lineare integratore on demand anziché un accumulatore cieco.

  2. Fondamentalmente si collega il blocco di input dell'azione integrale a un elemento indicativo nel loop. Questo potrebbe essere l'output dell'integratore per giudicare se ha iniziato l'accumulo (che richiede una comprensione del processo per rendere il giudizio corretto). Oppure controlli se i tuoi attuatori sono saturi o meno e formano un circuito di feedback basato su tali informazioni. Ho appena scelto a caso il primo link che è uscito da Google e alla fine di questo video c'è una spiegazione grafica del mio ultimo punto. https://www.youtube.com/watch?v=H4YlL3rZaNw


Aspetti positivi, grazie per l'espansione dell'idea. Grazie per il video, spiega molto bene il problema.
Tomnexus,

1

A volte può essere utile disporre di più insiemi di parametri PID, per fasi a grana grossa della gamma di operazioni del sistema, che si cambia al volo quando il sistema passa da una fase del comportamento a un'altra. Ad esempio, un set di Kp, Ki e Kd per quando si attiva il rubinetto caldo e si ottiene solo acqua fredda; quindi una volta che inizi a vedere aumentare la temperatura, passa a un altro set di Kp, Ki e Kd. Quindi sintonizzare i due di conseguenza.

Stai utilizzando la libreria PID nel parco giochi Arduino di Brett Beauregard? Questo è abbastanza carino. E c'è anche un esempio "adattivo" di questo.


Grazie per i suggerimenti Non usando la libreria pid, l'ho scritto io stesso per saperne di più su come funziona.
Ryan Griggs,

Hai considerato feed forward? È come se le modifiche rapide influissero sull'output attraverso un circuito aperto, quindi non aspetti che il circuito chiuso reagisca.
Gregory Kornblum,

Sto cercando di avvolgere il mio cervello su come funzionerebbe "feed forward" in questo caso. L'ingresso sarebbe la temperatura desiderata e l'uscita imposterebbe le valvole in una posizione predeterminata (come discusso nell'altro mio commento sopra) usando una tabella di ricerca o una semplice equazione?
Ryan Griggs

È possibile utilizzare feedforward in aggiunta al feedback (PID a circuito chiuso). È sufficiente aggiungere l'azione del controller di feedback all'azione del controller feedforward. Idealmente, il controller feedforward sarebbe un modello inverso della valvola. Feedforward offre essenzialmente un'azione istantanea su una modifica del setpoint. Anche con feedforward plus feedback è comunque necessario tenere conto dell'avvolgimento nel compensatore del controllo feedback. La componente di feedback deve essere presa in considerazione.
docscience,

1

Hai modellato il sistema?

Hai dei dati basati sul tempo che mostrano il superamento - in particolare la frequenza

Queste sono due domande che dovrebbero essere poste con qualsiasi query basata sul controllo.

Da quello che hai descritto, il tuo guadagno integrale è troppo alto, troppo alto. Potrebbe essere dovuto all'avvolgimento dell'integratore: il codice mostrato presenta alcune reali preoccupazioni pratiche, una delle quali è che non è il massimo degli integratori discreti

  • Topologia dell'integratore discreta molto scarsa
  • Nessun morsetto / limite sull'uscita I e tanto meno sull'uscita P + I

Allo stesso modo potrebbe essere perché è molto alto e ci vuole tempo per diminuire.

Quindi sì, il valore memorizzato nel registro I potrebbe essere finito per dire ... 1000C perché il P + I non è stato impostato sulla risposta del sistema e quindi deve finire.

La prima cosa che farei è acquisire dati in tempo reale per la post-elaborazione. Successivamente eseguirò solo P e assicurerei che il guadagno proporzionale raggiungesse Successivamente eseguirò QUASI la temperatura desiderata (la teoria del controllo afferma che non lo farà). A seconda se

  1. Analisi dei dati di acquisizione attuali facilitando nel determinare guadagno adatto
  2. Viene derivato un modello di impianto per creare guadagni adeguati

Vorrei iniziare modificando il codice PID per un'implementazione migliore e quindi aggiungere un po 'di me, solo per dimostrare un punto.

Hai davvero bisogno di determinare a cosa sono destinati questi guadagni contro. L'ingresso è temperatura, l'uscita è ... flusso? quindi dovrebbe esserci un trasferimento di flusso / C e una funzione di trasferimento di flusso / Cs.


Buona risposta anche, grazie. Non ho modellato il sistema, in quanto non so ancora - sto solo cominciando a bagnarmi i piedi in questo studio. Hai ragione sul fatto che il valore I aumenta da limiti ragionevoli. Potete indirizzarmi verso un algoritmo di implementazione migliore per Integrator? Lo pseudocodice è il migliore, in quanto mi consente di imparare e inserire il codice nelle mie parole, piuttosto che copiare / incollare. Inoltre, puoi indirizzarmi a qualsiasi introduzione alla modellazione di sistemi semplici come questo? È corretto che i livelli di flusso (miscela calda e fredda) siano le uscite di questo sistema. Attualmente è solo inversamente proporzionale H / C.
Ryan Griggs,

1
Aggiungerò presto una modifica
JonRB

1

Un modo in cui mi piace risolvere Integral Windup è quello di smettere di accumulare l'errore ogni volta che l'uscita di controllo è alla sua massima deflessione . O ridimensionalo di quanto dista dalla massima deflessione. Pertanto, ogni volta che il controller emette "acqua calda 100%, acqua fredda 0%", non accumulare l'errore, ma non reimpostarlo su zero.

Non mi piace limitare l'integrale al massimo perché poi c'è un limite a quale errore sistematico può compensare il tuo PID.

Vorrei anche suggerire che invece di creare un PID "stupido" che ha solo un parametro che sta cercando di controllare senza conoscere il sistema sottostante, si installano due sensori di temperatura extra, sia sull'ingresso caldo che su quello freddo. Quindi si tenta di trovare una funzione che si avvicina alla posizione desiderata in base alle temperature di ingresso e si utilizza solo il loop PID per regolare l' errore nell'output di questa funzione.

L'errore sarà significativo perché non si misura il flusso (bene, a meno che non lo si faccia ovviamente), che dipende non solo dalle posizioni delle valvole (note) ma anche dalla pressione dell'acqua (sconosciute).

Tuttavia, questo dovrebbe aiutare molto con il problema che l'acqua calda raggiunga finalmente il rubinetto perché in un circuito PID ben smorzato, devi fare affidamento sull'elemento D che è ben calibrato per ridurre rapidamente il flusso caldo. Nella mia esperienza, ottenere il coefficiente derivativo corretto è di solito il più difficile. Ma se avessi i due sensori extra, l'uscita principale cambierebbe esattamente con la stessa rapidità della temperatura dell'acqua in ingresso, quindi sostanzialmente istantanea, senza alcun elemento derivativo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.