Vai al contenuto
PLC Forum


Un Pid "elastico"


JumpMan

Messaggi consigliati

Problema:

- Posizionamento di una trave di legno (peso variabile da 10 a 200Kg) tramite 2 rulli contrapposti azionati da 2 motori idraulici 160cc (collegati in serie) serviti da valvola proporzionale.

- Sistema provvisto di encoder per il posizionamento con precisione 10mm (su 20000mm).

- L'encoder entra in un S7-315 in cui vi è una regolazione PID per l'azionamento dell'uscita analogica.

Giungiamo al dunque: questo sistema, funzionava discretamente (anche solo con regolazione "P") fino a quando il cliente non ha voluto velocizzarlo montando 2 motori di cilindrata notevolmente inferiore (circa 1/3).

Ora il movimento avviene a velocità > 100m/minuto ma la coppia per partire e fermarsi si è ridotta notevolmente! Il problema è che se il movimento da fare è piccolo i motori non ce la fanno a partire perchè "P" è prossimo a 0, per tentare di far partire la trave ho abilitato anche la componente "I", ma mi succede questo:

1) A volte la trave è incastrata e la componente I arriva quasi al 50% prima di farla partire, per cui la quota viene superata di molto, poi la "I" scende e la trave torna indietro.

2) Anche durante il movimento "normale" della trave la componente "I" si incrementa facendo superare il punto di arresto e innescando alcuni pendolamenti all'arrivo.

In sostanza sembra che la trave sia trainata da un'elastico.

Per attenuare i problemi, ho azzerato la I quando ABS(P)>30% e quando P=0 (se P in zona morta significa che l'asse e in quota quindi azzero la I).

E' corretto interagire con il PID in questo modo oppure ci sono altri metodi ?

P.s. ho provato a abilitare anche "D" ma è un disastro.

Saluti a tutti

Link al commento
Condividi su altri siti


Stefano Sormanni

La prima cosa che mi viene in mente è quella di limitare l'azione intregrale I, questo perchè se ho una componente I molto elevata c'è il rischio che faccia dei danni, al limite la puoi limitare dopo che ha superato una certa quota. Un'altra cosa che potresti tentare è la diminuzione della velocità (linearmente) in prossimità della quota di arrivo.

:rolleyes:

Link al commento
Condividi su altri siti

...non sono sicuro di avere capito bene su come lavora il pid....

mi pare di capire che il la variabile "controllata" è la posizione con segnale di retroazione proveniente dall'encoder.... e qui tutto ok.... ma il set-point da dove arriva? è forse la semplice "posizione da raggiungere"?

Se è così, a mio avviso, se si vuole un sistema performante, ci manca un pezzo ovvero una funzione che calcoli la posizione teorica dell'asse in funzione del tempo (mettendoci dentro anche le eventuali rampe ecc. ecc.). Il valore calcolato da questa funzione verrebbe poi usato come set-point dal PID

ciao

Andrea

Link al commento
Condividi su altri siti

perchè non provi a disabilitare il pid alla partenza in modo da garantirti lo spunto necessario a spostare la trave e poi lo attivi non appena hai vinto lo spunto iniziale?????

Link al commento
Condividi su altri siti

...non sono sicuro di avere capito bene su come lavora il pid....ma il set-point da dove arriva...

Ho creato un FC che mi da un valore ErrPerc da -100.0% a +100.0% in base alla distanza dal target e alla lunghezza di rampa impostata.

Esempio:

Supponendo Lunghezza rampa = 1000:
 --------------------------------
 Quota      Quota       
 target     attuale       ErrPerc
 --------------------------------
 8000       1000          -100
 8000       7000          -100
 8000       7500          -50
 8000       8000          0
 8000       8500          +50
 8000       9000          +100
 8000       10000         +100
 --------------------------------

A questo punto ErrPerc lo uso come retroazione del PID, il setpoint lo metto a 0, in questo modo il pid cerca sempre di portare ErrPerc = 0 (quindi asse in quota).

Forse questa è una maniera un pò strana per fare un posizionamento con un PID, ma non ho voluto complicarmi la vita a creare profili di velocità da inseguire e altre cose strane in quanto la macchina è già abbastanza complicata e i bytes scarseggiano !

Inoltre come dicevo prima, funzionava tutto perfettamente finchè non hanno cambiato i motori.

Il problema è che con un pid siffatto, abilitare la componente I significa vederla incrementarsi continuamente durante tutto l'avanzamento e si ottiene che poi il punto di arresto viene superato (dopo un paio di rimbalzi la quota è comunque raggiunta).

La componente I la devo abilitare perchè se parto da quota 7990 e devo fermarmi a 8000 la P non fa neanche solletico ai motori ! In quel caso l'integratore si accorge che non c'è risposta e continua a incrementare l'uscita finchè l'asse non si muove (poi magari si muove troppo).

Per ovviare a questi inconvenienti azzero la I quando l'asse è in zona morta (quota target raggiunta) o quando è distante dal target (qui P vale abbastanza da far partire il motore).

Forse il sistema non è molto ortodosso ma mi è sembrato il modo + semplice.

Si accettano obiezioni...

Modificato: da JumpMan
Link al commento
Condividi su altri siti

Ciao JumpMan,

Il tuo problema è un classico dei regolatori PID e si risolve...classicamente: si aggiunge il feedforward; non mi dilungo sulle spiegazioni e sulle motivazioni, sono ampiamente descritte nel mio tutor sui controlli. Nel medesimo tutor trovi anche, come allegato, un programma di un posizionatore per cilindro idraulico con retroazione da LVDT, scritto per S7-21x.

In effetti la tua soluzione è un succedaneo del feed forward, solo che per eseguirla correttamente dovresti generare un corretto profilo di velocità, compensato poi dall'azione PID.

Io ti suggerirei di costruirti un FC legato ad interrupt a tempo (10 ms). Nello FC dovresti generare iò profilo di velocità ed eseguire il PID.

Link al commento
Condividi su altri siti

Ciao Livio, grazie per la risposta, non riesco però ad'aprire la pagina http://www.plcforum.info/didattica/conreg/conreg.htm (sempre che sia quella giusta), c'è qualche problema sul forum?

per eseguirla correttamente dovresti generare un corretto profilo di velocità,

In effetti lo pensavo anch'io, ma ho dovuto (come sempre) combattere per farci stare tutto in questo PLC :angry: non capisco come mai alla siemens siano così avari di ram ! 64K di ram costeranno 1 € o anche meno !

Penso che per la prossima macchina valuteremo di passare a una cpu un pò più generosa e purtroppo molto + cara ! :angry: e forse questo è il movente dell'avarizia della Siemens !

Scusate se ho divagato.

Link al commento
Condividi su altri siti

considerando che ti trovi di fronte ad un sistema, se non sbaglio, con molte incognite e poca ripetibilità perche non provi ad utilizzare una regolazione di tipo Fuzzy

Saluti a tutti

Link al commento
Condividi su altri siti

considerando che ti trovi di fronte ad un sistema, se non sbaglio, con molte incognite e poca ripetibilità perche non provi ad utilizzare una regolazione di tipo Fuzzy
C'è stato un periodo (15-20 anni fa) in cui i regolatori fuzzy erano di moda e venivano considerati una panacea universale; purtroppo i regolatori fuzzy, per loro natura, danno il meglio solo in alcuni casi come il riconocimento di immagini, sono molto validi anche per regolatori di temperatura. Nei posizionamenti bisogna distinguere le applicazioni: se devo regolare l'acostamento di una nave traghetto alla banchina (posizionamenti in battuta con velocità inferiore ad una sogli max) allora è un regolatore valido, se devo fare un posizionamento di precisione di un dispositivo di cui si possono conoscere esattamnete le caratteristiche, sono meno efficienti di un regolatore tradizionale. Il caso in esame è un'applicazione di cui si conoscono, o si possono conoscere, le caratteristiche esate.

..... ma ho dovuto (come sempre) combattere per farci stare tutto in questo PLC ......

Se togli lo FC di sistema del PID e te ne fai uno tu, probabilmente risparmi anche memoria. Se analizzi l'esempio e gli togli tutta la parte che non ti serve (il loop di pressione ) vedrai che ti viene abbastanza corto. Un'avvertenza: nell'esempio si genera il feeforward direttamente in analogico perchè la reazione è in valore analogico, qui hai la piccola complicazione di gestirti anche il riferimento di posizione.

Comunque, se ne hai necessità, mandami pure una mail con domande.

Link al commento
Condividi su altri siti

Il caso in esame è un'applicazione di cui si conoscono, o si possono conoscere, le caratteristiche esate.

Non sono sicuro di conoscere le caratteristiche esatte, il peso della trave da spostare varia da una decina di Kg a qualche centinaio, inoltre i motori idraulici montati secondo me trafilano e vanificano la precisione del posizionamento soprattutto alle basse velocità, e poi ci si mette anche il legno storto, il legno ruvido, il legno umido ecc. ecc. ... con questo non voglio dire che un fuzzy sia + valido (anche perchè non so neanche come funziona un fuzzy !).

Secondo me la prima cosa da fare sarebbe sostituire i motori, non so se restando sull'idraulica ci sia qualcosa di meglio, certo che non posso smantellare tutto per mettere dei brushless! il cliente mi ammazzerebbe !

Penso che farò alcuni esperimenti, in seguito vi farò sapere...

Grazie comunque Livio per la grande disponibilità e complimenti per il tutorial.

Grazie anche agli altri utenti e moderatori del forum per l'attenzione e la prontezza delle risposte.

Link al commento
Condividi su altri siti

  • 4 months later...

FORMULA DEL POSIZIONATORE

RifVel = SQRT(2*ErrorePosizione*a)*K

dove:

RifVel = riferimento velocità da dare al motore/i

ErrPos = errore di posizione (SP-PV)

a= accelerazione massima del sistema (non deve essere superirore alla accelerazione che effettivamente i motori possono generare con il massimo carico)

K= guadagno (in teoria vale 1, ma in pratica puoi modificarlo, ad. es. puoi aumentarlo quando l'errore è piccolo, oppure diminuirlo in caso di instabilità del posizionatore)

Con questa formula ti puoi generare la curva del riferimetno di velocità da dare ai motori.

Il pid lo puoi usare per confrontare il rif.velocità con il feedback:

SP=rif.vel.

PV=Fbk.Vel. (calcolato con l'encoder)

OUT = correzione del riferimento di velocità che va sommato a rif.vel. e inviato ai motori.

Con questo sistema ottimizzi il posizionamento, ma assolutamente non ti aiuta nel caso di impuntamenti.

Per toglierti dalle costole il problema degli impuntamenti dovresti usare la tecnica di modulazione della durata di impulso (PWM):

quando ti trovi nella condizione di stallo (l'integrale cresce ma il feedback di velocità è zero) devi commutare il riferimento da modulazione di ampiezza (AM) a modulazione d'impulso (PWM): significa ad esempio anzichè dare un riferimento di 2 volt costante (e intanto il trave non si muove...), dare ad es. 10V della durata di 100ms intervallati da 500ms di riferimento zero.

In questo modo ottieni una elevata coppia dovuta al rif. vel. alto (e il trave comincia a muoversi), ma bassa velocità (breve durata del rif.vel.).

Spero di essere stato chiaro e sopratutto utile.

Ciao.

Link al commento
Condividi su altri siti

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...