Vai al contenuto
PLC Forum


Timer Aggiuntivi Per S7-300/400 - Timer con possibilità di congelamento conteggio


batta

Messaggi consigliati

In un'altra discussione viene chiesto come creare altri timer da utilizzare in S7.

Penso che questo sia il posto giusto dove proporre la mia soluzione, sperando di fare cosa gradita.

Io consiglio di utilizzare la mia funzione "Timer" non in sostituzione ai timer S7 (richiede più risorse), ma quando servono le seguenti potenzialità aggiuntive:

- Valore di Preset da 0 a 32767

- Possibilità di congelamento valore corrente

La funzione Timer ha bisogno di una variabile INT dove appoggiare il valore corrente. Io di solito creo un DB con un array di INT da utilizzare esclusivamente per la funzione.

Come per i precedenti lavori fornisco i sorgenti ampiamente commentati.

Le funzioni possono essere utilizzate, modificate, ridistribuite liberamente.

Non sono ovviamente responsabile dell'uso che ne verrà fatto.

Chiedo sempre la stessa cosa: non modificate il nome dell'autore.

Grazie.

Clicca qui per scaricare il file

Link al commento
Condividi su altri siti

  • 1 year later...

ciao batta sono uno studente dell'itis galvani che si trova a Napoli. ti ringrazio in partenza per la tua disponibiltà, ma quando scarico i tuoi "progetti" non riesco a visualizzarli....mi compaiono numeri e lettere strane...non potresti inviarmi quello riguardante il serbatoio? ti ringrazio nuovamente... ***[at]***.it

Modificato: da NULL
Indirizzo email rimosso in quanto non conforme al regolamento
Link al commento
Condividi su altri siti

Quello che segue è il link per scaricare un piccolo progetto con due funzioni, una per il calcolo del volume di un serbatoio cilindrico orizzontale, l'altra per il calcolo del volume di un serbatoi sferico.

Per aprirlo hai bisogno, ovviamente, di Step7. Ti basta usare la funzione "Disarchivia" e poi aprire il progetto.

Link per download progetto Step7 calcolo volume serbatoio cilindrico orizzontale e serbatoi sferico

Ho appena fatto il download per verificare la presenza di eventuali problemi nel file, ma mi risulta essere tutto a posto.

Altri progetti sono invece archiviati come sorgenti .awl.

Per questi, una volta scaricati e scompattati, devi importarli nella cartella "Sorgenti" del tuo progetto Step7 e compilarli.

Se hai ancora problemi, spiega meglio cosa non funziona.

P.S. hai postato nella discussione sbagliata e hai scritto la tua e-mail personale, che è vietato da regolamento.

Link al commento
Condividi su altri siti

  • 6 months later...

Il lavoro fatto bene, serve sempre a qualcuno anche dopo anni, ho ripreso a lavorare con Siemens e utilizzo i timer aggiuntivi dell'esempio.

Grazie Batta

Riccardo

Link al commento
Condividi su altri siti

  • 3 months later...
barbato giuseppe

ciao Batta ,ho visto per caso che ti sei costruito dei timer con la possibilita di congelamento del tempo trascorso

li ho scaricati ma non riesco a visualizzarli ne' con disarchivia e ne' come sorgenti

sicuro di un tuo chiarimento ti ringrazio

Link al commento
Condividi su altri siti

  • 3 months later...

io di solito quando ho bisogno di timer aggiuntivi utilizzo l'SFB4 Timer TON che " consuma meno memoria " comunque è interessante il congelamento del tempo, grazie comunque per lo spirito di mettere a disposizione il know how

fullenzo

Link al commento
Condividi su altri siti

Dipende dai casi. Io uso entrambe le soluzioni.

Tieni presente che l'SFB4 occupa meno memoria, ma per ogni timer devi creare un DB.

Se i timer da usare con questo sistema sono pochi, non c'è nessun problema. Se il numero diventa consistente, dipende dalla cpu che stai utilizzando.

Link al commento
Condividi su altri siti

Matteo Montanari
Tieni presente che l'SFB4 occupa meno memoria, ma per ogni timer devi creare un DB.

non è del tutto corretto. puoi utilizzare una Db unica indicizzando i valori necessari ai timer.

la cosa è spiegata in un esempio fornito da Siemens.

se devo creare un blocco "standard" inserico anche i timer nella definizione dei dati, in questo modo anche un programma scritto in AWL (o IL - Instruction List che dir si voglia) diventa simile al SFC.

Link al commento
Condividi su altri siti

non è del tutto corretto. puoi utilizzare una Db unica indicizzando i valori necessari ai timer.

la cosa è spiegata in un esempio fornito da Siemens.

Non riesco a capire come, ma potrebbe essere interessante.

Perché non posti il link?

se devo creare un blocco "standard" inserico anche i timer nella definizione dei dati, in questo modo anche un programma scritto in AWL (o IL - Instruction List che dir si voglia) diventa simile al SFC.

Non capisco cosa vuoi dire. Non potresti essere più chiaro, magari con degli esempi?

Link al commento
Condividi su altri siti

ciao Batta ,ho visto per caso che ti sei costruito dei timer con la possibilita di congelamento del tempo trascorso

li ho scaricati ma non riesco a visualizzarli ne' con disarchivia e ne' come sorgenti

sicuro di un tuo chiarimento ti ringrazio

Scusa se non ti ho risposto prima, ma la tua richiesta mi era sfuggita.

Spero tu abbia risolto il problema.

In ogni caso, ho appena scaricato il file, scompattato ed aperto con Step7 senza problemi.

Link al commento
Condividi su altri siti

Matteo Montanari
CITAZIONE

non è del tutto corretto. puoi utilizzare una Db unica indicizzando i valori necessari ai timer.

la cosa è spiegata in un esempio fornito da Siemens.

Non riesco a capire come, ma potrebbe essere interessante.

Perché non posti il link?

Il link non riesco più a trovarlo sul sito Siemens, magari è stato rimosso o magari ora l'esempio risulta essere a pagamento...( :ph34r: )

CITAZIONE

se devo creare un blocco "standard" inserico anche i timer nella definizione dei dati, in questo modo anche un programma scritto in AWL (o IL - Instruction List che dir si voglia) diventa simile al SFC.

Non capisco cosa vuoi dire. Non potresti essere più chiaro, magari con degli esempi?

ecco qui un esempio molto semplice semplice, comunque è il principio di funzionamento quello che importa...

FUNCTION_BLOCK FB 20
TITLE =
VERSION : 0.1


VAR
  TimerP01 : SFB 5;    
  TimerP02 : SFB 5;    
END_VAR
BEGIN
NETWORK
TITLE =Posizione P1

//;
      CALL #TimerP01 (// Generazione Tempo Comando in Corso
           IN                       := E      0.0,// Comando in Corso Posizione
           PT                       := T#5S);
//;
// Segnalazione Luminosa
//;
      U     #TimerP01.Q; // Generazione Tempo Comando in Corso
      U     E      0.0; 
      =     A      0.0; 
NETWORK
TITLE =Posizione P2

//;
      CALL #TimerP02 (// Generazione Tempo Comando in Corso
           IN                       := E      0.1,// Comando in Corso Posizione
           PT                       := T#5S);
//;
// Segnalazione Luminosa
//;
      U     #TimerP02.Q; // Generazione Tempo Comando in Corso
      U     E      0.1; 
      =     A      0.1; 

END_FUNCTION_BLOCK

CITAZIONE

ciao Batta ,ho visto per caso che ti sei costruito dei timer con la possibilita di congelamento del tempo trascorso

li ho scaricati ma non riesco a visualizzarli ne' con disarchivia e ne' come sorgenti

sicuro di un tuo chiarimento ti ringrazio

Scusa se non ti ho risposto prima, ma la tua richiesta mi era sfuggita.

Spero tu abbia risolto il problema.

In ogni caso, ho appena scaricato il file, scompattato ed aperto con Step7 senza problemi.

a dire la verità ho avuto problemi anche io a scaricare gli esempi proposti...

personalmente preferisco inserire il codice nei messaggi, più pratico e veloce...

(non viene indicato il nome dell'autore del programma, e quindi tutti possono dire che è farina del loro sacco...)

Link al commento
Condividi su altri siti

L'esempio è decisamente interessante.

Non sono però tanto convinto che sia così parsimonioso in termini di risorse.

Per 2 timer, il DB di istanza è di 40 byte, mentre per 2 dei miei timer ne bastano 4.

Al più presto farò delle prove per capire quanto incide sui tempi di scansione.

Non ho ancora capito invece dov'è che il programma in awl diventa simile al linguaggio strutturato.

Questo comunque non rappresenta, per me, un problema, dato che non amo particolarmente il linguaggio strutturato.

E' comodo per alcune cose, ma non per tutto. Inoltre genera un codice piuttosto pesante.

In awl fai le stesse cose con un codice molto più leggero.

a dire la verità ho avuto problemi anche io a scaricare gli esempi proposti...

Ma il problema è nel download, nella scompattazione o nell'apertura con Step7?

A volte scrivo anch'io direttamente il codice. Dipende però anche dalla lunghezza.

In ogni caso, non ci trovo nulla di male se si deve fare almeno la fatica di scaricarlo per poterlo visionare.

Non nego poi che per me è un piccolo piacere personale vedere il numero dei download che aumenta.

Questo dei timer poi è un esercizio banale, ma che con poche risorse permette di gestire timer "alternativi".

Chi è interessato all'esempio dei timer e non riesce a scaricarlo, mi può contattare all'indirizzo e-mail che si vede nella firma e provvederò ad inviarlo.

Modificato: da batta
Link al commento
Condividi su altri siti

  • 2 months later...

:(

Salve a tutti, ho scaricato il file esempio timer, premetto che sono inesperto con S7_300.

Al termine disarchivia, compare il messaggio:

i dati disarchiviati sono stati depositati nella directory

'C:\Programmi\Siemens|s7Proj\S7TMP000'.

Non è stato possibile, tuttavia, interpretare il contenuto

dell'archivio come progetto.

Non so come fare per vedere il suddetto esempio

ringrazio chiunque per l'aiuto.

Link al commento
Condividi su altri siti

  • 2 months later...

Ciao Batta,

ho scaricato e testato il timer che hai creato, ma cosi' com'e' scritto nel tuo progetto non mi funziona: il tempo residuo viene riportato continuamente al valore iniziale

Modificando il segmento 2 dell'FC120 come segue tutto funziona correttamente:

M000: ON    #Run
      ON    #Clock
      SPB   M002
      L     #ResVal
      L     1
      -I    
      SPPZ  M001
      L     0
M001: T     #ResVal
M002: L     #ResVal
      L     0
      <=I   
      U     #Enable
      =     #Out

Ciao!

Link al commento
Condividi su altri siti

Io l'ho provato in varie occasioni e funziona, anche con richiamo multiplo della funzione e/o di altre FC o FB, con sovrascrittura quindi delle aree di memoria delle variabili dell'interfaccia della funzione.

La tua modifica è comunque corretta.

Nel mio codice infatti, quando si effettua il salto, si scrive direttamente in #ResVal il contenuto dell'accumulatore, senza aver prima caricato con un'istruzione tale valore in modo evidente.

Però deve funzionare ugualmente, perché l'accumulatore viene caricato con il valore di #ResVal nel momento in cui #ResVal viene passato alla funzione come parametro.

Ti ringrazio per la segnalazione, e devo dire che sono rimasto sorpreso, negativamente, di me stesso.

Di solito infatti non ricorro ad espedienti come quello sopra descritto solo per risparmiare una riga di codice, ma preferisco un codice concettualmente corretto e chiaro, come quello da te scritto.

Un'altra soluzione per rendere la funzione corretta, è modificare il segmento 2 come segue:

M000: ON    #Run
      ON    #Clock
      L     #ResVal
      SPB   M001
      L     1
      -I    
      SPPZ  M001
      L     0
M001: T     #ResVal
      L     0
      <=I   
      U     #Enable
      =     #Out
Senza aggiungere righe di codice, basta spostare l'istruzione "L #ResVal" prima dell'eventuale salto. In questo modo il valore iniziale di #ResVal viene caricato in modo evidente nell'accumulatore, e non in maniera "occulta". Volendo, si può anche far risparmiare di eseguire l'operazione "T #ResVal" alla CPU quando la funzione viene eseguita con i flgas #Run o #Clock bassi, modificando il segmento 2 come segue:
M000: ON    #Run
      ON    #Clock
      L     #ResVal
      SPB   M002
      L     1
      -I    
      SPPZ  M001
      L     0
M001: T     #ResVal
M002: L     0
      <=I   
      U     #Enable
      =     #Out

Ringrazio ancora alan_ford444 per la segnalazione, ed invito tutti quelli che utilizzano questa funzione ad apportare la correzione.

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