Vai al contenuto
PLC Forum


Invertire Azione Uscita Pid


Mauro_lab

Messaggi consigliati

Salve :rolleyes:

La questione parrà stupida, ma per me ultimamente le cose semplici diventano difficili e quelle difficili sono miracoli :blink:

Usando un PID con la funzione FB41

Usando un S.P. fisso

Normalmente

Quando il segnale del campo supera il valore di S.P l'uscita PID scende

Quando il segnale del campo sende dotto il valore di S.P l'uscita PID sale

lasciamo perdere i parametri P I D

A me serve l'opposto, ovvero

Quando il segnale del campo supera il valore di S.P l'uscita PID sale

Quando il segnale del campo sende dotto il valore di S.P l'uscita PID scende

Praticamente devo invertire l'uscita di controllo....... e non in negativo ma come azione :rolleyes:

Link al commento
Condividi su altri siti


Gianmario Pedrani

Metti un guadagno negativo, ovvero la parte P mettili es -0.5 oppure -0.1 a secondo di come lo vuoi veloce o lento oppure metti il meno al valore di proporzionale che già hai impostato.

se cosi non dovesse andare bene per te devi invertire l'uscita prima di mandarla al regolatore, e puoi fare cosi: prendi l'uscita es diciamo che il tuo regolatore quando è tutto aperto ti dia fuori 100.0 oppure 1000.0 non so!! la passi ad una fc105, o fc 106 che trovi nella bibblioteca e li invertendo i valori di ingenierizzazione ovvero i limiti della funzione

Link al commento
Condividi su altri siti

Effettua lo XOR del valore che dedi invertire con FFFh prima di trasferirlo nella PEW

Se mi chiedevi di buttarmi dalla finestra ero più felice..... :unsure:

Tradotto in italiano cosa serebbe? :o

Giammario ho già messo il proporzionale negativo, ma mi pare molto brutto da vede.

Con le funzioni FC 105 e 106 scalo solo il valore di uscira ma non inverto la azione del regolatore.

A meno che tu mi stia suggerendo di mette 100 al valore minimo e 0 al valore massimo nella funzione FC106 ma poi devo anche convertirla in formato da INT a WORD........ non c'è altro modo? :(

Link al commento
Condividi su altri siti

Effettua lo XOR del valore che dedi invertire con FFFh prima di trasferirlo nella PEW

Questo funziona solo se il campo dell'uscita è da 0 a 4095.

Giammario ho già messo il proporzionale negativo, ma mi pare molto brutto da vede.

Perché?

Capisco che tu non voglia vedere un parametro negativo impostato su un pannello operatore, ma ti basta impostare normalmente il parametro, ed effettuare l'inversione prima di darlo in pasto al PID.

Per ottenere questo, basta una sola operazione:

NEGI se il parametro è un intero a 16 bit

NEGD se il parametro è un intero a 32 bit

NEGR se il parametro è in virgola mobile a 32 bit

Anche l'inversione dell'uscita funziona ma è, a mio avviso, concettualmente non corretta.

E poi, a me sembra scomodo vedere, per esempio, l'uscita del PID al 100% e la valvola proporzionale completamente chiusa o, viceversa, l'uscita del PID a 0% e la valvola proporzionale completamente aperta.

La soluzione più "pulita" è quella dell'inversione del parametro P.

Link al commento
Condividi su altri siti

Si vero......

Ma la coso è un pochino più complessa.

La variabile di P è si nel pennello operatore a 32Bit ma anche nei sistemi di supevisione a 32 Bit

e poi vinene prelevata direttamente dalla DB di controllo del PID

Facendo come suggerisci devo fare le due cose in due diversi sitemi........

Poi questo è un sistema che deve mantenere un livello in un serbatoio il fatto sche segni 0 significa che la pompa va troppo veloce se segna 100 è troppo lenta, pertanto non è brutto vedere l'uscita inversa.

Ma farla direttamente sul PLC? <_<

Link al commento
Condividi su altri siti

Accidenti :angry:

Stavo dormendo ed ad un tratto mi sono sveliato di colpo ;)

Un lampo nel sonno mi ha colpito

NEGR se il parametro è in virgola mobile a 32 bit

è il complemento a due in virgola mobile.

Ovvero inverte il valore.

Eccco allora la cosa si fa interessante accendo il PC e eccomi qua! :blink:

Prendo la variabile di P e la ficco nel NEGR , e adesso l'uscita dovrei metterla nel PID, mi creo una variabile reale di appoggio e ce la metto.....

Non uso la stessa altrimenti non vale!

Funziona?

Mi manca il PLC

Il simulatore non ce la fa :angry:

Proverò tra qualche ora

Link al commento
Condividi su altri siti

Questo funziona solo se il campo dell'uscita è da 0 a 4095

Si, con FFFh è vero; ho messo questo valore per rendere l'idea di ciò che intendevo con l'operazione XOR. Correggo con FFFFh per l'inversione fino a 65535, proseguendo con il valore esadecimale se richiesto. ;)

Tradotto in italiano cosa serebbe?

La tabella della verità dello XOR è la seguente:

0 0 : 0

0 1 : 1

1 0 : 1

1 1 : 0

Cioè l'operazione dà risultato 1 se, e solo se, i termini dgli operandi sono diversi. Nel caso del confronto che ti ho suggerito io, e che ho utilizzato spesso con successo in alcune delle mie applicazioni, confrontando il tuo valore analogico (per es. 0110) con Fh=1111 (4 cifre per comodità dell'esempio), hai come risultato 1001, cioè l'esatto opposto del valore in ingresso. Secondo me, ritenendo comunque validi i suggerimenti di Batta e Gianmario, con un paio di righe di programma risolvi il tuo problema.

Link al commento
Condividi su altri siti

La variabile di P è si nel pennello operatore a 32Bit ma anche nei sistemi di supevisione a 32 Bit

e poi vinene prelevata direttamente dalla DB di controllo del PID

Prendo la variabile di P e la ficco nel NEGR , e adesso l'uscita dovrei metterla nel PID, mi creo una variabile reale di appoggio e ce la metto.....

Non uso la stessa altrimenti non vale!

Non ho ben capito cosa intendi fare.

Se i supervisori puntano direttamente alla variabile "GAIN" del DB di istanza della funzione FB41 e nei supervisori non vuoi vedere un guadagno negativo, allora devi invertire l'uscita.

Se invece puoi far puntare i supervisori ad una variabile di appoggio, allora usa l'istruzione NEGR per invertire il segno. A questo punto, che tu vada a scrivere il risultato direttamente nel DB o che lo passi come parametro nel richiamo di FB41, non cambia nulla.

Se invece intendi lasciare che i supervisori puntino direttamente alla variabile "GAIN", poi prelevare questo valore, invertire il segno e poi passarlo al PID come parametro nel richiamo di FB41... beh, questo non lo puoi fare, perché il valore che tu passi come parametro viene scritto nel DB.

Link al commento
Condividi su altri siti

Ecco si appunto è quello che ho fatto :rolleyes:

In questo caso non punto direttamente nella DB ma uso una variabile, così la posso manipolare come voglio

essendo una variabile del PLC non mi devo preoccupare di tutte le precauzioni che una variabile che pun alla DB occorre prendere

Tradotto in italiano cosa serebbe?

Ok conosco bene la logiaca binaria, era solo una esclamazione per il fatto che mi sembrava troppo complesso per invertire semplicemente un comando :lol:

Link al commento
Condividi su altri siti

Non è complicato, ma funziona solo con valori esadecimali tipo F, 7F, FF, 7FF, FFF, 7FFF (per restare nel campo di variabili a 16 bit).

Se, per esempio, voglio convertire un valore da 0..100 in 100..0, l'OR esclusivo non va più bene.

Ma, direi, non è un problema. Basta infatti una semplice sottrazione per ottenere il risultato voluto.

L 100

L "Var1" //valore da 0 a 100

-I

T "Var2" //valore da 100 a 0

Che non è più complicato che scrivere

L "Var1" //valore da 0 a 32767

L W#16#7FFF

XOW

T "Var2" //valore da 32767 a 0

Link al commento
Condividi su altri siti

Salve :rolleyes:

Ho un problema che non comprendo

Prendo la variabile di P e la ficco nel NEGR , e adesso l'uscita dovrei metterla nel PID, mi creo una variabile reale di appoggio e ce la metto.....

Ecco ho fatto così, ma avviene una cosa strana

Supponiamo che la variabile in input che si chiama MD82 formato REAL

Prendo MD82 e le inserisco nel NEGER e in uscita metto una variabile creata net TEMP (stessa FB dove ho il PID) con nome #Guad_neg fomato REAL

Questa variabile #Guad_neg la inserisco in ingresso al PID sul GAIN

inserisco il valore nella MD82 = 0.01 in unscita la #Guad_neg = -0.01

Ma mi trovo sul PID la variabile un volore #Guad_neg = -0000000001 dove sono finiti i decimali? :angry:

Naturalmente il PID schizza da tutti le parti e non è un errore di visualizzazione ma vale proprio -1 :(

Link al commento
Condividi su altri siti

ti consiglio di metterlo prima anche per pulizia nella programmazione...

la soluzione che uso usualmente in caso di regolazione inversa è di scrivere il gain da supervisore, nel plc moltiplicarlo per -1 e poi passarlo nel pid...ed ha sempre funzionato...

Link al commento
Condividi su altri siti

si prima c'è il blocco PID poi facco il NEGER

:blink: :blink: :blink:

A parte la "pulizia di programmazione" (non ti pare che come logica andrebbe negato "prima" di darlo al PID?), non ti ha mai insegnato nessuno che per usare una variabile temporanea devi "prima" definirla e "poi" usarla?

Se tu richiami una variabile temporanea prima di definirla (nel senso di "scriverla"... non semplicemente "dichiararla"), il suo valore può essere qualsiasi cosa, vista che la sua allocazione non è fissa (essendo una variabile temporanea...) e può pescare da una zona di memoria usata nella FC o FB precedente per qualsiasi altra cosa...

Modificato: da Gapo
Link al commento
Condividi su altri siti

Quoto Gapo.

Non è questione solo di "pulizia di programmazione".

Effettuare le operazioni

L MD82

NEGR

T #Guad_Neg

prima di passare il parametro #Guad_Neg al PID è OBBLIGATORIO.

Oppure puoi evitare di passare il parametro alla funzione FB41 e scrivere direttamente il guadagno nel DB di istanza.

Esempio:

L MD82

NEGR

T "DbIstanzaPid".GAIN

Una domanda: ora i supervisori scrivono il dato in MD82 o è solo un esempio?

Se utilizzi davvero MD82, se non hai configurato l'area di merker ritentivi almeno fino a MB85, quando spegni il PLC perdi il valore impostato.

Link al commento
Condividi su altri siti

L'alternativa è usare una variabile "vera" anziché una temporanea; non darebbe problemi (se non per un ciclo PLC) ma in ogni caso è fuori da ogni logica... senza contare che, come dice per l'appunto Batta, bisognerebbe considerare il discorso retentività.

PS: ho visto fare grossi danni da gente inesperta che usava le variabili temporanee prima di scriverle...

Link al commento
Condividi su altri siti

Salve :rolleyes:

Scrivere una variabile prima o dopo averla usata ci dovrebbe essere solo un ritardo di un ciclo, al massimo prende il valore vecchio di un ciclo.

Il fatto che il sistema usi la sua aria di memoria per altri scopi non è la prima volta che mi capita.

Ma forse è meglio usare una varibile Maker cosi non rischio multe per disordine nella programmazione.

Il fatto delle ritenzione è volutamente NON ritenuta per il semplice fatto che un impianto quando il PLC si spegne, è necessario eseguire e rimpostare le varibili di controllo, non è pensabile far ripartire un impianto senza avere la certezza delle vaiabili impistate. Pertanto tutte vengono inizializzate a 0 e l'utente per forza deve controllare che tutto viene impostato correttamente.

Gli impianti non sono macchine limitate in un cappannone ma si estendono per ettari, e uno spegnimento di un PLC significa giorni di controlli e verifiche di ogni genere. Non esistono valori predifiniti ma vi è un continuo aggiustamento delle variabile per causa del tempo meteo, tra il giorno e la notte, la materia prima puo subire modifiche tra un rifornimento e l'altro ecc......

Naturalmente le variabili importanti sono ritenute nelle apposite DB.

PS: ho visto fare grossi danni da gente inesperta che usava le variabili temporanee prima di scriverle..

Si vero se chi sbaglia è umano può succedere, l'importante è capire perchè si sbaglia.

Link al commento
Condividi su altri siti

Scrivere una variabile, prima o dopo un fc o altro ha la sua importanza, non certo solo quella di un ritardo di ciclo.

Dipende ovviamente come è strutturato il progetto.

Non conosco il tuo impianto. Anche io ho realizzato impianti che si estendono su parecchi capannoni e linee lunghissime

usando pid e decine, pe non dire centinaia di analogiche.

Onestamente però, ho sempre usato dei data block per appoggiare le variabili proprio perchè sono ritenitive "d'ufficio"

Laddove ci era l'estrema necessità di azzerare qualcosa, lo faccio passando da OB100 ( non certo i range delle analogiche )

Per i pid con Gain negativo, nel caso non piacesse al cliente, facevo un bit il quale se impostato moltiplica il gain con -1

ma anche le varie soluzioni proposte ottengono comunque lo scopo

Per quanto riguarda poi i range delle analogiche, appunto perchè possono anche essere da modificare, creo pagine

protette da password e quindi gli operatori dotati di tale pwd possono accedere.

Francamente comunque in 20anni di attività nen mi è mai capitato uno o più strumenti analogici, per i quali ho

necessità di caricare un range diverso dopo uno spegnimento del plc, ma sempre l'ultimo che era attivo.

Non sò quale strumento possa cambiare il suo range dopo uno spegnimento. Per capirci se ha un certo range, dopo un restart

( può essere passato qualche minuto penso ... ) cosa può essere cambiato ?

Se magari ci dai qualche dettaglio in più possiamo capire di più.

PS leggi il mio messaggio non con tono critico, ma come suggerimento se può esserti utile

Link al commento
Condividi su altri siti

Scrivere una variabile prima o dopo averla usata ci dovrebbe essere solo un ritardo di un ciclo, al massimo prende il valore vecchio di un ciclo.

Il fatto che il sistema usi la sua aria di memoria per altri scopi non è la prima volta che mi capita.

Ma forse è meglio usare una varibile Maker cosi non rischio multe per disordine nella programmazione.

Si tratta semplicemente di conoscere le caratteristiche della macchina con cui si lavora.

Personalmente faccio largo uso delle variabili locali, che trovo comodissime e utilissime. A patto di conoscerne i limiti.

Nel caso specifico, appena abbandoni il blocco in esecuzione l'area di memoria utilizzata per le variabili locali viene considerata libera, quindi i blocchi successivi sono liberi di sovrascrivere il contenuto.

Questo implica che se entri in un blocco di programma e leggi lo stato di una variabile locale, non puoi sapere cosa contenga. Non si tratta quindi di perdere solo una scansione, ma di ritrovarsi con un valore che non c'entra assolutamente nulla.

Ad una variabile locale si deve tassativamente prima assegnare un valore. Solo dopo l'assegnazione si potrà avere certezza del contenuto.

Non procedere in questa maniera con le variabili locali dei plc S7-300/400, è un gravissimo errore.

Link al commento
Condividi su altri siti

PS leggi il mio messaggio non con tono critico, ma come suggerimento se può esserti utile

Leggo sempre i messaggi come un suggerimento e valido aiuto.

Purtroppo nel caso di spegnimento nella impiantistica chimica occorre paracchio tempo prima di potere ripartire

Io sono in Arabia da quasi un mese per far partire un impianto nuovo e forse tra un paio di giorni parte.

Non è questione di 20 anni di esperienza che possono cambiare le cose. Io in 30 anni ho visto passare dei PLC (che manco esisteva la parola PLC) sino ad oggi, ma c'è sempre qualcosa da imparare ed io sono qui per questo.

Comunque nulla di complicato sono sono tanti piccoli particolari che devono incastrarsi l'uno all'altro.

IL problema maggiore è che non sono in un ufficio comodo su una bella poltrona, ma sono in campo da solo e davo dare retta a molte persone, per questo mi avvalgo di un vostro valido aiuto per una risporta SMART, che è sicuramente gradita.

Ritornando alla questione, se la ritenzione non la ritengo necessaria è perche, per esperienza, non lo è, visto il livello dell'utilizzatore, se fa qualche passo in più per riavviare l'impianto è solo un bene.

Riassumendo, la cosa più semplice è creare una Maker REAL e modificarlo invertendo il valore di GAIN e poi inserirla nel PID, questo me sembra semplice, veloce e funzionale. Non dico che altri sistemi siano inutili o sbagliati, li tengo in cosiderazione sicuramente per gli sviluppi futuri.

Grazie

Mauro

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