texano Inserito: 14 ottobre 2010 Segnala Share Inserito: 14 ottobre 2010 Salve, mi servirebbe un aiuto.Ho una macchina dosatrice gestita da s7 300, con supervisione Wincc 5.1 sp.1, mi servirebbe, poter controllare il tempo che effettivamente la macchina gira, e quindi di conseguenza il tempo di fermo.Mi potreste, gentilmente dare un suggerimento su come fare???Sulla supervisione, ci sono due pulsanti start e stop, vorrei legare a loro, un temporizzatore o altro per il conteggio.Grazie Link al commento Condividi su altri siti More sharing options...
Gianmario Pedrani Inserita: 14 ottobre 2010 Segnala Share Inserita: 14 ottobre 2010 Secondo me la soluzione più semplice è crearsi 2 orologi con dei contatori, all'interno del programma plc, e poi visualizzare i secondi, minuti ,ore , giorni dentro la supervisione.. Link al commento Condividi su altri siti More sharing options...
cagliostro Inserita: 14 ottobre 2010 Segnala Share Inserita: 14 ottobre 2010 (modificato) Salve,esistono svariati esempi e tecniche su come realizzare un contatore di funzionamento.Anche Siemens nella biblioteca di funzioni denominata "Standard library" ==> "System Function Blocks" offre le funzioni SFC2,3 e 4 per la realizzazione di un contaore di esercizio.La spiegazione di queste SFC le trovi anche con l'aiuto in linea.In alternativa se può andarti bene allego il codice sorgente da importare come sorgente esterna.Il contatore delle ore arriva ad una gestione massima di 32766, dopodichè si resetta automaticamente.Tuttavia con alcune semplici modifiche è possibile portare la capacità di conteggio delle ore in formato 32bit aumentando decisamente la capacità di conteggio.Una volta compilata la funzione, quest'ultima deve essere richiamata in OB1 ed usare sempre di OB1 la variabile di sistema contenuta nei dati TEMP denominata OB1_PREV_CYCLE.In defintiva il contaore sfrutta come clock di conteggio il tempo di ciclo impiegato dalla CPU per elaborare il programma. Evitando così l'impiego di temporizzatori o altro.Ovviamente come detto all'inizio questo è un modo di operare. Sicuramente ve ne sono altri che certamente gli utenti del forum ti posteranno come possibile esempio.FUNCTION_BLOCK "Contaore" TITLE = AUTHOR : C_ostro FAMILY : Counters VERSION : 0.1 VAR_INPUT OB1_PREV_CYCLE : INT; //ms Run_Stp : BOOL; //Run/Stop counter ResetCnt : BOOL; END_VAR VAR_OUTPUT iSCnt : INT; //Seconds counter iMCnt : INT; //Minutes counter iHCnt : INT; //Hours conter END_VAR VAR dmsCnt : DINT; //millisec. counter END_VAR BEGIN NETWORK TITLE = // Reset counters U #ResetCnt; SPB RES; // Run/Stop counter U #Run_Stp; SPBN END; // milliseconds counter L #OB1_PREV_CYCLE; // From OB1 - millisec L #dmsCnt; // Adding millisecs +D ; T #dmsCnt; L L#1000; // 1000 ms = one second -D ; SPM END; T #dmsCnt; // Start with rest value // Increase seconds counter L #iSCnt; + 1; T #iSCnt; L 60; >=I ; SPBN END; L 0; T #iSCnt; // Increase minutes counter L #iMCnt; + 1; T #iMCnt; L 60; >=I ; SPBN END; L 0; T #iMCnt; // Increase hours counter L #iHCnt; + 1; T #iHCnt; L 32766; >=I ; SPBN END; // Reset mseconds-seconds-minutes-hours counters RES: L 0; T #dmsCnt; T #iSCnt; T #iMCnt; T #iHCnt; END: SET ; SAVE; END_FUNCTION_BLOCK Modificato: 14 ottobre 2010 da cagliostro Link al commento Condividi su altri siti More sharing options...
texano Inserita: 14 ottobre 2010 Autore Segnala Share Inserita: 14 ottobre 2010 Grazie, Cagliostro,mi potresti dire come faccio ad importare il codice da te descritto?? Link al commento Condividi su altri siti More sharing options...
cagliostro Inserita: 14 ottobre 2010 Segnala Share Inserita: 14 ottobre 2010 (modificato) Ho fatto una piccola modifica al codice, adesso la gestione delle ore di lavoro arriva fino a 2 miliardi e rotti appoggiando la variabile su di una DINT.Se sei interessato all'esempio che ti ho postato in precedenza, lascialo perdere ed importa il seguente codice come sorgente esterna.Per importare il codice devi semplicemente fare un copia di tutto il testo contenente la funzione.Fatto questo, apri con NotePad per esempio nel desktop di windows, un file che chiamerai per esempio texano.Quindi incolla il codice copiato nel nuovo file di testo chiamato texano e salva il tutto.Adesso rinomina il file texano con estensione .awl, per cui da texano.txt diventerà texano.awl.Apri S7,seleziona la cartella "sorgenti" e clicca con il tasto destro del mouse, nella nuova finestra, seleziona "inserisci nuovo oggetto", quindi scegli "sorgente esterna".A questo punto devi cercare il percorso in cui è stato salvato il file texano.awl e confermare con apri.Fatto questo nella cartella sorgenti troverai il file appena importato, quindi fai doppio click sul medesimo e ti si aprirà il codice sorgente della funzione FB5.dal menu "File" clicca su "Compila" se non viene segnalato nessun errore durante la compilazione, allora ti troverai nella cartella "Blocchi" la funzione FB5.Accertati prima di eseguire il "Compila" di non aver già presente una FB5, altrimenti ti viene sovrascritta.Adesso si tratta di creare il DB di istanza da assegnare alla FB5, e richiamare quest'ultima nell'OB1 per le ragione già dette nel post precedente.FUNCTION_BLOCK FB 5TITLE =AUTHOR : C_ostroFAMILY : MeterVERSION : 0.1VAR_INPUT OB1_PREV_CYCLE : INT ; //ms Run_Stp : BOOL ; //Run/Stop counter ResetCnt : BOOL ; END_VARVAR_OUTPUT iSCnt : INT ; //Seconds counter iMCnt : INT ; //Minutes counter iHCnt : DINT ; //Hours conterEND_VARVAR dmsCnt : DINT ; //millisec. counter END_VARBEGINNETWORKTITLE =// Reset counters U #ResetCnt; SPB RES; // Run/Stop counter U #Run_Stp; SPBN END; // milliseconds counter L #OB1_PREV_CYCLE; // From OB1 - millisec L #dmsCnt; // Adding millisecs +D ; T #dmsCnt; L L#1000; // 1000 ms = one second -D ; SPM END; T #dmsCnt; // Start with rest value// Increase seconds counter L #iSCnt; + 1; T #iSCnt; L 60; >=I ; SPBN END; L 0; T #iSCnt; // Increase minutes counter L #iMCnt; + 1; T #iMCnt; L 60; >=I ; SPBN END; L 0; T #iMCnt; // Increase hours counter L #iHCnt; + L#1; T #iHCnt; L L#2147483647; >=D ; SPBN END; // Reset mseconds-seconds-minutes-hours countersRES: L 0; T #dmsCnt; T #iSCnt; T #iMCnt; T #iHCnt; END: SET ; SAVE ; END_FUNCTION_BLOCK Modificato: 14 ottobre 2010 da cagliostro Link al commento Condividi su altri siti More sharing options...
batta Inserita: 15 ottobre 2010 Segnala Share Inserita: 15 ottobre 2010 Secondo me, come ho già avuto modo di dire in altre discussioni, il modo più semplice per fare un contaore è fare un... contasecondi.Basta incrementare una DWORD (quando sono vere le condizioni che richiedono l'attivazione del conteggio) sul fronte di salita del merker di sistema con frequenza 1Hz.In questo modo si è già fatto un contasecondi che (considerando anche il segno) arriva a circa 68 anni di funzionamento ininterrotto.Direi che si potrebbe tranquillamente evitare di gestire l'overflow.Se poi si vuole la visualizzazione in hh:mm:ss, già molti supervisori la gestiscono automaticamente.Nel caso si volessero invece gestire le tre variabili nel plc, piuttosto che incrementare i secondi, ogni 60 secondi incrementare 1 minuto, ogni 60 minuti incrementare 1 ora, è più semplice partire da un unico conteggio in secondi e poi, con poche istruzioni /D e MOD (resto della divisione), scomporre in ore, minuti, secondi.Esempio: L #Sec //Secondi totali L L#3600 /D T #hh //Ore L #Sec //Secondi totali L L#3600 MOD T #Tmp //Resto in secondi dopo calcolo ore L 60 /I T #mm //Minuti L #Tmp //Resto in secondi dopo calcolo ore L L#60 MOD T #ss //SecondiLe operazioni tengono conto del segno, quindi, come detto sopra, il conteggio massimo gestibile è di 2147483647 secondi totali, corrispondenti a 596523 ore, 14 minuti e 7 secondi (circa 68 anni). Link al commento Condividi su altri siti More sharing options...
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