Vai al contenuto
PLC Forum


Costruire Un Pid


roberto8303

Messaggi consigliati

Premetto di aver letto nella sezione didattica il corso su controllo e regolazione Pid.

Voglio partire da zero per capire meglio e fissare i punti fondamentali di inizio per impostare praticamente il programma nella cpu in questo caso la s7200

Propongo un esempio pratico su cui lavorare.

Materiale utilizzato:

Motore trifase hp 0.25 poli 4 collegato a D 50hz.

Inverter monofase- trifase tarato da 0 a 50hz con segnale di riferimento +10volt =50hz =32000 punti uscita del plc.

Sensore di posizione con uscita segnale elettrico 0-10volt ( corsa 100mm, 1mm=0,1volt) Il sensore genera 10volt quando il motore deve ruotare a 1400rpm=50hz

Si vuole tenere costante la posizione per es. a 50mm = 5volt con la precisione di +/- 1mm

La velocita di oscillazione massima del sensore di posizione puo essere +/- 1mm in 0,05secondi.

Siccome non ho mai costruito un pid spero che con l aiuto del PLC Forum,riesco a capire almeno quali sono le basi per impostare un buon controllo!

Per prima cosa io penso che il tempo di campionamento deve essere dai 20 ai 50ms.(correggetemi se sbaglio!)

Il nostro valore campionato ogni 20ms sara chiamato VP che risiedera nella VW10

Il nostro valore desiderato aver costante sara chiamato SV che risiedera nella VW12 (50mm)

L errore sara e=SV-VP l errore risiedera nella VW14

quindi VW14= VW12-VW10

A questo punto chiedo come si deve ragionare per stabilire di quanto deve essere il valore della costante proporzionale che moltiplicheremo al nostro errore?

Link al commento
Condividi su altri siti


  • Risposte 89
  • Created
  • Ultima risposta

Top Posters In This Topic

  • roberto8303

    58

  • Livio Orsini

    32

riporto l equazione pid

Yn = (error * Kp) + (I + i_inst) + (Kd * (error – old_error))

dove error = SP- PV (setpoint - process value) ; i_inst = error * chi ; old_error = error del ciclo precedente

L integrale che sarebbe I+ i_inst come si calcola? mi potete spiegare cosa significano singolarmente

I=?è per caso un coefficiente che scegliamo noi?

chi=?che valore è da dove lo si ricava?

Link al commento
Condividi su altri siti

remetto di aver letto nella sezione didattica il corso su controllo e regolazione Pid.

Ahi, ahi Roberto! Forse non lo hai letto attentamente, magari hai saltato qualche paragrafo che ti sembrava noioso :)

Nei primi due capitoli ci sono le risposte alle tue domande del secondo post e anche a quelle del primo.

Comunque ripeto, anche per altri, alcuni fondamenti.

Prima di tutto il tempo di campionamento.

Non lo si può scegliere a naso, a sensazione, per sentito dire. Una regola, un poco empirica ma con solide basi teoriche, stabilisce che il periodo di campionamento deve essere di un ordine inferiore al periodo corrispondente alla massima frequenza a cui risponde il sistema controllato.

Nell'esempio da te fatto, ammettiamo che la massiam frequenza a cui risponda ad anello aperto il controllo di velocità del tuo azionamento (motore + inverter) sia 10Hz; a 10 Hz equivale un periodo pari a 100ms. Bene se vuoi realizzare un controllo esterno di velocità con tecniche numeriche, dovrai campionare con periodo di 10ms. Anche 20ms potrebbero essere suifficienti con alcuni accorgimenti.

Come si determina, in pratica, la massima frequenza a cui risponde il sitema ad anello aperto, ma anche ad anello chiuso?

Anche qui la pratica di laboratorio ci viene in aiuto.

Tariamo perfettamente il nostro azionamento e controlliamo che con 10v di riferimento si raggiunga la massima velocità stabilita.

Poi misuriamo la velocità con riferimento costante a 8.5v; ripetiamo la misura con riferimento a 9V e 9.5v. Verifichiamo che la variazione di velocità sia proporzionale e lineare. Annotiamo l'escursione di velocità.

A questo punto dobbiamo procurarci un generatore di frequenza sinusoidale, in grado di erogare 1Vpp con frequnze comprese almeno da 0.05Hz fino a 50Hz.

Poniamo il riferimento di velocità a 9V, poi sovrapponiamo a questo l'uscita sel generatore tarato alla minima frequenza e dobbiamo assicurarci, tramite oscilloscopio, che l'escursione del riferimento sia compresa tra 8.5V e 9.5. L'escursione di velocità dovrà corrispondere all'escursione misurata in modo statico.

Aumentiamo gradatamente la frequenza modulante, avendo cura di mantenere costante l'ampiezza entro 1V.

Quando l'escursione di velocità si sarà ridotta al 70.7% del valore misurato staticamente, avremmo raggiunto la frequenza limite del sistema; sono i famosi 3dB che determinano la banda passante.

La prova si può anche effettuare con ampiezze minori: 0.5V, 100mV, etc.. L'unica cosa fondamentale è la corretta metodologia e la corretta misura.

La procedura che ho descritta è una procedura didattica. Nella pratica corrente gli azionamenti sono caratterizzati, anche per banda passante, dai costruttori. E' vero che quasi nessuno riporta questo dato però, per esperienza, si sa quanto può essere. Poi ci sono limiti fisici dovuti alla tecnologia. Ad esempio l'anello di corrente di un azionamento trifase 50Hz, con controllo a SCR, risponde al massimo in 6.6 ms proprio per il limite fisico dei 50Hz. Infatti il medesimo azionamento in USA è un poco più rapido perchè la rete funziona a 60Hz.

Per le varie domamnde sui parametri e sulla loro corrispondenza fisica, ti rimando al tutorial; li puoi travare le risposte. Per dartele qui dovrei riscrivere i primi 2 capitoli, converrai che non è proprio il caso.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Fermo restando il primo esempio, ne riporto un altro per vedere se ho capito qualcosa.

Si ha un motore 1400rpm quando il riferimento out dal plc è di 32000punti.

si vuole tenere la velocita costante di questo motore con un errore del +/-2% cioe di circa +/- 20rpm quindi la nostra banda morta sara da 1380 a 1420, in questo campo il motore si considera controllato e il pid è escluso.

Se pero la velocita scende a 1300rpm si ha un errore di 100rpm, come si fa a questo punto a dire lo moltiplico per il valore di kp?quanto deve valere kp? io penso teoricamente e ignorante in materia, che se il nostro regolatore deve tenere il motore sempre al valore SP dobbiamo moltiplicare 100 * 22,85.

questo 22,85 viene fuori da 32000/1400rpm. cioe il nostro convertitore butta fuori 22,85punti/ ogni rpm. e siccome dobbiamo recuperare un erroe di 100 lo moltiplichiamo per kp 22,85. chiedo ho pensato e detto una c...? o forse il kp deve essere molto piu basso perche poi ci dobbiamo aggiungere l integrale e il derivativo?so che puo sembrare una sciocchezza per gli esperti ma per me che è una cosa nuova non lo è :(

Link al commento
Condividi su altri siti

Ahi, ahi Roberto! Forse non lo hai letto attentamente, magari hai saltato qualche paragrafo che ti sembrava noioso

Livio il paragrafo non è per niente noioso!! :angry: anzi è interessantissimo!!! :) pero so che in alcune righe del paragrafo ci sono pagine e pagine di base che non ho :( ! e vorrei aiutarmi con la pratica (e con il tuo aiutino :D ) per cercare di capire meglio!

Link al commento
Condividi su altri siti

No Roberto, l'ho proprio scritto con l'intento di proporlo a chi ha poche o nulle conoscenze di base sulla regolazione, quindi formule ridotte al minimimo. Però il tutorial, specialmente i primi 2 capitoli, va letto con attenzione e digerito lentamente. Se leggi attentamente, quando spiego come si costruisce un PID con tecnica discreta i 3 termini fondamentali: Proporzionale, Integrale e Derivativo sono spiegati "ad abbundantiam" sia come si implementano sia da cosa derivano. Però deve essere stato digerito il primo capitolo: quello di base dove si tratta il PID generico con tecnica analogica.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

No Roberto, l'ho proprio scritto con l'intento di proporlo a chi ha poche o nulle conoscenze di base sulla regolazione, quindi formule ridotte al minimimo

Scusa, hai ragione sono io che non mi sono impegnato abbastanza. comunque ora sono arrivato a questo punto e vorrei chiederti un chiarimento prima di andare avanti,diciamo che teoricamente ho capito benissimo l integrale quale funzione deve svolgere nel controllo

esso incrementa la stabilità, rallenta la risposta ed annulla l’errore in condizioni a regime.

Ad ogni periodo di campionamento il valore in uscita equivale al valore

d’ingresso sommato al precedente valore d’uscita. Con il tempo di campionamento uguale a 10

msec., ogni 10 msec sarà effettuata la somma tra il valore di in ingresso ed il precedente valore memorizzato.

Aumentando o diminuendo il coefficiente chi si diminuirà o si aumenterà il tempo d’integrazione

Per una cpu siemens 200 come faccio matematicamente a scrivere questo? ho difficolta a capire come memorizzare il valore campionato nel tempo ogni10ms

Link al commento
Condividi su altri siti

Per prima cosa l'integrale devi trattarlo i real. Riserverai una variabile real all'integrale, ovviamente sarà una doppia word; chiamala, p.e., DW_ri. Nella routine di inizializzazione questa andrà azzerata. Alla prima chiamata della fujzione PID, la variabile che rappresenta l'integrale sarà uguale a zero.

Il coefficiente di integrazione Ki sarà anch'esso real. Moltiplichi, usando la moltiplicazione in real, l'errore istantaneo per Ki, il risultato va in una variabile temporanea real; chiamala, p.e., DW_riinst. Ora esegui questa somma:

DW_ri = DW_ri + DW_riinst..

Ogni volta che chiami la funzione eseguirai moltiplicazione e somma. Se l'errore non cambia segno ed è, p.e., sempre positivo noterai che la variabile DW_ri ad ogni chiamata s'incrementa.

Ovviamente dovrai fare un test con un valore di comparazione; quando il valore d'integrale raggiunge il limite prefissato, cioè DW_ri > limite poni DW_ri = limite.

Poi devi prevedere anche un comando di reset d'ntegrale.

Per esperienza Ki si tiene sempre minore di 1; più lo diminuisci più rallenti l'integrale. E' come se aumentassi il valore del condensatore.

Puoi scrivere le 4 istruzioni relative all'integrale, poi provi a mettere un valore fisso di errore e verifichi come cresce o decresce l'integrale andando in on line con il PLC

Link al commento
Condividi su altri siti

:thumb_yello:

Dwr_i in VD10

inserisco un chi = 0,8 inferiore all unita in vd14

LD SM0.0

MOVR 0.8, VD14

assumo come esempio un errore pari a 5 in vd18

LD SM0.0

MOVR 5.0, VD18

eseguo la moltiplicazione

LD SM0.0

MOVR VD14, VD22

*R VD18, VD22

eseguo la somma

LD SM0.0

+R VD22, VD10

eseguo il confronto per imporre un limite all integrale (limite di esempio=3000)

LDR> VD10, 3000.0

MOVD 3000, VD10

Vado on line con il pc e vedo che Vd10 incrementa fino ad arrivare 3000 e poi riparte da 0 e cicla sempre da 0 a 3000. è normale?

Nel Main ho il segmento che quando i0.3 è on trasferico 0 in Vd10 per azzerare DW_ri(Vd10)

Ho due domande :(

Ogni volta che chiami la funzione eseguirai moltiplicazione e somma

Ogni volta cioe quando? quando voglio aggiungere al controllo P anche il controllo I? esempio, ho un potenziometro lineare ed alle massime escursioni escludo il controllo I, vado solo con quello proporzionale e quando sono vicino al punto di equilibrio chiamo anche la funzione integratore?

Il comando di reset integrale è un semplice trasferimento di 0 nella variabile DW_ri?

Link al commento
Condividi su altri siti

Vado on line con il pc e vedo che Vd10 incrementa fino ad arrivare 3000 e poi riparte da 0 e cicla sempre da 0 a 3000. è normale?

No è sbagliato! Devi verificare quello che fai dopo il confronto, se VD10 > 3000 ===> vd10 = 3000.

Poi:

1 - l'errore può essere un intero, dipende cosa hai in reazione; solitamente o hai un analogico convertito o un contatore, quindi sono interi.

2 - il coefficiente di integrazione, quello che tu definisci "chi", è sempre real quindi tutte le variabili dell'integrale, sia il temporaneo risultato della moltiplicazione, sia la memoria della somma devono essere real, altrimenti si perdono preziosi decimali. Solo la variabile che metti in somma con la parte proporzionale e, eventualmente, con la parte differenziale saranno interi, visto che il D/A accetta solo interi.

Ogni volta cioe quando?

Quando lo decide il timer del campionamento; se hai messo il timer a 10ms ogni 10 ms avrai un interrupt che andrà a chiamare la funzione PID.

L'azzeramento della funzione, in pratica l'integrale, deve essere fatto solo alla prima volta o quando occorrono condizioni che lo richiedano (in genere anomalia che genera allarme).

Link al commento
Condividi su altri siti

Solo la variabile che metti in somma con la parte proporzionale e, eventualmente, con la parte differenziale saranno interi, visto che il D/A accetta solo interi.

-E la parte integrale?? ho appena corretto il programma lasciando i caloli in real solo la moltiplicazione e la somma e il chi perche è 0.8.L errore invece l ho dovuto convertire in real per forza.

- VD10 è la correzione che serve per buttare nel D/A insieme al proporzionale? e se VD10 esce fuori da un calcolo in real, quindi con virgola, posso convertirlo in intero?? nel confronto del limite di 3000 succede che VD10 caricato come intero dopo il box della comparazione del limite si trova sempre ad un numero lunghissimo!!

Link al commento
Condividi su altri siti

Puoi fare tutte le operazioni, confronto compreso, in real per convertire poi solo quando usi l'integrale per metterlo sul D/A

Se vai nella sezione didattica dove c'è il link al mio tutorial, c'è anche il link alle appendici. nelle appendici l'ultima contiene il download a 4 programmi S7-200, vecchi come versione di microwin, tra cui trovi anche un posizionatore con PID. Guardatelo bene

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

tra cui trovi anche un posizionatore con PID. Guardatelo bene

:blink: E mica me ne ero accorto che avevi fatto dei programmi di esempio!! e certo che me lo studio segmento per segmento!! Grazie!!!!! :thumb_yello:

Link al commento
Condividi su altri siti

Mooolto interessanteee!! finalmente vedo un programma serio e completo mi serviva per capire come ''muovermi'' con la programmazione.

una piccola domandina Livio, se puoi e hai voglia di andar a rivedere ok, altrimenti non fa nulla, gia sto disturbando piu del dovuto!

nel programma posiz. e pid. nel interrupt segmento 11

dove c è il loop PI all inizio moltiplichi in real 1 nel VD74,

chiedo perche Vd74 se l errore risiede in VD70? eppure ho girato tutto il programma ma non trovo nessun trasferimento o conversione da intero -real da vd70 a vd74. :(

La correzione proporzionale non si calcola Kp =error *chi e quindi VD70 *1= Vd74?... non riesco ad arrivarci :(

Continuando con il PI nel integrale invece mi trovo benissimo, cè il chi a 0.05 moltiplicato per VD70 cioe l errore.

Link al commento
Condividi su altri siti

Evidentemente si tratta di un errore di digitazione, altrimenti non riesco a spiegarmelo, :senzasperanza: comunque, ora mi è molto piu chiaro la regolazione e come scriverla nel plc.

Vorrei fare una prova a banco di un regolatore PI, potresti consigliarmi un applicazione fattibile per scopo didattico e sperimentale, che necessita di una regolazione Pi?

Ho pensato al regolare gli rpm di un motore, e non me ne vengono altre... :(

Link al commento
Condividi su altri siti

1 - Programma di esempio. Devo andare a rivederlo, son passati oltre 10 anni e la memoria non aiuta.

2 - Meglio usare qualche cosa di statico e lento come un controllo di temperatura. Però potresti anche provare direttamente con un controllo di velocità. Segui bene i consigli del tutorial su come ottimizzare i parametri.

Link al commento
Condividi su altri siti

Per il controllo di velocita, ho paura che non riesco a vedere bene la reazione quando freno l albero motore, cioe l azione di correzione ci sara sicuramente, ma volevo provare un sistema dove si ''rischia di andare subito in instabilita'' tipo un filo sempre in tensione tra due ruote motorizzate, e non appena cerco di abbassarlo vedo quando tempo il sistema lo riporta in tensione come era prima e con la minima instabilita! tipo (aspo avvolgitore)

ora è solo un problema meccanico per la realizzazione a banco, per mettere in pratica quindi il controllo su cui esercitarmi.

Se non è fattibile cio che penso, seguiro il tuo consiglio sul controllo di velocita retroazionato.Grazie di tutto come sempre! ;)

Link al commento
Condividi su altri siti

nel programma posiz. e pid. nel interrupt segmento 11 ...

Sono andato a rivedere il tutto, manca un'istruzione; si sarà cancellata nella trascrizione? bhoo

LD     Ric_Marcia
LPS
MOVR   Pos_err_real, Corr_prop_real
*R     1.0, Corr_prop_real         //il numero è il coefficiente P
TRUNC  Corr_prop_real, Corr_prop_int[/code]

La riga che manca è quella in neretto.

In questo caso il coefficiente proporzionale Kp è sempre 1; è così perchè quell'applicazione (una pressa idraulica) lo richiedeva.

Hai notato il numero limitato di istruzioni necessarie per eseguire un PI completo di limiti?

I due coefficienti Kp e Ki che qui sono fissi (1 e 0.05) puoi renderli variabili da pannello operatore sostituendo le due costanti con due VD. Ovviamente il coefficienti diventano operativi solo tra un richiamo e l'altro del PI, quindi mettere dei blocchi ^_^

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Hai notato il numero limitato di istruzioni necessarie per eseguire un PI completo di limiti?

Si :) e mi spinge ancora di piu a fare un mio primo controllo PI, poi dopo di sicuro un PID.

Capisco il vantaggio di modificare il proporzionale e integrale da pannello.

Stamattina nemmeno a farlo apposto, sono stato chiamato da una fabbrica che producono fili per saldatrici e li avvolgono su rocchetti. Sono miei clienti, faccio loro la manutenzione sui motori a corrente continua.

Il capomanutentore,lamentava un difetto su di un motore che segue la bobina grande con un ballerino interposto tra aspo e avvolgitore.

Praticamente mi ha detto che il motore non rispondeva prontamente( il motore è circa un 35kw dc eccitaz.indipendente) anche se aumentava da pannello operatore il proporzionale, e la corrente erogata dal convertitore di armatura andava sempre al massimo! ma il motore non rispondeva velocemente alla richiesta di accelerazione.Io non ho potuto dirgli nulla senza fare le prove al motore, e mi ha detto che lo avrebbe smontato comunque perche ne ha un altro di scorta.

Comunque sono curioso e appena posso andare da loro mi faro dire se il problema è al motore o nel controllo.

Link al commento
Condividi su altri siti

  • 1 month later...

mi ero quasi dimenticato di concludere la discussione, lasciarla in sospeso non è bello :)

il problema a quel motore c era...e come spesso succede è sempre un problema di natura umana... :rolleyes:

le spazzole del motore erano state sostituite dal loro personale tecnico.

1) non erano della stessa qualita di impasto.

2) non erano della stessa misura, infatti li hanno fatte limare, ma facendo questo la spazzola nel suo alloggio portaspazzola non scendeva liberamente spinta dalla molla, e quindi il contatto sul collettore di alcune delle 8 spazzole non c era quasi per niente!! :angry:

risultato il motore non rispondeva bene, e il collettore ha cambiato colore per via della caduta di tensione sulle spazzole diversa da quella necessaria e raccomandata dalla casa costruttrice!

Link al commento
Condividi su altri siti

  • 2 weeks later...

Sto riprendendo il discorso per quanto riguarda il controllo PID che ho iniziato nella discussione, Livio, volevo chiederti un ulteriore consiglio, all inizio ho spiegato che volelo controllare la velocita di un motore asincrono trifase 2 poli con tachimetrica calettata al suo albero, e un inverter pilotato con 0-10volt da plc.

Ora prima di montare tutto al banco, pensavo, frenando il motore e per tenere fermi gli rpm come da set point il regolatore PI aumenta la frequenza dell inverter con 0-10v, il motore riuscira ad accelerare se la frequenza aumenta di poco? cioe se fosse un converitore con motore dc allora non ci sono problemi perche la coppia è in funzione della corrente erogata dal convertitore, in questo caso io aumento la frequenza :( , non sono sicuro se il motore si portera agli rpm desiderati se io tendo comunque a frenarlo. quindi ti chiedo, con un motore da 0,09 kw quale inverter mi consgli di utilizzare per questa prova solo a scopo didattico? e come deve essere impostato? V/f? o controllo vettoriale?

Link al commento
Condividi su altri siti

Se l'azionamento (motore + inverter) è in grado di erogare la coppia necessaria non ci sono problemi.

la retroazione con tachimetrica (o con encoder) è un vecchio metodo per tenere costante la velocità degli inverter v/f. La si usava già 25 anni fa quando si volevno evitarele classiche non linearità di variazione di velocità e le prese di carico.

Link al commento
Condividi su altri siti

ah giustamente dici se non supero con il carico la corrente di targa del motore e quella erogabile dell inverter allora il motore puo recuperare i giri, ok , e per quanto riguarda l accelerazione decelerazione nell inverter a che tempo devo tararla? al minimo tipo 0.1secondi? cosi risponde il piu presto possibile?

Link al commento
Condividi su altri siti

comunque ora rifaccio un riepilogo di cio che ho capito cosi prima di mettermi a scrivere il programma vediamo se sbaglio

valore set point, desiderato = Vd 10

valore letto ad ogni ciclo di scansione = Vd 14

kp in Vd26

chi in Vd 30

nel interrupt a tempo ogni 20ms scrivo queste istruzioni

Carico il valore Vd 14 in Vd 18 in modo da aggiornarlo e leggerlo ogni 20ms

poi eseguo la differenza per stabilire l errore Vd10-Vd18= Vd22

carico l errore anche in una Vd 42 che usero poi per moltiplicarla con chi

moltiplico l errore Vd22 * Kp coefficiente proporzionale quindi Vd22*Vd26=Vd 22

ora dovrei fare la somma con la parte integrale

per calcolarla eseguo: l errore Vd42 * chi Vd30 =Vd 42

quindi faccio la somma della parte proporzionale con quella integrale e cioe VD22*VD42 risultato in VD50 = correzione totale.

mancano i limiti per il proporzionale e l integrale, il procedimento pero è giusto? :(

Link al commento
Condividi su altri siti

il procedimento pero è giusto?

no, non è giusto i conti non mi tornano...

perche l equazione dovrebbe essere questa

Yn = (error * Kp) + (I + i_inst) + (Kd * (error – old_error))

io non ho eseguito correttamente I+i_inst... cioe dovevo fare I + (errore*chi) ma I nei valori quanto vale? questo non ho capito bene! :(

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