sibo78 Inserito: 2 luglio 2015 Segnala Inserito: 2 luglio 2015 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
leleviola Inserita: 2 luglio 2015 Segnala Inserita: 2 luglio 2015 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
walterword Inserita: 2 luglio 2015 Segnala Inserita: 2 luglio 2015 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 .....
sibo78 Inserita: 3 luglio 2015 Autore Segnala Inserita: 3 luglio 2015 Buon giorno, niente da fare, anche usando il metodo consigliato da walter, con timer impostato a 100ms leggo 82 impulsi anzichè 100. SImo
amed Inserita: 3 luglio 2015 Segnala Inserita: 3 luglio 2015 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
walterword Inserita: 3 luglio 2015 Segnala Inserita: 3 luglio 2015 infatti sono timer asincroni Per avere temporizzazioni precise e sicure devi attivare l'interrupt a tempo
batta Inserita: 3 luglio 2015 Segnala Inserita: 3 luglio 2015 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.
walterword Inserita: 4 luglio 2015 Segnala Inserita: 4 luglio 2015 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
sibo78 Inserita: 6 luglio 2015 Autore Segnala Inserita: 6 luglio 2015 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
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