PDA

Visualizza versione completa : timer


problema
08-07-2004, 13.16.16
Salve
Sto cercando di far girare una routine una sola volta.
Mi spiego meglio:

Private Sub Timer1_OnTimer()
If Toggle1.Value = True Then
Windows("uscite.xls").Activate

Range("B16") = 1 + Range("B16")
Range("b45") = 1 + Range("b45")
Range("A52") = 1 + Range("A52")
Application.Goto Reference:="uscita1"
'Selection.PrintOut Copies:=1, Collate:=True
Range("b17").Select
Selection.Copy
Range("e52").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Timer1.Interval = 0
Range("a4").Select
Application.Run "uscite.xls!spostadati"

End If


End Sub

Adesso uso un secondo timer per riattivare il primo.
Come posso far fare una sola scansione col primo timer?????

LoryOne
08-07-2004, 14.45.25
Cioè ?
L'evento OnTimer() viene comunque generato purchè sia abilitato il controllo timer ogni x millisecondi (proprietà interval).
Il tutto funziona se Toggle1.Value = True, altrimenti nisba.

LoryOne
08-07-2004, 15.03.07
Supponiamo che dopo 5 secondi dall'avvio del conteggio mi debba apparire 1 sola volta nella finestra di debug questa stringa: "Ciao Mondo"

Per prima cosa inserirò un controllo timer e specificherò la proprietà interval su 1000 (1000 millisecondi=1 secondo)
Poi abiliterò il controllo: timer.enabled=true
Da questo momento il timer comincerà a contare ed ogni secondo genererà l'evento OnTimer().

Sarà qui dentro che dovrò scrivere il codice per far apparire la stringa ma dovrò far attenzione di aver raggiunto il 5° secondo dopo l'avvio del conteggio.
Come fare ?
Si può utilizzare una variabile che verrà incrementata ogni secondo.

Se definisco la variabile con Dim, ogni volta che l'evento verrà generato, il valore della variabile verrà azzerato ogni volta che ssarà generato l'evento.
Se però tale variabile verrà definita come Static, essa manterrà il valore precedente ogni volta che verrà generato l'evento.

Es:
Private Sub Timer1_OnTimer()
Static i As byte

i=i+1
If i=5 then
debug.print "Ciao Mondo"
Timer1.enabled=False ' non verrà più generato l'evento onTimer.
End If
End Sub

problema
09-07-2004, 07.38.14
Si come disabilitarlo in fondo alla Sub ci sono riuscito.
Il problema è come posso poi riattivarlo senza dovere usare un secondo timer.

in pratica io ho un segnale che intercetto con il timer 1,
Questo segnale dura un po di tempo(variabile), in questo periodo io devo far partire la mia routine " es. stampo un foglio" ma solo una sola volta.Mentre con il timer ne stampo uno ogni ciclo di timer.
Come faccio ??????
Grazie ancora

LoryOne
09-07-2004, 08.27.00
Si come disabilitarlo in fondo alla Sub ci sono riuscito.
Il problema è come posso poi riattivarlo senza dovere usare un secondo timer.

Non hai bisogno di un secondo timer.
Devi agire semplicemente sulla proprietà interval ed abilitare/disabilitare il conteggio con timer.enabled=[true][false]

Se il conteggio non deve più avvenire durante una certa operazione dovrai disabilitare il conteggio per poi riabilitarlo ad operazione conclusa.

Cio che mi lascia perplesso è cosa intendi con:
"Questo segnale dura un po di tempo(variabile)"
Variabile in base a cosa ?

LoryOne
09-07-2004, 08.34.12
La proprietà Interval è Get Let quindi sia impostabile che leggibile.
Quel'è il problema problema ? :rolleyes:

LoryOne
09-07-2004, 08.53.23
Dim t1 As Byte

Private Sub Form_Load()
t1 = 5
End Sub

Private Sub Timer1_Timer()
Static t As Byte

t = t + 1
Debug.Print "Secondo " & t
If t1 = t Then
Timer1.Enabled = False
t = 0
Debug.Print "Sono trascorsi " & t1 & " secondi"
Select Case t1
Case 5: t1 = 10
Case 10: t1 = 15
Case 15: t1 = 5
End Select
Debug.Print "La prossima visualizzazione tra " & t1; " secondi..."
Timer1.Enabled = True
End If
End Sub


Non so se ho reso l'idea
Ps: E' in VB non in VBA ma non cambia nulla.

problema
09-07-2004, 13.10.20
Grazie Loryone
Questo mio tentativo di programma è di cercare di sfruttare alcuni segnali che mi provengono da un PLC di una macchina.
I segnali che mi arrivano sono dati da dei microinterruttori posti in varie zone, quindi il loro funzionamento è molto variabile,per quello che i segnali non sono sempre con gli stessi tempi.
Comunque vorrei chiederti un piccolo favore se hai tempo e voglia.
Con un timer riesco a controllare più di un "segnale",perche io con più timer mi funzionava ma ora che ne uso solo uno mi va in tilt puoi dargli un occhio??? Grazie
Private Sub Timer1_OnTimer()
If Toggle1.Value = True Then
Windows("uscite.xls").Activate

Range("B16") = 1 + Range("B16")
Range("b45") = 1 + Range("b45")
Range("A52") = 1 + Range("A52")
Application.Goto Reference:="uscita1"
'Selection.PrintOut Copies:=1, Collate:=True
Range("b17").Select
Selection.Copy
Range("e52").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Timer1.Interval = 0
Range("a4").Select
Application.Run "uscite.xls!spostadati"
End If








If Toggle2.Value = True Then
Windows("uscite.xls").Activate
Range("C16") = 1 + Range("C16")
Range("b45") = 1 + Range("b45")
Range("A52") = 1 + Range("A52")
Application.Goto Reference:="uscita2"
'Selection.PrintOut Copies:=1, Collate:=True
Range("C17").Select
Selection.Copy
Range("e52").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False


Timer1.Interval = 0
Application.Run "uscite.xls!spostadati"
Range("a4").Select
End If
If Toggle3.Value = True Then
Windows("uscite.xls").Activate
Range("D16") = 1 + Range("D16")
Range("b45") = 1 + Range("b45")
Range("A52") = 1 + Range("A52")
Application.Goto Reference:="uscita3"
'Selection.PrintOut Copies:=1, Collate:=True
Range("d17").Select
Selection.Copy
Range("e52").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False

Timer1.Interval = 0
Application.Run "uscite.xls!spostadati"
Range("a4").Select

End If
If Toggle4.Value = True Then
Windows("uscite.xls").Activate
Range("E16") = 1 + Range("E16")
Range("b45") = 1 + Range("b45")
Range("A52") = 1 + Range("A52")
Application.Goto Reference:="uscita4"
'Selection.PrintOut Copies:=1, Collate:=True
Range("e17").Select
Selection.Copy

Range("e52").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False

Timer1.Interval = 0
Application.Run "uscite.xls!spostadati"
Range("a4").Select

End If
If Toggle5.Value = True Then
Windows("uscite.xls").Activate
Range("F16") = 1 + Range("F16")
Range("b45") = 1 + Range("b45")
Range("A52") = 1 + Range("A52")
Application.Goto Reference:="uscita5"
'Selection.PrintOut Copies:=1, Collate:=True
Range("f17").Select
Selection.Copy
Range("e52").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False

Timer1.Interval = 0
Application.Run "uscite.xls!spostadati"

Range("a4").Select
End If
If Toggle6.Value = True Then
Windows("uscite.xls").Activate

Range("G16") = 1 + Range("G16")
Range("b45") = 1 + Range("b45")
Range("A52") = 1 + Range("A52")
Application.Goto Reference:="uscita6"
'Selection.PrintOut Copies:=1, Collate:=True
Range("g17").Select
Selection.Copy
Range("e52").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False

Timer1.Interval = 0
Application.Run "uscite.xls!spostadati"
Range("a4").Select

End If
If Toggle7.Value = True Then
Windows("uscite.xls").Activate

Range("H16") = 1 + Range("H16")
Range("b45") = 1 + Range("b45")
Range("A52") = 1 + Range("A52")
Application.Goto Reference:="uscita7"
'Selection.PrintOut Copies:=1, Collate:=True
Range("h17").Select
Selection.Copy
Range("e52").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False

Timer1.Interval = 0
Application.Run "uscite.xls!spostadati"
Range("a4").Select
End If
If Toggle8.Value = True Then
Windows("uscite.xls").Activate

Range("I16") = 1 + Range("I16")
Range("b45") = 1 + Range("b45")
Range("A52") = 1 + Range("A52")
Application.Goto Reference:="uscita8"
'Selection.PrintOut Copies:=1, Collate:=True
Range("i17").Select
Selection.Copy
Range("e52").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False

Timer1.Interval = 0
Application.Run "uscite.xls!spostadati"

Range("a4").Select
End If
If Toggle9.Value = True Then
Windows("uscite.xls").Activate

Range("J16") = 1 + Range("J16")
Range("b45") = 1 + Range("b45")
Range("A52") = 1 + Range("A52")
Application.Goto Reference:="uscita9"
'Selection.PrintOut Copies:=1, Collate:=True
Range("j17").Select
Selection.Copy
Range("e52").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False

Timer1.Interval = 0
Application.Run "uscite.xls!spostadati"
Range("a4").Select

End If
If Toggle10.Value = True Then
Timer1.Interval = 0
Windows("uscite.xls").Activate

Range("K16") = 1 + Range("K16")
Range("b45") = 1 + Range("b45")
Range("A52") = 1 + Range("A52")
Application.Goto Reference:="uscita10"
'Selection.PrintOut Copies:=1, Collate:=True
Range("k17").Select
Selection.Copy
Range("e52").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False


Application.Run "uscite.xls!spostadati"

Range("a4").Select

End If

End Sub
Grazie ancora:)

LoryOne
09-07-2004, 13.57.04
Allora,faccio le prime considerazioni:
Ti chiedo solo di seguire questo 3d e di darmi una conferma in base a cosa leggo dal codice che mi hai postato per farmi capire se ho compreso bene il tuo problema.

Considerazione 1:
Vi è un solo controllo timer.
Questo implica che vi sia un unico evento chiamato OnTimer() che viene generato ciclicamente in base alle impostazioni impartite dalla proprietà Interval del controllo stesso.

Considerazione 2:
All'interno dell'evento OnTimer() vi è una serie di operazioni che vengono compiute o meno in base ad un flag identificato dalla proprietà enabled di diversi controlli chiamati Toggle1,Toggle2,...Toggle[n].
L'esecuzione delle procedure è quindi legata indissolubilmente al valore di tale flag, tant'è che tutte vengono valutate con cadenza specificata dalla proprietà Interval.

Considerazione 3
All'interno del blocco If ... End If c'è la presenza dell'istruzione Timer1.Interval=0.
Tale istruzione non interrompe immediatamente il conteggio ma entrerà in azione subito dopo la valutazione dell'intera sequenza di istruzioni contenute nell'evento OnTimer().
Così facendo non sarà il conteggio ad essere disabilitato, bensì la cadenza con la quale verrà generato l'evento in questione

problema
09-07-2004, 17.57.01
Meno male che ci sei.
Si è proprio come dici nella "considerazione 3",il conteggio non si interrompe ed io mi ritrovo non con una unica azione compiuta ma bensi con diverse.
Hai maniera di fermare questa azione????


Nella "Considerazione 2" i controlli non cadono uno in seguito ad un altro ma sono random,ci può essere toggle 2 e poi ci può essre toggle 5 e così via.

Grazie ancora LoryOne:)

LoryOne
10-07-2004, 11.21.06
Poco importa se i vari Toggle sono comandati random.
Il problema è che avendo un solo controllo timer, attraverso le proprietà Enabled ed Interval del controllo stesso, tu non fai altro che abilitare o disabilitare il conteggio ed impartire la cadenza con la quale viene generato l'evento OnTimer().
Tutto il codice all'interno della procedura [Timer1_OnTimer()...End Sub] verrà valutato in toto e sequenzialmente dall'inizio fino alla fine.
Questo significa che qualunque modifica alle proprietà Enabled o Interval entrerà in azione non appena il flusso delle istruzioni avrà raggiunto End Sub.

L'intervallo di tempo da monitorare (a quanto ho capito) è random ed influenza in modo univoco i Toggle, tanto da interrompersi singolarmente qualora la proprietà Enabled del Toggle interessato risultasse True.

In altre parole, tu devi generare un evento per ogni Toggle, ergo un controllo Timer per ogni Toggle come avevi fatto prima.

problema
19-07-2004, 13.33.02
Ho provato a usare un timer per ogni "toggle" per funzionare funziona è che dopo pochi minuti di lavoro il computer mi dice che ho finito tutta la memoria e si blocca tutto.
Sono andato a vedere le risorse che uso durante questo programa e sono sfruttate al massimo con più timer.
Devo trovare un'altra strada.
Intanto grazie ancora.
:(