Vai al contenuto
PLC Forum


Timer E Fb


Ron the bon

Messaggi consigliati

Ciao a tutti,

ho una domanda. Sto scrivendo un programma dove uso dei FB con delle In e Out. In italiano cred osi chiamino FB di istanza.

Ora in questi FB ho dei Timer. Il FB viene chiamato molte volte lungo tutto il programma e quindi ogni volta i Timer avranno un loro valore.

Esempio: ho FB100 per una funzione. All'interno ho il Timer T100. Questo FB viene chiamato 5 volte nel programma.

Ora la domanda: dove vengono memorizzati i valori dei Timer?

RonTheBon

Link al commento
Condividi su altri siti


In italiano cred osi chiamino FB di istanza

Gli FB sono blocchi funzionali con memoria, e la memoria è rappresentata dai DB che associ agli FB.

Pur sfruttando lo stesso FB, dovrai associare ad esso un DB diverso ad ogni istanza: per questo motivo vengono chiamati DB di istanza

dove vengono memorizzati i valori dei Timer?

Se ti serve un valore diverso per ogni istanza, puoi sfruttare i parametri d'ingresso.

Se il valore è identico ad ogni istanza, puoi memorizzarlo come parametro STAT.

In entrambi i casi, i valori verranno memorizzati nel DB di istanza.

Link al commento
Condividi su altri siti

Accidenti come e' difficile spiegare il problema.

Ci riprovo.

Il valore iniziale di ogni Timer nel FB di istanza viene immesso tramite i parametri d'ingresso (IN).

Se per esempio un bit mi serve dentro la FB lo mettero' come parametro STAT, cosi' che posso riutilizzarlo piu' tardi senza perdere il valore.

Con i Timer come si fa? Se ad esempio ho un Timer T100 che dura 10minuti, devo metterlo come parametro STAT? Se si, con quale Data Type?

RonTheBon

Link al commento
Condividi su altri siti

...nel FB di istanza...

Accidenti com'è difficile spiegarti che gli FB non sono d'istanza.......ma non ci riprovo. Semmai rileggi il post precedente. :angry:

Se ad esempio ho un Timer T100 che dura 10minuti, devo metterlo come parametro STAT?

Ripeto: se il valore è costante, memorizzalo su STAT, altrimenti su IN

Link al commento
Condividi su altri siti

ho FB100 per una funzione. All'interno ho il Timer T100. Questo FB viene chiamato 5 volte nel programma

Premetto di non essere un super esperto, ma ho una domanda da farti, "Ron the bon" il tuo timer è quello che hai scritto??

Mi spiego T100 è un timer come T90-T1-T50-ecc non è un SBF4 "TON" ovvero un timer costruito apposta per lavorare all'interno di FB con DB di istanza? :(

Xchè se fosse come ho inteso quello che stai cercando di fare equivale a scrivere 5 segmenti in oguno di essi richiami il T100, non sono mica convito che funzioni la cosa?? :unsure::unsure:

Modificato: da TravelMen
Link al commento
Condividi su altri siti

Si Travelman,

hai ragione. Siccome non sapevo mi sono espresso male.

Ho trovato la soluzione:

NON devo usare un timer T100 ma un timer definito nel FB, del tipo SFB4 TON.

In questo modo posso avere quanti timer voglio che verranno attribuiti ogni volta che l'FB viene chiamato.

Il Timer del tipo SFB4 e' un timer locale e viene usato solo nel FB in questione.

Ma attenzione, all'inizio ho provato a far funzionare il tutto con il programma SIMPLC, la simulazione del plc su pc, ma c'e' un bug (io ho la versione V5.3 + SP3). Una volta scaricato il programma anti-bug il tutto ha funzionato.

Grazie a tutti

Link al commento
Condividi su altri siti

Mi inserisco nella discussione, perchè non ho mai utilizzato SFB4 e non capisco bene una cosa: lo posso dichiarare come una variabile STAT di un DB di istanza e fin qui va bene. Comunque, al richiamo di SFB4 all'interno del blocco, dovrò assegnarli un suo DB di istanza, che non c'entra nulla col DB di istanza nel quale il timer è dichiarato, o no? Qual'è quindi l'utilità di TON? TravelMen dice che è

un timer costruito apposta per lavorare all'interno di FB con DB di istanza
: ma perchè deve esistere un timer specifico per FB con DB di istanza?

Grazie

Link al commento
Condividi su altri siti

No, quando chiami l' SFB4 all'interno del FB non devi assegnare nessun DB di istanza, solo 2 parametri d'entrata e 2 di uscita. Quindi puoi chiamare il SFB4 ogni volta che hai bisogno di un timer, ogni volta devi solo aggiungere i suoi parametri.

Link al commento
Condividi su altri siti

Avevo già provato, ma mi chiede sempre il DB di istanza. Faccio così:

-dichiaro SFB4 come variabile STAT e lui mi inserisce automaticamente il nome "ton"

-nel codice scrivo "call ton" o "call sfb4"

- premo enter e me lo segna in rosso e mi dice che l'FB necessita di un Db di istanza

Cosa sbaglio?

Link al commento
Condividi su altri siti

Matteo Montanari

esempio di codice AWL Siemens (copialo nella cartella sorgenti e compila):

FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1


VAR_INPUT
  start_timer_1 : BOOL;    
  start_timer_2 : BOOL;    
  start_timer_3 : BOOL;    
  Time_1 : TIME;    
  Time_2 : TIME;    
  Time_3 : TIME;    
END_VAR
VAR_OUTPUT
  out_timer_1 : BOOL;    
  out_timer_2 : BOOL;    
  out_timer_3 : BOOL;    
END_VAR
VAR
  Instanz1 : SFB 3;    
  Instanz2 : SFB 3;    
  Instanz3 : SFB 3;    
END_VAR
BEGIN
NETWORK
TITLE =

      U     #start_timer_1; 
      =     L      0.0; 
      BLD   103; 
      CALL #Instanz1 (
           IN                       := L      0.0,
           PT                       := #Time_1,
           Q                        := #out_timer_1);

      NOP   0; 
NETWORK
TITLE =

      U     #start_timer_2; 
      =     L      0.0; 
      BLD   103; 
      CALL #Instanz2 (
           IN                       := L      0.0,
           PT                       := #Time_2,
           Q                        := #out_timer_2);

      NOP   0; 
NETWORK
TITLE =

      U     #start_timer_3; 
      =     L      0.0; 
      BLD   103; 
      CALL #Instanz3 (
           IN                       := L      0.0,
           PT                       := #Time_3,
           Q                        := #out_timer_3);

      NOP   0; 
END_FUNCTION_BLOCK

Link al commento
Condividi su altri siti

In questo modo posso avere quanti timer voglio che verranno attribuiti ogni volta che l'FB viene chiamato.

Attenzione che c'è un limite al richiamo di timer all'interno di FB, trovi tutto su i dati utente della CPU, se non ricordo male in una 315-2DP il limite è 11

dichiaro SFB4 come variabile STAT e lui mi inserisce automaticamente il nome "ton"

Attribuendoli un nome es. "pippo"

nel codice scrivo "call ton" o "call sfb4"

no lo devi richiamare come call pippo

Nella finestra delle librerie, troverai il tuo SFB4 sotto la voce "blocchi con multi istanza" se non ricordo male :D

Link al commento
Condividi su altri siti

Scusate,

ma voglio capire bene anche io.... neanche io sono espertissimo...

suppongo di voler creare un FB o FC che mi faccia lampeggiare una gemma. utilizzo le mie procedure per fare la stessa cosa con più gemme richiamando di volta in volta la mia FB con DB istanza diversa (lampada 1, lampada 2, lampada 3, etc.). Nella FB supponiamo di utilizzare due temporizzatori... cosa succede alle istanze? il programma potrebbe non funzionare correttamente o solo un problema di velocità? Cioè i temporizzatori non vengono istanziati? se uso T101 e T102 e istanzio 3 volte la mia FB è come scrivere un programma dove per tre volte si richiamano gli stessi temporizzatori? se sì a cosa servono i temporizzatori <_<

Scusate anticipatamente le domande forse un pò banali

Link al commento
Condividi su altri siti

I timer T101 o T102 (nel tuo esempio) sono timer globali, cioe' che si usano e sono visibili per tutto il programma. Quindi non puoi (anzi, non devi) usarequesti timer se usi delle FB con istanze: ogni volta il timer avra' valore diverso e il programma non funziona.

Usando degli FB con DB di istanza, praticamente crei dei temporizzatori locali che valgono solo per il tuo DB. Nel tuo esempio devi definire 2 timer locali nel FB (STAT), ad esempio T_01 e T_02 del tipo SFB4. In questo modo avrai 2 timer ogni volta che chiami la tua FB con il tuo DB di istanza (lampada1, lampada2, lampadax).

Il timer deve essere un parametro di tipo STAT.

Link al commento
Condividi su altri siti

Cesare Nicola
cosa succede alle istanze? il programma potrebbe non funzionare correttamente o solo un problema di velocità? Cioè i temporizzatori non vengono istanziati? se uso T101 e T102 e istanzio 3 volte la mia FB è come scrivere un programma dove per tre volte si richiamano gli stessi temporizzatori

Non devi usare T101 o Txxx, ma dichiarare nella tabella delle variabile, una variabile (ad esempio MioTimer), di tipo SFB4. Poi, nel codice, richiami "MioTimer" (CALL MioTimer). Così, hai creato un timer che "risiede" nel DB di istanza associato a quell'FB e non c'entra nulla con i timer tradizionali, come T101, ecc. Se richiami più volte lo stesso FB, con diversi DB di istanza, non succede nulla, anzi è proprio quello il vantaggio: puoi avere n timer che possono coesistere, perchè risiedono in differenti DB. Almeno credo di aver capito così. fai una prova col sorgente postato da KEOSMM e vedrai subito cosa succede.

Ciao

Link al commento
Condividi su altri siti

...aggiungo... con la SFB 4!?

La SFB3, usata in precedenza, mi sembra di capire dalla guida on-line che serve per generare degli impulsi...

spero di aver capito...

Link al commento
Condividi su altri siti

Matteo Montanari
ca..o allora devo modificarmi tutti i Temporizzatori S_EVERZ usati come ritardo all'inserzione nella FB!!! o sbaglio?

dipende da quello che vuoi fare.

...aggiungo... con la SFB 4!?

La SFB3, usata in precedenza, mi sembra di capire dalla guida on-line che serve per generare degli impulsi...

nell'esempio è utilizzato SFB3 ma puoi utilizzare qualsiasi altro blocco, non solo SFB ma anche FB...

Link al commento
Condividi su altri siti

Ho realizzato dei ritardi all'inserzione per comandare motori e valvole di un compressore. Ad esempio apro la EV olio e attendo 1 secondo poi inizio parzializzazione... cose di questo genere. Tutte nella stessa FB.

cosa vuoi dire con

nell'esempio è utilizzato SFB3 ma puoi utilizzare qualsiasi altro blocco, non solo SFB ma anche FB...

grazie.

Link al commento
Condividi su altri siti

Matteo Montanari

dove dichiari:

VAR
  Instanz1 : SFB 3;    
  Instanz2 : SFB 3;    
  Instanz3 : SFB 3;    
END_VAR
puoi dichiarare quello che vuoi (SFB, FB, FC) a seconda di quello che devi realizzare... chiaramente quando lo richiami:
      CALL #Instanz1 (
           IN                       := L      0.0,
           PT                       := #Time_1,
           Q                        := #out_timer_1);

avrai risultati e dati diversi.

------

ritornando al tuo "problema"

puoi sostituire tutti i timer "normali" utilizzando SFB3, o SFB4 o altro, a tuo piacimento.

il mio consiglio è quello di prendere il codice, copiarlo, compilarlo ed effettuare delle prove, in questo modo capisci il funzionamento e di conseguenza puoi modificare il blocco per renderlo adatto alle tue esigenze.

Link al commento
Condividi su altri siti

come pensavo :blink:

...scusa se insisto ma allora i temporazzitaori e i generatori di impulsi standard dove è opprtuno utilizzarli? solo nei blocchi organizzativi che non vengono istanziati?

Grazie

Link al commento
Condividi su altri siti

Matteo Montanari
ma allora i temporazzitaori e i generatori di impulsi standard dove è opprtuno utilizzarli?

nella cpu hai a disposizone 128 (o 256) timer, questi timer devono avere una sola "bobina" di comando.

utilizzare una funzione con timer di sistema (SFC per interderci) non sei limitato dal numero di timer.

chiarmante puoi sfruttare l'uno o altro sistema.

il tutto dipende da cosa devi realizzare, e quanto semplice (o complesso) lo vuoi rendere.

Link al commento
Condividi su altri siti

  • 6 months later...

Ciao a tutti,

riapro la discussione perchè mi sto cimentando con le teorie esposte nei post precedenti e, nello sviluppo del software, mi stanno sorgendo altre domande. Parto con una breve descrizione...

Sto costruendo una FB per pilotare un compressore, qs. viene parzializzato con degli impulsi. La FB deve essere replicata tante volte quanti sono i compressori x cui ho eliminato tutti i TON globali e ho realizzato una FB a parte per la generazione di impulsi che utilizza la SFB3 e SFB4. La FB chiamata Pulse_GEN viene richiamata nella FB Compressore. Ecco le domande:

1) Devo istanziare all'interno della FB compressore più volte la FB Pulse_GEN, quindi ho dichiarato la Pulse_GEN come variabile STAT e la utilizzo spudoratamente (sena appoggiarmi a DB di istanza) nella FB Compressore.... E' giusto operare così, oppure devo dichiarare tante varibili STAT, basate sulla FB Pulse_GEN, quante sono le istanze da utilizzare all'interno della FB Compressore.??? :unsure:

2) Nella FB Compressore devo generare dei ritardi all'inserzione e quindi, non volendo utilizzare temporizzatori globali, uso la SFB4 come variabile STAT rinominata Ritardo. Ritardo viene richiamata più volte con valori sempre diversi di Tempo per l'ingresso PT. Ad es. 3 sec. per la Pompa_olio, 5 sec. per la EV_olio etc. E' giusto operare così o bisogna dichiarare più variabili STAT per es. Ritardo_EV_Olio, Ritardo_Pompa_Olio, etc.??? :huh:

3) Il discorso Vale anche x i contatori? mi spiego meglio... se nella FB Compressore devo utilizzare un contatore cosa sucederà alle istanze? :blink:

Grazie anticipatamente a tutti

Link al commento
Condividi su altri siti

Matteo Montanari

io creerei (anzi creo) un "blocchetto" di dati per ogni temporizzatore, in questo modo non "confondi" le idee ed i tempi, diventerà solamente più lunga la DB di istanza ma al finale sono solamente 3 dati ogni timer. stessa cosa per i contatori

Modificato: da Matteo Montanari
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...