Forum: PC-Programmierung VB 2010 Express Zeiterfassung


von Marcel K. (eden)


Lesenswert?

Hallo,

ich versuche zur Zeit ein Zeiterfassungssystem zu schreiben. Es soll per 
USB mit 8 verschiedenen Werten gespeist werden, die jeweils einen 
Wertspezifischen Counter und Timer Triggern. Leider habe ich nie VB 
gelernt, und große Probleme damit mich für die richtige Art und Weise zu 
entscheiden, dies zu realisieren.

Der Timer muss auch mindestens auf 10ms genau sein, damit habe ich 
besondere Probleme, einen "normalen" Counter bekomme ich alleine 
natürlich hin.....

Hat jemand vllt ein wenig Gnade mit mir und hilft mir da aus der 
Patsche?
Ich bin was VB Counter angeht im Moment ziemlich frustriert.

Bisher habe ich dies hier:

------------------------------------------------------------------------ 
-----
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
    Inherits System.Windows.Forms.Form

    'Das Formular überschreibt den Löschvorgang, um die Komponentenliste 
zu bereinigen.
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Wird vom Windows Form-Designer benötigt.
    Private components As System.ComponentModel.IContainer

    'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer 
erforderlich.
    'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
    'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.components = New System.ComponentModel.Container()
        Me.Button1 = New System.Windows.Forms.Button()
        Me.Button2 = New System.Windows.Forms.Button()
        Me.Button3 = New System.Windows.Forms.Button()
        Me.Label1 = New System.Windows.Forms.Label()
        Me.Label2 = New System.Windows.Forms.Label()
        Me.Label3 = New System.Windows.Forms.Label()
        Me.Timer1 = New System.Windows.Forms.Timer(Me.components)
        Me.SuspendLayout()
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(405, 447)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(75, 23)
        Me.Button1.TabIndex = 0
        Me.Button1.Text = "Start"
        Me.Button1.UseVisualStyleBackColor = True
        '
        'Button2
        '
        Me.Button2.Location = New System.Drawing.Point(633, 447)
        Me.Button2.Name = "Button2"
        Me.Button2.Size = New System.Drawing.Size(75, 23)
        Me.Button2.TabIndex = 1
        Me.Button2.Text = "Stop"
        Me.Button2.UseVisualStyleBackColor = True
        '
        'Button3
        '
        Me.Button3.Location = New System.Drawing.Point(842, 447)
        Me.Button3.Name = "Button3"
        Me.Button3.Size = New System.Drawing.Size(75, 23)
        Me.Button3.TabIndex = 2
        Me.Button3.Text = "Reset"
        Me.Button3.UseVisualStyleBackColor = True
        '
        'Label1
        '
        Me.Label1.AutoSize = True
        Me.Label1.Location = New System.Drawing.Point(308, 33)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(13, 13)
        Me.Label1.TabIndex = 3
        Me.Label1.Text = "0"
        '
        'Label2
        '
        Me.Label2.AutoSize = True
        Me.Label2.Location = New System.Drawing.Point(245, 33)
        Me.Label2.Name = "Label2"
        Me.Label2.Size = New System.Drawing.Size(19, 13)
        Me.Label2.TabIndex = 4
        Me.Label2.Text = "00"
        '
        'Label3
        '
        Me.Label3.AutoSize = True
        Me.Label3.Location = New System.Drawing.Point(176, 33)
        Me.Label3.Name = "Label3"
        Me.Label3.Size = New System.Drawing.Size(19, 13)
        Me.Label3.TabIndex = 5
        Me.Label3.Text = "00"
        '
        'Timer1
        '
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(1287, 585)
        Me.Controls.Add(Me.Label3)
        Me.Controls.Add(Me.Label2)
        Me.Controls.Add(Me.Label1)
        Me.Controls.Add(Me.Button3)
        Me.Controls.Add(Me.Button2)
        Me.Controls.Add(Me.Button1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)
        Me.PerformLayout()

    End Sub
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents Button2 As System.Windows.Forms.Button
    Friend WithEvents Button3 As System.Windows.Forms.Button
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents Label2 As System.Windows.Forms.Label
    Friend WithEvents Label3 As System.Windows.Forms.Label
    Friend WithEvents Timer1 As System.Windows.Forms.Timer

End Class


Aber leider ist das Zählintervall nicht mal annähernd 1ms bzw 10ms.
Außerdem stellt das erst den primitiven Anfang der Software dar. Es 
fehlen Counter, die jedes Stoppen eines Timer mitzählen um die 
Rundenzahl auszugeben. Auf englisch habe ich etwas gefunden zur Funktion 
"stopwatch", aber das habe ich leider nicht richtig verstanden.

Vllt könnte mir jemand eine deutssprachige einfach Lektüre dazu 
verlinken, oder mir die ~50 Zeilen Code anpassen, bzw mich dabei 
anleiten?

: Bearbeitet durch User
von Lan (Gast)


Lesenswert?

Einen Timer dafür zu nehmen ist nicht gut, weil die Zeit nie konstant 
sein wird (wie du schon bemerkt hast). Dazu solltest du verstehen wie 
der Timer funktioniert und die Microsoft Hilfe dazu durchlesen.
Besser wäre es, ein Event zu programmieren, das durch eine 
Buchungsaktion ausgelöst wird. In der Aktion könntest du die aktuelle 
Zeit mit DateTime.Now abfragen.

von Lan (Gast)


Lesenswert?

Wenn Du eine Zeit messen möchtest, dann vielleicht so:

===================================

Dim dtStart As DateTime

Private Sub buttonStart_Click(sender As System.Object, e As 
System.EventArgs) Handles Button1.Click
    dtStart = DateTime.Now
End Sub

Private Sub buttonStopp_Click(sender As System.Object, e As 
System.EventArgs) Handles Button2.Click
    Dim tsRundenzeit As TimeSpan = DateTime.Now.Subtract(dtStart)
    MessageBox.Show("Rundenzeit = " & tsRundenzeit.ToString())
End Sub

===================================

von c-hater (Gast)


Lesenswert?

Marcel Keil schrieb:

> ich versuche zur Zeit ein Zeiterfassungssystem zu schreiben. Es soll per
> USB mit 8 verschiedenen Werten gespeist werden, die jeweils einen
> Wertspezifischen Counter und Timer Triggern. Leider habe ich nie VB
> gelernt, und große Probleme damit mich für die richtige Art und Weise zu
> entscheiden, dies zu realisieren.

Ja, was zum Teufel hast du denn überhaupt gelernt?

Bei .net ist die verwendete Sprache weitgehend Wurscht, was man 
beherrschen muß ist das .net an sich.

Und wenn man das tut, dann wird sofort klar, daß es erhebliche 
Beschränkungen gibt bezüglich der Zeiterfassung, denn .net ist von einem 
Echtzeitsystem etwa soweit entfernt wie die Dinosaurier von der 
Produktion von SmartPhones, da sorgt schon die GC für.

Es ist allerdings nicht allein die Schuld von .net und der GC, sondern 
das ebenfalls nicht echtzeitfähige Win32/Win64-Backend von .net kann 
selber schon für noch heftigere Lags sorgen.

De facto mußt du den ganzen Schotter schon sehr gut kennen (und passend 
konfigurieren), um wenigstens einigermaßen zuverlässig Sachen unterhalb 
von ca. 1/10s auflösen zu können.

Glaubst du nicht? Fuck, ist mir scheißegal. Teste dein Programm einfach 
z.B. mal am MS-"Patchday"...

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Marcel Keil schrieb:
> Der Timer muss auch mindestens auf 10ms genau sein

DateTime.Now ist auch nicht wirklich genau.

Eine System.Diagnostics.Stopwatch hilft, die ist genau.

: Bearbeitet durch User
von nicht"Gast" (Gast)


Lesenswert?

Moin.

Im Grunde ist es egal, was du nimmst. Die 10ms sind zu knapp. Windows 
kann dir nie garantieren, dass die Zeit eingehalten wird. dazu 
bräuchtest du ein Echtzeit Betriebssystem.

Bei größeren Zeiten kann man den Fehler evtl tolerieren, aber 10ms sind 
schon echt kurz.

Grüße

von Jens P. (picler)


Lesenswert?

c-hater schrieb:
> Und wenn man das tut, dann wird sofort klar, daß es erhebliche
> Beschränkungen gibt bezüglich der Zeiterfassung, denn .net ist von einem
> Echtzeitsystem etwa soweit entfernt wie die Dinosaurier von der
> Produktion von SmartPhones, da sorgt schon die GC für.

Dem ist nichts hinzuzufügen. Wenn du 100ms Genauigkeit erreichst, kannst 
du hoch zufrieden sein.

Ich habe ein ähnliches Projekt gebaut. Dabei geht es um einen 
Zugangslogger. An den verschiedenen Türen im Objekt sind kleine 
(selbstgestrickte) Terminals installiert, die einen RFID-Chip einlesen 
und dessen ID über einen CAN-Bus an einen PC mit CAN-USB-Wandler 
weiterleiten. Dieser wertet die ID aus und sendet entsprechend dem 
Ergebnis einen String auf den Bus. Die Response-Time ist stark abhängig 
von der verwendeten PC-Hardware und liegt bei durchschnittlichen 500ms, 
im besten Fall bei 200ms. Bei einem PC hatte ich aber auch schon mal 
über 1s gehabt.

Mein Tipp: Wenn es so genau sein muss, kannst du die reine Zeiterfassung 
nur in einen externen µC auslagern. Wenn du diesen auch noch in ASM 
programmierst, sind auch 1µs kein Problem. Oder du nimmst ein 
Realtime-OS.

von c-hater (Gast)


Lesenswert?

Marcel Keil schrieb:

> ich versuche zur Zeit ein Zeiterfassungssystem zu schreiben. Es soll per
> USB mit 8 verschiedenen Werten gespeist werden, die jeweils einen
> Wertspezifischen Counter und Timer Triggern. Leider habe ich nie VB
> gelernt

Warum, zum Teufel, programmierst du dann eigentlich in VB? Weil du 
eigentlich überhaupt nix kannst und glaubst, dich mit VB für das 
entschieden zu haben, bei dem man am wenigsten seinen stinkendfaulen 
Arsch bewegen und lernen muss?

> Der Timer muss auch mindestens auf 10ms genau sein

Das kannst du generell unter Windows im Allgemeinen und unter .Net im 
Besonderen glatt vergessen. Mag sein, dass es für irgendetwas gut ist, 
aber es ist auf jeden Fall kein Echtzeitsystem, wollte es auch nie sein. 
Und neben den ganzen Widrigkeiten, die dir Windows allein schon als 
Multitasker mit einer virtuellen Speicherverwaltung aufbürdet, kommt 
dann noch der Scheiß von .net mit seiner garbage collection, deren 
Verhalten, vorsichtig ausgedrückt, vollkommen unvorhersehbar ist...

> Bisher habe ich dies hier:
[...]

OMG. Das ist ja nur noch extrem peinlich. Nichtmal eine einzige 
verschissene Zeile eigenen Codes. Nur das, was die VS-IDE nach ein 
bissel Rumgeklicke generiert hat.

Alles klar: Ein Troll.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.