Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
660to664
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
660to664
660to664
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Erfahrung mit TimerControl von Thomas Risi?

Erfahrung mit TimerControl von Thomas Risi?
01.09.2005 09:53:06
Thomas
Hallo,
hat jemand Erfahrung mit dem TimerControl von Thomas Risi?
Dort steht:
TimerControl
Downloads TimerControl OCX
Hinweis zum Download: Wenn Sie obigen Link aktivieren, wird ein Installationsvorgang gestartet, der alle erforderlichen Dateien auf Ihrem System installiert.
Verwendet wird hierbei die Windows Installer - Technologie von Microsoft. Sie können die Datei Setup.exe öffnen, und die Installation beginnt sofort. Sie können die Datei aber auch zuerst auf Ihrem Rechner speichern, und dann erst starten, aber die Internet-Verbindung muß geöffnet bleiben, da das eigentliche Installationspaket geladen werden muß.
Dieser Installationsvorgang bricht bei mir ab! Fehlende *.msi auf der Seite von Thomas Risi.
Wenn Sie nur das Control (OCX) downloaden benötigen Sie die VB6-Laufzeitbibliotheken.
Das Control (OCX) ist in einer Zip-Datei das andere hab ich von MS.
Jedoch wie krieg ich nun das Steuerelement/Control (OCX-Datei) auf meinen Rechner? Wo muss ich die Speichern oder gibt es dafür eine Installationsroutine? Ich kopierte die Datei nach C:\WINDOWS\system32 dort scheint sie wohl nicht hinzugehören, da das Bsp-Makro von Thomas Risi bei mir auch immer TimerControl1 - Fehler beim Kompilieren: Variable nicht definiert meldet.
Wie kann ich die besagte rtctl.ocx in das System einbinden?

Danke, Viele Grüße
Michael

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Erfahrung mit TimerControl von Thomas Risi?
02.09.2005 18:07:35
Thomas
Hallo Michael,
ich habe keine Erfahrung damit gesammelt, weil ich Timer per API selber schreibe. Sag mir ein konkretes Problem, dann bekommst du von mir ein Beispiel.
Gruß
Nepumuk
Excel & VBA – Beispiele
AW: Erfahrung mit TimerControl von Thomas Risi?
05.09.2005 14:03:10
Thomas
Hallo Nepumuk,
danke für dein Angebot, ich war das WOE nicht online, deshalb erst heute meine Antwort.
Nun ich möchte alle 200msec 2 Messwerte auslesen.
Dazu wird in die 1. Spalte die Zeit (Versuchsdauer), in die 2. und 3. Spalte der Messwert über eine DDE-Server-Verbindung ausgelesen. Das Macro steht unter Sheet1(Sheet1).
Im Macro nach
'Timerfunktion und Datalogging Start - Ende
bzw.
'Timerfunktion und Datalogging Nachlauf
ist mein Problem zu finden.
Hier das Macro:
In diesem hab ich eine Loop geschrieben, die 200 msec durch den sleep-Befehl anhält.
So erhalte ich ca. alle 200 msec einen Messwert...
Diesen "Sleep-Teil" hoffe ich nun in eine vernünftige "TimerControl" umzuwandeln, die ungeachtet irgendwelcher Laufzeitunterschiede der Loop, alle 200msec die DDE-Werte ausließt. Insgesamt läuft die 1. Loop 30 min (das ist variabel) und geht dann in die 2. Loop über. (Die 1.Loop protokolliert den Anstieg 0 -&gt Soll-/Istwert und den gesamten Versuchsverlauf, die 2. Loop das Abklingverhalten von Soll-/Istwert -&gt 0).
Toll wäre wenn ich die Zeitintervalle irgendwo vorgeben könnte, um sie ggf. dem Meßvorhaben anpassen zu können.
Option Explicit
Private Declare Sub Sleep Lib "kernel32.dll" ( _
ByVal dwMilliseconds As Long)
&ltpre&gt
Private Sub CommandButton1_Click()

Dim sngStart As Single
Dim n As Integer 'Timerschleife'Integer -32.768 bis 32.767 oder Long -2.147.483.648 bis 2.147.483.647
Dim m As Integer 'Startschleife
Dim o As Integer 'Stopschleife
Dim p As Integer 'Übergabewert zw. Start- und Stopschleife
'Dim Wb1 As String '1=FlowDDE
'Dim Sh1 As String
'Dim Wb1Sh1 As String
'Dim Wb1Sh1 As Worksheet
'Dim Wb2 As String '2=Datalog
'Dim Sh2 As String
'Dim Wb2Sh1 As Worksheet
Dim gcf As Single 'double 'GasCorrectionFactor Single:von -3,402823E38 bis -1,401298E-45 für negative Werte und von 1,401298E-45 bis 3,402823E38 für positive Werte Double: -1,79769313486231E308 bis -4,94065645841247E-324 für negative Werte und von 4,94065645841247E-324 bis 1,79769313486232E308 für positive Werte
Dim dde1 As Long 'Integer 'max.Fluß DDE1
Dim dde2 As Long 'Integer 'max.Fluß DDE2
Dim channelNumber1, channelNumber2 'As Variant




'Wb1 = ActiveWorkbook.Name
'Sh1 = ActiveSheet.Name
'Wb1Sh1 = "Workbooks(" & Wb1 & ").Worksheets(" & Sh1 & ")"
''Set Wb1Sh1 = "Workbooks(" & Wb1 & ").Worksheets(" & Sh1 & ")"

gcf = Range("M1")
dde1 = Range("B1")
dde2 = Range("B8")

'Workbooks.Add 'muß vor dem Ventilöffnen stehen!! Sonst könnte das Ventil offen sein und es erfolgt eine Fehlermeldung ...
'ActiveWorkbook.SaveAs Filename:="E:\_Log.xls"
'Wb2 = ActiveWorkbook.Name
'Sh2 = ActiveSheet.Name
'Set Wb2Sh1 = Workbooks("_Log.xls").Worksheets("Tabelle1")

''Workbooks("_Log.xls").Worksheets("Tabelle1").Range("A1") = "Zeit"
Range("P1") = "Zeit"
Range("Q1") = "Ch1 (Split)"
Range("R1") = "Ch2 (Carbo)"
Range("P1:R1").Select
Selection.Font.Bold = True
Selection.HorizontalAlignment = xlCenter
'Windows(Wb1).Activate 'Flowdde and Excel_1&2-stop_loop_link_.xls
'Windows.Arrange ArrangeStyle:=xlVertical
'ActiveWindow.ScrollColumn = 2
''Windows(Wb2).Activate
''Windows(Wb1).Activate
''Windows(Wb2).Activate
'Open DDE-link
m = 0 'Schleifenzähler Start
Range("E28") = m

channelNumber1 = Application.DDEInitiate(app:="FLOWDDE", topic:="C(1)")
channelNumber2 = Application.DDEInitiate(app:="FLOWDDE2", topic:="C(1)")


'Write Setpoint Start
Do
If m = 10 Then Exit Do 'verhindert Endlosloop
m = m + 1

'DDE 1
DDEPoke channelNumber1, "P(9)", (Sheets(1).Cells(4, 2))
Sheets(1).Cells(4, 3) = DDERequest(channelNumber1, "P(9)")
'DDE 2
DDEPoke channelNumber2, "P(9)", (Sheets(1).Cells(11, 2))
Sheets(1).Cells(11, 3) = DDERequest(channelNumber2, "P(9)")
Loop While ((Sheets(1).Cells(4, 2).Value) &lt&gt (Sheets(1).Cells(4, 3).Value)) And ((Sheets(1).Cells(11, 2).Value) &lt&gt (Sheets(1).Cells(11, 3).Value))

Range("E28") = m

'Timerfunktion und Datalogging Start - Ende
'Windows("_Log.xls").Activate 'Windows(Wb2).Activate oder gar überflüssig, da activate allein nicht reicht, um die Daten nach _Log.xls zu schreiben
sngStart = Timer
n = 0 'Schleifenzähler

Do
n = n + 1
Sleep 197 '200 'Zeit in msec

With Cells(n + 1, 16)
.NumberFormat = "[hh]:mm:ss.000"
.Value = (Timer - sngStart) / 86400
End With

'DDE 1
Cells(n + 1, 17) = DDERequest(channelNumber1, "P(8)") * dde1 * gcf / 320 * 100
'DDE 2
Cells(n + 1, 18) = DDERequest(channelNumber2, "P(8)") * dde2 * gcf / 320 * 100

'Loop While n &lt= 9000 '9000 = 30 min bei einem 200ms Intervall
Loop While Timer &lt (sngStart + 9000 * 0.2) '1/5
p = n 'Übergabewert zw. Start- und Stopschleife

'Stop
'Windows(Wb1).Activate 'Flowdde and Excel_1&2-stop_loop_link_.xls
o = 0 'Schleifenzähler Stop
Range("E29") = o

'Write Setpoint Stop
Do
If o = 10 Then Exit Do 'verhindert Endlosloop
o = o + 1
'DDE 1
DDEPoke channelNumber1, "P(9)", (Sheets(1).Cells(33, 2))
Sheets(1).Cells(4, 3) = DDERequest(channelNumber1, "P(9)")
'DDE 2
DDEPoke channelNumber2, "P(9)", (Sheets(1).Cells(39, 2))
Sheets(1).Cells(11, 3) = DDERequest(channelNumber2, "P(9)")

Loop While ((Sheets(1).Cells(33, 2).Value) &lt&gt (Sheets(1).Cells(4, 3).Value)) And ((Sheets(1).Cells(39, 2).Value) &lt&gt (Sheets(1).Cells(11, 3).Value))

Range("E29") = o


'Timerfunktion und Datalogging Nachlauf
'Windows("_Log.xls").Activate 'Windows(Wb2).Activate oder gar überflüssig, da activate allein nicht reicht, um die Daten nach _Log.xls zu schreiben

Do
n = n + 1
Sleep 197 '200 'Zeit in msec

With Cells(n + 1, 16)
.NumberFormat = "[hh]:mm:ss.000"
.Value = (Timer - sngStart) / 86400
End With

'DDE 1
Cells(n + 1, 17) = DDERequest(channelNumber1, "P(8)") * dde1 * gcf / 320 * 100
'DDE 2
Cells(n + 1, 18) = DDERequest(channelNumber2, "P(8)") * dde2 * gcf / 320 * 100

'Loop While n &lt= 300 + p '300 = 1 min bei einem 200ms Intervall
Loop While Timer &lt (sngStart + 300 * 0.2) '1/5

Cells(p + 2, 16).Select 'Übergang Stopschleife markieren
With Selection.Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
''ActiveWorkbook.Save

'Close DDE-channel
DDETerminate channelNumber1
DDETerminate channelNumber2


'Windows(Wb1).Activate 'Flowdde and Excel_1&2-stop_loop_link_.xls
End Sub&lt/pre&gt

Danke,
viele Grüße
Michael
P.S. wie lange bleibt dieser Thread aktiv? Ggf. müßte man einen neuen starten?
Anzeige
AW: Erfahrung mit TimerControl von Thomas Risi?
05.09.2005 14:46:43
Thomas
Hallo Michael,
mal ein Beispielcode:
' **********************************************************************
' Modul: Modul4 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private Declare Function KillTimer Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal nIDEvent As Long) As Long
Private Declare Function SetTimer Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal nIDEvent As Long, _
    ByVal uElapse As Long, _
    ByVal lpTimerFunc As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long

Private Const gcClassnameMSExcel = "XLMAIN"

Private lnghWnd As Long

Public Sub prcStart()
    lnghWnd = FindWindow(gcClassnameMSExcel, Application.Caption)
    SetTimer lnghWnd, 0, 200, AddressOf prcTimerStart '200=Millisekunden
End Sub

Public Sub prcStop()
    KillTimer lnghWnd, 0
End Sub

Private Sub prcTimerStart(ByVal hwnd As Long, ByVal nIDEvent As Long, _
        ByVal uElapse As Long, ByVal lpTimerFunc As Long)

    Beep
End Sub

Wenn du die Mailbenachrichtigung aktiviert hast, dann können wir hier weitermachen, so lange wir wollen. Ansonsten, je nach Anzahl der Fragen und Antworten, verschwindet deiser Thread nach ~ 4 Tagen im Archiv, wo keine Antwort mehr möglich ist.
Gruß
Nepumuk
Excel & VBA – Beispiele
Anzeige
AW: Erfahrung mit TimerControl von Thomas Risi?
05.09.2005 15:19:00
Thomas
Hallo Nepumuk,
danke für deine Hilfe.
Nun weiß ich nur nicht wie und wo ich deine Zeilen in mein Macro einfüge bzw die Subs aufrufe.
Hast du ein Bsp. in dem du mit diesem Macro in Zeitintervallen was ausführen ließt?
Danke Michael
PS nach dem ich nicht ganz zu beginn die email benachrichtigung aktiviert habe ist es wohl jetzt zu spät, da ich nun kein entsprechendes Feld mehr sehe...
AW: Erfahrung mit TimerControl von Thomas Risi?
05.09.2005 15:27:11
Thomas
Hallo Michael,
in meinem Beispiel wird alle 200 Millisekunden ein Beep ausgelöst. Starte mal prcStart. Zum anhalten musst du prcStop ausführen.
Gruß
Nepumuk
Excel & VBA – Beispiele
Anzeige
... bin am basteln...
05.09.2005 17:41:08
michael
Hallo Nepumuk,
erst mal danke für den Tip.
Versuchte nun das Beep durch meine Abfragen in der loop zu ersetzen. Hab nun erst mal irgendwie excel abgeschossen irgendwas hab ich da falsch gemacht... Hast du eine Idee?
'Option Explicit
Private Declare Function KillTimer Lib "user32.dll" ( _
ByVal hwnd As Long, _
ByVal nIDEvent As Long) As Long
Private Declare Function SetTimer Lib "user32.dll" ( _
ByVal hwnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Const gcClassnameMSExcel = "XLMAIN"
Private lnghWnd As Long
Public Sub prcStart()
lnghWnd = FindWindow(gcClassnameMSExcel, Application.Caption)
SetTimer lnghWnd, 0, 200, AddressOf prcTimerStart '200=Millisekunden

sngStart = Timer
n = 0 'Schleifenzähler
End Sub&lt/pre&gt
Public Sub prcStop()
KillTimer lnghWnd, 0
End Sub&lt/pre&gt
&ltpre&gt
Private Sub prcTimerStart(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long)

Do
n = n + 1

Zeit1 = Timer
With Cells(n + 1, 16)
.NumberFormat = "[hh]:mm:ss.000"
.Value = (Zeit1 - sngStart) / 86400
End With

'DDE 1
Cells(n + 1, 17) = 10 * n
'DDE 2
Cells(n + 1, 18) = 100 * n
Sleep 100 'zumTesten - simuliert eine gewisse Laufzeit

Loop While n &lt= 9 '9000 = 30 min bei einem 200ms Intervall
'p = n 'Übergabewert zw. Start- und Stopschleife

Call prcStop

End Sub&lt/pre&gt
DAnke,
Grüße
Michael
Anzeige
AW: ... bin am basteln...
05.09.2005 18:33:50
Nepumuk
Hallo Michael,
du hast den Timer noch nicht ganz verstanden. Durch die sleep - Funktion hälst du deine Schleife an. Da hat der Timer beim zweiten Schleifendurchlauf den nächsten Intervall schon gestartet. Dadurch will das Makro zweimal paralell laufen, was unweigerlich zum Absturz führt. Du kammst nach dem starten des Timer nicht mehr in die Routine prcStart zurück, sondern das Makro des Timers wird an die DLL übergeben. So z.B. würde das laufen:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private Declare Function KillTimer Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal nIDEvent As Long) As Long
Private Declare Function SetTimer Lib "user32.dll" ( _
    ByVal hwnd As Long, _
    ByVal nIDEvent As Long, _
    ByVal uElapse As Long, _
    ByVal lpTimerFunc As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long

Private Const gcClassnameMSExcel = "XLMAIN"

Private lnghWnd As Long
Private sngStart As Single
Private intCounter As Integer
Private n As Long

Public Sub prcStart()
    lnghWnd = FindWindow(gcClassnameMSExcel, Application.Caption)
    sngStart = Timer
    n = 0
    SetTimer lnghWnd, 0, 200, AddressOf prcTimerStart '200=Millisekunden
End Sub

Public Sub prcStop()
    KillTimer lnghWnd, 0
End Sub

Private Sub prcTimerStart(ByVal hwnd As Long, ByVal nIDEvent As Long, _
        ByVal uElapse As Long, ByVal lpTimerFunc As Long)

    Dim Zeit1 As Single
    On Error GoTo err_exit
    n = n + 1
    Zeit1 = Timer
    With Cells(n + 1, 16)
        .NumberFormat = "[hh]:mm:ss.000"
        .Value = (Zeit1 - sngStart) / 86400
    End With
    'DDE 1
    Cells(n + 1, 17) = 10 * n
    'DDE 2
    Cells(n + 1, 18) = 100 * n
    intCounter = intCounter + 1
    If intCounter = 9000 Then Call prcStop '9000 ~ 30 min bei einem 200ms Intervall
    Exit Sub
    err_exit:
    Call prcStop
    MsgBox "Fehler " & CStr(Err.Number) & vbLf & _
        vbLf & Err.Description, 16, "Fehler"
End Sub

Gruß
Nepumuk
Excel & VBA – Beispiele
Anzeige
AW: ... bin am basteln...
06.09.2005 00:42:03
michael
sensationell - danke Nepumuk!
den ersten Teil meiner Datenaufzeichnung schein ich nun im Griff zu haben
Nun steh ich vor folgendem Problem:
Mein ursprüngliches Macro wird über ein Steuerelement im Tabellenblatt1 gestartet. Im MS Excel Objecte für Tabellenblatt1 gibt es ein Private Sub CommmandButton1_Click().
Dort wird der DDE-Server gestartet und die Ventile geöfffnet. Dann hatte ich meine Datenaufzeichnung von Start über die gesamte Versuchsdauer.
Als 2. teil hatte ich das Schließen der Ventile und das Aufzeichnen der Daten über das Absinken des Gasflusses.
Ich rufe nun das Öffnen der Ventile über Private Sub CommmandButton1_Click() auf, anschließend rufe ich per Call prcStart auf. Jetzt spring die Prozedur in das Modul. Der Timer läuft. Nun kommt der 2.Teil und das Problem...
Jetzt sollen die Ventile geschlossen und der Nachlauf aufgezeichnet werden.
Muss ich dazu vorher den timer killen (prcStop) oder kann das im Hintergrung weiterlaufen bis ich es wieder brauche.
Variante A:
Call prcStop
Call Ventile schließen (Stopp)
Call prcStart2 (analog dem prcStart jedoch kürzere aufzeichnungszeit und unter der letzten Zeile vorgesetzt))
Call prcStop2 (analog dem prcStop)
Falls diese Lösung in Betracht kommt, wo müssen/können die nachfolgenden Macros stehen?
Kann das Schließen der Ventile unter Sheet1 stehen, das prcStart2 und prcStop2 im selben Modul wie prcStart oder auch in einem neuen Modul wenn ich das Modul kopiere und nur die Namen in prcStart2, prcStop2 und prcTimerStart2 ändere?
Variante B:
die If bedingung ruft nicht prcStop sondern das Schließen der Ventile auf, anschließend werden wie gehabt die Werte mit der Zeit protokolliert und dann erst erfogt das Call prcStop
Ich füge meine nicht funktionierende Datei hinzu - vielleicht wird so das problem übersichtlicher. https://www.herber.de/bbs/user/26312.xls
Danke und Gruß
Michael
Anzeige
AW: ... bin am basteln...und komme weiter...
06.09.2005 01:39:29
michael
...einen fehler hab ich...
das Sub Stopp() muß nun im Modul stehen, nicht mehr unter Sheet1. Im Sheet1 erzeugt es einen Fehler, weiß aber nicht warum...
Jedoch stimmt irgend etwas nicht mit meiner überarbeiteten Bedingung, die das Sub prcStop2 aufruft. Ich will die Bedingung, die den Timer killt nicht von einer Anzahl durchlaufener Cyclen abhängig machen, sondern von der Versuchsdauer. Falls mal ein Cyclus - warum auch immer hängt - wäre das Ventil zu lange offen.
Warum braucht eigentlich die If Anweisung If ... then Call prcStop kein End If?
Danke,
Grüße
Michael
Anzeige
AW: ... bin am basteln...und komme weiter...
06.09.2005 10:57:53
Nepumuk
Hallo Michael,
1. In Tabellen sollten keine Makros stehen, sondern nur Ereignisroutinen. Wenn diese Prozeduren aufrufen, dann sollet diese sich in Standardmodulen befinden und nicht im Klassenmodul der Tabelle.
2. Ich habe keine Ahnung, welche Bedingung einen Versuch beendet.
3. Du brauchst, wenn du die Timer nicht nummerierst kein zweites Stop - Makro. Eines reicht.
4. Eine If - Then Anweisung braucht kein End If, wenn es keinen Block bildet. Schau dir die VBA - Hilfe dazu an. Steht alles drin.
Gruß
Nepumuk
Excel & VBA – Beispiele
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige