Vai al contenuto
PLC Forum


Contatore Con Uscita Ad Impulsi


Matteo Angrisano

Messaggi consigliati

Matteo Angrisano

Salve,

dovrei collegare al PLC un misuratore di portata che offre un'uscita ad impulsi (ad esempio 1imp/m3), sapete dirmi come fare?

Link al commento
Condividi su altri siti


Ciao,

probabilmente devi contare gli impulsi (N impulsi = N m3); potresti utilizzare un contatore (CU), oppure un semplice incremento (INC); se l'impulso è veloce, dovrai usare un contatore veloce (CTRL_HSC).

Abbiamo poche informazioni:

- quanto dura l'impulso ?

- ogni quanto ti arriva un impulso ?

- qual'è il valore massimo del conteggio (quindi dei m3) ?

- quale versione software stai usando e quale CPU devi usare ?

- quanto conosci dei PLC e del Siemens S7-1200 ?

Link al commento
Condividi su altri siti

Matteo Angrisano

Intanto grazie per la risposta,

in ordine:

  • CREDO 200ms (devo chiedere e verificare)
  • ogni volta che passa un m3, non è regolare
  • non c'è un valore massimo
  • TIA PORTAL v.13 e S7-1200 CPU1212C AC/DC/RLY
  • ho appena iniziato ad usarlo, conosco poco e nulla
Link al commento
Condividi su altri siti

Con 200 mS, credo che tu possa provare ad eseguire un conteggio semplice, incrementando una variabile con INC, a patto di mettere al minimo i tempi di filtraggio degli ingressi al minimo (li trovi nelle proprietà della tua CPU) che è appunto di 0,2 secondi; dovrai mettere in serie alla INC il tuo ingresso con la rilevazione di un fronte di salita;se non dovesse bastare sarai costretto ad utilizzare i contatori veloci (CTRL_HSC).

Il valore massimo dipende dalla variabile che utilizzerai, ma ci DEVE comunque essere: ad esempio, con un DINT puoi arrivare al massimo a 2147483647; arrivati al tuo massimo, puoi azzerare il conteggio e/o inizare a contare con un altra variabile, dividendo il conteggio in m3, poi in migliaia di m3 e così via, questo a seconda di quello che hai necessità di fare.

Se non conosci nulla, ti consiglio prima di impratichirti un po' e di scaricare il manuale di sistema aggiornato dal SIemens Support Online, dove troverai le caratteristiche della tua CPU e le spiegazioni di tutte le istruzioni che ti ho nominato; sul sito Siemens Support Online puoi trovare anche parecchi esempi.

Link al commento
Condividi su altri siti

Matteo Angrisano

Ok.. Partendo da qualcosa di più semplice, ho creato un segmento per cui con I0.0 attivo si deve attivare l'uscita Q0.0.

Se ora volessi impostare un contatore che mi legga tutti i cambi di stato di I0.0? Che contatore uso e come lo imposto?

Link al commento
Condividi su altri siti

Per i contatori guardati nel manuale di sistema o nella guida in linea le istruzioni CTU, CTD e CTUD; per il tuo utilizzo, io però userei una variabile di un blocco dati, che poi incrementi con l'istruzione INC: ricordati solo di inserire in serie al contatto di I0.0 il rilevamento del fronte di salita.

Cerca con google Siemens Support: lì troverai parecchi esempi ed il manuale di sistema.

Link al commento
Condividi su altri siti

Matteo Angrisano

Avevo già visto quei contatori sul manuale, però contano avanti o indietro.

A me serve che il contatore conti sempre in avanti sia da 0 a 1 sia da 1 a 0.

Una variabile di un blocco dati cosa è?

Link al commento
Condividi su altri siti

Utilizzi il fronte di salita (0-->1) ed il fronte di discesa (1-->0) in parallelo all'ingresso di conteggio del contatore o all'struzione di incremento se utilizzi questa soluzione.

i questo modo puoi conteggiare entrambi i cambiamenti di stato poichè mi sembra di capire che ogni cambio di stato conteggia un m3 .

Quindi cosa c'entra l'impulso di 200ms ?

bigalex

Link al commento
Condividi su altri siti

Una variabile di un blocco dati cosa è?

Hai a disposizione gli I/O che sono hardware, i merker, che penso tu conosca e le variabili definite nei blocchi dati; questi ultimi possono essere di istanza (e cioè "abbinati" ad un blocco FB) oppure globali; se tu crei un blocco dati globale (es. DB9) al suo interno puoi inserire delle variabili di qualsiasi tipo previsto (cerca "Tipi di Dati") e poi utilizzarle all'interno di uno dei blocchi che utilizzi (Esempio: DB9 = Blocco MioBloccoDati; DBD0 = variabile MioContatore; per chiamarlo MioBloccoDati.MioContatore).

Secondo me, l'approccio migliore è rilevare il fronte di salita (e di discesa se ti serve) ed incrementare una variabile definita in un blocco dati globale con l'istruzione INC; poi prevedere che non arrivi mai al limite della variabile che hai definito (cerca "Tipi di Dati" e vedrai tutti i tipi e i loro limiti).

Mi sa che devi studiare un po' ...

Modificato: da drugo66
Link al commento
Condividi su altri siti

  • 3 weeks later...

ciao matteo,

io uso spesso I misuratori lancia impulsi

Di solito io li uso per totalizzare il volume o per il calcolo della portata istantanea!

Prima di tutto , mi darei un compito (misuratore di portata per esempio) e poi proverei a realizzarlo.

Ciao

Inviato dall'app. Mobile di PLC Forum da GT-N5100

Link al commento
Condividi su altri siti

Nel TIA Portal V13 Upd3 esiste già un contatore di impulsi che va abilitato nell'hardware e si lega direttamente a un'uscita. L'ingresso e l'uscita sono legati nel senso che es. I0.0 -> Q0.0 I0.1->Q0.1 e cosi via. La funzione per andare a verificare il conteggio è CTRL_HSC e va legata al nome hardware degli ingressi.

Link al commento
Condividi su altri siti

  • 4 weeks later...
Matteo Angrisano

Ciao ragazzi, ho ripreso lo studio del mio progetto e ora ho qualche piccola conoscenza in più.

Vi ricordo il mio obiettivo: collegare il lancia impulsi di un misuratore di portata ad un ingresso digitale del PLC e avere la portata.

Andando per step ho quindi pensato di fare così:

Un CTU che conti i cambi di stato da 0 a 1 dell'ingresso digitale.

Usare un RD_LOC_T che legga l'ora quando il valore di CTU è =1 e salvi in Ora1

Usare un RD_LOC_T che legga l'ora quando il valore di CTU è >1 e salvi in Ora2

Usare T_DIFF per avere la differenza di Ora2-Ora1 e salvare come Ora_Diff

Usare il comando Move in modo che Ora2 diventi Ora1

Ora, dopo il primo cambio di stato da 0 a 1, il valore di CTU sarà sempre >1 e leggerà quindi sempre Ora2 ed io avrò la giusta differenza ogni volta.

A questo punto posso dividere il peso di impulso del mio misuratore di portata per la differenza di tempo.

È corretto?

xbidsw.png

Questo è ciò che ho fatto, non riesco però ad inserire nella maniera corretta il comando Move per copiare Ora2 in Ora1 solamente dopo aver fatto la differenza e nemmeno a fare peso di impulso diviso Diff_Ora.

Sto seguendo una strada giusta o devo cambiare per forza modo di operare?

Link al commento
Condividi su altri siti

Ciao,

mi sono perso e non capisco cosa vuoi fare: ma non dovevi misurare una portata in base agli impulsi ?

In ogni caso:

- I0.0 lo appoggerei ad un merker con in serie un bel rilevamento di fronte in cima ai tuoi segmenti: in questo modo non devi utilizzare ogni volta un merker di appoggio per il rilevamento del fronte e lo puoi usare su tutti i segmenti seguenti

- nel comando di contatori io ho sempre utilizzato i fronti, è più sicuro che ad ogni impulsi conti una volta sola; tieni anche conto che il contatore stesso cambia il suo stato (Q) quando il conteggio raggiunge lo zero

- l'istruzione MOVE non ti funziona con Ora1 e Ora2 probabilmente perchè sono DTL, che dovrebbe essere un dato composto (al momento non lo ricordo ...), quindi o crei un FC di copia dei singoli dati che compongono il DTL oppure fai la stessa cosa, ma nel momento che ti serve, dipende da quante volte ti serve questa funzione

- personalmente per "contare" nel modo in cui lo fai tu, preferisco usare l'istruzione INC: i contatori li utilizzo solo quando mi serve un conteggio che, quando arriva a zero, mi scatena un qualche evento, andando quindi a verificare lo stato di Q del contatore e senza dover definire una word in CV

Link al commento
Condividi su altri siti

Matteo Angrisano

Sarà un mio limite, ma riesco a capire la metà delle cose che hai detto..

Purtroppo non riesco a capire come studiare i PLC della Siemens..

Comunque si, devo misurare una portata in base agli impulsi. Ma sono confuso.. C'è chi mi dice di usare contatori veloci.. Chi di usare l'istruzione INC.. Chi mi dice di sfruttare la differenza di tempo tra il secondo ed il primo impulso..

Non so che strada seguire, ecco.

Link al commento
Condividi su altri siti

Facciamo un po' d'ordine:

- se il tuo trasduttore invia un impulso ogni metro quadro, penso proprio che tu debba limitarti a contare gli impulsi (così avevo capito io all'inizio), altrimenti devi capire meglio come funziona il trasduttore: se hai bisogno siamo qui, ma devi fornirci le caratteristiche tecniche del trasduttore

- l'utilizzo dei contatori veloci dipende, secondo me, dalla velocità degli impulsi: se gli impulsi durano poco e sono molto veloci, un ingresso gestito in modo "normale" potrebbe non farcela a contare tutti gli impulsi, ed ecco che l'utilizzo dei contatori veloci acquista un senso; tu hai scritto di una durata di 200 mS, quindi il PLC non dovrebbe avere problemi; non sai ogni quanto si ripete un impulso, ma non credo sia meno di 100 mS, quindi, sempre secondo me, lascia stare i contatori veloci

- ti ho consigliato l'uso dell'istruzione INC perchè, secondo me, è più adatta allo scopo, ma tu sei libero di utilizzare quello che più ti aggrada

- sempre secondo me, è meglio che utilizzi il fronte dell'ingresso per contare, altrimenti corri il rischio che un impulso ti causi 2 conteggi: l'hai già utilizzato sull'ingresso EN all'istruzione RD_LOC_T; quello che ti ho consigliato è di scrivere la stessa istruzione con in uscita un merker e poi di utilizzare quel merker per contare, così eviti di dover usare l'appoggio più volte (quel M1.0 sotto I0.0, che deve essere diverso per ogni istruzione)

- Clock_date.Ora1 è un dato DTL e sostieni che non ti funziona con l'istruzione MOVE; al momento non ho il manuale sotto mano, ma sicuramente DTL è un dato composto, quindi fatto di, che so, 8 word; se vuoi farne una copia (quindi un MOVE ad hoc per i DTL), dovrai copiare con MOVE ogni singola word di quel dato DTL; in questo modo dovrebbe funzionare

- per studiare il S7-1200 c'è il suo manuale: non so a che livello di preparazione sei, ma il manuale lo ritengo abbastanza comprensibile: in ogni caso, se non capisci qualche specifica cosa, noi siamo qua

- se diverse persone ti consigliano approcci diversi è perchè le persone sono ... diverse ! Perdonami il gioco di parole, ma il senso è quello: alla fine sei poi tu che devi scegliere ed eseguire il tuo lavoro

Link al commento
Condividi su altri siti

Matteo Angrisano

Grazie Drugo, sei davvero gentile.. E scusa per il piccolo "sfogo" di prima, ma spero capisca che quando c'è di mezzo il lavoro..

Cerco di rispondere in ordine:

Il trasduttore mi da un segnale digitale, cioè ad esempio un'uscita di 1impulso/litro.

Con 200ms intendevo la durata dell'impulso, ma sono sicuro che tra un impulso e l'altro passi un tempo molto più alto, ALMENO qualche secondo, quindi sono d'accordo sul non utilizzare i contatori veloci.

Per contare gli impulsi ho utilizzato come mi hai detto, un contatto normalmente aperto e un rilevatore di fronte di salita in serie e funziona.

Però per contare ho utilizzato un CTU, ma credo che con INC avrei lo stesso risultato.

Per quanto riguarda il problema del MOVE, funziona, quello che non riesco a fare è farlo solamente DOPO aver fatto la differenza (nel progetto che ho postato prima). Nel senso che non so in che ordine debbano andare le istruzioni nei segmenti in modo da dire fai prima questo e solamente dopo fai quest'altro.

Mi spiego meglio.. Sempre nel mio progetto ho messo T_DIFF per fare Ora2-Ora1, poi mi serve che Ora2 venga copiato in Ora1. Qual'è il problema? Che il PLC fa tutto in sequenza e quindi T_DIFF va sempre a 0. C'è un modo per evitare questo?

Ancora grazie, pian piano andiamo avanti

Link al commento
Condividi su altri siti

Nessun problema, capita ...

Se vuoi usare un contatore, sei libero di farlo: tieni solo conto che si tratta di una word, quindi il conteggio arriva a 65535 e poi si ferma (sempre se ricordo bene ...).

Non c'è un modo per invertire la sequenza, la CPU esegue sempre dall'alto verso il basso, il che, volendo, è anche una certezza: sei tu che devi decidere quali istruzioni hai bisogno che siano eseguite prima o dopo e, quindi, inserirle di conseguenza.

Non so dove hai messo il MOVE, ma, secondo me, il tuo problema non è solo quello, ma risiede nel fatto che solo una volta utilizzi il fronte (con l'istruzione RD_LOC_T) mentre nelle altre no: metti i fronti dappertutto (se vuoi utilizza un merker come ti consigliavo in #15, altrimenti usa sempre merker di appoggio diversi), fai la differenza e poi copi Ora2 in Ora1. Infine, queste 2 operazioni le farei quando mi sono arrivati almeno 2 impulsi (tramite il confronto Valore contatore > 1 come nel segmento precedente), altrimenti Ora2 potrebbe contenere un valore improprio.

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