andrea.scalfati Inserito: 9 febbraio 2007 Segnala Inserito: 9 febbraio 2007 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
Luca Bab Inserita: 9 febbraio 2007 Segnala Inserita: 9 febbraio 2007 Hai tante strade da poter seguireinanzitutto la doppia word ti permette un range piu' ampiopoi con il byte di clock della cpu da 1 sec , conti i secondi , i minuti e le oreoppure 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 1Poi puoi decidere di fare il listone o di parametrizzare il blocco ( consigliato per tanti motori )ciaoLuca
Luca Bettinelli Inserita: 9 febbraio 2007 Segnala Inserita: 9 febbraio 2007 Puoi usare una dword invece di una word con valore in DINT (intero doppio) fino a2.147.483.647
Vince73PLC Inserita: 9 febbraio 2007 Segnala Inserita: 9 febbraio 2007 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
Eddyn°1 Inserita: 9 febbraio 2007 Segnala Inserita: 9 febbraio 2007 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 minutiPer ogni motore puoi crearti 3 DW:- DW1 per il conteggio dei secondi- DW2 per il conteggio dei minuti- DW3 per il conteggio delle oremettiamo 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...
batta Inserita: 9 febbraio 2007 Segnala Inserita: 9 febbraio 2007 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:
adross Inserita: 10 febbraio 2007 Segnala Inserita: 10 febbraio 2007 Ovviamente i conteggi debbono risiedere in memorie ritentive e caricabili come back up.
tode72 Inserita: 12 febbraio 2007 Segnala Inserita: 12 febbraio 2007 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...
Renzo R. Inserita: 12 febbraio 2007 Segnala Inserita: 12 febbraio 2007 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:AvvertenzaLa 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.
Ecup Inserita: 12 febbraio 2007 Segnala Inserita: 12 febbraio 2007 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
tode72 Inserita: 12 febbraio 2007 Segnala Inserita: 12 febbraio 2007 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
JumpMan Inserita: 12 febbraio 2007 Segnala Inserita: 12 febbraio 2007 (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 DINTPoi fai un FB(2) con i parametri: STAT: Motore_01 FB1 STAT: Motore_02 FB1........................................................ STAT: Motore_80 FB1Dentro l'FB2 richiami le multiistanze:CALL Motore_01Start:= A0.0Reset:= M0.0eccetera ...(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: 12 febbraio 2007 da JumpMan
JumpMan Inserita: 14 febbraio 2007 Segnala Inserita: 14 febbraio 2007 (modificato) Errata corrige messaggio precedente:STAT: Min DINT >>>>>>> STAT: Min BYTESTAT: Sec DINT >>>>>>> STAT: Sec BYTE(Un byte è piu' che sufficente per contare fino a 60 ) Modificato: 14 febbraio 2007 da JumpMan
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora