Vai al contenuto
PLC Forum


Costruire Un Pid


roberto8303

Messaggi consigliati

Se è un cc a magneti permanenti

esatto è un magneti permanenti da 3700rpm, di tachimetriche abbastanza vecchiotte ne ho diverse, pero sono statore e rotore diciamo ''libere'' e penso che siano almeno 20 o 30V/1000rpm dovrebbero essere calettate su flange costruite apposto dietro ai motori dc non ne ho di quelle che sono chiuse che ruotano su cuscinetti con albero sporgente che si accopianno con giunti elastici :( , questa nella foto è la piu piccola che ho trovato da poter ''fissare'' dietro al motorino ac...

purtroppo non ho messo piu la ventola di raffredamento in plastica, perche dovrei allungare l alberino, ma tanto per quello che devo fare, cioe prove che durano pochi minuti penso che non cè bisogno, poi il motore ce l ho a banco e mi accorgo subito se riscalda.

poi un altra cosa Livio, volevo chiederti, in questo caso con la tachimetrica analizzo il segnale di ingresso su 0-32000punti e ok, ma per quanto riguarda l encoder sia per questa applicazione ma come per altre, cosa succede se come riferimento di ingresso invece di dare un segnale che va da 0-32000punti mando un numero piu basso per es 0-500punti? ottengo meno precisione nel stabilire l errore che vien fuori dalla differenza? e il controllo come si comporta? è uguale o ne risente se calcola l errore su un valore variabile di ingresso relativamente basso cioe poco risolutivo? non so se mi son fatto capire :(

Link al commento
Condividi su altri siti


  • Risposte 89
  • Created
  • Ultima risposta

Top Posters In This Topic

  • roberto8303

    58

  • Livio Orsini

    32

Prima di tutto i 32000 punti sono, in realtà, 2047 perchè siemens per sua comodità a shiftato a sx la lettura dell'A/D_C.

Se riduci a 500 punti riduci di ad un quarto circa la risoluzione.

Link al commento
Condividi su altri siti

ah si perchè i 4 bits meno significativi di AIW0 son solo di figura.

quindi si perde risoluzione...allora dovendo fare un controllo meglio avere un segnale di ingresso 0-10volt che averene uno 0-5volt giusto?

Link al commento
Condividi su altri siti

Finalmente mi sono potuto dedicare un paio di ore a questo regolatore PI! e sono successe molte cose :)

ho installato il tutto con la nuova tachimetrica, ho deciso di modificare la frequenza di riferimento inverter in modo da avere a 32000 punti 10volt in uscita AQW0

precisamente 1070rpm motore con 10volt della tachimetrica quindi AIW0.

Quindi completo il programma che avevo lasciato solo con il regolatore proporzionale, aggiungo 5 segmenti e sopra al proporzionale scrivo quello integrale, usando l ingresso I0.2 attivo la funzione jump per saltare il controllo integrale e andare solo con il proporzionale.

ora metto un po di dati che ho nel programma perche è successa una cosa che ancora non mi sono spiegato...

Valore set point fisso 18000 circa 600rpm motore.

Interrupt a tempo 15ms

kp=0.6

chi=0.04

limite proporzionale 1500 e -1500

limite integrale 2047 e -2047

Vado on line faccio partire il motore e si porta a 600rpm inserisco il proporzionale e cè una piccola oscillazione di rpm tra 540 e 660..è normale? io credo di si...allora chiudo l interruttore I0.2 che svolge i segmenti che erano saltati dopo jmp,quindi l integrale, il motore gira piu regolare con una variazione tra 580 a 620rpm, quindi passo alla prova, freno con la mano la ruota che ho sull albero motore, il motore si innervosisce appena e la frequenza e la velocita a display dell inverter si alza per qualche secondo e si porta vicino al valore set point cosi come il riferimento tachimetrica.e fin qui tutto sembra andare bene, appena mi rimetto devo collegare un pannello per modificare i valori di kp e chi mentre il motore ruota per vedere cosa cambia... :)

Ora arriva il bello, decido di frenare di parecchio il motore, arrivo a fermarlo quasi ed all improvviso si mette a ruotare a scatti!! anche lasciandolo il motore va a colpi, la tachimetrica segna da 2 a 8 volt in pochi secondi il motore singhiozza propio! allora disattivo l interruttore integrale, ma niente, poi anche il proporzionale ma non cambia il motore va a singhiozzi!! lo fermo riparto e ancora niente! :senzasperanza: allora decido di ricaricare il programma nel plc per azzerare un po tutto, e appena riparto il motore gira di nuovo regolare!

Ormai ho capito Livio che per fare un regolatore del genere bisogna affidarsi a regole teoriche ben precise e non farlo andare '' cosi come va'' ma quando si osserva un fenomeno che sopratutto presenta errori e si trova il ''difetto'' ti giuro che la regola che magari prima non si capiva poi ti entra in testa e per sempre!!

ma nel mio caso cosa potrebbe essere? l errore è diventato troppo grande siccome il set point era 18000 e il riferimento era 0? ma i limiti quindi a cosa servono?

Link al commento
Condividi su altri siti

Prima cosa: l'oscillazione. Non va bene! Parti con proporzionale molto più basso, 0.1 p.e., dai uno step (gradino) di riferimento pari a 1V (10%) e osserva all'oscilloscopio cosa succede alla tachimetrica cosa accade. COn proporzionale basso non ci deve essere nessuna oscillazione. incrementa poco a poco il proporzionale ripetendo la prova sino a che noti un inizio di oscillazione, riduci un poco il proporzionale. Ripeti la procedura con l'integrale.

Se non fai così e se non riesci ad ottenere una rotazione stabile gia con il solo proporzionale, c'è qualche errore di programamzione.

Per ora metti solo il limite sull'uscita per evitare di superare il limite del D/A_C

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

Ok molto chiaro, non sono partito con un proporzionale basso cioe 0.1 e quindi faro questa prova, pero ho provato ad aumentarlo anche a 0,6 e l oscillazione sembra aumentare...

dai uno step (gradino) di riferimento pari a 1V (10%) e osserva all'oscilloscopio cosa succede alla tachimetrica cosa accade

capito quindi scrivo 3200=1volt e vedo all oscilloscopio cosa accade cioe se ci sono variazioni...aumento il proporzionale fino a che noto oscillazioni di riferimento! e poi riabbasso il proporzionale. Gia me l avevi detto, ma adesso ho capito bene come fare!

Anche se teoricamente mi viene il dubbio che sto cercando dal controllo piu di quello che posso pretendere, cioe, io ''freno'' circa 300rpm e vorrei che l inverter incrementi di molto la frequenza per recuperare, e non solo il ''minimo indispensabile'' per non andare in instabilita! :(

comunque questa è una altra storia,che poi vedremo piu avanti, per ora devo fare come mi hai detto! :thumb_yello:

Per ora metti solo il limite sull'uscita per evitare di superare il limite del D/A_C

di quanto devo mettere il limite? di 32000 e -32000? o di meno?

Link al commento
Condividi su altri siti

di quanto devo mettere il limite? di 32000 e -32000? o di meno?

Si va bene così

pero ho provato ad aumentarlo anche a 0,6 e l oscillazione sembra aumentare...

Se aumenta significa che il guadagno è troppo elevato. Sempre che tutto ikl resto sia a posto.

Per curiosità, come aggiorni l'uscita? Scrivi direttamente sulla periferia analogica suppongo, però all'inizio del ciclo seguente o al temrine della funzioen?

Link al commento
Condividi su altri siti

all inizio al primo segmento nel MAIN scrivo e carico il valore set point in AQW0 dopo ci sono i segmenti dove carico in real kp e chi eseguo le somme e quasi all ultimo segmento sempre nel main non nel interrupt a tempo, sommo i due riferimenti di P ed I e li carico in AQW0 con Sm0.0 all inizio del box.

Il tempo per l interrupt da 15ms è bene tenerlo cosi? cosa cambia se provo a cambiarlo? la risposta del controllo?

Link al commento
Condividi su altri siti

all inizio al primo segmento nel MAIN

NO!

La scrittura del riferimento deve essere fatta in modo diretto, cioè senza passare dai registri immagine. Deve essere fatta sempre nella funzione sotto interrupt. Io consiglio di farlo come prima operazione della funzione, usando il valore calcolato la volta precedente. All'ingresso della funzione si legge direttamente il valore della tachimetrica e si scrive direttamente il valore di riferimento calcolato nel campionamento precedente.

Usando un azionamento costituito da inverter + asincrono un tempo di campionamento adatto potrebbe essere pari a 20ms.

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

ops :blink: , ecco perche rispondeva a scatti scriveva in uscita con un tempo impreciso :(

ok pero spiegami quale funzione mi permette di fare questo

All'ingresso della funzione si legge direttamente il valore della tachimetrica e si scrive direttamente il valore di riferimento calcolato nel campionamento precedente.

cioe devo al primo segmento scrivere AQW0 = AQW0+Variabile PI?

si legge direttamente il valore della tachimetrica

ops, AIW0 l ho traserito in una variabile es VW10 nel main, e nel interrupt ho letto VW10... :D mentre dovevo caricarla direttamente nella funzione interrupt...

mi sa che occorre rifare un po il programma :) a questo punto mi chiedo nel main occorre scrivere solo il valore di KP e chi e il set point?

Link al commento
Condividi su altri siti

Nel main puoi scrivere solo quello che non entra direttamente nella regolazione; ad esempio se passi i parametri tramite tastierino HMI usi il main o un altro blocco per scriverli nella variabile che sarà usata dalla funzione PID

Al momento non ricordo, e non ho modo di verificare, se AIWxx e AQWxx siano direttamente la periferia analogica, oppure siano l'area dei registri immagine della periferia analogica. Se scrivi e leggi dai registri immagine sei sempre schiavo del tempo di ciclo, con tutte le implicazioni che comporta questo fatto.

In pratica devo fare:

- Chiamo funzione PID

- Nella funzione verifico se la funzione è attiva

- Se è attiva leggo la tachimetrica e scrivo il riferimento usando il valore calcolato precedentemente

- calcolo l'errore ed eseguo i blocchi P, I e D

- sommo i vari coefficienti ottenuti, riscalo eventualmente, verifico i limiti e memorizzo il valore di riferimento (che metterò in uscita la prossimo campionamento)

Link al commento
Condividi su altri siti

non ho modo di verificare, se AIWxx e AQWxx siano direttamente la periferia analogica, oppure siano l'area dei registri immagine della periferia analogica

Ok stasera sul tardi verifico io sul manuale

verifico i limiti e memorizzo il valore di riferimento (che metterò in uscita la prossimo campionamento)

quando dici mettero in uscita al prossimo campionamento intendi che si aggiorna al prossimo evento interrupt cioe dopo i 20ms?

Link al commento
Condividi su altri siti

quando dici mettero in uscita al prossimo campionamento intendi che si aggiorna al prossimo evento interrupt cioe dopo i 20ms?

Certo

Link al commento
Condividi su altri siti

se AIWxx e AQWxx siano direttamente la periferia analogica, oppure siano l'area dei registri immagine della periferia analogica

se ho capito bene sono direttamente la periferia analogica, riporto quello che ho trovato sul manuale.

La s7 200 non aggiorna automaticamente gli ingressi analogici durante il normale ciclo di scansione, a meno che non sia stato attivato il filtraggio degli ingressi analogici. é stato predisposto un filtro analogico per garantire un segnale piu stabile.

Se si attiva il filtro per un dato ingresso analogico, l s7 200 aggiorna l ingresso una volta in tutti i cicli di scansione, esegue il filtraggio e memorizza internamente il vlaore filtrato. il valore viene fornito ogni volta che il processo accede all ingresso analogico.

Se invece non si attiva il filtraggio degli ingressi analogici, ogni volta che il programma accede all inresso analogico, l s7 200 ne legge il valore dalle unita di ampliamento.

Gli ingressi analogici Aiw0 integrati nella cpu 224xp vengonno aggiornati in tutti i cicli di scansione con l ultimo risultato fornito dal convertitore analogico/digitale.

Poiche si tratta di un convertitore sigma-delta generalemente i valori non richiedono un flitraggio software.

Comunque a quanto sembra l area dei registri di immagine comprende quelli di processo degli ingressi, uscite, accumulatori, merker interni m, merker speciali sm, memorie variabile V. poi negli oggetti di dati che sono locazioni di memoria,comprendono contatori,ingressi analogici-uscite analogiche registri degli accumulatori,valori attuali del contatore veloce.

L accesso agli oggetti di dati è piu restrittivo, visto che si puo accedere a questi solo in base all uso che si intende fare di uno di questi oggetti.

a me sembra di aver capito che posso leggere e scrivere e trasferire i valori AIW0 e AQW0 direttamente nella funzione interrupt...

Link al commento
Condividi su altri siti

Rieccomi, questa sera ho avuto un paio di ore libere e ho rifatto tutto daccapo! :)

L errore c era eccome... :rolleyes: e anche sciocco.

Ho riscritto il progamma mettendo tutti i calcoli e le letture e scritture dei valori analogici nella funzione interrupt cancellandoli quindi nella funzione main dove li avevo scritti l altra volta.VAdo a provare, inserisco il proporzionale e...niente l uscita non si aggiorna non regola niente! :( , allora vado a vedere nel main siccome nel interrupt rifatto ero sicuro che andava tutto bene, e infatti nella funzione Main c era l errore madornale, e cioe ho caricato il valore di set point direttamente in AQW0 e non in una word d appoggio!!! :angry: sara stata una distrazione, ma intanto il plc non aggiornava niente siccome leggeva il valore fisso nel main e lo caricava in aqw0!

allora corretto questo, inserisco il valore di 1volt di riferimento cioe solo il 10% e provo ad osservare ad oscilloscopio con un valore di kp prima 0.6 e poi 0.9 ora metto delle foto cosi per rendere l idea

la prima è con proporzionale a 0.6 la seconda è con proporzionale a 0.9 e misurata la tachimetrica anche con oscilloscopio, purtroppo manca la misura con l oscilloscopio con kp a 0.6 cancellata per sbaglio :angry:

Link al commento
Condividi su altri siti

Vd 28 nella tabella di stato è l errore.

con kp a 0.9 noto qualche instabilita nella rotazione e sopratutto appena parte il motore, comunque non appena freno il valore aumenta e va bene. ora manca l integrale, ma voglio collegare il pannello cosi cambio i valori kp e chi senza caricare sempre il programma, purtroppo posso mettermi seriamente solo questo fine settimana :(

secondo te kp 0.9 è troppo alto?

pero voglio chiederti un altra cosa Livio, io ho cercato di rapportare il segnale di ingresso con quello di uscita e cioe quando carico come set point 32000 la tachimetrica mi restituisce circa 32000, ma se invece mi dava solo es. 20000, l errore sarebbe stato diverso siccome e=set point- valore di consegna, in quel caso come ovviare a questo problema?? manipolare il segnale di riferimento del set point? cioe io scrivevo es in un pannello 32000 e poi nel programma lo dividevo per un numero in modo da portarlo a 20000?

cioe di solito si usano trasduttori che danno in uscita un segnale 0-10volt e altrettanto riferimenti per attuatori 0-10volt, ma nel caso il segnale di consegna non arrivi a 10volt come si fa?

Link al commento
Condividi su altri siti

1 - Se la prima foto si riferisce alla tacho con Ki = 0.9 è evidente che siamo con xsi < 0.6, cioè ci sono oscillazioni. Se la terza foto si riferisce a Kp=0.6 direi che può andare, amche se sarebbe meglio vedere la tachimetrica.

2 - L'uscita del trasduttore di velocità non è detto che debbe assere uguale all'ingresso di riferimento. L'importante è ricondurre il tutto all'eguaglianza tramite opportune riscalature. Nel caso di tacho, solitamente 60V/1000rpm, si usa un partitore in modo da far corrispondere 10V (se il riferimento è 10v) alla massima velocità. Se usi un encoder non ci sono problemi, la riscalatura la fai sul riferimento. L'importante è cercare dis fruttare al massimo l'escursione del trasduttore di velocità. Se hai un potenziometro come riferimento, con tensione massima di, p.e., 5v conviene comunque riscalare il riferimento. E' ovvio che si perde un po' di risoluzione. Nel tuo caso, basta shiftare a sx di un passo quello che leggi all'ingresso del rifierimento.

Link al commento
Condividi su altri siti

xsi < 0.6

che vuol dire xsi?

Se la terza foto si riferisce a Kp=0.6 direi che può andare, amche se sarebbe meglio vedere la tachimetrica.

si è con kp 0.6 anche se e lo devo fare, voglio verificare con riferimento fisso es. 4000 e senza correzione se questa tachimetrica è stabile o ancora ci sono oscillazioni! ho il dubbio che a bassi giri, l inverter non faccia ruotare in modo uniforme il motore,(devo provare per ora è solo un dubbio) perche quando misurai a 12volt di uscita tachimetrica e il motore era sui 1400 rpm l onda era bella precisa senza oscillazioni.

poi per il fatto di riscalare i riferimenti per adattarli nel controllo ho capito :thumb_yello:

c è un altra cosa, posto il programma e voglio capire se ho fatto bene quando escludo il proporzionale e lo azzero, se ho fatto bene, perche mi sa che non si fa cosi...

Link al commento
Condividi su altri siti

TITLE=COMMENTI SULLA ROUTINE DI INTERRUPT

Network 1

// CALCOLO L ERRORE SET POINT VW10-AIW0= VW20

LD SM0.0

MOVW VW10, VW20

-I AIW0, VW20

Network 2

// CONVERTO L ERRORE IN DI VD24

LD SM0.0

ITD VW20, VD24

Network 3

// CONVERTO L ERRORE IN REAL VD28

LD SM0.0

DTR VD24, VD28

Network 4

// SALTO IL REGOLATORE INTEGRALE E SVOLGO IL PROPORZIONALE

LD SM0.0

A I0.2

JMP 1

Network 5

Network 6

Network 7

// CONTROLLO PROPORZIONALE

LBL 1

Network 8

// AZZERO KP

LDN I0.2

MOVR 0.0, VD14

Network 9

// SE I0.2 ON CARICO KP IN KP

LD I0.2

MOVR VD14, VD14

Network 10

// MOLTIPLICO L ERRORE VD28 X KP = VD30=P

LD I0.2

MOVR VD14, VD38

*R VD28, VD38

Network 11

// ARROTONDO P IN REAL IN DI VD42

LD SM0.0

A I0.2

ROUND VD38, VD42

Network 12

// ARROTONDO P Di IN INTERO VW100

LD I0.2

DTI VD42, VW100

Network 13

// SOMMO P AL SET POINT = VW102

LD I0.2

MOVW VW100, VW102

+I VW10, VW102

Network 14

// TRASFERISCO VW102 ALL USCITA AQW0

LD I0.2

MOVW VW102, AQW0

Link al commento
Condividi su altri siti

i segmenti Network 8 e 9

praticamente se ho i0.2 aperto carico sempre 0 in vd14=kp altrimenti carico vd14in vd14 cioe 0.6 ==>vd14 che ho il box nella funzione Main.

è giusto caricare 0 con i0.2 nell interrupt?

Link al commento
Condividi su altri siti

Mhmm, io lo farei differentemente.

La scelta deve essere subito in ingresso.

Se la regolazione è attiva eseguo, altrimenti metto 0 in AQW0 ed esco.

Se la regolazione è attiva ==> Errore=SetPoint-Tacho, se Errore > banda_morta eseguo, altrimenti esco senza modificare AQW0.

Se esguo proporzionale al termine testo se attivo Integrale e continuo con la medeisma filosofia.

Però questa è la mia idea, ognuno poi deve "sentirsela"

Link al commento
Condividi su altri siti

sto perdendo un sacco di tempo per fare la prova con il pannello, praticamente dal pannello quando inserisco un kp a 0,55 nel plc è un numero intero 55, quindi ho fatto la divisione x 100 in modo da ottenere 0,55 e mandarlo in real come riferimento kp, ma non posso tenere la divisione che cicla sempre nel main perche il risultato non è costante sempre a 0.55!! oscilla!e a volte e come se scompare e poi ritorna dal box divisione :blink: come posso fare? ah per il disturbo della tachimetrica ho risolto, ho cambiato i cavetti e ho usato cavi schermati, ora con riferimento fisso è molto piu stabile!

Link al commento
Condividi su altri siti

ma non posso tenere la divisione che cicla sempre nel main

Fai il test se il valore da pannello è cambiato; se cambia allora riesegui la divisione e memorizzi in Kp (VDxx)

ah per il disturbo della tachimetrica...
se il signale di reazione è elettricamente disturbato il PID cercherà di correggere il disturbo elettrico come fosse un disturbo di velocità, ergo velocità instabile
Link al commento
Condividi su altri siti

risolto il problema della divisione per il riferimento da pannello.

Il programma di esempio che ho postato,lo cancello del tutto! :angry:

Tra scalature, poi la parte P e che nasce dal riferimento in VW quindi intero, poi diventa doppio intero, poi real e poi di nuovo a ritroso, e poi rifarlo anche per I e poi mettere i limiti, mi incasina un po le cose nella funzione interrupt, siccome non sono un programmatore esperto, diciamo che mi sono ''ammazzato con le mie stesse mani'', quindi domani mattina a mente fresca, rifaccio di nuovo tutto :( facendo le cose senza avere una logica in testa di come iniziare e come finire si arriva al punto di combinare solo casino.

voglio seguire il tuo consiglio impostando il programma in questo modo

Se la regolazione è attiva eseguo, altrimenti metto 0 in AQW0 ed esco.

Se la regolazione è attiva ==> Errore=SetPoint-Tacho, se Errore > banda_morta eseguo, altrimenti esco senza modificare AQW0.

Se esguo proporzionale al termine testo se attivo Integrale e continuo con la medeisma filosofia.

anche se non ho capito cosa intendi per la regolazione è attiva? poi nel tuo programma di esempio, tu azzeri kp o chi non AQW0 questo non capisco...

Link al commento
Condividi su altri siti

cosa intendi per la regolazione è attiva?

Vai qualche post indietro, dove ripeto l'organizzazione della funzione.

tu azzeri kp o chi non AQW0 questo non capisco...

In quale programma? Se è l'esempio in pseudo "C" potrebbe essere un errore di battitura, se invece è l'esempio del 200 no, quello ha funzionato e continua a funzionare.

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