Vai al contenuto
PLC Forum


Problema Uscita Regolazione Analogica


TomCastagna

Messaggi consigliati

Buongiorno,

sono un elettricista e mi scuso subito se non sono in grado di usare termini del gergo della programmazione. Mi è stato richiesto da un cliente di far muovere in maniera più o meno costante una ventola, con motore collegato ad un inverter, secondo la temperatura letta da una termoresistenza. L'impianto già esistente è gestito da un PLC 313c e ho pensato quindi di utilizzare la scheda analogica per comandare la ventola. Ho collegato dunque all'ingresso PEW 136 del PLC ad una termoresistenza (ingresso configurato appunto per termoresistenze a due fili) e all'uscita analogica (configurata per corrente 4-20 mA) PAW 128 l'ingresso analogico in corrente dell'inverter del motore. Successivamente, prendendo spunto dal manuale Siemens, ho compilato una sorta di programma per riuscire ad ottenere una regolazione di tipo PID con temperatura a 20°C. Vi copio il programma per darvi un'idea:

CALL "CONT_C" , DB41

COM_RST :=

MAN_ON :=

PVPER_ON:=

P_SEL :=

I_SEL :=

INT_HOLD:=

I_ITL_ON:=

D_SEL :=

CYCLE :=T#50MS

SP_INT :=

PV_IN :=

PV_PER :=PEW 136

MAN := MD20

GAIN :=

TI :=

TD :=

TM_LAG :=

DEADB_W :=

LMN_HLM :=

LMN_LLM :=

PV_FAC :=

PV_OFF :=

LMN_FAC :=

LMN_OFF :=

I_ITLVAL:=

DISV :=

LMN :=

LMN_PER :=PAW128

QLMN_HLM:=

QLMN_LLM:=

LMN_P :=

LMN_I :=

LMN_D :=

PV :=

ER :=

Con MD20 ho inteso il SETPOINT da dare al programma per poter effettuare la modulazione. L'ho convertito il REAL nel modo che segue:

L 200

ITD

DTR

T MD20

...Ora mi chiedo... Ho sbagliato qualcosa sul programma, sul collegamento? Perché effettivamente la corrente in uscita dalla porta analogica PAW 128 è sempre 4 mA.... Qualcuno ha idee?

Grazie mille dell'aiuto!

Link al commento
Condividi su altri siti


Le assegnazioni ai parametri, che nella funzione FB41 mancano, non li hai messi per evidenziare solo i dati che ritieni ti interessano di più, o mancano proprio?

I parametri hanno un valore di default e vanno impostati in funzione dell'utilizzo del regolatore, cito ad esempio:

- hai assegnato PV_PER :=PEW 136 , ma se non assegni PVPER_ON:=TRUE, il tuo valore attuale di periferia non viene elaborato

- dici di aver assegnato MD20 come valore di Set-Point, ma non devi mandarlo in MAN (che è il valore di comando manuale), bensì a SP_INT

- MAN_ON di default è = TRUE, ma in questa condizione la regolazione è inibita e viene passata all'uscita il valore MAN

Se tu nello Step7 chiami l'. sulla FB41 ti spiega tutto in modo dettagliato, credo sia meglio che lo leggi in modo approfondito.

Link al commento
Condividi su altri siti

Aggiungo che, avendo impostato CYCLE=50ms, devi elaborare FB41 ogni 50ms.

Il modo migliore per farlo, è richiamare FB41 in OB35 dopo aver modificato opportunamente, in configurazione hardware (scheda schedulazione orologio), il tempo di esecuzione di OB35 che di default è 100ms.

Oppure, se lasci il tempo di esecuzione di OB35 a 100ms, imposta CYCLE=100ms

Link al commento
Condividi su altri siti

Buonasera a tutti!

Innanzi tutto, grazie delle vostre risposte, che sono state molto gradite. Allora... ho letto le spiegazioni riguardo l'FB41 e mi sono mosso in questa maniera (ho riportato anche i valori che leggo dal PLC:

CALL "CONT_C" , DB41

COM_RST :=TRUE

MAN_ON :=

PVPER_ON:=TRUE

P_SEL :=TRUE

I_SEL :=TRUE

INT_HOLD:=

I_ITL_ON:=

D_SEL :=

CYCLE :=T#50MS

SP_INT :=MD10 (+1.000e+002)

PV_IN :=

PV_PER :=PEW136 (16#100)

MAN :=

GAIN :=

TI :=

TD :=T#5S

TM_LAG :=

DEADB_W :=MD10 (+2.000e+000)

LMN_HLM :=

LMN_LLM :=

PV_FAC :=

PV_OFF :=

LMN_FAC :=

LMN_OFF :=

I_ITLVAL:=

DISV :=

LMN :=

LMN_PER :=PAW128 (16#0)

QLMN_HLM:=

QLMN_LLM:=

LMN_P :=

LMN_I :=

LMN_D :=

PV :=

ER :=

Le word sono state ottenute così:

L 100 (64)

ITD (64)

DTR (42c80000)

T MD 10 (42c80000)

L 2 (2)

ITD (2)

DTR (40000000)

T MD 40 (40000000)

Non trovo ugualmente variazioni in uscita... Ho sbagliato qualcosa per caso nella conversione dei numeri in REAL? Ho sbagliato a scrivere il programma su un FC richiamato su OB1 e OB35? Manca ancora qualcosa da mettere nel controllo PID? .... Mi sto perdendo un po' nelle prove :(

Grazie ancora dell'ascolto!

Modificato: da TomCastagna
Link al commento
Condividi su altri siti

Elenco errori:

1) hai impostato COM_RST :=TRUE. In questo modo, continui a resettare il PID. L'uscita non si schioderà mai dal valore 0.

2) manca impostazione GAIN (a meno che non tu non abbia assegnato un valore direttamente nella variabile DBD20 - GAIN del DB di istanza)

3) manca impostazione TI (a meno che non tu non abbia assegnato un valore direttamente nella variabile DBD24 - TI del DB di istanza)

4) hai assegnato un valore a TD. Per la tua applicazione quasi sicuramente serve un controllo PI (senza D). Infatti, hai impostato P_SEL=TRUE e I_SEL=TRUE, ma non hai modificato l'impostazione di D_SEL che di default è FALSE. Questo significa che il controllo della derivata è escluso, e il parametro impostato in TD è ininfluente.

Controlla inoltre, direttamente nel DB di istanza, il valore attuale dei parametri che non utilizzi. Per esempio: al parametro MAN_ON non assegni nessun valore. Se in precedenza hai fatto delle prove e a MAN_ON avevi assegnato il valore TRUE, questo rimane impostato nel DB di istanza (DBX0.1). Non passare un parametro NON significa che quel parametro viene messo a zero, ma solo che non viene modificato.

Come già scritto anche nel mio precedente post, verifica che il parametro CYCLE che hai impostato a 50ms corrisponda al reale tempo di richiamo di FB41.

Personalmente trovo più comodo lavorare con PVPER_ON=FALSE ed utilizzare valori ingegneristici e non direttamente i valori di PEW e PAW. Ma questa è solo una questione di abitudine.

Tieni però presente che, utilizzando direttamente i valori della periferia, di default il valore minimo dell'ingresso analogico corrisponde a 0.0% ed il valore massimo a 100.0%. Lo stesso vale per l'uscita analogica.

Se dovessi aver bisogno di adattare questi valori, leggi sul manuale come operano i parametri PV_FAC e PV_OFF per la variabile di processo (ingresso analogico), LMN_FAC e LMN_OFF per l'uscita.

Per finire, un consiglio: tu scrivi il valore in uscita LMN_PER direttamente sull'uscita analogica.

Questo non è sbagliato, ma risulta scomodo perché non è possibile leggere (in una VAT o in altre parti del programma) il valore dell'uscita analogica. In questo modo, puoi vedere il valore che assume solo in test guardando cosa esce dalla FB41. Se appoggi l'uscita del PID ad una variabile e poi trasferisci la variabile sull'uscita analogica, tutto diventa più comodo.

Link al commento
Condividi su altri siti

Salve,

da quello che ho letto finora,direi che ci sono un pò di cose che devono essere "riallineate".

Ho sbagliato a scrivere il programma su un FC richiamato su OB1 e OB35?

Da quel che interpreto direi proprio di si. La cosa più semplice è richiamare la FB41 con il DB di istanza che le hai assegnato (es:DB41), in OB35.

Come ti è stato suggerito in precedenza e mi sembra che tu lo abbia fatto. Accertati che il parametro CYCLE=50ms abbia lo stesso valore di tempo del richiamo di OB35 impostato invece nella configurazione hardware di S7.

Altro punto che deve essere sistemato è il parametro DEADB_W :=MD10 (+2.000e+000). Questo parametro corrisponde alla banda morta del sistema.

Per cui se non mi sfugge qualcosa non vedo il motivo di metterci la variabile MD10 che poi è il tuo SET POINT di lavoro (cioè la temperatura di lavoro da regolare). Quindi direi che al momento il valore di banda morta puoi metterlo a 0.0.

Per quanto concerne il SP_INT, questa grandezza che rappresenta il valore di temperatura che il regolatore deve mantenere stabile nel tempo, può andar bene scriverla in MD10, ma puoi anche evitare di fare la conversione e scrivere direttamente:

L 1.000000e+002 (nel simbolico di questa variabile assegna il formato REAL)

T MD 10

La conversione la devi fare nel caso in cui il Set Point venga scritto direttamente da altre fonti in formato INT. overo dove non è possibile scriverlo direttamente in formato REAL.

Comunque le istruzioni usate per la conversione da intero a virgola mobile sono corrette.

Non capisco invece l'altra conversione per la MD40 (intesi la sintassi è corretta), non vedo nella funzione PID dove appunto MD40 è utilizzata.

A giudicare dal valore posto a 2, forse mi sa che doveva o deve essere la banda morta. Ovvero quel famoso errore di cui dicevo prima DEADB_W :=MD10 forse volevi scrivere DEADB_W :=MD40.

Per evitare un post eccessivamente lungo, chiudo il seguente e ne riapro un successivo.

Modificato: da cagliostro
Link al commento
Condividi su altri siti

immaginekk.png

Come ben saprai è determinante che abbia già dato un'occhiata almeno allo schema a blocchi del regolatore PID FB41, di cui allego immagine.

......a questo punto si tratta di far chiarezza su quello che può esser più conveniente usare in fatto di variabile di processo PV_IN o PV_PER.

Il feedback di temperatura arriva da una termoresistenza a 2 fili il cui valore viene letto in PEW136, ora se non ricordo male, il valore di PEW136 contiene già il valore espresso in ° in formato intero con risoluzione al 1/10 di °. Poi per quanto riguarda la rappresentazione se in ° C oppure °F immagino ci sia sul modulo analogico della scheda l'apposita configurazione di scelta.

Per cui se viene rilevata una temperatura di 245°C, il valore letto in PEW136 sarà di 2450.

Si tratta quindi di trasformare il valore di PEW136 nel giusto formato di rappresentazione, in modo da poterlo elaborare correttamente in funzione di quanto scritto su SetPoint.

Per far ciò è sufficiente come già ti è stato detto mettere PVPER_ON=TRUE mente devi scrivere sul parametro PV_FAC il valore 0.1 è su PV_OFF il valore 0 (dovrebbe esserlo già per default).

In questo modo se scrivi per esempio un SetPoint di 80.5°C, una volta raggiunta tale temperatura la termoresitenza dovrebbe misurarti un feedback di 800 che attraverso la scalatura fatta su PV_FAC=0.1 ti darà un valore pari a 80.0 (questo valore puoi monitoralo sulla variabile PV che trovi anche del DB di istanza assegnato alla funzione di PID FB41.

Link al commento
Condividi su altri siti

....per cui ricordati che da questo momento in avanti le grandezze fisiche in gioco saranno in °.

A questo punto se sei interessato ad inserire anche una banda morta nel parametro DEADB_W il valore di inserimento è espresso in °. Quindi srcivere 1.5 corrisponde ad inserire una banda morta di +/- 1.5°.

Per quanto concerne i guadagni da inserire sulle costanti di regolazione (I e D) ricordati che in questo tipo di PID non è sufficiente metterle a 0 per escluderle, ma lo devi fare agendo sui grandezze P_SEL D_SEL e I_SEL.

pertanto volendo configurare un regolatore di tipo PI, accertati che i parametri P_SEL ed I_SEL siano scrittia a TRUE, mentre D_SEL sia FALSE. Se poi per necessità di regolazione devi inserire anche la costante dello stadio derivativo, allora abiliterai anche di cinseguenza D_SEL.

Per quanto concerne i valori da assegnare alla parte proprozionale e d integrale, anche su questo forum troverai dei tutorial su come procedere per l'ottimizzazione dei guadagni del regolatore. Le costanti del guadagno proporzionale e del tempo di integrazione vengono scritti direttamente sui parametri denominati GAIN e TI.

Ricordati che se il senso di regolazione è invertito, è sufficiente inserire il segno - sul valore GAIN.

Come senso di regolazione corretto credo che nel tuo sistema la cosa dovrebbe essere del tipo:

desidero più temperatura, allora la velocità del ventilatore deve diminuire.

Proseguendo nella lettura dello schema a blocchi di FB41, come già ti è stato suggerito verifica che il parametro MAN_ON sia uguale a FALSE.

Link al commento
Condividi su altri siti

.......i parametri LMN_HLM e LMN_LLM, rappresentano rispettivamente i limiti di uscita del tuo regolatore PID, solitamente per default sono messi a +100 e -100%. Poi anche in questo caso come per i guadagni del PID, a seconda di come si comporterà il tuo sistema andrai eventualmente ad agire anche sui limiti. Arrivati alla fine, si tratta di determinare la gestione della grandezza di uscita , che nel tuo specifico caso corrisponderà al riferimento in corrente 4-20ma, da passare in formato periferia su PAW128.

In relazione a questo vale anche quello che ti è giò stato suggerito.

Seguendo i consigli che gli utenti hanno postato in questo discussione, dovresti quanto meno riuscire ad ottenere una variazione sulla grandezza da regolare (non più uscita a 4 ma).

Ovviamente a seguito dei test che condurrai, dovrai poi inserire i valori più idonei per l'ottimizzazione del PID.

Buon lavoro

Link al commento
Condividi su altri siti

  • 2 weeks later...

Buongiorno di nuovo a tutti,

innanzi tutto, grazie mille per la professionalità e l'efficienza delle vostre risposte, con le quali sono riuscito finalmente a far sbloccare l'uscita analogica del PLC! :rolleyes:

Ho ora però il seguente problema.... Riguarda il controllo della mia uscita e più precisamente... Il suo SETPOINT.

Il feedback di temperatura arriva da una termoresistenza a 2 fili il cui valore viene letto in PEW136, ora se non ricordo male, il valore di PEW136 contiene già il valore espresso in ° in formato intero con risoluzione al 1/10 di °. Poi per quanto riguarda la rappresentazione se in ° C oppure °F immagino ci sia sul modulo analogico della scheda l'apposita configurazione di scelta.

Per cui se viene rilevata una temperatura di 245°C, il valore letto in PEW136 sarà di 2450.

Si tratta quindi di trasformare il valore di PEW136 nel giusto formato di rappresentazione, in modo da poterlo elaborare correttamente in funzione di quanto scritto su SetPoint.

Per far ciò è sufficiente come già ti è stato detto mettere PVPER_ON=TRUE mente devi scrivere sul parametro PV_FAC il valore 0.1 è su PV_OFF il valore 0 (dovrebbe esserlo già per default).

In questo modo se scrivi per esempio un SetPoint di 80.5°C, una volta raggiunta tale temperatura la termoresitenza dovrebbe misurarti un feedback di 800 che attraverso la scalatura fatta su PV_FAC=0.1 ti darà un valore pari a 80.0 (questo valore puoi monitoralo sulla variabile PV che trovi anche del DB di istanza assegnato alla funzione di PID FB41

Ho seguito tutte queste istruzioni ottenendo il seguente blocco istanza:

COM_RST :=FALSE

MAN_ON :=FALSE

PVPER_ON:=TRUE

P_SEL :=TRUE

I_SEL :=TRUE

INT_HOLD:=FALSE

I_ITL_ON:=FALSE

D_SEL :=FALSE

CYCLE :=T#50MS

SP_INT :=1.700000e+000

PV_IN :=0.0

PV_PER :=W#16#D0

MAN :=0.0

GAIN :=1.500000e+000

TI :=T#20S

TD :=T#2S

TM_LAG :=T#0MS

DEADB_W :=0.0

LMN_HLM :=1.0000000e+003

LMN_LLM :=0.0

PV_FAC :=1.0000000e-001

PV_OFF :=0.0

LMN_FAC :=1.0000000e-001

LMN_OFF :=0.0

I_ITLVAL:=0.0

DISV :=0.0

LMN :=

LMN_PER :=PAW128

QLMN_HLM:=

QLMN_LLM:=

LMN_P :=

LMN_I :=

LMN_D :=

PV :=

ER :=

Ho cercato d'impostare il Setponit interno in modo tale che la famosa ventola staccasse a 17 gradi (ho preferito per il momento non inrodurre alcun valore di banda morta) scrivendo 17.0. Facendo ciò, e con le impostazioni che ho riportato qui sopra (ho riportato il valore dell'ingresso che ho letto al momento della prova), ottengo solo un valore di uscita in corrente che arriva gradualmente fino al 100%... Indipendentemente dal variare del valore dell'ingresso della termoresistenza.

Ho pensato che il valore inserito al SETPOINT andasse convertito da intero a formato in virgola mobile, ma non ho ottenuto variazioni nel risultato. Inoltre, ho provato ad inserire un valore di SETPOINT convertito da intero, in parola e poi in real... Ma nulla da fare. :senzasperanza:

Non riesco bene a trovare una corrispondenza diretta tra il valore in ingresso (espresso in esadecimale) con il valore di setpoint (espresso in real). Sbaglio per caso qualche valore impostato sui limiti massimi e minimi? Sbaglio forse il valore di quadagno?

Non riesco putroppo a trovare neanche delle documentazioni che facciano al caso mio... :(

Grazie mille per l'attenzione

Modificato: da TomCastagna
Link al commento
Condividi su altri siti

Così a spanne sembra che metti l'ingresso di feedback PV_PER (la temperatura reale) a w#16#d0 che è 208, la moltiplichi poi per 0.1(PV_FAC) ottenendo così 20.8

Il setpoint è a 17.0. Il tuo errore sarà perciò 17-20.8 = -3.8.

Se metti una variabile in uscita su ER avrai questa cifra in real.

vedi lo schema a blocchi postato da cagliostro poco più sopra schema a blocchi

Hai fatto poi quello che dice batta? (Impostazione coordinata tra richiamo del blocco e parametro cycle)

Link al commento
Condividi su altri siti

.....sempre che i valori riportati da te nel blocco parametri di FB41 siano stati ricopiati correttamente, dalla tua descrizione il SP impostato su SP_INT non è di 17° ma bensì 1.7°.

Per cui l'errore sul blocco differenziatore sarà 1.7 - 20.8 = cioè un errore di -19.1°.

L'uscita analogica che pilota l'inverter sarà al 100% (20ma) in modo tale da spingere il motore del ventilatore al massimo, per cercare di portare la temperatura al valore di 1.7° (cosa difficilmente realizzabile).

Comunque il linea di principio, (ribadendo sempre sui dati da te postati ed in particolar modo quel 1.7°), il regolatore sta funzionando in modo corretto.

Ho pensato che il valore inserito al SETPOINT andasse convertito da intero a formato in virgola mobile

Il Set Point deve arrivare al parametro SP_INT esclusivamente come dato in formato virgola mobile.

Per cui se l'impostazione del SP avviene da HMI o da altre vie devi assicurarti sempre e comunque che il dato venga convertito alla fine prima di entrare nella nel parametro SP_INT di FB41, in virgola mobile.

Link al commento
Condividi su altri siti

Una cosa molto semplice da fare, per verificare almeno il corretto senso di regolazione del PID (che mi sembra già esser giusto) consiste nell'impostare un Set Point di lavoro supponiamo di 80.0° (8.000000e+001) e tenendo il forno spento è quindi misurando attraverso la termoresistenza una temperatura che dovrebbe essere vicina a quella dell'ambiente dove stai conducendo il test, dovresti vedere che l'uscita del regolatore si porterà (dipende dall'errore e dai guadagni inseriti) al minimo valore di uscita che è 0 (guardando il limite minimo impostato) corrispondente a 4ma; quindi motore ventilatore fermo o alla minima velocità impostata sull'inverter.

Poi porti il valore del SP ad un valore di 5°(5.000000e+000), dovresti ottenere l'azione contraria che è quella che hai descritto con un SP di 1.7°.

Se il comportamento dell'uscita del regolatore è quello che ti aspetti, allora direi che ci sei. Altrimenti se risulta contrario come ti dicevo nel precedente post inserisi un guadagno proporzionale GAIN con segno -.

Adesso si tratta di trovare i giusti guadagni da inserire nella costante di tempo dello stadio dell'integratore (I) ed il guadagno del proprozionale (P), per ottenere una regolazione che soddisfi le tue aspettative.

Un'altra cosa che ho notato è l'impostazione del limite massimo sulla grandezza di uscita pari a 1000% ovvero LMN_HLM :=1.0000000e+003.

Ora non so se si tratta di errori di trascrizione, oppure di concetto perchè non ti è chiaro come inserire un numero in virgola mobile, ma se vuoi limitare l'uscita come dovrebbe esser fatto ad un 100% del suo valore massimo in formato periferia (27648), il valore che devi scrivere è: LMN_HLM :=1.0000000e+002.

La parte sinistra del numero rappresenta la mantissa, mentre quella di destra il suo esponente, per cui se desidero scrivere

-1.56 = -1.560000e+000

23.5657 = 2.356700e+001

100 = 1.000000e+002 e così via.

Ultima cosa che mi sento di dirti, quando scrivi:

Non riesco bene a trovare una corrispondenza diretta tra il valore in ingresso (espresso in esadecimale)

La tua variabile di processo letta dall'ingresso della termoresistenza, non la devi mica visualizzare necessariamente in esadecimale, puoi visualizzarla anche in rappresentazione decimale. Tuttavia la meglio cosa da fare è quella di vederla già scalata in formato reale andando a leggere la PV che trovi nel DB di istanza assegnato alla FB41.

in questo modo la puoi confrontare direttamente con la SP_INT, poi come suggeritoti da ken:

Se metti una variabile in uscita su ER avrai questa cifra in real.
Modificato: da cagliostro
Link al commento
Condividi su altri siti

ho appena variato i valori come mi avete consigliato (se non ho capito male)

COM_RST :=FALSE

MAN_ON :=FALSE

PVPER_ON:=TRUE

P_SEL :=TRUE

I_SEL :=TRUE

INT_HOLD:=FALSE

I_ITL_ON:=FALSE

D_SEL :=FALSE

CYCLE :=T#50MS

SP_INT :=1.700000e+001

PV_IN :=0.0

PV_PER :=W#16#D0

MAN :=0.0

GAIN :=1.500000e+000

TI :=T#20S

TD :=T#2S

TM_LAG :=T#0MS

DEADB_W :=0.0

LMN_HLM :=1.0000000e+002

LMN_LLM :=0.0

PV_FAC :=1.0000000e-001

PV_OFF :=0.0

LMN_FAC :=1.0000000e-001

LMN_OFF :=0.0

I_ITLVAL:=0.0

DISV :=0.0

LMN :=

LMN_PER :=PAW128

QLMN_HLM:=

QLMN_LLM:=

LMN_P :=

LMN_I :=

LMN_D :=

PV :=

ER :=

Quello che ora leggo è un valore raggiunto del 10% (LMN = 10.0 che equivale a circa i 5.5 mA) e... Che io cambi il setpoint in 100.0 o 10.0 non cambia nulla... Cambiare il segno del GAIN mi ha invertito, come sperato, il senso della regolazione. A rigor di logica, dovrei avere un valore in corrente che modula a seconda del raggiungimento o meno della temperatura letta dalla termoresistenza.... Come mai ciò non avviene nel mio caso?

Il valore dell'errore è in questo momento di 16.92477....

Link al commento
Condividi su altri siti

.......allora ho commesso un errore grossolano riguardando il mio post al messaggio#7, ovvero sull'utilizzo della variabile PV_PER.

Questa variabile viene linearizzata nel campo 0-100% con ingresso appunto in formato periferia che va da 0-27684.

Per cui scrivendo anche come da tuo esempio il su PV_PER il valore in hex 0D=208 il dato viene così scritto:

208* (100/27648) =0.75 che ulteriormente moltiplicato per la V_FAC=0.1 mi da un valore di temperatura corrispondente a 0.075°.

per cui dovresti mettere PVPER_ON=FALSE e scrivere il dato proveniente dalla termoresistenza sul parametro PV_IN, avendolo però prima convertito in REAL e moltiplicato per 0.1

A seguire allego il codice per la conversione è scalatura del dato da inserire in PV_IN

 L     PEW   136
      ITD   
      DTR   
      L     1.000000e-001
      *R    
      T     MD   194

ovviamente questo ha senso se confermi che il valore della temperatura letta nel canale PEW136 corrisponde come da esempio:

PEW=245 significa 24.5°.

La MD194 è il risultato del dato finale da scrivere in PV_IN, io ho usato questo indirizzo per esempio, poi vedi tu se tenerlo o cambiarlo.

Tutto quello che è stato detto in precedenza ad eccezione appunto dell'uso errato che ti ho suggerito di PV_PER, rimane valido.

Porterei anche il parametro LMN_FAC da 1.0000000e-001 (come da te postato) a 1.0

Scusandomi ancora per l'errore, ti auguro un buon lavoro.

Modificato: da cagliostro
Link al commento
Condividi su altri siti

Il valore dell'errore è in questo momento di 16.92477....

questo conferma quando scritto nel mio post di cui sopra.

ER = SP_INT - PV

17.0 - 0.075 = 16.92477

se sistemi il tutto come suggerito, vedrai che le cose iniziano a girare per il verso giusto......

Link al commento
Condividi su altri siti

Confermo quanto detto da Cagliostro negli ultimi due post e faccio un breve riassunto.

L'ingresso PV_PER (abbinato all'impostazione di PVPER_ON=True) con impostazioni di default PV_FAC=0.0 e PV_OFF=0.0 praticamente converte il valore di un ingresso analogico 0-27648 in 0.0-100.0%.

Nel tuo caso però la lettura dell'ingresso analogico non va da 0 a 27648, ma è direttamente in decimi di grado. Non è quindi un valore adatto per essere passato direttamente al parametro PV_PER.

Io quindi riporterei i seguenti parametri parametri ai valori di default:

PVPER_ON=False

PV_FAC=1.0

PV_OFF=0.0

LMN_FAC=1.0

LMN_OFF=0.0

Poi converti ed adatti (come indicato da Cagliostro) la lettura della temperatura che, quindi, non si deve passare a PV_PER ma a PV_IN).

Se non mi sfugge nulla, dovrebbe iniziare a funzionare.

Link al commento
Condividi su altri siti

Buonasera a tutti,

di nuovo, grazie infinite per il vostro supporto in questa situazione un po' tosta per me! Secondo le vostre istruzioni ho modificato i parametri e mi trovo così:

ho appena variato i valori come mi avete consigliato (se non ho capito male)

COM_RST :=FALSE

MAN_ON :=FALSE

PVPER_ON:=FALSE

P_SEL :=TRUE

I_SEL :=TRUE

INT_HOLD:=FALSE

I_ITL_ON:=FALSE

D_SEL :=FALSE

CYCLE :=T#50MS

SP_INT :=28.0

PV_IN :=MD194

PV_PER :=

MAN :=0.0

GAIN :=1.500000e+000

TI :=T#20S

TD :=T#2S

TM_LAG :=T#0MS

DEADB_W :=0.0

LMN_HLM :=100.0

LMN_LLM :=0.0

PV_FAC :=1.0

PV_OFF :=0.0

LMN_FAC :=1.0

LMN_OFF :=0.0

I_ITLVAL:=0.0

DISV :=0.0

LMN :=

LMN_PER :=PAW128

QLMN_HLM:=

QLMN_LLM:=

LMN_P :=

LMN_I :=

LMN_D :=

PV :=

ER :=

Ora ottengo all'ingresso finalmente un valore in gradi... Però.... Nonostante come setpoint metto 25.0 (ma ho fatto prove anche con 80.0, con 5.0 e con 10.0) il mio regolatore non si ferma quando la sonda raggiunge un valore fissato.... Il GAIN mi sembra giusto, no?

Link al commento
Condividi su altri siti

...Un'altra cosa che noto, molto strana, è che l'errore si fissa sul valore del Setpoint... Ora, da quello che ho letto, il valore di ER non è dato dal SETPOINT meno la letttura in ingresso, cioè PV_IN? E allora... Se la mia sonda legge 24.0 ed io ho un setpoint di 25... ER dovrebbe risultare 1? Che succede ora?... In questo momento sto ricontrollando tutto quello che ho scritto.... Vediamo un po'.... Ovviamente, ogni suggerimento è sempre molto benvenuto :)

Link al commento
Condividi su altri siti

Ma quella componente Integrale ti serve realmente ? Hai provato a mettere I_SEL :=FALSE ? Se ti serve questa componente, comincia con un tempo TI :=T#1S e poi aumenta fino a quando l'uscita diventa instabile.

In ogni caso ti consiglio di escludere sia la componente Integrale sia quella Derivata fino a che non funziona tutto correttamente, poi se vuoi sbizzarrirti, abilitale.

Link al commento
Condividi su altri siti

Ma quella componente Integrale ti serve realmente ? Hai provato a mettere I_SEL :=FALSE ? Se ti serve questa componente, comincia con un tempo TI :=T#1S e poi aumenta fino a quando l'uscita diventa instabile.

In ogni caso ti consiglio di escludere sia la componente Integrale sia quella Derivata fino a che non funziona tutto correttamente, poi se vuoi sbizzarrirti, abilitale.

Ho appena provato ad escludere entrambe le componenti.... L'unca cosa che ottengo, settando un guadagno proporzionale a 0.5, è solamente la moltiplicazione del Setpoint con il guadagno. Quindi pra vedo che se metto 40.0 al setpoint, LMN mostrerà 20.0.... La cosa però non mi aiuta molto. Non riesco a costringere il mio sistema a prendere di riferimento il mio valore di lettura dalla sonda

Link al commento
Condividi su altri siti

Nonostante come setpoint metto 25.0 (ma ho fatto prove anche con 80.0, con 5.0 e con 10.0) il mio regolatore non si ferma quando la sonda raggiunge un valore fissato.... Il GAIN mi sembra giusto, no?

Da quel che intuisco mi sembra che tu stia provando il tutto in condizioni reali, dal momento che scrivi "quando la sonda raggiunge un valore fissato....."

Ti posso assicurare che facendo una prova molto semplice impostando :

SP_INT=28.0 ed in PV_IN anziche scrivere il valore calcolato su MD194 scrivi come in SP_INT un valore per esempio di 30.0, l'uscita del regolatore inizierà a variare. Attendi qualche secondo e subito dopo imposta su PV_IN lo stesso valore di SP_INT cioè 28.0. vedrai che l'uscita del regolatore LMN_PER si blocca, per poi iniziare nuovamente a variare in modo inverso se porti PV_IN da 28.0 a 25.0.

Se questo funzionamento è verificato, da un punto di vista della regolazione il blocco FB41 lavora correttamente.

"Ricollegandomi" alla tua affermazione "il mio regolatore non si ferma quando la sonda raggiunge il valore fissato..." ribadisco che se stai testando il tutto nelle reali condizioni di lavoro ed accertato (mi sembra di si) che il senso di regolazione del PID sia corretto, non puoi pretendere per esempio che impostando un Set point di lavoro = 28.0 quando questa temperatura viene raggiunta e rilevata dalla termoresitenza il PID arresti la sua regolazione congelando il valore in uscita a LMN_PER.

Sicuramente questo succede ma per tempi pressochè brevi, in quanto il sistema che vai a regolare avrà una certa deriva termica quindi appena raggiunti i 28.0 la temperatura difficilmente si bloccherà a questo valore, ma tenderà ad aumentare.

Ovviamente questa deriva deve essere contenuta il più possibile, impostando i guadagni del regolatore (PI) in modo tale da otimizzare la risposta e la stabilità del regolatore.

Inoltre non è detto che tu debba operare necessariamente con una correzione che va da 0 al 100%, puoi anche tentare di restringere il limite massimo di correzione su LMN_HLM.

Quando scrivi:

settando un guadagno proporzionale a 0.5, è solamente la moltiplicazione del Setpoint con il guadagno. Quindi pra vedo che se metto 40.0 al setpoint, LMN mostrerà 20.0.... La cosa però non mi aiuta molto. Non riesco a costringere il mio sistema a prendere di riferimento il mio valore di lettura dalla sonda
.

Se non si tratta di un errore di scrittura, in realtà il guadagno GAIN non viene affatto moltiplcato con il SetPoint, ma semmai con la componente di errore ER (come da schema a blocchi già postato).

Per cui se lavorando solamente con un regolatore di tipo P (solo parte proprozionale inserita in GAIN) con valore =0.5 e con SP_INT=40.0

l'uscita avrà valore 20.0 su LMN, solo se il valore di PV_IN=0.0.

LMN= (SP_INT - PV_IN) * GAIN.

Solo però con regolatore configurato in modalità P

in queste condizioni LMN_PER = LMN * (27648/100) = 20 * 276.48 = 5529.6 arrotondato a 5530 su PAW128

Link al commento
Condividi su altri siti

...Un'altra cosa che noto, molto strana, è che l'errore si fissa sul valore del Setpoint... Ora, da quello che ho letto, il valore di ER non è dato dal SETPOINT meno la letttura in ingresso, cioè PV_IN? E allora... Se la mia sonda legge 24.0 ed io ho un setpoint di 25... ER dovrebbe risultare 1? Che succede ora?... In questo momento sto ricontrollando tutto quello che ho scritto.... Vediamo un po'.... Ovviamente, ogni suggerimento è sempre molto benvenuto

Se l'errore (variabile ER del DB di istanza) è sempre uguale a SP_INT, significa che la variabile di processo PV_IN (MD194) è uguale a zero o non è in formato REAL.

Cosa leggi in PEW136 (in formato INT)?

Hai fatto la conversione da PEW136 a MD194 come indicato nel post #16 di Cagliostro?

Cosa leggi in MD194 (in formato REAL)?

Link al commento
Condividi su altri siti

Se l'errore (variabile ER del DB di istanza) è sempre uguale a SP_INT, significa che la variabile di processo PV_IN (MD194) è uguale a zero o non è in formato REAL.

Cosa leggi in PEW136 (in formato INT)?

Hai fatto la conversione da PEW136 a MD194 come indicato nel post #16 di Cagliostro?

Cosa leggi in MD194 (in formato REAL)?

qui di seguito copio tutta la conversione con accanto i valori in virgola mobile:

L PEW 136 (2.915e-043)

ITD (2.915e-043)

DTR (2.080e+002)

L 1.0000000e-001 (1.000e-001)

*R (2.080e+001)

T MD 194 (2080e+001)

per PEW 136 in INT leggo 208

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