Vai al contenuto
PLC Forum


Regolatore Pid Per Attuatore Pneumatico - Aiuto!!!


Piero80

Messaggi consigliati

Sto realizzando una tesina per laurearmi in ing informatica. Devo realizzare un regolatore per il controllo di posizione di un attuatore pneumatico. Devo utilizzare un linguaggio dello STEP 7 dato che siamo in possesso di PLC Siemens. Dal modello matematico mi viene fuori che mi serve un controllo PID, volevo sapere come faccio a realizzarlo su STEP 7? Devo usare obbligatoriamente l'FB41?? O ci sono altri metodi?

Un altra domanda?? La posizione desiderata viene data attraverso un potenziometro, quindi l'ingresso è in analogico; come vengono trattati i segnali analogici??

Ultima domanda (+ banale), dopo posso trovare schemi (cioè disegni) di elettrovalvole, mi servono per disegnare l'impianto.

Vi ringrazio in anticipo...e spero ricevo risposte.

Piero

Link al commento
Condividi su altri siti


Un consiglio usa la funzione CERCA e vedrai che il tuo problema è già stato affrontato e risolto e forse ci deve anche essere un esempio nell'area didattica.

Saluti

Link al commento
Condividi su altri siti

Omar ti ringrazio per l'interessamento, ma avevo già provato + volte a fare ricerche nel forum, ma non ho trovato risposte esaurienti al mio problema.

Grazie

Link al commento
Condividi su altri siti

Hai provato a studiarti l'esempio per S7200 associato al tutorial per la regolazione di Livio Orsini, inserito nella sezione di didattica?

ma non ho trovato risposte esaurienti al mio problema.

Di sicuro difficilmente troverai risposte esaudienti se con tale aggettivo identifichi una risposta che preveda analisi e soluzione con dimostazione e schemi e tutorial del tuo problema. Insomma un poco ti devi smazzare :P

Es. se l'esempio citato non fà al tuo caso perchè usi un s7-300 anzichè un s7-200 te lo dovrai tradurre ma il "significato" dell'applicativo è comunque valido etc.etc.etc.

SURSUM CORDA!!!

Link al commento
Condividi su altri siti

L'esempio non l'ho trovato, comunque ho provato a fare da solo. Mi sono creato un FB1 dove richiamo L'FB41, in uscita a questo ci ho messo l'SFC105 per convertire l'uscita in un intero e poi devo controllare le 2 valvole per la posizione. Ora un problema stupido che mi è sorto è il seguente, sopra il blocco FB41 compaiono 3 ??? rossi e quindi devo inserire un'etichetta, quella variabile dove devo dichiararla e che tipo è?? per favore aiutatemi che devo finire questa tesi.............grazie

Link al commento
Condividi su altri siti

sopra il blocco FB41 compaiono 3 ??? rossi e quindi devo inserire un'etichetta

I blocchi di tipo FB devono essere associati ad un blocco dati. Tu non devi far altro di inserire al posto dei 3 ??? rossi il nome di un DBxx e step 7 ti chiederà se vuoi creare un DB di istanza. Ovviamente come numero di DB dovrai sceglierne uno non ancora usato.

Ciao

Gianluca

Link al commento
Condividi su altri siti

Grazie grazie grazie..... :D il db me lo creavo prima e quindi poi non me lo accettava........già che ci siamo, che voi sappiate un PID posso solo realizzarlo con l'FB41 o c'è qualcosa di un po' + semplice??!?!

Link al commento
Condividi su altri siti

Ragazzi aiutatemi......ho impostato l'FB41 e l'uscita l'ho inviata ad una FC106 per convertire il valore reale in intero.....ora devo attivare le valvole in mutua esclusione a seconda se bisogna spingere il pistone verso sinistra o destra. Se voglio inviare il valore intero ad un temporizzatore come posso convertire il valore intero in un valore TIME?? C'è qualche altro modo per attivare le valvole per un certo intervallo di tempo??

Link al commento
Condividi su altri siti

ITB -> converte un intero in BCD

ma il temporizzatore accetta un formato particolare dove si deve imporre la base tempi e il tempo appunto, ora non ho sottomano i documenti ma se non erro i primi 4 bit sono la base i restanti il tempo ...

se devi leggere un temporizzazote LC T1 e lo metti in una variabile, questo è il tempo in intero in seocndi ...

Escludere mutuamente due uscite ?!?

...
 Un   A0.0
 =     A0.1 
 ...

Una curiosità, utilizzi valvole proporzionali per la movimentazione ?

Per quanto riguarda il valore analogico, di regola linearizzi una tensione da 0-10V, questa è rappresentata in formato interno come 0-27648 punti ... ma è un numero binario dove ii primi tre bit hanno solo informazione di rottura cavo, cortocircuito .. e altro ...

quindi devi schiftare a destra di tre bit il tuo valore, a meno che non utilizzi le solite funzioni della siemens (io me son costruite ... per una serie di motivi ...)

A mio avviso essendo una tesi ti converrebbe anche costruirti il tuo PID ... infondo non è poi così difficile e inoltre vedi altre problematiche :) ...

ciao

Link al commento
Condividi su altri siti

Grazie Federico per il tuo interessamento, ma il problema è che è la prima volta che ho a che fare con plc e robe del genere, e trattandosi di una tesina vorrei finire il prima possibile.

Se tu o qualcun'altro abbia un po' di tempo vi spiego i passaggi che ho fatto e mi dite dove qualcosa non va.

Riassumo l'impianto in breve: potenziomentro per dare la posizione desiderata, sensore che dà la posizione attuale e 2 valvole di uscita che funzionano in mutua che spostano il cilindro da una parte o dall'altra.

Mi è stato dato il modello matematico dell'impianto e mi sono ricavato il PID.....ora viene il bello:STEP7.

Ho realizzato un blocco FB1 e al suo interno ci ho messo un FB41 dove ci ho collegato la variabile potenziomentro e la variabile della posizione attuale (SP_INT e PV_INT), il resto degli ingressi gli ho lasciati di default e il valore di

GAIN, TI e TD l'ho modificato dal blocco DB1 di istanza di FB1. In uscita ho preso solo la variabile LMN e l'ho associata ad una variabile "controllo" che ho portato in ingresso ad una FC106 per convertire il valore reale in intero (questo mi è stato suggerito dal prof). Ora in uscita dalla FC106 avrei un valore intero (OUT).

Nell'OB1 ho rikiamato l'FB1 con la quale vorrei comandare una o l'altra valvola, e con l'uscita della FC106 a cui ho associato una variabile vorrei dirgli per quanto tempo deve attivare la valvola?? Se qualcuno mi può dire se almeno il ragionamento è giusto o c'è qualcosa di sbagliato o di + semplice.....Sarei enormemente grato se qualcuno mi aiutasse a finire.........sono distrutto......ho troppo poco tempo, sicuramente dopo quest'avventura avrò tutto il tempo di prendere confidenza con STEP7....Grazie ancora a tutti

Piero

Link al commento
Condividi su altri siti

ciao.

Io ho usato l'FB1 PID_CP semplice da usare poi con il simulatore PID è molto facile modificarne i parametri per le proprie esigenze.

l'uscita digitale poi la mandi alla scheda analogica di uscita ed il gioco è fatto

ciao. :D

Link al commento
Condividi su altri siti

FB41 intanto va lanciato nell' OB35 ciclico, impostando il tempo di campionamento almeno 1/10 del tempo del periodo che hai trovato dal tuo modello discretizzato ... Questo è il primo passo.

Se ho capito quello che vuoi fare ...

Quindi avrai un Set_Point ... e l'uscita prenderà i valori tali per quelli che hai parametrizzato nei limiti, quindi, avrai una uscita che varierà dal -100 al +100 ... dove si potrebbe ipotizzare +100 valvola sempre aperta a Dx e -100 valvola sempre aperta sx ...

a questo punto potresti lavorare così sempre OB35, fai la gestione del tempo on/off apertura chiusura valvole, potresti procedere così:

ipotiziamo:

Valore di uscita -100 ... +100

ti ricavi il modulo del valore di uscita, poi il tempo di apertura valvola lo stabilisci così:

Valore/100 * Periodo ... esempio banale

ipotiziamo OB35 viaggi a 5ms, potresti avere che

Periodo 500ms, quindi avrai che se il tuo valore di comando vale 25 terrai aperto la valvola per 25/100*500ms.

il controllo di apertura e chiusura valvola lo potresti vare su OB35 appogiandoti alla periferia con un tempo di controllo di 5ms ... Per il verso risulta banale, se valore di controllo >0 abiliti valvola verso positivo altrimenti negativo, tradotto in pseudo istruzioni, dove ovviamente non son prese alcuna precauzione di sicurezza sia per macchina che per le persone !!!! è solo un esempio possibile:

m0.0 -> Abilita valvola positiva
m0.1 -> abilita valvola negativa
m0.7 -> abilitazione temporale apertura valvola
Mw200 -> valore di controllo
Mw210 -> conteggio cicli
  
            
          L    MW210
          +   1
          T    MW210
          L    MW200
          <=I
          =    M0.7
          L     0
          >I
          =    M0.0
          <I
          =    M0.1

          L     MW210
          L     100
          <I
          SPB pippo
          L    0
          T    MW210
pippo: NOP 0  

          U   M0.7
          U   M0.0
          =   A0.0   // Comando uscita posizitva
          U   M0.7
          U   M0.1
          =   A0.1  // Comando uscita negativa

          L    AB0      // per settare l'immagine IPU 
          T    PAB0    // in modo diretto ... altrimenti dovresti attendere il ciclo PLC molto maggiore di 5ms

Bene solo un esempio prima perchè a 5ms (si ipotizza che il codice sia eseguito in OB35) difficilmente si comanda una valvola quindi bisognerebbe crearsi una base di tempi propria ... poi è opportuno creare delle soglie di isteresi ...

PS. da dove sei Piero80 ?

ciao

Modificato: da Federico Milan
Link al commento
Condividi su altri siti

Io sono di Matera, ma studio a Pisa.....imparare i PLC e STEP7 in un mese non è facilissimo e tra le cose che mi hai scritto ho capito circa la metà....ma non per colpa tua , ma mia :(

Scusami ancora, ma voglio kiederti, quello che mi hai scritto è il modo + semplice e banale per affrontare questo tipo di problema??

Piero

Link al commento
Condividi su altri siti

Scusami ancora, ma voglio kiederti, quello che mi hai scritto è il modo + semplice e banale per affrontare questo tipo di problema??

NO!

prima perchè per fare un posizionamento così io personalmente non userei un pid, ma qualcosa di costruito ad hoc, però essendo una tesina sarai costretto ad utilizzare il pid ...

del resto ti ho solo proposto una delle infinite possibili soluzioni per modulare una valvola ON/OFF ... spetta a te valutare quale sia il migliore ... è come dire una soluzione fatta il realtime :)

Quello che ho capito è che non hai chiaro come funziona l'attuazione delle valvole, e del resto non si sa con che tipo di idraulica hai a che fare ... ma il principio di per sè è molto semplice.

Apri una valvola e il pistone si sposta in una direzione, siccome lavori nel discreto, sicuramente se moduli l'apertura delle valvole del pistone avrai una velocità nel periodo di campionamento del pid variabile a secondo di come moduli, e questo ti consente di avere una controreazione dello spazio ... del resto hai solo un anello di controllo da quello che ho capito anche perchè non avrebbe senso avere un anello di velocità per questa aplicazione, da cui il perchè del tuo algorimo di FdT assomigli a un PID, secondo me è più un PI, ifanttti avrai bisogno di un integratore per annullare l'errore di posizione ...

Altra cosa che mi sembra non ti sia chiara è l'algoritmo del PID ... se vuoi esiste un tutorial fatto da LIVIO che ti spiega in modo egregio il funzionamento del PID, ma credo che sia importante capire che il PID non è altro che un algoritmo che deve essere richiamato in modo ciclico e a periodo ben definito appunto su OB35. Il periodo campionamento (scusami se non son chiarissimo e se mi scappano alcuni errori, ma è parecchio tempo che non tratto questi argomenti :) ) deve essere scento in base a come discrettizzi l'algoritmo della FdT del continuo, cioè da quando passi dal dominio di s (Variabile di Laplace complessa) alla varibile z secondo Tustin o altra corrispondenza ... del tipo s=jw -> z=e^(jF/T) (se non erro ma in internet troverai sicuramente la rappresentazione più giusta) T = periodo di campionamento ... di regola se vuoi una banda passante di 1HZ minimo campioni a 10Hz ... quindi 1Hz = periodo circa di 1 secondo campionerai minimo a 100ms ...

Se hai domande più specifiche chiedi pure, però dovresti essere più chiaro, eventualmente poni dei punti di cio che non hai chiaro sullo Step7 o su come funziona un attuattore ...

ciao

Link al commento
Condividi su altri siti

Non devo usare necessariamente un PID, anzi anche qualcosa di + semplice del tipo y(k)=ay(k-1)+... u(k)+... ti scrivo il modello matematico dell'impianto DY(n)= b1*u(n-1)+a1*DY(n-1)+a2*DY(n-2)....dove

- DY è la differenza tra la posizione attuale e quella desiderata;

- a1,a2,b1 sono dei coefficienti meccanici

Quindi potrei usare anche solo dei sottrattori e dei moltiplicatori per realizzarmi il mio controllore , giusto?

Dovrebbe essere semplice, così facendo avrei alla fine una specie di PI come tu hai suggerito prima.....come opereresti tu (in maniera molto molto basilare) per realizzare un cotrollo del genere?

Mi stai dando grande aiuto........grazie

Piero

Link al commento
Condividi su altri siti

Behh ... Visto che hai gia la funzione implementarla è abbastanza semplice, del resto sul PLC puoi implementarti una stackMachine per eseguire i tuoi calcoli, una cosa però non dici, tu hai la tua funzione discrettizzata, anche se c'è qualcosa che non mi convince sulla tua funzione, forse è il modello del sistema piuttosto che la FdT ... comunque sia immaggino che hai il modello matematico nel dominio di Laplace e dai poli ti sei ricavato una semplice rete lead-lag per posizionare i poli al posto giusto, quindi dovresti discrettizzare questa rete nel dominio di z. Quando la discretizzi ovviamente sei costretto a trovarti anche il periodo di campionamento! Questo è importante per determinare il periodo dell'OB ciclico appunto OB35 (Questo OB viene richiamato a tempi ben precisi proprio per campionare ... ) ... Da questo punto in poi inizia la fase di stesura del tuo algoritmo, che effettivamente non sarà altro che una serie di sotrattori e moltiplicatori con una memoria, massimo due dipende dal grado della FdT ... Fatto questo tu avrai alla fine una uscita con un valore che bisogna in qualche modo gestire con due uscite avanti,indietro ... E a questo punto entra in gioco una funzioncina tipo quella proposta che ti parzializza il comando della valvola ...

... Se invece cadi nell'ipotesi che non è necessario sfruttare il modello matematico del sistema, potresti anche ragionare in questo modo ...

il pistone oleodinamico sicuramente ha una velocità fissa, quindi non puoi agira su questa grandezza per recuperare tempo e velocità di posizionamento, in pratica viagga a una velocità fissa, non serve quindi a molto il controllo di velocità o un anello interno di velocità :) ...

A questo punto si fa un'altra deduzione, siccome agiamo su uno spostameto a velocità costante controllando il movimento abbiamo che lo spazio percorso è l'integrale in dt della velocità del pistone ossia Kv*t :) quindi il nosto sistema ha gia un integratore e sicuramente in teoria ci posizioniamo con errore nullo (è presente un integratore :) ) ...

Ipoiziamo ora di non conoscere le reazioni meccaniche (in questo caso dovute a inerzie, gestioni e tempi attuattori ...) ...

Per fare uno spostamento del genere, sotto le ipotesi prima dette, possimo dire che:

- V_spostamento = kostante

- Precisione di spostamento = Ea

                                                        Ea              [m]
segue che tempo controllo  Tc <  ------------------- -------
                                                 V_Spostamento  [m/s]

Quindi dovrai campionare con una fequenza maggiore 1/Tc ...

Ora viene il posizionamento:

MD100 = SetPoint

MD104 = posizione

MD108 = Ea

MD112 = posizionamento a scatti ...

MD200 = MD100 - MD104

SE MODULO(MD200) > Ea

SE MD200 > 0 -> attiva memoria spostamento positivo

SE MD200 < 0 -> attiva memoria spostamento negativo

SE MODULO(M200) <= MD112 -> Attiva posizionaento a step ...

Per la prima parte se noti niente di dificile, fin che non arrivi in tolleranza comandi o avanti o indietro ...

La seconda parte posizionamento a step, avrai il tuo algoritmo che modula la valvola ...

Esempio, tempo campionamento 1s e modulazione fissa a 50%

Se sei in tolleranza potresti avere la valvola aperta per 200ms e chiusa per 200ms ... in questo modo nell'arco di 1s avrai tra spinte di 200ms ... e un effetto di dimezzare la velocità quindi incrementare la precisione di posizionamento ...

Questo potrbbe essere il punto di partenza, ... anzi potresti a questo punto solo dopo essere posto in zona di posizionamento a step eventualmente implementare il tuo algoritmo ... avresti come efetto minore complicazioni e gestione disaturazioni, individui il problema in modo più conciso e diretto, sicuramente semplifichi molto la gestione

...

ciao

Link al commento
Condividi su altri siti

Il modello che ti ho mandato è il solo modello matematico che ho , così come te l'ho scritto..........non ho niente in Laplace........come faccio a trovare il tempo di ciclo??

Link al commento
Condividi su altri siti

Il modello che ti ho mandato è il solo modello matematico che ho , così come te l'ho scritto..........non ho niente in Laplace........come faccio a trovare il tempo di ciclo??

Scusa come ?!? :blink: ... come avresti fatto quindi a trovarti che ti basta un PID ?!?

Di regola hai il modello matematico del sistema visto come una funzione in s del tipo

                                                                                 
                                                                       2
            a*s + b*s^-1 + ...                              dy       d  y
F(s) =  -----------------------     ->     oppure   y(t) + ---- +   -----  + ... = u(t) + ....
            c*s + d*s^-1 + ...                               dt         2
                                                                       dt

Da cui ti ricavi i poli che se son nell'asse positivo ti rendono il sistema non stabile quindi si ottimiza il tutto con una funzione H(s) ... questa H(s) -> H(z), in pratica se la tua H(s) è limitata e convergente anche la H(z) dovrebbe essere convergente se rispetti alcuni valori ...

.... senza H(z) credo sia difficile trovare il tempo di campionamento ... a meno che non ci si basi sulla velocità del pistone conoscenza precisione voluta ...

scrivi che:

DY(n)= b1*u(n-1)+a1*DY(n-1)+a2*DY(n-2)

DY(n) = SetPoit - Y(n) = differenza di distanza ...

u(n) = quindi dovrebbe essere una velocità ?!?

onestamento non è molto chiara, io la interpreterei come hai scritto tu, ma è il modello del sistema o del presunto controllo ?!?

Modificato: da Federico Milan
Link al commento
Condividi su altri siti

Per Piero80

Se tu non dovessi realizzare una tesina ma risolvere un problema pratico di direi: campiona a 10 ms. e vedrai che le cose funzionano. Ma dato che la tua è una tesina devi anche dimostrare che la teoria compbacia con la pratica.

Quindi per prima cosa devi stabilire i limiti del tuo sistema fluidico che sarà composto dal gruppo cilindro-pistone, dal trasduttore di posizione (che cosè un LVDT od un encoder?) e, spero, da una valvola proporzionale. Se l'architettura è così come l'ho descritta, il limite minimo te lo impone la frequenza di taglio della valvola. Poi hai il problema del limite di velocità del PLC. Lavorare con tempi al disotto dei 10 ms. è problematico per un S7-3xx.

Dal punto di vista organizzativo del programma devi generare un inerrupt a tempo di ciclo (OB35) con il quale andrai a richiamare la funzione di regolazione.

Se devi posizionare ti consiglio di usare un algoritmo PI, per azzerare l'errore, con banda morta di errore, altrimenti il tuo posizionatore non si ferma mai.

Da ultimo, se vai nella sezione didattica, trovi un mio tutor pratico sui controlli, negli esempi allegati c'è anche un programma per S7-216 che sgue un loop di posizione per cilindro idraulico. L'algoritmo è un po' più complesso perchè prevede anche la rampa per evitare i colpi di ariete al circuito idraulico.

Link al commento
Condividi su altri siti

  • 2 weeks later...

Scusa Federico Milan, rinfrescami un attimo la teoria, hai detto che il valore di una analogica va da 0 a 0-27648 decimale, perchè ? l'analogica se non sbaglio è composta da 12 bit i primi tre sono la diagnostica, un bit di segno e 8 bit di valore...non riesco a capire dove ti esce il 27648.

Link al commento
Condividi su altri siti

Il valore che leggi da una analogica Siemens è sempre nel formato 15bit + segno (+32767 , - 32768) con variazione minima sulla lettura pari a 1 unità. Se l'analogica non ha una risoluzione 15bit ma per esempio 12bit allora avrai i tre bit meno significativi che valgono sempre 0, quindi avrai una variazione minima sulla lettura di 8 unità.

I bit di diagnostica non mi risulta siano "inseriti" nel dato che viene letto (magari mi sbaglio).

Nel caso di lettura + o - 10Volt avrai:

>32511 = overflow

>27648 = >10V

27648 = 10V

0 = 0V

-27648 = -10V

<-27648 = <-10V

< -32512 = overflow

Molti preferiscono nel caso di risoluzione 12bit scalare a destra di tre bit il valore letto in modo da avere una variazione minima sulla lettura pari a 1 unità.

CIAO

Link al commento
Condividi su altri siti

Non mi è ancora tutto chiaro, 27648 che corrispondono a 10 v convertiti in binario danno 11***0000000000 quindi un valore a 15 bit, non capisco il significato dei singoli bit

Fammi un esempio, se all'ingresso analogico ho 5v quale sarà il valore binario e decimale letto dalla CPU

Non capisco nemmeno da dove ti esce il 32511 :blink:

Modificato: da awl
Link al commento
Condividi su altri siti

Federico Milan

quello che dici del valore 27648 è molto semplice, allora:

le analogiche sono composte da 12bit + 1 di segno a cui si sommano 3 bit di segnale, per comodità io ragiono a 16 bit, ci sono dei vantaggi che credo riesci a intuire ... ma non entriamo nel dettaglio ... (se vuoi ragiore a punti prendi il valore letto da siemens e dividilo per otto ... 27648/8 = 3456 punti, ossia la tua precisione di lettura/scrittura su una scala da 0..10V è pari a 10/3456 = 0.003 V/punto ... in pratitica è il tuo quanto numerico, o discretizzazione che dir si voglia ... una precisazione dividere per otto equivale a shiftare di 3bit verso destra ...)

l'elettronica non è come una formula matematica, ma ha dei parametri, tra cui anche la linearità, cosa significa?

significa che il costruttore ti garantisce un arco di linarità ...

quindi 32768 non sono 10V (20 mA) ma di più, i 10V li hai a 27648 (oppure che è lo stesso a 3456 punti) ...

cioè tra 0...27648 il segnale segue una legge e garantisce una linearità, al di fuori superi i limiti e non sei garantito della linearità ...

tutto qui ...

MANUALE SCHEDA ANALOGICA!!!!!!!!!!!!!!!!!!

C'è scritto tutto!!

mi associo nel senso che leggere un manuale non è molto semplice, però ti può servire un domani, ... comunque sia...

se sai che 27648 corrisponde a 10V (20mA dipende se si in corrente o tensione) ... 5V sono esattamente 27648/2

mi sembra ovvio !!! ora credo che il tuo problema siano i tre bit segnati con asterisco, questi sono bit di segnale introdotti per verificare che l'analogica sia apposto, quindi hanno informazione del tipo cavo rotto, segnale fuori range, ...

tutto qui ...

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