LabVIEWForum.de - Mehrere Queues für mehrere Tasks

LabVIEWForum.de

Normale Version: Mehrere Queues für mehrere Tasks
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo liebes Forum,

ich habe ein kleines großes Problem und wäre wirklich sehr über Hilfe dankbar Rolleyes
Ich bereite gerade eine Messung vor und will hierzu zwei Task mit mehreren Kanälen messen (den einen Task mit ca 10kHz den Anderen mit 1 MHz) und speichern. Ich habe an anderer Stelle des Forums den Tipp bekommen einen Ringspeicher zu benutzen, dies hat mit nur einem einzigen Task super funktioniert aber bei einem zweiten nicht so ganz…
Ich zeige euch am besten mal mein Programm:

Ich erstelle zuerst die verschiedenen Kanäle. Ich benutze zwei Schleifen, da ich ja auch mit zwei unterschiedlichen Abtastraten messen will und es zwei verschiedene Mess-Devices sind. Den oberen Task will ich mit 10 kHz abtasten, den Unteren mit 1Mhz.

[attachment=45964]

So und jetzt fangen die Probleme an. Als nächstes lese ich in jeweils zwei Schleifen die zwei verschiedenen Kanalblöcke aus und schicke sie mit je einem Queue zu der jeweiligen Speicher-Schleife. Dort schreibe ich sie in eine TDMS-Datei rein. Damit die nicht allzu groß wird, will ich alle 600 „Umdrehungen“ eine neue Datei erstellen und beschreiben.

[attachment=45966]

Mein Problem liegt jetzt darin, dass ich das Gefühl habe, dass nur ein Queue erstellt wird. Ich überwache ebenfalls die Queue-Größe und die eine ist immer Null, während die Andere sehr sehr schnell anwächst.

Daher meine Frage:

1.) Ist es überhaupt möglich zwei Ringspeicher in einem VI zu benutzen?
2.) Wie sorge ich dafür, dass der Ringspeicher nicht so schnell eine sehr große Größe annimmt ohne einen „Out of Memory“-Fehler zu bekommen?


Ich hoffe ich konnte mein Problem einigermaßen verständlich skizzieren... Würde mich wirklich sehr über eine Antwort freuen :-)

Viele Grüße,
Gerald
Hallo Gerald,

- ich hatte dir schon einmal gesagt, dass die Art und Weise, wie du die DAQ-Task erstellst, höchstgradig "ungewöhnlich" ist und dir eine deutliche Verbesserung genannt!
- du betreibst keinerlei (naja: rudimentäres) Fehlerhandling in den DAQ-Producer-Loops. Gibt es dort Fehlermeldungen?
- Die Queuesize sagt nichts über den Inhalt der Queueelemente aus...
- Eine DAQ-Loop läuft mit 10s-Takt (100k Elemente/10kHz Samplerate), die andere mit 0,1s-Takt (100k Elemente/1MHz Samplerate). Die müssen unterschiedlich schnell Daten liefern...
- Deine Consumer-Loop wartet unbegrenzt (ohne TimeOut) auf neue Daten in beiden Queues. Sie muss also 10s auf ein Datenpaket der einen DAQ-Loop warten - in der Zwischenzeit produziert die andere Loop aber 100 Datenpakete - von denen du aber nur ein einziges aus der Queue liest!

THINK DATAFLOW!

Zu deinen Fragen:
1) Ja. Du kannst auch deutlich mehr als nur 2 Queues benutzen...
2) Queue schneller auslesen oder in der Länge begrenzen. Such dir aus, was dir besser gefällt...
Hallo Gerd,

ich habe die Fehlerbehandlung extra aus dem Skript gestrichen um es für das Forum ein wenig übersichtlicher zu gestalten, ansonsten Danke für die Tipps. Nachdem ich die Taktung angepasst hatte, hat's geklappt :-)
Allerdings hab ich noch eine Andere Frage:

Ich habe in einer ersten Version Zeitschleifen anstatt While-Schleifen benutzt und auch wenn es natürlich mit einer normalen While-Schleife jetzt viel besser klappt vermisse ich die Möglichkeit jeder Schleife einen eigenen Prozessor zuzuordnen.
Gibt es diese Möglchkeit für eine While-Schleife oder kann man eine zeitgesteuerte Schleife mit variabler Periode erstellen?

Grüße,
Gerald
Hallo Gerald,

Zitat:Gibt es diese Möglchkeit für eine While-Schleife
Jein. Für die While-Schleife direkt nicht, aber du könntest eine While-Loop in einer TWL verpacken...

Zitat:oder kann man eine zeitgesteuerte Schleife mit variabler Periode erstellen?
Ja. Du kannst über die Ein-/Ausgangsknoten der TWL die Parameter beeinflussen.

Ist dieses Feature wirklich nötig? Wenn du die Loops auf einen Core festpinnst, nimmst du LabVIEW die Möglichkeit, die Last selbst zu verteilen...
Naja wirklich "nötig" nicht, aber fand es ganz schön :-)
Danke auf jeden Fall für die Hilfe, werde mir mal ein paar Gedanken machen....aber es wahrscheinlich einfach lassen ;-)
Referenz-URLs