Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Pid : Problema Con Pid Diretto Ed Inverso


Messaggi consigliati

Inserito:

... è il mio primo messaggio , quindi vorrei per prima cosa dare un saluto a tutti i gli iscritti del forum

....... ho' utilizzato fina ad adesso pid , nello specifico la fb41 siemens con s7-300 , sempre in applicazioni singole senza avere problemi ...... adesso devo gestire la pressione all'interno di un serbatoio mantenendola costante rispetto al setpoint , questo mediante due valvole proporzionali , la prima si apre quando la pressione scende al di sotto del setpoint immettendo aria in pressione , la seconda valvola si apre quando la pressione sale oltre il setpoint mettendo in sfiato il serbatoio , ovviamente le due valvole devono lavorare alternativamente una rispetto all'altra ...... per gestire le valvole utilizzo due pid , uno che lavora in modo diretto ed uno in modo inverso , aventi lo stesso setpoint (tranne un pelino di banda morta che ho' inserito )

... il problema è che quando la pressione è nell'intorno del setpoint , la valvola che dovrebbe rimanere chiusa si apre , e rimane aperta fino a quando il suo pid non ha' scaricato la componente integrale residua , ovviamente lo stesso accade con l'altra valvola ..... come fare per ovviare a questo problema ? utilizzando solo la componente proporzionale le valvole lavorano in modo corretto , pero' dubito di riuscire a regolare in modo ottimale la pressione senza la componete integrale ( al momento non posso fare prove in quanto la macchina non è disponibile )

una idea che mi è venuta è la seguente : in base alla pressione instantanea (rispetto al setpoint) posso sapere quale valvola deve lavorare e quale deve rimanere chiusa , potrei quindi forzare a zero l'uscita in corrente verso la valvola che deve rimanere chiusa , lasciando lavorare il suo pid in modo che si scarichi la componete integrale ......... magari qualcuno che ha' dovuto gestire applicazioni simili puo' darmi qualche suggerimento ....

grazie


Inserita: (modificato)

Ciao

Non so se posso esserti di aiuto, ho avuto parecchi sistemi come il tuo, erano serbatoi de 20,30 mila litri di sostanze pericolose che vengono pressurizzate con azoto.

Non ho mai utilizzato plc per questi sistemi ma singoli regolatori o DCS, le valvole sono normalmente chiuse con segnale 4/20 ma, quando si preleva il liquido la PCV 1 apriva l’azoto per evitare che il serbatoio imploda, quando si scaricano le cisterne apre la PCV 2 per scaricare la sovrappressione mantenendo il set. Quello che cerchi tu è il punto morto, personalmente i regolatori che utilizzo hanno una funzione particolare la quale agisce su due uscite 4/20ma. Esattamente il sistema lavora in questa maniera: +100 \ 0 \ -100, da zero a +100 scarichi l’azoto da zero a -100 apre la valvola di scarico, il punto morto lo decido io ( bar ) in relazione al set impostato. Ti faccio un esempio, set 5 bar imposto 1 bar T.M. il PCV inizierà a regolare da 5,5 e 4,5.

Nel caso in cui non posso fare nulla, forzo le valvole in chiusura così ritardi il loro intervento, quest’ultimo sistema l’adotto solo in caso di emergenza.

Spero di averti dato qualche idea

Buona notte

Modificato: da taratista
Marcello da Nettuno
Inserita:

in questi casi io adotto il sistema con tre regolatori, con il primo PID che pilota e gli altri due regolatori proporzionali in sequenza.

il primo modulo è un pid; l'uscita di questo non la mando ad un AO fisico ma la trasferisco all'ingresso in parallello degli altri due regolatori solo proporzioinali, uno avrà la banda positiva, l'altra negativa, e imposto i set point e l'ampiezza delle bande in modo da ottenere la zona morta che mi serve.

Inserita:

Per ovviare questo inconveniente ci sono due metodi classici: quello brutale che azzera la componente integrale e quello più sofisticato che impedisce alla parte integrale di crescere troppo.

La componente integrale, detta anche reset, serve a far coincidere il valore della variabile controllata con il valore di consegna. Se non si usa la componente integrale l'errore è sempre >0.

Usando il metodo brutale, cioè azzerando con un comando esterno la compenete integrale in situazioni come quella che hai descritto, si ottiene una risposta più rapida anche se imprecisa durante questo transitorio. I vecchi regolatori PID analogici prevedevano un bel contatto di relè, poi mosfet, in parallelo al condensatore di integrazione. Un comando esterno faceva si che il contatto si chiudesse scaricando il condensatore e azzerando al componente integrale. Sui regolatori software, ben studiati e ben realizzati, è previsto un analogo comando software che azzera la componente integrale.

Io non uso mai le funzioni PID di libreria Siemens o di altri, quindi non so se è previsto anche per FB41 il reset dell'integrale.

Il sistema più sofisticato di controllo, invece, prevede che la componente integrale rimanga entro valori prossimi allo zero; in questo modo la risposta del regolatore, in casi come il tuo, è molto più veloce.

COme si fa? semplicemente dando un riferimento diretto in parallelo all'uscita del regolatore. La grandezza del riferimento sarà equivalente alla componente integrale del regolatore, in questo modo l'integrael si mantiene prossimo allo zero.

Come si fa? Non certo con la sfera di cristallo :) .

E' sufficiente prefissare un valore di soglia, positivo e negativo, della componente integrale. Superata la soglia si aumenta o si diminuisce il valore di feed forward applicato; di quanto? di una quantità che dipende dalle caratteristiche del processo che si va a controllare.

Cerco di chiarire con un esempio.

Ammettiamo che tu stia controllando la tua valvola dando un riferimento in corrente 0-10mA. 10mA corrisponderanno a 4096 punti del tuo D/A. Fissi la soglia dell'integrale a 50. Superata questa soglia aumenti (se positivo) o diminuisci (se negativo) il valore di feed forward di 5 punti. Ad ogni campionamento se l'integrale è maggiore, in valore assoluto, della soglia si effetuerà questa operazione. Crescerà il valore di feed forward e l'integrale sarà piccolo.

Ovviamente la componente base del feedforward dovrà essere congrua con il valore di consegna della varaibile.

Marcello da Nettuno
Inserita:

Scusa Livio, non ho mai usato il PLC citato, sarebbe possibile programmarlo con la soluzione che ho descritto?

(allego un schema a blocchi per maggior chiarezza)

post-208249-0-69729800-1398528041_thumb.

Marcello da Nettuno
Inserita:

per la parte matematica:

Data una uscita del regolatore PID 0...100, il primo regolatore PI dovrebbe avere set point = 75 / banda proporzionale=50, mentre il secondo PI set poit = 25 banda proporzionale= -50 (cioè inverso).

Naturalmente se si vuole la zona morta i valori variano leggeremente.

Inserita: (modificato)
Scusa Livio, non ho mai usato il PLC citato,...

Come ho scrito in precedenza, non uso le funzioni di libreria, almeno per la regolazione, così non so se è fattibile quello che tu proponi.

Personalmente non ne vedo l'utilità, dato che si fa regolarmente in unica funzione. Anzi a dire il vero ho fatto "porcate" peggiori :) .

Per esempio ho usato tempi d'integrale differenti in carica e scarica, guadagni proporzionali variabili in funzioen del trend (derivata) dell'errore, e via elencando.

Ma forse non ho ben compreso il tuo intendimento..

Modificato: da Livio Orsini
Marcello da Nettuno
Inserita:

l'utilità consiste nell'ottenere una sequenza senta sovrapposizioni e un unico pid su cui lavorare con banda e integrale in modo pulito.

Inserita: (modificato)
Io non uso mai le funzioni PID di libreria Siemens o di altri, quindi non so se è previsto anche per FB41 il reset dell'integrale.
Per riuscire a fare quello che ti ha suggerito Livio, dovresti attuare sulle variabili sotto elencate.

Per capire meglio il risultato della retroazione, creati una tabella VAT e visualizza tutte le variabili del FB :

COM_RST[ BOOL ] Default= FALSE : COMPLETE RESTART; Il blocco ha una routine di inizializzazione che viene elaborata se l'ingresso COM_RST" è impostato.

INT_HOLD [ BOOL ] Default= FALSE : INTEGRAL ACTION HOLD / Congela componente I; l'uscita dell'integratore può essere congelata. A questo scopo, l'ingresso "Congela componente I" deve essere impostato

I_ITL_ON [ BOOL ] Default= FALSE : INITIALIZATION OF THE INTEGRAL ACTION / Impostare componente I; l'uscita dell'integratore può essere settata sull'ingresso I_ITL_VAL. A questo scopo, l'ingresso "Impostare componente I" deve essere impostato.

I_ITLVAL [ REAL ] -100.0...100.0 (%) Default = 0.0  : INITIALIZATION VALUE OF THE INTEGRAL ACTION / Valore di inizializzazione per il componente I; l'uscita dell'integratore può essere impostata all'ingresso I_ITL_ON. All'ingresso "Valore di
inizializzazione per il componente I" c'è il valore di inizializzazione.

Se I_ITL_ON = 1 il valore impostato viene I_ITLVAL inizializzato su LMN_I e quindi influenzando la grandezza regolante LMN_PER.

LMN_I = INTEGRAL COMPONENT / Componente I; l 'uscita "Componente I" contiene la quota integrale della grandezza controllante.

Modificato: da Savino
Inserita:

Se la risposta del sistema in fase di carico e di scarico è abbastanza simile, potresti provare con un unico PID con uscita impostata da -100 a +100.

Con valore negativo agisci su una valvola, con valore positivo sull'altra.

Se invece vuoi resettare l'integrale, il bit è "I_ITL_ON"

Inserita:
Livio:

Personalmente non ne vedo l'utilità, dato che si fa regolarmente in unica funzione.

Marcello:

... nell'ottenere una sequenza senta sovrapposizioni e un unico pid su cui lavorare.....

Probabilmente stiamo dicendo entrambi la medesima cosa

Inserita:

... ok grazie , appena avro' nuovamente la macchina disponibile , vorrei provare se ne ho il tempo , le varie metodologie che mi sono state suggerite ......

per Livio Orsini : alcune cose non mi sono chiare riguardo al metodo che hai descritto :

quando l'integrale ha' superato un valore delta di soglia , si aumenta di un valore opportuno il feed forward , poi immagino che si agisca anche sull'integrale ( diminuendolo di un valore uguale a delta ?? ) altrimenti l'integrale continua a crescere ......

cosi' facendo hai un valore di integrale basso , ma anche un valore di feed forward che nel tempo è cresciuto , quando il pid inverte direzione ( la valvola che si stava aprendo adesso si deve chiudere ) e quindi l'uscita del pid è vicina a zero avro' sempre il valore di feed forward da scaricare ....

Inserita:
quando l'integrale ha' superato un valore delta di soglia , si aumenta di un valore opportuno il feed forward , poi immagino che si agisca anche sull'integrale ( diminuendolo di un valore uguale a delta ?? ) altrimenti l'integrale continua a crescere ......

No, l'integrale si scarica automaticamente. Devi pensare alla funzione dell'integrale nel regolatore.

La componente proporzionale corregge gli errori istantanei (transitori), mentre la componente integrale corregge gli errori "stabili". Se il feed forward fosse perfetto l'integrale sarebbe zero. Se aggiusti il valore di feed forward l'integrale perde la qauntità corrispondente per equilibrare il sistema.

Se vuoi chiarirti meglio le idee prova a leggere il mio tutorial sulle regoalzioni. Lo trovi nella sezione didattica, sottosezione elettrotecnica.

Inserita:
Se la risposta del sistema in fase di carico e di scarico è abbastanza simile, potresti provare con un unico PID con uscita impostata da -100 a +100.

Con valore negativo agisci su una valvola, con valore positivo sull'altra.

Avevo anch'io pensato esattamente a una soluzione del genere. Poiche utilizzando lo stesso algoritmo, avresti una risposta piu' immediata e meno problemi di ottimizzazione. In oggni caso cosi come l'hai impostato, ci dovrebbe essere un link tra i due algoritmi e banda morta, altrimenti non ci riuscirai.

Poi, se tu stai utilizzando l'FB41, ti suggerirei di connoscere l'algoritmo a fondo, simulando(magari con PLCSim) le varie alternative possibile a disposizione e definendo una efficace logica di regolazione, prima di andare sulla macchina.

Un'altra cosa... leggendo ancora il tuo primo post, non e' molto chiaro la descrizione del funzionamento di questo sistema; forse potrebbe essere anche sbagliato l'approccio di come e' stata pensato la regolazione stessa. <_<

Inserita:
Avevo anch'io pensato esattamente a una soluzione del genere. Poiche utilizzando lo stesso algoritmo, avresti una risposta piu' immediata e meno problemi di ottimizzazione.

Lo credo anch'io.

Ci sono casi in cui la soluzione corretta prevede l'utilizzo di due PID distinti. Gli esempi più classici sono forse riscaldamento/raffreddamento e umidificazione/deumidificazione.

In questi casi è normale che ci possa essere sovrapposizione delle due azioni opposte quando si è vicini al valore di set point, ma questo non rappresenta un problema.

Nel caso in discussione invece, dove questa sovrapposizione si vuole tassativamente evitare, forse la soluzione con un unico PID è la più semplice sia da implementare che da mettere a punto.

Se la risposta del sistema poi non è simmetrica, si possono sempre cambiare i parametri del PID al volo, a seconda se l'errore è positivo o negativo.

Qualcuno le considera porcate, ma io non mi scandalizzerei per così poco.

Insomma, per sapere se il sistema funziona bene, bisogna provare. Io, prima di adottare sistemi più complessi, un tentativo lo farei.

Inserita:

.... sabato ho' potuto collaudare il sistema , alla fine per non complicarmi troppo la vita ho' utilizzato un singolo pid con range di uscita +100 e -100 e le due valvole azionate in base all'uscita positiva o negativa del pid ..... è tutto ok , non vi sono piu' azionamenti contemporanei ed indesiderati delle due valvole

Livio Orsini

...... ho' letto il tuo tutorial , è veramente molto ben fatto , sopratutto ho' apprezzato il fatto che non vi sia soltanto una trattazione puramente matematica (per me' molto ostica) ma anche una trattazione piu' vicina al programmatore ....... una curiosita' , ho' notato che nel tuo esempio , nel momento in cui l'orologio di sistema richiama il blocco del pid , la prima cosa che esegui è di mettere in uscita il valore di comando calcolato nel campionamento precedente , il senso comune suggerirebbe di calcolare il nuovo valore di comando e di attualizzare subito l'uscita del pid , è solo una questione di abitudine oppure vi sono delle motivazioni tecniche ?

Inserita:
...è solo una questione di abitudine oppure vi sono delle motivazioni tecniche ?

Le motivazioni ci sono e sono state anche esposte nella trattazione.

La risoluzione dell'algoritmo di regolazione non ha tempi costanti, ma è funzione delle condizioni in cui si trova il regolatore di volta in volta.

Questo potrebbe dare luogo a variazioni del periodo di aggiornamento, variazioni che causano disturbi di regolazione, esattamento come se fosse instabile il,periodo di campionamento.

La tecnica adottata è uno dei metodi possibili per ridurre ad un livello trascurabile questi disturbi. In pratica si inserisce un ritardo costante che non influenza il regolatore.

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...