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
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.
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 ===================================
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"...
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.