Vai al contenuto
PLC Forum


pid


walterword

Messaggi consigliati

sto mettendo giu un pid fatto in casa in base a quanto i vecchi libri di matematica mi suggeriscono

premesso che si tratti di una valvola proporzionale e che sia da controllare una temperatura , e premesso che il twido non abbia numeri a 32 bit

pensavo di svolgere i calcoli come segue :(

setpoint:=%mw10

feddback:=%mw11

kp:=%mw12 , chi:=%mw13 , kd:=%mw14

cost. prop. cost. integ. cost. deriv.

dti:=%mw15 tempo di campionamento per l'integrale

dtd:=%mw16 tempo di campionamento per la derivata

errore:=%mw17 errore

err_precedente:=%mw18 errore precedente

outp:=%mw20 uscita prop.

outi:=%mw21 uscita int.

outd:=%mw22 uscita deriv.

out:=outp+outi+outd+ bias(che spero di non usare)

begin

errore:=setpoint-feedback

outp:=errore*kp (faro' partire la funzione solo con il proporzionale fino a quando la curva non vada in equilibrio

dopodiche aggiungo l'integrale:

outi:=(errore/dti)*chi uscita integrale

outd:=((errore-err_precedente)/dtd)*kd uscita derivata

out:=outp+outi+outd

err_precedente:=errore

considerando che la valvola mi lavori da 0 a 10 volt , quindi min e max ,

e che sull'out dovro scalare il valore , e che scatenero un interrupt a tempo non capisco alcune cose:

dti che sarebbe il delta t in base al quale calcolo l'area dell'integrale coincide con il tempo di campionamento? (tra un interrupt ed il successivo?)

dtd che sarebbe anche qua la base del rettangolo dove vado a calcolare la pendenza della curva e quindi la derivata e' un tempo a se

oppure anche lui coincide con il tempo di campionamento???

ed in fine pensavo di lanciare questi calcoli all'interno di un interrupt chiamato ogni 3-4 secondi

a parte il fatto che non ho ancora studiato come fare il manuale e l'automatico del pid , al limite se decido di farlo nel momento in cui decidessi di mettere in manuale posso tranquillamente impostare

setpoint=feedback forzandolo o esiste una prassi ben piu definita

giusto perche il pid magari lavora ancora e nel momento in cui rimetto in automatico non vorrei che mi sparesse l'uscita

grazie a tutti

(in particolare al mago dell'automazione nonche dei controlli sig. livio

qualora volesse insegnarmi qualcosa)

ciao e buona domenica

Link al commento
Condividi su altri siti


A occhio e croce mi sembra che:

- Il calcolo dell'azione proporzionale vada bene.

- Il calcolo dell'azione derivativa può andare se il dtd è l'intervallo tra due interrupt. In sostanza fai la derivata tra un interrupt e l'altro.

- Per l'azione integrale non direi. Devi fissare un tempo integrale Ti che sia utile per il processo e assai superiore al "dt" tra due interrupt. Poi devi totalizzare tutti i prodotti (errore * dt) fino a che la somma dei dt uguaglia il Ti. Questo totale per chi sarà l'azione integrale. Per implementarlo potresti ad esempio, fare un vettore (blocco dati) a scorrimento con tante posizioni quanti sono i dt che ti servono più uno e quando campioni l'errore devi fargli posto facendo scorrere i vecchi campionamenti di un posto perdendo il più vecchio.

Non si riesce a calcolare l'integrale con i soli dati attuali e di un momento fa, bisogna tenere traccia dell'errore per tutto il tempo Ti. Se il tempo Ti è troppo piccolo non serve.

Non ho mai provato a fare un algoritmo PID istruzione per istruzione. E' interessante, ma sono certo che quelli dei regolatori sono sofisticati. Bisogna anche pensare a "tener buono" il regolatore all'avviamento e quando si cambia il set.

Saluti

R.G.

Link al commento
Condividi su altri siti

Federico Milan

Ciao,

il passaggio da manuale a automatico è meglio usare (come hai giustamente intuito) tecniche bumpless, cioè, quando tu passi in manuale, fai in modo che ance il set pint e la regolazione segua il manuale, in modo che quando ripassi in automatico non hai il colpo dovuto a uno scalino ...

dipende da come si realizza il pid, molti non sono dacordo in questo utilizzo, ma spesso si vede che chi = Kp/Ti , cioè Ti è il tempo in cui si anulla l'azione proporzionale ... stesso discorso per la derivativa ...

In linea di principio il codice è giusto, quello che mi preocupa sono i calcoli a 16 bit, la questione è che potrebbe fuzionare tutto senza problemi, come potrebbero inescarsi delle oscillazioni dovute alla quantizzazione ... il problema infatti, non è solo nel linearizzare l'azione della valvola tra 0-10 volt, ma il cacolo fatto a 16 bit, potrebbe saltarti delle condizioni, quindi porre in oscillazione il sistema, infatti integrando a passi, se sono troppo grandi approssimi troppo con le conseguenze citate ...

ciao

Link al commento
Condividi su altri siti

Aggiungi anche :

If Int_err > IL then Int err = IL

If Int:err < -IL then Int_err = -IL

IL = limitazione dellintegrale

Serve per evitare che l'integrale vada in overflow e per limitarne l'azione

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