Vai al contenuto
PLC Forum


Pid Impulsivo Con Uscita Digitale - Come implementare un PID che regoli due uscite BOOL?


mikdc

Messaggi consigliati

Ciao ragazzi,

avrei bisogno di una mano riguardo al controllo di una serranda motorizzata, comandata da due uscite digitali, una per l'apertura e una per la chiusura.

l'apertura-chiusura deve essere regolata in base alla temperatura fumi rilevata da una sonda 4-20mA. Il motore è chiaramente uno a partenza diretta.

Il PLC è un SLC 5/04 e uso RSLogix 500 per la programmazione.

Premetto che non ho mai usato Rockwell prima e mi trovo molto in difficoltà nel trovare un modo per implementare un normalissimo PID a impulsi con uscite digitali.

La funzione PID gestisce solo una uscita analogica? posso metterlo in funzione TIMED, ma non mi genera due comandi (es. UP/DOWN) per due uscite digitali?

Dato che Step7 lo supporta nella libreria standard (SFB 42, CONT_S) non credo sia una funzione particolare, ma non riesco a trovare un regolatore a step tra le funzioni della instruction palette.

Avete consigli?

grazie in anticipo

Mik

Link al commento
Condividi su altri siti


non so se gestisce uscite digitali,

comunque mi sembra che il blocco scp ti possa linearizzare l'uscita.

Io farei cosi: linearizzo l'uscita da -1000 a +1000. Quindi valore positivo attivo l'uscita 1; valore negativo attivo l'uscita 2. La durata è proporzionale al valore linearizzato.

Forse non molto elegante ma funzionale.

ciao

Link al commento
Condividi su altri siti

Ok grazie mille, proverò domani quando torno sull'impianto.

quindi metto giù un PID normale con Control Variable es. N31:5.

Poi uso la funzione SPC su N31:5, Input min: 0, Input max: 16383, scaled min -1000, scaled max 1000.

Poi sul valore di uscita (es. N31:6) faccio il grt 0 e il les 0 per comandare l'uscita digitale.

Però così facendo otterrei un comando continuo delle uscite, sempre una o sempre l'altra?

Cosa intendi con durata proporzionale al valore linearizzato?

grazie ancora!

Link al commento
Condividi su altri siti

non conosco la tua macchina,

quindi posso dirti delle cavolate.

supponiamo che il PID cicli ogni 100msec.

Allora fai una uscita a tempo proporzionale al valore del PID.

Esempio PID linearizzato= 1000 Uscita 1 per 100 msec

PID linearizzato =500 Uscita 1 per 50 msec

Stesso metodo per i valori negativi.

Magari ti crei anche una bella banda morta ad esempio uscite linearizzata compresa tra 50 e -50 no regolazione.

E' un idea poi dipende dalle caratteristiche dell'impianto......

Link al commento
Condividi su altri siti

Non conosco nè Rockwell nè la macchina, ma se la macchina ha una risposta lenta (diciamo sui 10 sec.) io farei così:

In un blocco elaborato a tempo (es. ogni 10ms) incremento di 1 una word X

Scalo l'uscita del pid con valori da -1000 a +1000

Quando la word X raggiunge un valore che corrisponde al fondoscala del PID (1000) la azzero

Anche se l'uscita del pid inverte il segno azzero la word X (qui non sono molto sicuro)

Confronto il valore assoluto del pid con la word X, se è maggiore setto un uscita o l'altra a seconda del segno del PID

Posso anche azzerare le uscite se il PID ha un valore assoluto inferiore a un tot.

Alla fine tutto questo è simile a quanto spiegato da luciopro ;)

Modificato: da JumpMan
Link al commento
Condividi su altri siti

Purtroppo hanno rinviato di 3 settimane la messa in servizio dell'impianto in questione, ma qualche prova in bianco l'ho fatta oggi.

E' uno scambiatore di calore per raffreddare i fumi in uscita da un forno prima dell'ingresso nel filtro. La serranda in questione aumenta o diminuisce l'afflusso di fumi nello scambiatore in base ad una temperatura. pare che sia molto lenta nel movimento (l'intera corsa si compie in 2 minuti).

il software che ho fatto oggi è il seguente, seguendo i consigli di luciopro:

- generato un clock di 5 secondi (T4:20)

- impostato il pid che regola ogni secondo

- linearizzata l'uscita da -1000 a + 1000

- banda morta di +-100

- se in corrispondenza del clock (T4:20/DN) l'uscita è superiore a 100, comanda l'apertura per quei 5 secondi, viceversa la chiusura.

sulla carta potrebbe funzionare, bisognerà vedere la velocità della serranda e di quanto varia la temperatura in base all'apertura della stessa.

speriamo!!

grazie mille per le dritte!

ciao

Mik

Link al commento
Condividi su altri siti

Se ho ben capito come vuoi fare, con qualsiasi valore del PID compreso tra 101 e 1000 ottieni un impulso di 5s.

Non mi sembra il massimo...

Nel mio esempio mi sono sforzato di spiegare come generare impulsi con duty-cycle variabile da 0% a 100% in proporzione al valore del PID.

Come ha detto anche luciopro:

a tempo proporzionale al valore del PID
Link al commento
Condividi su altri siti

Ciao Mikdc,

A mio parere, se ho capito bene quello che vuoi fare , l'uscita "a tempo proporzionale al valore del PID" non fa al caso tuo.

Il Blocco PID tira fuori un valore 0..100%(parlando in percentuale), questo valore è il setpoint di posizione della valvola che vai a regolare:

Uscita CV del PID = 0% (Valovola Chiusa)

Uscita CV del PID = 20% (Valvola Aperta al 20%)

Uscita CV del PID = 100% (Valovola tutta aperta).

L'ideale sarebbe che tu abbia in feedback la posizione della valvola e di conseguenza eseguire un posizionamento al valore richiesto dal pid.

Se purtroppo non hai il feedback della posizione della valvola, puoi incrementare una word mentre apri e decrementarla mentre la chiudi, creando una retroazione virtuale.

Facendo attenzione ad impostare il massimo valore nella word di feedback quando la serranda risulta tutta aperta (finecorsa di apertura) e di azzerarla quando la serranda risulta tutta chiusa(finecorsa di chiusura).

Poi inserisci una banda morta sull'errore di poizione.

Ciao.

Link al commento
Condividi su altri siti

No io ho soltanto i finecorsa di serranda tutta aperta e tutta chiusa che tagliano le uscite!

Quando il forno sarà a regime vedremo se differenziare gli impulsi in base al valore del PID come dice Jumpman, per ora sembra sufficiente così, se tutto funzionerà a dovere (dicono i processisti) la serranda quasi non si dovrebbe muovere dato che portata e temperatura dei fumi saranno molto costanti.

vedremo a fine agosto (sempre che i lavori meccanici siano finiti)

grazie ancora

Link al commento
Condividi su altri siti

  • 3 weeks later...
E' uno scambiatore di calore per raffreddare i fumi in uscita da un forno prima dell'ingresso nel filtro. La serranda in questione aumenta o diminuisce l'afflusso di fumi nello scambiatore in base ad una temperatura. pare che sia molto lenta nel movimento (l'intera corsa si compie in 2 minuti).

IMHO non ha molto senso usare un PID per un controllo del genere... personalmente farei un semplice controllo proporzionale sull'apertura della serranda in base alla temperatura dei fumi (o alla differenza di temperatura che rilevi tra ingresso e uscita... quello dipende dalla specificità del tuo imoianto) con limiti di temperatura impostabili. Le uscite digitali di apertura/chiusura vanno comandere semplicemente fino al raggiungimento della posizione desiderata... ho già fatto qualcosa del genere: si fa con una semplice SCP e un controllo sui limiti min/max, senza tirar ein ballo PID

Link al commento
Condividi su altri siti

mikdc,

Innanzitutto il titolo della tua discussione non e' corretto:

Pid Impulsivo Con Uscita Digitale, Come implementare un PID che regoli due uscite BOOL
Piuttosto direi : Pid con uscita ad impulsi (step controller).
avrei bisogno di una mano riguardo al controllo di una serranda motorizzata, comandata da due uscite digitali, una per l'apertura e una per la chiusura.

l'apertura-chiusura deve essere regolata in base alla temperatura fumi rilevata da una sonda 4-20mA. Il motore è chiaramente uno a partenza diretta.

Senz'altro hai pensato bene, ti serve un regolatore ad impulsi, che guida il motorino che apre e chiude la serranda, una valvola farfalla di solito.

Infatti, ho visto che tu hai gia esperienza col FB42 della Siemens, e quindi se avresti utilizzato una CPU S7300, saresti forse a capo. Invece, il blocco PID per i SLC non sarebbe cosi generoso.

Dunque, Se tu compari il block diagram del FB42 ed il block diagram del PID controller del SLC, vedi subito che nel primo la grandezza di controllo (grandezza regolante) va a finire sul blocco che elabora il valore analogico in uscita, convertendolo in impulsi digitali a passo, con cambiamento del senso di regolazione.

In cambio sul secondo caso, il CV (control variable), va diretto in uscita, sulla control valve, comportandosi come un regolatore continuo.

Il Time Mode, Timed or STI non centra. Ti serve scrivere una sub (blocco) che elabora la grandezza regolante e la converte appunto in digitale ad impulsi, cambiando il senso della direzione (+/-).

PS: ovviamente spero tu abbia un feedback della posizione...
No e' neccessario per questo tipo di regolazione.

Se tu guardi il layout del FB42, vedi:

PULSE_TM    TIME    >= CYCLE    T#3s    MINIMUM PULSE TIME : a minimum pulse duration can be assigned...

BREAK_TM    TIME    >= CYCLE    T#3s    MINIMUM BREAK TIME : a minimum break duration can be assigned...
           
MTR_TM      TIME    >= CYCLE    T#30s   MOTOR ACTUATING TIME: The time required by the actuator to move from limit stop to limit stop .

Il motor actuating time lo trovi certamente indicato sulla etichetta del motorino, in secondi. Pratticamente la sub che dovresti implementare, ne tiene conto del tempo che il motorino, sotto funzionamento costante, va dalla condizione FC tutto aperto alla condizione FC tutto chiusso o viceverza.

Tu dovresti scalare il valore percentuale analogico in correspondenza con questo tempo, considerando anche i valori di tempo e pausa degli impulsi .

Il senso della regolazione lo ricavi dal segno dato dal valore di scarto(errore) cioe' dalla differenza tra PV e SP.

I parametri di tempo impulso e tempo pausa sono variabili, in funzione alle tue esigenze in velocita' di risposta.

Questa sarebbe la strada guista per sfruttare al massimo le prestazioni del controllore PID.

P.D. : non conoscendo a fondo questo sistema SW, ci potrebbe essere una soluzione gia fatta . Speriamo un riscontro con qualche esperto in RSLogix500 che mi smentisca, chiedendo scuse in anticipo.

Modificato: da Savino
Link al commento
Condividi su altri siti

l'apertura-chiusura deve essere regolata in base alla temperatura fumi rilevata da una sonda 4-20mA.
Qui ti dimentichi del referimento ove vorresti regolare la temperatura cioe' il SP.

La temperatura di un sistema non la regoli solo con il valore istantaneo, termocoppia, etc.

IMHO non ha molto senso usare un PID per un controllo del genere... personalmente farei un semplice controllo proporzionale sull'apertura della serranda in base alla temperatura dei fumi (o alla differenza di temperatura che rilevi tra ingresso e uscita ... quello dipende dalla specificità del tuo imoianto)... con limiti di temperatura impostabili. Le uscite digitali di apertura/chiusura vanno comandere semplicemente fino al raggiungimento della posizione desiderata...
Gapo, Secondo me tu hai le idee sbagliate.
ho già fatto qualcosa del genere: si fa con una semplice SCP e un controllo sui limiti min/max, senza tirar ein ballo PID
L'SCP non andrebbe bene neanche all'uscita del PID.

mikdc, una regolazione si fa' in base ad un riferimento, sia questo fisso a variabile. Il guadagno (+/-) della valvola sara in funzione dallo scarto tra SP e PV.

Modificato: da Savino
Link al commento
Condividi su altri siti

mikdc,

Se a te non serve una grossa precisione di regolazione, puoi semplicemente fare un regolatore proporzionale, senza utilizzare un PID; ti basta fare una sottrazione tra SP e PV per ricavare il senso della regolazione, se questa e' positivo riscaldi (apri), se negativo raffreddi (chiudi).

Poi, il guadagno proporzionale sara' 'in funzione al tempo della corsa del motorino', ad andare da tutto aperto a tutto chiuso.

Questo tempo(motor actuating time) lo ci trovi indicato sulla etichetta del motorino, come gia detto.

Non ti serve la retroazione dellla posizione.

Leggiti questo post e afferra dei 'concetti e terminologie' di base.

Modificato: da Savino
Link al commento
Condividi su altri siti

Poi, il guadagno proporzionale sara' 'in funzione al tempo della corsa del motorino', ad andare da tutto aperto a tutto chiuso
Quindi se per esempio tu imposti un valore per una costante che la chiami K= 1000 e la fai corrispondere con un valore di tempo in secondi, 1000ms=1s, allora il motorino esegue un guadagno di 1 s, aprendo o chiudendo in modo costante, finche' l'errore tra SP e PV sara' presente. Poi agli impulsi delle uscite le filtri con un tempo impulso e un tempo pausa per evitare un lavoro continuo sull'attuatore.

Hai appena creato un regolatore con guadagno proporzionale con un largo effetto offset, dovuto alla mancanza del tempo integrale.

Poi, una variabile P ( proporzionale) andrebbe ad amplificare il valore di guadagno ( K * P )

Ho detto tutto, go to bed ;)

Modificato: da Savino
Link al commento
Condividi su altri siti

Qui ti dimentichi del referimento ove vorresti regolare la temperatura cioe' il SP.

La temperatura di un sistema non la regoli solo con il valore istantaneo, termocoppia, etc.

Ma anche no... lui non dice di dover regolare una *temperatura*, ma di dovere regolare la *posizione di una serranda* in base alla temperatura dei fumi

Gapo, Secondo me tu hai le idee sbagliate.

Può anche essere, ma parlo a ragion veduta visto che ho già fatto 3 o 4 applicazioni del genere, ovvero applicazioni in cui lo scambio d'aria (posizione della serranda) era regolato in base alla temperatura dei fumi e alla temperatura esterna... che è diverso dal "mantenere un setpoint di temperatura" (applicazioni che ho comunque fatto, ma che non mi pare sia questo il caso da come ho capito io la descrizione... poi posso anche aver inteso male eh... :P).

In ogni caso, se avessi capito male io il problema, e ci fosse un set di temperatura da mantenere, personalmente non userei comunque un PID:

-la componente derivativa, che già solitamente si usa poco, in questo caso credo sia da escludere in partenza: non conosco l'impianto nello specifico, ma non credo che la dinamica della temperatura di quei fumi preveda cambi molto repentini, e in ogni caso non gli si potrebbe "star dietro" con una reattività della serranda così bassa.

-la componente integrale, viceversa, è in certo senso già attuata dalla lentezza stessa della serranda.

-uare un PID per la sola componente proporzionale, tantopiù in questo caso dove non avrebbe nemmeno gli impulsi già pronti, mi pare inutile... il valore della componente proporzionale è calcolato in maniera immediata, e gli impulsi sarebbero comunque da creare. Eventualmente ci sarebbe da discutere su qual'è il modo migliore di generare questi impulsi: io ho un mio algoritmo che mi sono creato anni fa proprio per questi casi (che mi capitano di frequente) e consiste sostanzialmente nella definizione di un ciclo ON-OFF (con tempi minimi sia per l'ON che per l'OFF) su un tempo base (impostabile), dove i tempi di ON e OFF sono calcolati in base al valore della componente proporzionale. Ovviamente ci sono delle soglie di "sempre ON" e una banda morta per il "sempre OFF". Già testato su decine di impianti, funziona più che bene senza ricorrere al PID.

ciao

Link al commento
Condividi su altri siti

Gapo,

ma di dovere regolare la *posizione di una serranda* in base alla temperatura dei fumi
Questo che tu hai scritto non sarebbe la stessa cosa che mikdc ha scritto.
l'apertura-chiusura deve essere regolata in base alla temperatura fumi rilevata da una sonda 4-20mA. Il motore è chiaramente uno a partenza diretta.

Secondo me lui non ha solo sbagliato a scrivere il titolo della discussione, ha anche descritto non in modo adeguato e chiaro quello che a bisogno. Poi, se ha tirato in ballo addirittura l'FB42, secondo me Io penso di non avermi sbagliato di tanto.

Spero che mikdc si facia ancora vivo, e ci chiarisca di piu' , magari apportando piu' dati per quanto riguarda questo processo.

Modificato: da Savino
Link al commento
Condividi su altri siti

Secondo me, semplicemente, non è stato descritto in maniera molto chiara il processo... e il fatto che abbia tirato in ballo la FB42 (IMHO) non è necessariamente significativo: potrebbe anche essere partito col piede sbagliato.

In ogni caso, come ho scritto prima, in entrambi i casi (personalmente) non userei il PID per un controllo del genere.

ciao

Link al commento
Condividi su altri siti

Va bene e' un tuo punto di vista. Ma questo dovrebbe essere chiarito da mikdc .

Ma togliemi una curiosita', a cosa ti servirebbe regolare la posizione di una serranda?

Modificato: da Savino
Link al commento
Condividi su altri siti

Ma togliemi una curiosita', a cosa ti servirebbe regolare la posizione di una serranda?

Nelle applicazioni che ho fatto, la posizione della serranda (anzi, delle serrande, visto che erano 3 in catena, oppure 4 in posizioni diverse accoppiate a 2 a 2) determinava la quantità di aria + fumi che veniva "ricircolata" e quella che invece veniva presa dall'esterno, ed era determinata in base alla temperatura interna o alla differenza tra la interna e esterna. La temperatura esterna andava poi poteva influire anche sulla portata totale (ovvero sul riverimento di velocità dei mega-ventoloni). Lo scopo era quello di assicurare il giusto ricambio di aria all'interno della "camera" in questione, dove entrava materiale caldo, bagnato e "fumoso" e doveva uscire asciutto e più freddo... ma non troppo freddo altrimenti non era più lavorabile. I tempi (fino a 20 minuti tra l'entrata e l'uscita), la dimensione (camere lunghe anche 30 metri, con materiale caldo da un lato e freddo dall'altro), e la dinamica del sistema (tutta quell'aria non è che si scalda o si raffredda in un attimo), rendevano inutile l'utilizzo del PID.

Link al commento
Condividi su altri siti

Va bene Gapo, Io non vorrei mettere sotto discussione la soluzione adottata da te per quel diterminato processo, poi se funziona va tutto bene :) Comunque i PI o PID sono delle funzione molto useful in regolazione, si possono utilizzare in modo singolo, in cascata, convinati con altri algoritmi e cosi' via... A volte le soluzione adottate possono essere piu' di 1 e funzionarebbero in ogni modo. Aspettiamo mikdc che ci dica cosa a deciso di fare, altrimenti rischiamo di andare OT.

Link al commento
Condividi su altri siti

Quello che voglio dire è che se non è richiesta una particolare criticità (e quindi la precisione e la reattività di un PID ben configurato), IMHO è molto meglio avere sott'occhio del codice scritto di proprio pugno sul quale si sa di preciso dove intervenire, piuttosto che che cambiare un parametro del PID e "sperare" che il sistema reagisca come desiderato...

I PID li uso anch'io quando sono necessari (tanto in Siemens quanto in AllenBradley, TwinCAT, Mitsubishi, ecc... ecc...) e proprio perché noto comportamenti diversi tra i vari tipi di PLC, se posso evitarli preferisco ragionare con la mia testa, tantopiù se la tipologia di controllo prevede, alla fin fine, di utilizzare solo la componente proporzionale... non ci vuole molto a scrivere del codice che faccia una retroazione proporzionale all'errore...

PS: per quanto riguarda i controlli delle serrande che ho descritto, oltre a funzionare correttamente da diverso tempo (i primi da ormai 4 anni) ti posso assicurare che in quel caso l'utilizzo del PID, sarebbe stato inutile e probabilmente nemmeno fattibile... ma non voglio addentrarmi troppo nei dettagli dell'impianto, visto che si sta discutendo di altro

Link al commento
Condividi su altri siti

Vedi Gapo, quello che dice te sarebbe un tuo punto di vista, che Io ho nel passato ho sostenuto, ma poi alla fine no per lungo. Poi, dipende anche di tante cose.. se tu fornisci SW per la FIAT ad esempio, loro vorrebbero un stile piu' standard possibile, e quindi non ti accettarebbero certe personalizzazioni di codice.

Poi, se sei un costruttore padrone, e scrivi il tuo codice personalizzato per le tue propie macchine, allora tutto va bene, tanto la macchina e' tua e fai come vuoi. Se incambio sei un dipendente, magari qualcuno non sarebbe tanto d'accordo perche se tu te ne vai via o muori, allora chi entra non ne capisce un tubo. Quindi e' tutto relativo.

Mi fermo qui per non continuare ad andare OT ( gia' siamo andati abbastanza ). Aspettiamo mikdc si facia vivo e ci chiarisca un po la situazione.

Link al commento
Condividi su altri siti

se tu fornisci SW per la FIAT ad esempio, loro vorrebbero un stile piu' standard possibile, e quindi non ti accettarebbero certe personalizzazioni di codice.

Tipicamente chi si rivolge a me lo fa perché sa che può fare affidamento al mio lavoro, non perché uso funzioni strandard.

Ti faccio un esempio: in una ditta qui vicino ci sono tre macchine sostanzialmente identiche tutte con sistemi di controllo differenti fatti da tre diverse società. Due usano funzioni standard e normali SCADA... e spesso hanno problemi... Una è fatta da noi con funzioni (nella fattispecie da me) con funzioni "nostre" e supervisione programmata da noi... e va sempre... L'anno prossimo dovranno fare dei revamping su altre macchine: non ti dico quale delle tre società hanno chiamato (nonostante non utilizzi sw standard) ;)

Poi, se sei un costruttore padrone, e scrivi il tuo codice personalizzato per le tue propie macchine, allora tutto va bene, tanto la macchina e' tua e fai come vuoi. Se incambio sei un dipendente, magari qualcuno non sarebbe tanto d'accordo perche se tu te ne vai via o muori, allora chi entra non ne capisce un tubo. Quindi e' tutto relativo.

Beh... non è che lavoro da solo... siamo in 5, ci parliamo tra di noi, ci confrontiamo sulla preparazione delle funzioni non standard, e siamo perfettamente "intercambiabili": se vado via io ce ne sono altri 4 che conoscono il codice... finché poi il controllo non standard è un proporzionale, non è che siamo inventati chissàche... tutti sarebbero in grado di capirlo... :)

Link al commento
Condividi su altri siti

Gapo, non so quanto vecchio sei, ma Io ho scritto migliaie di pagina di codice, creato da me, non standard, Ok. Ma i PI e PID sono delle funzioni molto useful, come sommare e restare. ;)

Modificato: da Savino
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...