Alle 200ms einen Wert aufzeichnen
26.08.2005 11:45:44
michael
ich stehe vor dem Problem alle 200ms über einen DDE-Server Werte auszulesen und in Excel mit Zeit und Wert zu protokollieren.
In VB gibt es über die Funktion Timer die Möglichkeit alle 200ms (vielleicht auch noch kürzer) einen Wert aufzuzeichnen. Sowas hab ich zumindest mal in einem Bsp gesehen. Jedoch hab ich kein VB und schon gar nicht eine Ahnung davon...
Gibt es diese Möglichkeit mit VBA in Excel?
Ich habe 3 Lösungsansätze probiert.
1) mit Sleep, da wartet die Schleife 200ms und ließt anschließend die Werte aus. Leider wird die Loop nicht immer in gleichen Zeiten durchlaufen, sodaß ich einen bestimmten Wert (z.B. 10ms) abziehen könnte. Nach ca. 30 min summieren sich die Laufzeitunterschiede zu einer deutlichen Abweichung auf.
Private Declare <pre>
Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
.
.
.
sngStart = Timer
n = 0 'Schleifenzähler
Do
n = n + 1
Sleep 197 '200 'Zeit in msec
... Werte lesen und schreiben...
Loop While n <= 9000
1b) ich habe dann versucht, jeweils die Zeit für einen Schleifendurchlauf zu ermitteln, die dann mit Sleep 200 - Dauer abgezogen wird, um die jeweiligen Laufzeitunterschiede auszugleichen. Geht leider auch nur bedingt, da mittlerweile der eigentliche Abfrageprozess schneller abläuft als die drumrum gestrickten Abfragen zur
Laufzeitermittlung ...
2) dann versuchte ich vor dem AUfruf, der die Werte liest und schreibt, eine "Warteschleife" zu kreieren...
.
.
.
sngStart = Timer
n = 0 'Schleifenzähler
Do
n = n + 1
Do Until Timer >= sngStart + n * 0.2 'statt Sleep - puffert Laufzeitunterschiede der Loop
If Timer >= sngStart + n * 0.2 Then Exit Do
Loop
... Werte lesen und schreiben...
Loop While n <= 9000
nur bremst mir die Do Until Loop den Rechner so aus, dass er überhaupt nicht mehr mit dem DDE-Server (Werte auslesen) kommuniziert. Ich sehe zwar, dass mir schon alle 200ms ein Wert geschieben wird, der ist leider 0, da nichts mehr ausgelesen wird...
3) Application.OnTime - nur kann ich hier (lt. Bsp in der Hilfe) nur Intervalle >=1sec realisieren. Kann man durch zusätzliche Deklarationen ähnlichem dem Sleep oben, in den 200msec-Bereich vordringen?
<pre>
Sub CommandButton1_Click()
...
...
...
sngStart = Timer
n = 0 'Schleifenzähler
Call TimerStart
End Sub</pre>
<pre>
Sub TimerStart()
n = n + 1
NextTime = sngStart + n * 0.2
Applikation.OnTime earliesttime:=NextTime, procedure:="LogStart", schedule:=True
End Sub</pre>
<pre>
Sub LogStart()
... Werte einlesen...
If n <= 9000 Then Call TimerStart Else Exit Sub
p = n 'Übergabewert zw. Start- und Stopschleife
End Sub</pre>
Ich bin für jeden Tip dankbar!
Viele Grüße und Dank im voraus
Michael