Stopwatch in Excel met com-poort bedienen

Status
Niet open voor verdere reacties.

obes

Gebruiker
Lid geworden
24 aug 2015
Berichten
11
Beste forumleden
Ik ben al een tijdje aan het knoeien met een stopwatch in Excel die bediend zou moeten worden door een bericht van de com-poort.
Ik gebruik dit voor het uitlezen van de com-poort (mscomm in vba):
In Userform-code voor openen com-poort:
Code:
Private Sub cmdOpen_Click()
'poort openen voor ontvangen van berichten
frmcomm.RS232.CommPort = 10

'Before opening the port prepare for errors
On Error Resume Next
frmcomm.RS232.PortOpen = True
If Err = 8002 Then
MsgBox "The COMPORT is not present or defective."
Exit Sub
End If
If Err = 8004 Then
MsgBox "The selected port is already open by other program."
Exit Sub
End If

End Sub

In Userform-code voor lezen com-poort
Code:
Public Sub cmdRead_Click()
intEndsignal = 0

Do While intEndsignal = 0
Run "CommTest"
DoEvents
If intEndsignal > 0 Then Exit Do
Loop


End Sub

In aparte module de verwerking van de com-input
Code:
Public intEndsignal As Integer

Sub CommTest()
'macro voor lezen van compoort

Dim commInput
If frmcomm.RS232.InBufferCount > 0 Or intEndsignal = 0 Then
frmcomm.RS232.InputLen = 0
commInput = frmcomm.RS232.Input
Else
Exit Sub
End If
Do While frmcomm.RS232.InBufferCount = 0
DoEvents
If intEndsignal > 0 Then Exit Sub
Loop
frmcomm.RS232.InputLen = 0

commInput = frmcomm.RS232.Input
AppendText (commInput)

End Sub

Sub AppendText(strText As String)
    'commInput in textbox plaatsen
    With frmcomm.txtRead
        .SetFocus '//required
        .Value = .Value & strText & vbNewLine
        .SelStart = Len(.Value)
    End With
If frmcomm.txtRead.Value = 101 Then
Run ("startknop")
  
End If
End Sub

Ik gebruik deze als stopwatch:
Code:
Sub startknop()
frmcomm.txtRead = Empty

Range("R1").Value = True 'timer actief
Range("Q1") = "Tijden"
  Range("Q65536").End(xlUp).Offset(1, 0) = Range("S1")
  Range("S1").ClearContents
  timing = Timer
  Range("R1").Value = True
  Do While Range("R1")
    Range("S1") = Format(Timer - timing, "0.00")
        frmcomm.Timer_userform.Value = Range("S1")
        DoEvents
  Loop

End Sub

Bij het berichtje "101" op de com-poort moet de stopwatch starten en/of herstarten.
Het starten is geen probleem. Maar als de stopwatch loopt dan kan ik geen berichten binnenkrijgen via de com-poort. Pas als ik de stopwatch handmatig stop dan kan een nieuw bericht de stopwatch weer starten. Herstarten lukt dus niet.

Iemand enig idee wat hier het probleem is? En hoe op te lossen?
 
Ik vermoed dat je mijn bericht in je vorige draadje over het hoofd hebt gezien.

Misverstand 1: de com poort lees je niet uit met een loop maar mbv het OnComm event. Zie voor een voorbeeld: https://support.microsoft.com/en-us/kb/194922

Misverstand 2: je hebt het over een timer maar je gebruikt er geen. Je gebruikt de functie Timer, die geeft de verstreken tijd sinds middernacht. Een Timer installeer je mbv Application.Ontime. Zie https://msdn.microsoft.com/en-us/library/office/ff196165.aspx

Terug naar de tekentafel?
 
Ik vraag me dan af hoe het komt dat het ontvangen van com-berichten wel super goed werkt en de stopwatch ook super goed werkt? Maar dat dit niet samen kan werken?

Die verklaring zou mij waarschijnlijk al super ver helpen.
 
Lastig uit te leggen. Dan moet je begrijpen dat Windows event driven is, wat een message loop is, hoe events door Windows worden verwerkt.
Met je do loop neem je de controle van windows over, om die weer even terug te geven mbv DoEvents. Maar dat doe je niet één keer (dan gaat het meestal nog wel goed), in dit geval doe je het drie keer. Lijkt me zeer verwarrend, voor Windows.

Over een andere boeg: als je een knop op een userform zet, dan schrijf je toch ook geen Do Loop waarin je alle muis events gaat uitlezen tot er iets bij zit wat je nodig hebt? Nee, je definieert een OnClick event handler. Windows roept je wel als er een click op die knop komt.
Nu is de knop een com control. Definieer het OnComm event en Windows roept je wel als er iets op die com poort staat.

Don't call us, we will call you.
https://www.youtube.com/watch?v=i4njPe2_rho
 
Bij elke ontvangst van data uit COM1 wordt de "buffer-data" van boven naar beneden ververst.
Ook schuift de timer een aantal regels op naar beneden wanneer de "Key" in de "buffer-data" zit.
De timer op de oude plaats geeft aan hoe lang het duurde om de "Key" weer te ontvangen.
De knop springt van "Start Logging" naar "Stop Logging" en weer terug, tevens wordt de poort geopend/gesloten en de timer gestart/gestopt.

Soms zijn userforms een vlag op een modderschuit.
 

Bijlagen

  • helpmij obes rs232 key in data logging.xls
    62,5 KB · Weergaven: 76
Laatst bewerkt:
Mooi alpha, zoals het hoort!
Wel vervelend dat je die control in runtime mode helemaal niet ziet.
Let op: als je het workbook afsluit (maar niet de excel instantie) terwijl de timer loopt zal excel het workbook weer openen. Op te lossen in de BeforeClose van het workbook.
(Het beste is de timer in een class in te pakken en in die class ook de beforeclose te onderscheppen).
 
Heren!

Super bedankt. Pixcel heel goed uitgelegd! Alpha bedankt voor het voorbeeld en de duidelijke uitleg. Ik ben nu bezig alles te herschrijven. Iemand al een tip om dit in seconde en milliseconde te zetten? Minuten en uren heb ik niet nodig.

Nogmaals bedankt!
 
Waarom moet je milliseconden weten?
De timers hebben een nauwkeurigheid van 10ms.
Daarnaast heb je Userforms en MSCOMM, die lopen binnen VBA, wat weer loopt binnen Excel, wat weer loopt binnen Windows.
Allemaal een opeenstapeling van vertragende en nauwkeurigheid verminderende processen.
Je wekt een suggestie van nauwkeurigheid die er naar mijn mening niet is.
 
Laatst bewerkt:
Het zijn registratie tijden die tot maximaal 15 seconden gaan. Om hier de verschillen uit te bepalen moet het voor mij wel ms zijn.
Maar ik ben nog wat aan het stoeien geweest.
Als ik door vba de tijd "now" in een cel laten plaatsen; bijvoorbeeld:
Als ik deze tijd 10:37:38 omzet in getal dan wordt dit 0,442800925925926.
De volgende tijd "now" is bijvoorbeeld 10:37:49 dit is als getal 0,442928240740741

Als ik dan de tweede tijd minus de eerste tijd doe en dat getal vermenigvuldig met 100000, dan heb ik toch de seconde en milliseconden? Of is dat niet?
Op deze manier kan ik wel wat herschrijven en heb ik mijn resultaat, hopelijk. Dan heb ik wel geen zichtbare lopende stopwatch maar ik kan wel mijn programma herschrijven dat ik de laatst geregistreerde tijd zichtbaar maak in het Userform.
 
Laatst bewerkt:
Zoals Alpha al zei: pas op voor schijn nauwkeurigheid. Google eens op "excel high resolution timer".
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan