Vai al contenuto
PLC Forum


Posizionamento, Pid E S7


Messaggi consigliati

Inserito:

Ciao a tutti, non avendo trovato risposta adeguata con la funzione cerca provo a rompere le scatole.

Sto cercando di fare un posizionamento con S7-200, inverter vettoriale e ovviamente asincrono trifase con lettura della posizione mediante encoder.

Il sistema meccanico è composto da una slitta che può percorrere al massimo 150mm con una velocità max di 5-7mm/s, la massa a vuoto è di circa 200Kg e ce ne possono stare altrettanti con il prodotto in lavorazione. Il sistema elettrico è composto da una PLC S7-200 CPU 224XP e per la regolazione di velocità uso una usita analogica (esp.) per il comando on off utilizzo due uscite digitali.

Sto lavorando a vuoto cioè solo con la slitta e il posizionamento non funziona molto bene: ho un errore progressivo che varia da 0.05mm a 0.18mm ho provato ad utilizzare il PID ma non lavora correttamente in quanto non modula si comporta come se fosse un sistema on off anche modificando i valori del PID.

O meglio mi trovo che con Kp pari a 100, chi pari a 10 e Kd pari a 0 il sistema sia decente ma è lento come le lumache. Se osservo i segnali di uscita PID e li confronto con la frequenza inverter mi trovo quest'ultima sia in ritardo e che non segua in maniera adeguata il PID.

Ho annullato, sull'inverter, le rampe di accelerazione e decelerazione ma niente da fare.

Grazie

P.S. ho già letto la dispensa di Livio ma al momento con pochi risultati.

Ciaoo


Inserita:

Da 0.05 a 0.18 mm non mi sembra un errore eccessivo, magari prova a darci qualche dato in più sulla meccanica (Trasmisione cinghia, Vite ). Che inverter usi? Il Pid Lo usi per l'anello di velocità o di posizione?.

Ciao

Inserita:

il Pid lo uso nell'anello di posizione, la velocità "non è considerata". L'inverter usato è un Lg modello IG5. Il motore è 4 poli, 1400giri e la trasmissione viene fatta mediante cinghia dentata e vite senza fine di cui però non conosco effettivamente le caratteristiche. L'errore che voglio ottenere è sotto il decimo di millimetro.

Inserita:

Ciao a tutti, scusa non ho capito una cosa, vuoi fare un posizionamento se non ho capito male, ma come fa il sistema a conoscere la posizione esatta dove fermarsi?

Grazie

rwhite

Inserita:

Mancano due dati fondamentali: che PID stai usando (spero non quello integrato in Siemens) e con quale tempo di campionamento.

Senza questi dati qaulsiasi ipotesi non sarebbe seria.

Inserita:
ho un errore progressivo che varia da 0.05mm a 0.18mm
L'errore che voglio ottenere è sotto il decimo di millimetro.
ho provato ad utilizzare il PID ma non lavora correttamente in quanto non modula si comporta come se fosse un sistema on off anche modificando i valori del PID.
Questo mi fa' pensare che hai qualcosa sulla parametrizzazione che non e' giusta. Diciamo che sotto i 0.10 mm sarebbe molto tirato per un PID di PLC, ma visto che a volte ci arrivi a un errore di 0,05, se continui ad ottimizzare il PID, forse ci arrivi. Hai provato a settare una banda morta di almeno +-0.08mm?
Inserita:

Invece si PID interno S7 e con un tempo di campionamento di 1 s. Da come scrivi mi sono imbattuto in un gran brutto lavoro :(

Il tempo di campinamento è volutamente ad 1 s in quanto il movimento nella condizione più gravosa dura circa 10 secondi. Oggi ho riprovato a metterci mano e non ci siamo per niente; molto lento nella risposta (Kp=5.3462 chi=0.1383) se aumento il Kp il sistema diventa instabile. Dimenticavo di dire che ho provato a lavorare a 60 -100Hz e non ci siamo, va molto meglio invece, se lavoro a 20Hz anche se è logico che sia così; solo che siamo un attimo lenti come velocità di traslazione e non mi piace molto il discorso.

OT mi sono messo in un casino che metà basta, ma conto di uscirne più forte di una roccia con gli amici del forum. fine OT

ciao e grazie

Inserita:

X Savino

non ho provato ad inserire una banda morta

Diciamo che sotto i 0.10 mm sarebbe molto tirato per un PID di PLC
era quello che temevo dalla risposta di Livio.
Inserita: (modificato)

1. Potrebbe essere la cinghia che fa un po' di elastico e ti introduce dei "giochi variabili" ?

tempo di campionamento di 1 s

2. Non è un po' troppo alto ?

3. Posizioni sempre nello stesso verso ?

Modificato: da JumpMan
Inserita:

Posso chiederti se hai Normalizzato errore di Posizione ?

Intendo dire che a volte l' errore di posizione in valore assoluto, calcolato in questa maniera, non e' proprio il massimo

per precisioni cosi piccole.

Error_Position := Command_Position - Actual_Position:

a volte, non dico sempre, e' buona cosa ragguardare l' errore di posizione rispetto al valore di massima Tolleranza ammesso.

in questo senzo

Error_PosR := (Command_Position - Actual_Position)/Tollerance:

cosi facendo enfatizzi al massimo l'errore per il Range di Tolleranza voluto.

quando l'errore e' oltre un determinato valore lo puoi limitare, oppure lo puoi ridure diminuendo il coefficente di guadagno

in base alla sua entita'

Potresti usare una legge logaritmica inversa .

Oppure diminuisci il grado di errore con una Logica di tipo Fuzzy.

(Molto Lontano = Errore Ridotto di 10;

Medio vicino = Errore Ridotto di 2

dentro la soglia di 2 Volte la tolleranza = Errore attuale )

Attenzione al valore del Guadagno proporzionale, non devi esagerare altrimenti rendi il sistema instabile.

Ma quale e' il passo della la vite senza fine in mm ? 1-2-4-5-10mm ?

L' inerzia del sistema, realmente compromette la precisione del posizionamento, oppure si riesce a smorzare con un accelerazione piu' contenuta, oppure con un Jerk piu' basso ?

lanciando un SetPoint di posizione molto ravvicinato, alla posizione attuale, come si comporta il sistema ?

la Raggiunge ?, oppure rimane fermo ? (Esempio Actual_Pos:= 10.01mm, New_Setpoint :=10.10mm)

Inserita: (modificato)

Non mi pronuncio sul PID integrato Siemens dell'S7-200, che non conosco. Il tempo di campionamento di un secondo, però, per un posizionamento è un'eternità.

Porta questo tempo a non più di 100ms (probabilmente accettabile visto che parli di un posizionamento piuttosto lento) e vedi cosa cambia.

Se per la cpu non è un problema, il tempo di campionamento portalo anche a 10-20ms, che male non fa.

Tu parli di un posizionamento da fare in 10 secondi. Tieni presente che quello che conta però è solo la fase di rallentamento. Quanto dura questa fase?

Modificato: da batta
Inserita:

Perche' usi un tempo di campionamento di 1 s ? E' certamente eccessivo.

velocita' max := 5-7mm/s (23.3 rps il Motore)

Mi pare che il passo della vite sia di 0.300mm (con trasmissione diretta)

pero' tu hai un ulteriore riduzione data dalla cinghia, percio' probabilmente la vite ha un passo maggiore.

Dunque senza ombra di dubbio, il tempo di campionamento e' molto molto grande.

Devi portarlo almeno a 0.01s

Per questo motivo che regoli in modalita' ON/OFF .

poi si spiega perche' a 20Hz ottiene una precisione migliore. (Controlla la Modalita' anello chiuso o aperto del Drive)

Mi sa che posizionandolo a mano ottieni una precisione migliore.

Ma il Drive lavora ad anello chiuso, con riferimento di velocita'?

In pratica l'encoder serve solo come feedback all' anello di posizione? oppure anche come feedback di velocita'

per il Drive?

Devi far lavorare il Drive in anello chiuso di velocita' ! (non Scalare v/f)

se non lo puoi fare almeno in Modalita' Vector SensorLess.

Poi devi generare un errore di 10v quando hai un errore di posizione superiore ai [0,150] mm

Come confronti i valori interni in mm ? (infatti mi hai detto che devi avere Kp:=100)

ecco come penso che tu abbia fatto il confronto : [Error_Pos :=0.1mm] * 100 = 10 volts (only Propor.)

invece ti consiglio di fare cosi:

Anello confronto ; Error_Position:= [ (Command_Pos - Actual_Pos)/Tollerance ]

' exampl. (10.00mm - 9.99m)/0.1mm = 1.00 Normalizzato .

Errore normallizzato lo devi usare come grandezza d'ingresso del PID .

non puoi fare il Confronto non rispettando queste cose. (i Coefficienti KP e chi e KD devono essere Normallizati, non assoluti)

Inoltre ricordati di considerare le inerzie, se applichi il set-point al sistema senza rampe o altro, ti ritroverai che

il riferimento di velocita' verso il drive sara' molto molto elevato, percio' accelerazioni istantane elevate.

Rompi sicuramente la vite senza fine (Ball-screw).

Cerca quando applichi un nuovo set-point di ramparlo prima che arrivi al PID.

Oppure devi generare un Profilo di Posizionamento Trapezioidale o Parabolico, in pratica il Set-Point che va al PID

segue un Profilo. (non di Botto va applicato)

In pratica cosi facendo, piano piano l' anello PID di Posizione insegue il profilo, (Non sara' mai quindi in saturazione)

il sistema partira' rispettando l' accelerazione specificata da profilo, (e non al Max), e d arrivera' al target dolcemente

evitando di creare inerzie pericolose.

Puoi fare un profilo di Posizionamento dolce, ma il PID di Posizione deve essere sufficientemente veloce (non 1 secondo).

Ciao e buon lavoro electra.

Inserita:

X Jumpman

1. Potrebbe essere la cinghia che fa un po' di elastico e ti introduce dei "giochi variabili" ?

Non credo ho notato che per vedere un movimento di 0.01 mm mi devo mettere molto d'impegno.

Il tempo di campionamento è il minimo che posso scegliere su quelli proposti dal PLC.

3. Posizioni sempre nello stesso verso ?

Si e no. Mi spiego meglio, il traslatore (che chiameremo A) si muove a dx e sx ed è montato sopra un piano (che chiameremo B) che si muove in avanti ed indietro, il funzionamento è:

1- start

2- il piano B si muove in avanti fino ad una quota Q prestabilita dall'operatore di cui non mi interessa veolcità e posizione;

3- si ferma B e si muove A verso dx di 2 mm ancora non mi interessa la precisione di lettura;

4- si ferma A e si muove B in senso opposto rispetto al punto 2;

5- si ferma B e si muove A verso sx di una quota X + 2mm (del precedente spostamento) ora mi interessa posizionarmi alla massima velocità consentita dalla precisione che voglio ottenere. Gli spostamenti possono variare da 4 a 12mm.

6- si riparte dal punto 2 e così via finche non finisce il materiale in lavorazione.

X Beatrice_Ru

Intendo dire che a volte l' errore di posizione in valore assoluto, calcolato in questa maniera, non e' proprio il massimo

per precisioni cosi piccole.

Error_Position := Command_Position - Actual_Position

Si io ho fatto proprio in questo modo, anche perchè con la libreria PID disponibile in Microwin ti permette di avere il SP, la VP e l'uscita.

Error_PosR := (Command_Position - Actual_Position)/Tollerance:

Devo provare questo sistema anche se a prima vista mi sembra di peggiorare le cose.

Ma quale e' il passo della la vite senza fine in mm ? 1-2-4-5-10mm ?

Il passo della vite è 5 se non ricordo male.

lanciando un SetPoint di posizione molto ravvicinato, alla posizione attuale, come si comporta il sistema ?

la Raggiunge ?, oppure rimane fermo ? (Esempio Actual_Pos:= 10.01mm, New_Setpoint :=10.10mm)

la raggiunge e la supera in alcuni casi in altri rimane fermo, diciamo che con il "metodo giusto" il motore rimane fermo.

Giusto per la cronaca il PID è sempre abilitato tramite SM0.0 nel programma principale mentre le operazioni descritte qualche riga più in alto vengono richiamate in una subroutine all'occorrenza.

Ciaoo

Inserita:

Intanto grazie, domani proverò con le indicazioni ricevute e vedremo cosa succede.

Ciaoo

Inserita:
Il tempo di campionamento è il minimo che posso scegliere su quelli proposti dal PLC
... mi sa che ti conviene usare il PID di Livio...

Guardati il suo tutorial. ;)

Inserita:

Si, anche per me 1 s per il tempo di campionamento sembra eccessivo..

non ho provato ad inserire una banda morta
una tolleranza li la devi dare, altrimenti cerchera sempre di correggere l'errore.. ma non penso sia il problema di fondo ..continuo a pensare che ottimizzando ancora qualche parametro o riga di codice dovresti migliorare ..
Inserita: (modificato)

Dal manuale d'istruzioni:

Per ottenere valori di campionamento statisticamente significativi si devono acquisire almeno 100
campioni. In un loop con tempo di campionamento di 200 msec l’acquisizione di 100 campioni
richiede 20 secondi, nei loop con un tempo di campionamento maggiore ci vorrà più tempo.
Nonostante nei loop con tempo di campionamento inferiore a 200 msec sia possibile acquisire
100 campioni in meno di 20 secondi, la sequenza di determinazione dell’isteresi acquisisce
comunque i campioni per almeno 20 secondi.

Si sei a 1 sec. di tempo reset, ci vogliono 100 sec x 100 campioni!

Modificato: da Savino
emanuele.croci
Inserita:

Scusa, ma non ho capito una cosa...

il SETPOINT che passi al tuo PID quale è esattamente???

Cioè:

se mi trovo adesso nella posizione 0.0 mm e voglio andare a 10.0 mm, il setpoint che passo al PID deve essere una funzione variabile nel tempo secondo le leggi fisiche del moto, ad esempio x(t)=Setpoint(t):

t=1sec setp=2 mm

t=2sec setp=4 mm

....

t=5sec setp=10 mm

(meglio ancora se consideriamo rampe di accelerazione e decelerazione come dice Beatrice)

Tu che funzione x(t) hai usato??

...spero tu non passi direttamente al PID la posizione 10mm e poi gli dici "pensaci tu!", sarebbe un po' una bestialità.... ;)

Ciao, Emanuele

Inserita: (modificato)

Emanuele hai ragione! :(

Usando la funzione integrata del pid l'ho messo giù così.

Il pid siemens che ho usato io ha "4 terminali":

1- bit di controllo o attivazione;

2- PV ossia la variabile di processo, in questo caso ho messo la posizione attuale;

3- SP ossia la posizione a cui voglio arrivare;

4- uscita.

Avendo decimali ho moltiplicato per 100 il valore della PV e del SP in quanto il PV mi accetta solo word mentre il sp mi accetta DW.

Che ci sia qualche errore di fondo? <_< Mah....

Forse è meglio partire un passo più indietro con questo controllo visto che ho tralasciato/sbagliato parecchie cose.

Dimenticavo che il mio encoder lo utilizzo come feedback all' anello di posizionee anche come feedback di velocita'

ciaoo

Modificato: da electra
Inserita:

Visto che il pid non mi riesce, dovuto certamente ad una mia poca/nulla conoscenza del regolatore implementato in un plc, se creo una serie di posizionamenti a confronto? Mi spiego sono alla quota 0 e voglio andare alla quota 10, faccio in modo di andare a Vmax fino alla quota 8, poi da 8 a 9.5 vado a Vmed ed infine da 9.5 a 10 a Vmin. Pensavo inoltre di mettere una banda morta attorno al SP.

Lo so che non è il massimo del lavoro ma al momento non mi viene in mente altro alla mia portata.

Ciaoo

emanuele.croci
Inserita: (modificato)

Ciao,

il PID è uno strumento adeguato per quello che vuoi fare, però ti serve un altro strumento, cioè un interpolatore matematico che "suddivide in TOT punti" il tuo percorso e, ad ogni istante di tempo, cambia leggermente il valore del setpoint.

Ad esempio, se vuoi andare da 0.0 a 10.0 in 5 secondi, anzichè scrivere

SP=10

scriverai una cosa del tipo

SP=2 * t (cioè SP=Xini+V*t... basta sostituire le variabili in questa espressione....)

Per fare ciò devi:

a) avere un modo per calcolare il tempo, ad esempio un contatore da incrementare ogni 100ms

b ) Xini è la tua posizione iniziale, è nota

c) V= velocità che vuoi avere, che so, 200mm/secondo...

d) devi calcolarti un Tmax = abs(Xfinale-Xiniziale)/V, se t>Tmax => t=Tmax, in modo che il tuo setpoint non vada "oltre"

Questo setpoint è un "punto mobile teorico" che il tuo PID si impegna a seguire in ogni istante; praticamente "traccia la rotta" per il controllore PID

Ciao, Emanuele

Modificato: da emanuele.croci
Inserita:

Electra holetto solo ora le tue precisazioni sul posizionatore. Sono un po' di fretta quindi ti do solo un parere un poco succinto.

1 - Il PID interno del 200 è valido (forse) per controlli di temperatura. Ti conviene implementare un PID apposito, sono una decina di istruzioni forse meno. Se guardi negli esempi allegati al mio tutorial ne trovi un paio. Tra l'altro è meglio usare solo la parte P I, la parte derivativa in un posizionatore in genere da più guai che benefici.

2 - Come ti hanno già detto il tempo di campionamento di 1" è un'enormità. Andare troppo veloci serve a poco, però è megliko che campionare troppo lentamente. L'ideale sarebbe conoscere la velocità di risposta del tuo azionamento ed agire di conseguenza. Così a spanne direi che 20 ms potrebbe essere un tempo di campionamento corretto per la tua applicazione. Devi farti un timer di sistema e sull'interrupt lanci il PID.

3 - Come ti suggerisce Emanuele.Croci il posizionamento migliore è creare una quota ideale, che si aggiorna ad ogni campionamento, e farla inseguire del tuo asse reale. Se hai letto il mio tutorial, al capitolo 6 trovi un esempio di posizionamento che segue priprio questo principio.

Inserita: (modificato)

Ho visto ora la il link e devo dire che è interessante, oggi provo vedere di implementarlo.

Per quel che riguarda le prove fatte ieri devo dire che con un posizionamento a tratti molto grossolano devo dire che ci potrebbe anche stare nel senso che vado oltre quota di 0.03mm. Comunque ho tralasciato l'anello di velocità e ho lavorato esclusivamente con l'anello di posizione. Boh... sono soddisfatto a metà nel senso che si è funzionante ma non con il pid come lo volevo io.

Oggi vedo se riesco a migliorarmi.

Ciaoo

Modificato: da electra
emanuele.croci
Inserita:
con un posizionamento a tratti molto grossolano

Avrai quindi impostato che, se la distanza residua è <X rallento e se è <Y mi fermo.

Beh... se il risultato ti va bene non ci vedo niente di male!

Tra l'altro, io sui posizionamenti monoasse (che non seguono quindi una traiettoria) non uso nemmeno il PID e l'interpolatore di setpoint -che pure ho già sviluppato- ma una tecnica simile a quella sopra descritta, solamente in rampa di decelerazione impongo all'inverter una V=SQRT(2A *deltaS), per farlo arrestare dolcemente e con miglior precisione....

Ciao, Emanuele

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