LabVIEWForum.de - Datenübertragung zw. Schleifen / Array leeren

LabVIEWForum.de

Normale Version: Datenübertragung zw. Schleifen / Array leeren
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
hallo zusammen,

meine VI für meine Prüfanlage enthält zwei parallele Schleifen, eine schnelle Schleife (100 Hz) zur Regelung und Datenerfassung; eine langsame Schleife (5 Hz) zum Anzeige der Daten auf Graphen und zum loggen in einer Datei. Das Programm wurde von einer ähnlichen Anlage übernommen, auf der es auch funktioniert, ich habe jedoch folgendes Problem:

Die Daten werden in der schnellen Schleife erzeugt, pro Schleifendurchlauf entstehen 9 Messdaten[attachment=59144]. Diese werden gesammelt und in ein Array geschrieben, welches von der langsamen Schleife ausgelesen und gelöscht werden sollen[attachment=59143]. In dem Array sollten somit immer 9*20=180 Datensätze liegen (pro langsamen Schleifendurchlauf ist die schnelle Schleife 20 mal ausgeführt worden). Das Löschen funktioniert jedoch nicht, das Array läuft in die Begrenzung von 486 Daten und bleibt permanent gefüllt. Wenn die Daten mit Hilfe eines Cases und eines Schalters manuell gelöscht werden, enthält das Array 0 Elemente nur solange, bis der Schalter gelöst wird, danach ist es direkt wieder voll (im Gegensatz zum Programmstart, wo es langsam vollläuft). Die dargestellten lokalen Variablen sind die einzigen Zugriffspunkte auf das Array, einen Feedback Knoten o.ä. gibt es auch nicht, in dem die Daten zwischengespeichert werden könnten.

Hat jemand eine Idee, wo die Daten zwischengespeichert werden bzw. wieso das Löschen nicht funktioniert?
Gibt es alternative Möglichkeiten die Daten zu übertragen? Bei Queues hatte ich gelesen, dass die empfangenen Daten schneller ausgelesen werden müssen als die gesendeten Daten erzeugt werden, was bei dieser Schleifenkonstellation nicht gegeben ist.

Ich bin für jede Idee dankbar!

Schöne Pfingsten!
Tobias
Hallo Tobias,

"Lokale Variablen"-Overkill!
Race conditions!

Einfache Lösung:
Wenn du Daten von einer Schleife in die ander schicken willst, solltest du eine Queue verwenden.
Simpel, sicher, performant…
(Das nennt sich dann sehr schnell Producer-Consumer-Schema!)

Zitat:Bei Queues hatte ich gelesen, dass die empfangenen Daten schneller ausgelesen werden müssen als die gesendeten Daten erzeugt werden, was bei dieser Schleifenkonstellation nicht gegeben ist.
Was hindert dich daran, im Consumer (deine langsame Schleife) die Queue jedesmal komplett auszulesen? Du musst ja nicht nur ein Element aus der Queue holen…
Hallo Gerd,

danke für deine schnelle Antwort. Ich werde das mit den Queues diese Woche mal ausprobieren.
Der ursprüngliche Entwickler des Programmes meinte es gab mit den Queues Probleme, ich werde bestimmt dann mit weiteren Fragen kommen Wink
Es wundert mich nur, dass die selbe Lösung auf dem anderen PC funktioniert und auf meinen PC nicht. Ist das Performanceabhängig oder weißt du woran das liegen könnte?

Viele Grüße
Tobias
Hallo,

ich habe die Datenübertragung mit den Queues probiert, es funktioniert auch einigermaßen, aber es läuft noch nicht ganz.

Ich möchte ja 9 einzelne Werte übertragen, diese wurden vorher in der Sendeschleife in ein Array geschrieben und dann in der Empfängerschleife ausgelesen. Jetzt erstelle ich in jedem Durchlauf der Senderschleife ein Array, schreibe da die Werte rein und übergebe dieses an die Queue.

Das Auslesen in der Empfängerschleife würde ich gerne mit "Flush Array" machen, damit alle Werte gleichzeitig gelöscht werden, jedoch kommt dann als Ausgabeformat "1D Array of Cluster of 1 Element 1D Array of double". Dies kann ich nicht verwenden, da ich die Werte als Array benötige, damit das vorhandene Programm diese weiterverarbeiten kann.

Als Zwischenlösung habe ich die Werte einzeln mit einer For-Schleife ausgelesen und in ein Array geschrieben, das kommt mir nur sehr langsam vor.

Gibt es eine elegantere Lösung, die 9 Messwerte aus der Sendeschleife hinterher sequentiell als Array in der Empfängerschleife zu haben? Idealerweise sollten die neuen Werte vorne stehen (wie bei dem vorher verwendeten Array) damit der Rest des Programmes kompatibel bleibt.

Viele Grüße
Tobias
Wo ist das Problem, Array of Cluster in einer For-Schleife bearbeiten, und in der Schleife das Array-Element auf dem Cluster holen:
[attachment=59156]
Alternative ist eine Queue, bei der du die Numeric-Elemente einzeln reinschiebst, aber dann hast du nur das Problem der Synchronisation. Welches Queue-Element stellt welchen Messwert dar?
Weitere Alternative: Du verwendest eine Cluster als Datentyp für deine Queue.

Gruß, Jens
Hallo Jens,

mit deiner ersten Lösung klappt die Datenübertragung wie gewünscht. Danke!

Viele Grüße
Tobias
Referenz-URLs