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 FormularPrivate 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 ModulOption 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
|
|