29. März 2024, 10:31
VB-fun.de - Beitragsübersicht zum VB-/VBA-Forum-Archiv 0412
  VB6: API-Timer läuft zu ungenau
 Von Earny
 Am 31. August 2008 um 17:47:47
 Frage Hallo,
ich habe ein VB6.0-Programm das Messwerte aus einer S7-CPU über OPC einlesen und dann in einem 1s-Zeitabstand in eine Excel-Tabelle schreiben soll.
Ich habe zuerst versucht, den zyklischen Schreibvorgang mit einem Standard-VB-Timer zu lösen. Das scheiterte, weil die Standard-VB6.0-Timer offensichtlich zu ungenau sind.
Gaga hatte mir empfohlen, einen API-Timer zu verwenden. Mit seiner Hilfe habe ich den API-Timer auf meinem Entwicklungsrechner zum Laufen gebracht. In einer Simulation lief der Timer, zumindest bei Timerwerten > 1s tadellos.
Dann habe ich heute mein VB-Projekt auf den Zielrechner kopiert, der über OPC mit der S7-CPU verbinden ist und laufen lassen. Dabei stellte sich heraus. dass auch der API-Rechner viel zu ungenau arbeitet. Oder könnte es sein, dass der API-Timer genau läuft und der GetTickCount ungenau kommt?
Ich habe mal nachfolgend den betreffenden VB-Code angefügt. Vielleicht fällt Euch irgendwas auf, was nicht i.O. ist.

Code (Ausschnitt) aus dem Formular
Private Sub cmdAufzeichnungStarten_Click()
Set Exc = GetObject(CurDir() + "\Messwerte.xls")
StartTimer CInt(txtIntervall.Text)
End Sub

Private Sub cmdStop_Click()
StopTimer
End Sub

Public Sub API_Timer()
Exc.Worksheets(1).Cells(2, 1).value = "Zeit"
Exc.Worksheets(1).Cells(2, 2).value = "Sollwert"
Exc.Worksheets(1).Cells(2, 3).value = "Istwert"
Exc.Worksheets(1).Cells(2, 4).value = "Zeitwert In ms"
m = m + 1 'Zeilenvorschub In Excel
Exc.Worksheets(1).Cells(m + 2, 1).value = Now()
If optVolumenstrom.value = True Then
Exc.Worksheets(1).Cells(1, 1).value = "Volumenstrom In l/min"
Exc.Worksheets(1).Cells(m + 2, 2).value = Anzeigen.txtSollVolumenstrom.Text
Exc.Worksheets(1).Cells(m + 2, 3).value = Anzeigen.txtIstVolumenstrom.Text
ElseIf optDruck.value = True Then
Exc.Worksheets(1).Cells(1, 1).value = "Druck In mbar"
Exc.Worksheets(1).Cells(m + 2, 2).value = Anzeigen.txtSollDruck.Text
Exc.Worksheets(1).Cells(m + 2, 3).value = Anzeigen.txtIstDruck.Text
ElseIf optFüllstand.value = True Then
Exc.Worksheets(1).Cells(1, 1).value = "Füllstand In mm"
Exc.Worksheets(1).Cells(m + 2, 2).value = Anzeigen.txtSollFüllstand.Text
Exc.Worksheets(1).Cells(m + 2, 3).value = Anzeigen.txtIstFüllstand.Text
ElseIf optTemperatur.value = True Then
Exc.Worksheets(1).Cells(1, 1).value = "Temperatur In °C"
Exc.Worksheets(1).Cells(m + 2, 2).value = Anzeigen.txtSollTemperatur.Text
Exc.Worksheets(1).Cells(m + 2, 3).value = Anzeigen.txtIstTemperatur.Text
End If
Exc.Worksheets(1).Cells(m + 2, 4).value = GetTickCount
Exc.Worksheets(1).Cells(m + 2, 3).Show
End Sub
Code aus dem Modul
Option Explicit
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long

Private MtmrID As Long

Public Sub StartTimer(ByVal intMilliSeconds As Integer)
'// --> Timer mit dem Intervall intMilliSeconds starten (Angabe In Millisekunden)
MtmrID = SetTimer(0, 0, intMilliSeconds, AddressOf CallBackTimerProc)
End Sub

Public Sub StopTimer()
'// --> Timer stoppen
If MtmrID <> 0 Then
KillTimer 0, MtmrID
End If
End Sub

Public Sub CallBackTimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
'// --> Diese Sub wird vom Betriebssystem nach jedem Ablauf des Intervalls aufgerufen
Messwertaufzeichnung.API_Timer
End Sub
Gruß
Earny

[ VB-/VBA-Forum | Archiv 0412 | Archiv-Übersicht ]
 Antworten
VB6: API-Timer läuft zu ungenau - Earny 31. August 2008 um 17:47:47
Re: API-Timer läuft zu ungenau - Detlev Schubert 03. September 2008 um 11:05:57
Re: API-Timer läuft zu ungenau - Earny 03. September 2008 um 22:20:51
Multimedia Timer - Rumbler 04. September 2008 um 11:40:40
Re: API-Timer läuft zu ungenau - Gaga 04. September 2008 um 00:14:44
Re: API-Timer läuft zu ungenau - Earny 04. September 2008 um 20:56:26
Re: API-Timer läuft zu ungenau - Earny, 05. September 2008 um 18:54:40
Re: API-Timer läuft zu ungenau - Rumbler 06. September 2008 um 10:38:07

Zum Seitenanfang

Startseite | VB-/VBA-Tipps | Projekte | Tutorials | API-Referenz | Komponenten | Bücherecke | Gewinnspiele | VB-/VBA-Forum | DirectX | DirectX-Forum | VB.Net | VB.Net-Forum | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum