Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Contatori Ore Di Esercizio


Messaggi consigliati

andrea.scalfati
Inserito:

Gentili esperti di automazione, sarei molto grato a chi mi potesse dare una mano: in una applicazione con plc S7-300 (CPU 315 2 DP) mi è stato chiesto di tenere il conteggio delle ore di funzionamento di tutti i motori in campo, che sono circa 80.

Per ciascun motore dispongo del segnale "in marcia" come ingresso al PLC. I motori partono con logiche diverse e hanno tempi di funzionamento per ogni ciclo diversi (da pochi minuti a varie ore).

Qualcuno potrebbe darmi delle dritte su come risolvere il problema ?

Siccome mi sembra che il numero di motori non permetta di usare le funzioni di sistema dedicate al conteggio delle ore di esercizio, avevo pensato di usare un clock (tipo merker di clock) per controllare lo stato di funzionamento dei motori ciclicamente, e quindi incrementare delle variabili (di tipo intero) in un DB, per tenere il conto dei periodi di funzionamento per ciascun motore. Non so però se è una strada valida e ho dei dubbi sui suoi limiti (cioè, se il clock fosse ad esempio ogni minuto, riuscirò a contare solo fino a circa 32mila minuti ? posso usare più di una word per ogni macchina così da superare questo limite ?).

Grazie a tutti,

Andrea


Inserita:

Hai tante strade da poter seguire

inanzitutto la doppia word ti permette un range piu' ampio

poi con il byte di clock della cpu da 1 sec , conti i secondi , i minuti e le ore

oppure ti fai il clock dei minuti ( ma sei meno preciso poiche' se il motore ti parte adesso e il clock scade tra un secondo.............)

Lo puoi fare con counter ( sui secondi e minuti ) o con dei ADD 1

Poi puoi decidere di fare il listone o di parametrizzare il blocco ( consigliato per tanti motori )

ciao

Luca

Luca Bettinelli
Inserita:

Puoi usare una dword invece di una word con valore in DINT (intero doppio) fino a

2.147.483.647

Inserita:

Se vuoi una "risoluzione" di un minuto, se usi una DINT (intero a 32 bit), volendo da 0 a +2 147 483 647 (limite massimo), hai a disposizione... vediamo:

2 147 483 647 min = 35 791 394 Ore = 1 491 308 giorni = 4085 anni...

Se non ho sbagliato qualcosa direi che sono più che sufficienti :D

Inserita:

Ciao Andrea.

Ti che precisione hai bisogni nel tuo contatore di ore?

Ti chiedo questo perchè tieni presente che se ti costruisci tu il clock con due timer perdi in precisione ( per farti capire, dopo 100 ore ti trovi un errore di 5-10 min )

Potresti usare l'orologio della CPU e li se hai problemi di precisione vai tranquillo, potresti usare i clock che ti mette a disposizione la CPU, potresti usare un OB richiamato a tempo...

Non so però se è una strada valida e ho dei dubbi sui suoi limiti (cioè, se il clock fosse ad esempio ogni minuto, riuscirò a contare solo fino a circa 32mila minuti

Per ogni motore puoi crearti 3 DW:

- DW1 per il conteggio dei secondi

- DW2 per il conteggio dei minuti

- DW3 per il conteggio delle ore

mettiamo il caso che usi un clock della CPU da 1 sec, ti incrementi la DW1, quando questa è maggiore di 60 incremento la DW 2 e azzeri la DW1 e cosi via...

Inserita:

Praticamente hanno già detto tutto.

Io per i contaore uso sempre il clock della cpu da 1 secondo ed incremento una doppia word.

Per 80 motori ti basterebbero quindi 80 DWORD, ovvero un piccolo DB da 320 byte.

Con una DWORD arrivi a contare fino a 2 147 483 647 secondi, ovvero circa 68 anni di funzionamento ininterrotto, che diventano 136 se nella visualizzazione sul display non si tiene conto del segno.

Puoi sempre mettere per iscritto che, fra 68 anni, se ce ne sarà bisogno, andrai tu personalmente ad azzerare i contatori :lol: :lol: :lol:

Inserita:

Ovviamente i conteggi debbono risiedere in memorie ritentive e caricabili come back up.

Inserita:

io userei anche delle variabili real da incrementare nella DB così il valore massimo di conteggio diventa 3,4 *10^38.... credo che ne hai abbastanza per far andare in pensione anche i pronipoti prima di fare l'aggiornamento... :lol:

Inserita:

ATTENZIONE:

L'uso di variabili di tipo real e' un errore, arrivato ad un certo punto la somma di 1 non e' piu' significativa e il numero rimane lo stesso.

Tratto dall'. in linea:

Avvertenza

La precisione di calcolo di 6 decimali significa p.es. che l'addizione di numero1 + numero2 = dà come somma numero1, quando numero1 è maggiore di numero2 * 10 elevato a y, con y>6:

100 000 000 + 1 = 100 000 000.

Ciao.

Inserita:

Ho già fatto un'applicazione simile, e ti posso confermare che il metodo che stai pensando di utilizzare è corretto...

io usavo un merker-clock di 1sec per incrementare una word di conteggio secondi, arrivata a 60 si resettava e incrementava una word di conteggio minuti, che a sua volta, arrivata a 60 incrementava una word di conteggio ore

Inserita:

Hai ragione renzo dimenticavo l'arrotondamento.... comunque per l'applicazione in oggetto credo bastino una serie di variabili INT in una Db da incrementare con la scalabilità indicata da ecup... una per i giorni, una per le ore, una per i minuti ecc ecc

Inserita: (modificato)

Di solito faccio più o meno come ecup, una DINT per le ore, un BYTE per i minuti e un BYTE per i secondi, incremento i secondi con il fronte di un clock di un secondo, a 60 azzero i secondi e incremento i minuti, ecc.

Con cotanti motori però ti consiglierei di fare un piccolo FB(1) che fa quanto appena detto con i seguenti parametri:

IN: Start BOOL

IN: Reset BOOL

STAT: Ore DINT

STAT: Min DINT

STAT: Sec DINT

Poi fai un FB(2) con i parametri:

STAT: Motore_01 FB1

STAT: Motore_02 FB1

............................

............................

STAT: Motore_80 FB1

Dentro l'FB2 richiami le multiistanze:

CALL Motore_01

Start:= A0.0

Reset:= M0.0

eccetera ...

(naturalmente ci devi mettere anche il fronte del clock da qualche parte, puoi fare come vuoi, magari con un BEB all'inizio di FB2, sinceramente per non appesantire troppo il ciclo non elaborerei tutti gli 80 richiami in un solo ciclo ma farei dei clock sfalsati...)

Poi in OB1 richiami FB2 e lo associ a una DB di tua scelta nella quale ti ritroverai tutti i dati di tutti gli 80 motori !

In questo modo il programma è sicuramente + ordinato e leggibile

Modificato: da JumpMan
Inserita: (modificato)

Errata corrige messaggio precedente:

STAT: Min DINT >>>>>>> STAT: Min BYTE

STAT: Sec DINT >>>>>>> STAT: Sec BYTE

(Un byte è piu' che sufficente per contare fino a 60 :P)

Modificato: da JumpMan

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