Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Hallo liebe LV Gemeinde,
ich habe zwei kleine, von Experten vermutlich leicht zu lösende Probleme. Ich habe eine Anwendung, bei der ich möglichst viele Messwerte pro Sekunde nehmen möchte. Mein Ansatz war der, dass ich mir einfach eine While-Schleife baue, die Messwerte zusammen mit der Zeit, die ich z.B. aus dem "Verstrichene Zeit"-VI bekomme, in ein Array schreibe und irgendwann in eine Datei speichere. Dabei ist mir aufgefallen, dass im fertigen Array die Zeit von Messwert zu Messwert nicht weiterläuft. Erst wenn etwa 2 Hundertstel vergangen sind, springt die Zeit im Array weiter. Das gleiche Ergebnis bekomme ich, wenn ich anstelle des "Verstrichene Zeit"-VIs das "Timer Wert (ms)"-VI benutze. Ich hätte eigentlich erwartet, dass ich zumindest hier immer dann, wenn eine Millisekunde vergangen ist, die neue Zeit im Array sehe. Stattdessen sehe ich bei z.B. 1000 Werten pro Sekunde 20 mal die gleiche Zeit, dann 20 mal die Zeit, die 2 Hunderstel später ist usw.
Um das Ganze zu verstehen, habe ich mir ein ganz einfaches Programm gebaut, in dem nur die Zeit in ein Array geschrieben wird. Als ich ein bischen damit herumspielte, fiel mir eine weitere Sache auf. Ich wollte z.B. mal genau 1000 Werte pro Sekunde haben, also benutzte ich das "Warten (ms)"-VI und stellte es auf 1 ms. Ich bekomme hier aber nur etwa 500 Werte. Wenn ich die Schleife nicht warten lasse sind es hingegen mehrere 1000 Werte pro Sekunde. Dies ist mein 2. Problem: Warum bekomme ich nur etwa 500 Werte pro Sekunde, wo ich 1000 erwarte? Am sonstigen Inhalt der Schleife sollte es nicht liegen, da die Schleife wie gesagt ohne Warten von 1 ms mehrere 1000 mal pro Sekunde läuft.
So, meine 2 Fragen nochmal kurz:
1.: Gibt es eine Möglichkeit, die Zeit millisekundengenau und nicht nur auf 2 Hundertstel genau in ein Array zu schreiben?
Viele Grüße,
Moe
2.: Warum läuft eine While Schleife, die 1000 mal pro Sekunde laufen sollte nur 500 mal pro Sekunde?
Im Anhang das einfache Test-Programm, bei dem ich mir auch die Frequenz anschaue, mit der die Schleife läuft. Ändert man im Blockdiagramm die Wartezeit auf 0 ms, so tritt der im 2. Punkt besagte Effekt auf.
Hallo,
Windows ist KEIN Echtzeitbetriebssystem! Datenerfassungseinzelschleifen mit 1 kHz, das sollte man nicht machen. Alles was schneller als max. 100 Hz geht, hat unter Windows nichts verloren. Ansonsten solltest du auf ein RT-Target ausweichen.
Übrigens unter meinem i7-Windows 7 Laptop kann ich deine Beschreibung nicht bestätigen, da schaffe ich ziemlich genau die 1 kHz, unter meinem etwas älteren Win XP Desktop PC mit Athlon kommen dagegen trotz gewaltiger Vereinfachung nur gut 500 Hz raus. Die Auflösung des Timers scheint nicht gut genug zu sein...
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
auch mein Rechner schafft nicht eine nochmals vereinfache Schleife mit 1kHz auszuführen. Meine CPU ist dabei gut ausgelastet. Mit welcher Hardware willst du denn die Messwerte aufnehmen? Mit einem DAQmx System können z.B. mehrere kSamples/s erfasst werden.
Gruß ÜUser
08.03.2011, 10:10 (Dieser Beitrag wurde zuletzt bearbeitet: 08.03.2011 10:14 von Lucki.)
(07.03.2011 17:39 )Moeseph schrieb: 2.: Warum läuft eine While Schleife, die 1000 mal pro Sekunde laufen sollte nur 500 mal pro Sekunde?
Mit 1000 mal pro Sekunde würde sie allenfalls laufen, wenn du a) den Metronom statt Wait verwenden würdest b) Das Programm selbst weniger als 1 ms benötigen würde c) das Wait/der Metronom bei 1ms noch verläßlich funktionieren so wie es sein sollte.
Daß die Schleife nur 500 mal pro Sekunde läuft, ist doch genau so wie es zu erwarten ist: 1 ms Wait + 1ms Programmausführung selbst (nach Deinen Angaben) = 2 ms = 500mal pro Sekunde.
Wie Jens schon andeutede, beträgt die Zeitauflösung unter Windows7 ca. 1 ms und nicht wie bei XP ca. 15 ms. Mit diesem vereinfachten Programm kann man das gut sehen:
Unendlich viel besser (als Windows 7 zu besorgen) ist allerdings, die kontinuierliche oder endliche Datenerfassung von einer NI-Messkarte selbst besorgen zu lassen und dabei das Waveform-Format zu verwenden. Die Zeitauflösung ist 1 µs oder besser. Man sieht sogar - bei gemultiplexter Datenerfassung von mehreren Kanälen - den geringen Zeitversatz zwischen den einzelnen Kanälen.