LabVIEWForum.de - Konstante Messfrequenz

LabVIEWForum.de

Normale Version: Konstante Messfrequenz
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Gemeinde!

Ich habe eine Erzeuger-Verbraucher-Struktur, wobei mehrere Erzeuger mir kontinuierlich Daten erzeugen, die ich in der Verbraucherstruktur mit einer Frequenz aufzeichne und anschließend als Messfile abspeichern möchte.

Das Problem welches dabei auftritt: Meine Verbraucherschleife nimmt mit zunehmender Datenmenge eine geringere Frequenz an.
Wie kann ich dieses Problem umgehen? Sollte ich die Daten zwischenspeichern? Wenn ja, wie geht das, ohne dass ich die die aktuelle Messung beeinflusse.

Liegt das am Speicher der vollläuft? Falls ja, könnte man auch die Speichergröße vorher festlegen und so das Problem umgehen?

VG Marcel

Lv86_img
(19.04.2011 10:21 )Meinhart_E.Steil schrieb: [ -> ]Liegt das am Speicher der vollläuft?
Damit hast du sehr wahrscheinlich den Nagel auf den Kopf getroffen.

Genaue Empfehlungen sind aber schwierig, da ich die Struktur deines Programmes nicht kenne. Aber es ist generell tödlich, bei langen Messungen alle Daten im RAM des Computers zu halten.

Übliche Lösungen beinhalten das Abspeichern der Daten und die Verwendung eines Ringpuffers.

Gruß, Jens
(19.04.2011 10:45 )jg schrieb: [ -> ]Genaue Empfehlungen sind aber schwierig, da ich die Struktur deines Programmes nicht kenne. Aber es ist generell tödlich, bei langen Messungen alle Daten im RAM des Computers zu halten.

Übliche Lösungen beinhalten das Abspeichern der Daten und die Verwendung eines Ringpuffers.

Gruß, Jens

Danke für die Antwort. Ein Beispiel kann ich gerade nicht geben, da ich im Urlaub verweile. Smile

Ich benutze als Verbraucher eine While-Schleife in der lokale Variablen die Daten aus den Erzeugerschleifen liefern und sammle die Daten dort bis die Messung durch ein Ereignis beendet wird. Für mich stellt sich jetzt die Frage, wie kann ich während der Messung die Daten aus der Schleife in einer Datei sammeln und somit die While-Schleife leeren. Mit dem Ringpuffer kann ich da nicht wirklich etwas anfangen?!

Hier im Forum habe ich beim stöbern auch nicht ähnliches gefunden oder es auch einfach nicht verstanden.

VG Marcel
(21.04.2011 08:38 )Meinhart_E.Steil schrieb: [ -> ]Danke für die Antwort. Ein Beispiel kann ich gerade nicht geben, da ich im Urlaub verweile. Smile

Ich benutze als Verbraucher eine While-Schleife in der lokale Variablen die Daten aus den Erzeugerschleifen liefern und sammle die Daten dort bis die Messung durch ein Ereignis beendet wird. Für mich stellt sich jetzt die Frage, wie kann ich während der Messung die Daten aus der Schleife in einer Datei sammeln und somit die While-Schleife leeren. Mit dem Ringpuffer kann ich da nicht wirklich etwas anfangen?!

Hier im Forum habe ich beim stöbern auch nicht ähnliches gefunden oder es auch einfach nicht verstanden.

VG Marcel

Habe ich das richtig verstanden? Du schreibst in der Erzeuger die Daten holst sie im Verbrauch wieder über eine Lokale Variable wieder raus? Das schreit ja schon nach Queues Smile
Danach kannst du die Daten im Verbraucher mittels Schieberegister speichern.
(22.04.2011 07:24 )Der_Elch schrieb: [ -> ]Habe ich das richtig verstanden? Du schreibst in der Erzeuger die Daten holst sie im Verbrauch wieder über eine Lokale Variable wieder raus? Das schreit ja schon nach Queues Smile
Danach kannst du die Daten im Verbraucher mittels Schieberegister speichern.

Mein Problem ist, dass ich mit den Daten des Erzeugers/Verbrauchers eine Maschine in "Echtzeit" regeln muss. Ich bewege einen Tisch und messe gleichzeitig die auftretenden Kräfte sowie noch mehrere andere elektrische Komponenten. Die gemessenenen Kräfte schalten die Maschine z. B. bei Überlastung ab.
Ich benutze mehrere Erzeugerschleifen (geht nich anders, da sonst die Buffer einiger Geräte volllaufen würde), die alle mit an sich gleichen aber doch leicht unterschiedlichen Frequenzen laufen. Wenn ich die in eine Queue eingebe, crasht meine Maschine früher oder später, da die Verarbeitung einfach irgendwann zeitverzögert stattfindet. Und die Verbraucherstruktur müsste schneller laufen als dier Erzeugerstruktur und die einlaufende Anzahl an Elementen gleichgroß sein, was die Queue in dem Falle sinnfrei machen würde. Mir kommt es letztendlich nicht auf ein paar verloren Datenpunkte an.

Habe das obengenannte Problem durch permanentes Schreiben der Daten in eine Datei aus dem Verbraucher gelöst. Das senkt natürlich meine Messfrequenz und erhöht damit meinen Datenverlust.

Bin für weitere theoretische Erörterungen stets offen. Smile

Viele Grüße
Marcel
Meinhart_E.Steil schrieb: [ -> ]Das Problem welches dabei auftritt: Meine Verbraucherschleife nimmt mit zunehmender Datenmenge eine geringere Frequenz an.
Das hat aber nichts mit der größeren Datenmenge an sich zu tun, sondern mit der Art, wie die größeren Datenmengen oftmals - um nicht zu sagen bei Anfängern immer - gesammelt werden.
Die Verlangsamung tritt ein, wenn die neuen Daten jedesmal als neue Elemente an das bestehende Datenarray angehängt wird, so daß sich das Datenarray jedesmal vergrößert. Das ist jedesmal mit einer aufwändigen Reorganisation des Datenspeichers verbunden.
Die Lösung ist: Ein hinreichend großes Array, z.B mit NaN-Werten, vordefinieren und dann die Elemente ersetzen. Beim Abpeichern dann die noch nicht ersetzten Werte löschen.
Oder ab Ver. 9 noch einfacher: Statt while-Schleife for-Schleife mit Bedingungsanschluß verwenden. An die For-Schleife eine genügend große Konstante an N anschließen, Sammeln der Daten mit dem Index-Ausgang. Abbruch immer wann man will wie bei der While-Schleife mit dem Bedingungsanschluß

Zur Frage Pufferüberlauf/Verlangsamung der Erzeugung:
Das schließt sich normalerweise gegenseitig aus.
Entweder: Die Daten werden unabhängig vom PC erzeugt, kommen also von einer Messkarte mit eigenem Timer, einem µC-System oder einem externem Gerät - Dann droht die Gefahr eines Puffer-Überlaufes bei nicht genügend schneller Verarbeitung. Die Datenrate bleibt aber aufrechterhalten.
Oder: Die Daten werden softwaremäßig vom PC getriggert oder erzeugt. Dann kann die Datenrate bei nicht genügend schneller Verarbeitung verlangsamt werden, man hat aber dann wahrscheinlich keinen Puffer-Überlauf.
Welche Art der Datenerzeugung bei Dir vorliegt - darüber häslt Du dich leider bedeckt.
(15.05.2011 10:43 )Lucki schrieb: [ -> ]Das hat aber nichts mit der größeren Datenmenge an sich zu tun, sondern mit der Art, wie die größeren Datenmengen oftmals - um nicht zu sagen bei Anfängern immer - gesammelt werden.
Die Verlangsamung tritt ein, wenn die neuen Daten jedesmal als neue Elemente an das bestehende Datenarray angehängt wird, so daß sich das Datenarray jedesmal vergrößert. Das ist jedesmal mit einer aufwändigen Reorganisation des Datenspeichers verbunden.
Die Lösung ist: Ein hinreichend großes Array, z.B mit NaN-Werten, vordefinieren und dann die Elemente ersetzen. Beim Abpeichern dann die noch nicht ersetzten Werte löschen.
Oder ab Ver. 9 noch einfacher: Statt while-Schleife for-Schleife mit Bedingungsanschluß verwenden. An die For-Schleife eine genügend große Konstante an N anschließen, Sammeln der Daten mit dem Index-Ausgang. Abbruch immer wann man will wie bei der While-Schleife mit dem Bedingungsanschluß

Idea Gute Idee, ich weiß zwar momentan noch nicht wie lange meine Versuche laufen, ich muss aber letztendlich immer die Frequenz und die Zeitdauer des Versuches parametrisieren und daraus lässt sich ja bequem nen ausreichend dimensioniertes Array vorab erstellen.

(15.05.2011 10:43 )Lucki schrieb: [ -> ]Zur Frage Pufferüberlauf/Verlangsamung der Erzeugung:
Das schließt sich normalerweise gegenseitig aus.
Entweder: Die Daten werden unabhängig vom PC erzeugt, kommen also von einer Messkarte mit eigenem Timer, einem µC-System oder einem externem Gerät - Dann droht die Gefahr eines Puffer-Überlaufes bei nicht genügend schneller Verarbeitung. Die Datenrate bleibt aber aufrechterhalten.
Oder: Die Daten werden softwaremäßig vom PC getriggert oder erzeugt. Dann kann die Datenrate bei nicht genügend schneller Verarbeitung verlangsamt werden, man hat aber dann wahrscheinlich keinen Puffer-Überlauf.
Welche Art der Datenerzeugung bei Dir vorliegt - darüber hält Du dich leider bedeckt.

Hm, momentan laufen im PC aus drei Kraftmessverstärkern Daten über drei RS232 Schnittstellen ein. Ich habe generell zwei Möglichkeiten die Daten dort auszulesen: Der Kraftmessverstärker liefert mir auf Anfrage den letzten erfassten Wert (was aus irgendeinem Grund aber nicht funktioniert) oder es werden alle Werte (momentaner Zustand) per vi erfasst.

Wenn ich jetzt alle Daten in einer Schleife sammle, sammeln sich halt unterschiedlich große Datenmengen an.

VG Marcel
Referenz-URLs