ökonomisches Aufteilen in Anzeigeprozess und Speichernprozess
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!
ökonomisches Aufteilen in Anzeigeprozess und Speichernprozess
Guten Abend!
Ich habe ein Messerfassungssystem, von dem ich Werte auslesen kann. Zu Simulationszwecken erzeuge ich mir ein entsprechendes Array mit zwei geschachtelten for-Schleifen.
Die Daten sollen in einer Anzeige angezeigt werden, wenn sie eingeschaltet ist, und abgespeichert werden, wenn der SpeichernProzess gestartet wurde. Die Graphenanzeige sowie der Abspeichernproess laufen in zwei anderen VIs. Das Datenholen wird vom Hauptprogramm aus gestartet und läuft immer parallel. Werden die Anzeige oder das Abspeichern eingeschaltet, dann wird das jeweils empfangene Array in eine Queue geschrieben. Das Bild zeigt dieses Datenholen und das Weiterleiten des Arrays mittels Queues.
Ich würde gerne wissen, ob dies eine "gute" Lösung ist oder ob es noch andere Alternativen gibt, die besser sein könnten?
24.06.2015, 07:52 (Dieser Beitrag wurde zuletzt bearbeitet: 24.06.2015 07:52 von GerdW.)
RE: ökonomisches Aufteilen in Anzeigeprozess und Speichernprozess
Hallo Hasenfuss,
Zitat:Ich würde gerne wissen, ob dies eine "gute" Lösung ist oder ob es noch andere Alternativen gibt, die besser sein könnten?
Eine "gute" Lösung wird es, sobald du dein VI mal aufräumst und zumindest einige der CoercionDots entfernst…
Im Ernst:
- Wenn es dir nur um eine Momentanwertanzeige geht, kannst du auch einen Notifier verwenden und hier auf die Case-Struktur verzichten.
- Je nachdem, wie wichtig dir das Abspeichern ist, könntest du auch eine längenbegrenzte Queue verwenden und auf die Case-Struktur im MainVI verzichten. Die Speicherroutine entscheidet dann "selbständig", ob gespeichert wird oder nicht…
RE: ökonomisches Aufteilen in Anzeigeprozess und Speichernprozess
Hallo GerdW,
vielen Dank für Deine Hinweise.
>>Eine "gute" Lösung wird es, sobald du dein VI mal aufräumst und zumindest einige der CoercionDots entfernst…
Danke für den Hinweis, daran hab ich nicht gedacht und ich habe sie jetzt überall da, wo machbar, entfert :-)
>>Wenn es dir nur um eine Momentanwertanzeige geht, kannst du auch einen Notifier verwenden und hier auf die
>>Case-Struktur verzichten.
Welchen Vorteil hat denn die Verwendung von Notifers anstelle von Queues? Wären die in diesem Fall weniger speicherintensiv?
>>Je nachdem, wie wichtig dir das Abspeichern ist, könntest du auch eine längenbegrenzte Queue verwenden und auf
>>die Case-Struktur im MainVI verzichten. Die Speicherroutine entscheidet dann "selbständig", ob gespeichert wird
>>oder nicht…
Ich weis nicht, ob das bei mir funktionieren würde - warum?
Folgendes ähnliches Beispiel, was das Problem erklären könnte -> Ich habe einen Motor, der am Laufen ist und es werden z.B. el. Leistung, Drehzahl, Drehmomente und Temperaturen gemessen. Ich möchte einmal in einer Graphenanzeige die Messwerte anzeigen. Dann besteht die Möglichkeitn, einen Versuch durchzuführen, in dem ich den Versuch starte. An den Versuch ist die Messaufzeichnung gekoppelt.
Ich bekomme von dem Messerfassungssystem Messwerte, die ich einmal zum Abspeichern und dann an die Graphenanzeige weiterleiten muss. Mein Konstrukt sieht bis jetzt so aus - ich habe 4 VIs.
Sobald das Hauptprogramm gestartet wird, beginnt der Prozess "Messwerte holen und verteilen" und läuft kontinuierlich im Hintergrund. Meine Messerfassung hat einen Fifo. In den Fifo werden pro Prozesstakt Messwerte in einer Reihenfolge in den Messerfassungsfifo hineingeschrieben:
1 2 3 4 5 ... 1 2 3 4 5 ...
Insgesamt habe ich knapp 40 Kanäle an meiner Messerfassung dran.
Ich muss also wissen, wo der erste Wert ist, damit ich die Daten richtig zuordnen kann, wenn ich sie lese, darum läuft der Messwerte-Holen-Prozess immer. Ist nun die Graphenanzeige aktiv (ein VI, dass via Subpanel im Hauptprogramm eingebunden wird), dann sollen die Messwerte dort angezeigt werden. Ich möchte die Graphenanzeige aber auch mal anhalten können, um z.B. Verläufe mir kurzfristig anzusehen, mal hineinzoomen ...
Beim Abpspeichern-Prozess genauso - das ist ein SubVI, dass gestartet wird, denn ich einen Versuch starte und die Messwerte aufzeichnen muss. Dann muss ich die Messwerte aus dem VI "Messwerte holen" an "SpeichernProzess" senden. Ich hatte gedacht, dass eine Queue eine gute Möglichkeit sei, um dann Messwerte von einem VI in das andere zu transportieren. Und was mir noch gefallen hat ist die Funktion Queue warten auf..., so dass ich keine Schleife bauen muss, die ständig pollt.
Ich habe hier mal mein Abspeichern-Prozess als Bild angefügt. Ich muss das eindimensionale Array noch etwas bearbeiten, damit ich es den einzelnen Kanälen zuordnen und dann in die TDMS-Datei hineinschreiben kann. Dieses VI wird gestartet, wenn ich den Versuch starte. Dann wartet die Funktion solange, bis in die Queue Daten reingeschrieben werden.
Falls Du mir noch ein paar Tipps geben kannst, würde ich mich riesig drüber freuen.