Vai al contenuto
PLC Forum


Problema Timers S7 Tia 13


Messaggi consigliati

Inserito:

Buon giorno,

mi sono imbattuto oggi in un problema o presunto tale sui timer in TIA 13.

La mia necessità è quella di avere un impulso ogni x ms per aggiornare un buffer di valori. I'intervallo di tempo tra ogni impulso è impostabile da OP ma siamo sempre attorno ai ms.

Ho riscontrato un errato conteggio da parte dei timers, nel senso che sembrerebbe che sbaglino a contare con tempi cosi ridotti.

il timer è gestito in questo modo (ogni 50ms dovrebbe generare un impulso su M970.1):

A %M970.0
L s5t#50ms
SD %T6
A %T6
= %M970.1
AN %T6
= %M970.0
La riprova che ho effettuato è la seguente ( con 1 impulso ogno 50mS; in 10 secondi dovrei avere 200 impulsi) :
A %M970.1 //impulso ogni 50ms
A %M922.0 // bit che attiva il timer di 10s
AN %T5
JCN m01
L %MW920 //contatore che incrementa ogni impulso
L 1
+I
T %MW920
m01: NOP 0
A %M922.0
L s5t#10s
SD %T5

In realtà ne conto circa 130 impulsi, se effettuo la stessa prova con impulsi da 100mS, ne conto 77 anzichè 100.

Qualcuno ha una spiegazione? sbaglio qualcosa??

Grazie

Simo


Inserita:

Domanda banale non è che nella esecuzione della tempistica degli impulsi influisce anche la durata dell'impulso stesso nel conteggio finale del tempo totale degli impulsi

Inserita:

ogni x millisecondi ...prima cosa devi considerare il tempo ciclo della cpu perche se il programma gira a 10 mS te li scordi gli impulsi ogni 1 o 2 o 3 ...o 9 o 10 mS ....

Per avere un impulso da timer , impulso asincrono , devi fare cosi:

- Se non hai il timer attivo lo attivi con la sua stessa uscita .Quando passa il tempo impostato il timer mette a 1 la sua uscita e di conseguenza smette di contare per un ciclo nel quale si resetta .Il ciclo successivo ricomincia a contare

UN timer1

SE timer2

.....

Inserita:

Buon giorno,

niente da fare, anche usando il metodo consigliato da walter, con timer impostato a 100ms leggo 82 impulsi anzichè 100.

SImo

Inserita:

I normali timer non sono precisi.Se vuoi il massimo della precisione devi attivare un interrupt a tempo (schedulazione orologio) in configurazione HW. Ogni x ms è eseguito OB35 per un ciclo. ad ogni esecuzione fai aumentere di 1 il contenuto di una word mediante una istruzione di addizione. Inserisci una comparazione che ti mette ON un bit che divente il bit ritardato. Ciao

Inserita:

infatti sono timer asincroni

Per avere temporizzazioni precise e sicure devi attivare l'interrupt a tempo

Inserita:

niente da fare, anche usando il metodo consigliato da walter, con timer impostato a 100ms leggo 82 impulsi anzichè 100.

Walter non ti ha mica detto che con un tempo di 100 ms avresti risolto il problema.

Cito:

e di conseguenza smette di contare per un ciclo nel quale si resetta .Il ciclo successivo ricomincia a contare

Questo significa che avrai sempre una scansione persa. E non si tratta di un "problema dei timer Siemens", ma di un comportamento assolutamente normale anche con altre marche.

Potresti fare un tentativo utilizzando le istruzioni Reset Timer e Abilita temporizzatore.

Esempio:

      U     T     10
      =     M     20.0
      R     T     10
      FR    T     10

      SET   
      L     S5T#100MS
      SE    T     10

In questo modo il timer non rimane inattivo per tutta una scansione, ma solo per il tempo tra le istruzioni "R" e "SE", ovvero per un tempo che, nel caso di una CPU lenta, si potrebbe valutare nell'ordine di qualche microsecondo.

Comunque, se hai bisogno di precisione, come ti hanno già suggerito, devi utilizzare gli interrupt a tempo.

Inserita:

col metodo di batta puoi recuperare qualche colpo ma non raggiungi lo stesso il target prefissato

Usare interrupt a tempo e ricorda che quando ne usi piu di uno , interrupt a tempo , se vuoi fare le cose fatte bene devi considerare la somma dei tempi di tutte le istruzioni in ogni interrupt ed ottimizzare il tutto

E se hai rami di scelta allora le cose si complicano perche devi prevedere i tempi nei diversi casi di flusso logico eseguito

Inserita:

Ciao e grazie a tutti.

già lo scorso venerdì avevo risolto ma non ho avuto tempo di riferire e ringraziare.

Come suggerito ho usato un interrupt a tempo e tutto sembra funzionare.

grazie ancora.

Simo

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