(28.10.2017 17:47 )Rene123 schrieb: Ich habe diese Variante gewählt, damit das Programm ein bisschen skalierbar ist.
Der Gedanke an sich ist sehr gut!
Ich bin aber der Meinung, auch andere Verfahren sind gut genug skalierbar.
Zitat:Gibt es eine Möglichkeit ein Öffnen und Schließen von VIs umzusetzen ohne das es sich merkbar auf die Benutzung auswirkt?
Da die Benutzung eines VIs nach dem Öffnen beziehungsweise vor dem Schließen stattfindet, kann sich Öffnen oder Schließen eigentlich gar nicht so sehr auf die Benutzung auswirken. Oder was meinst du genau?
Zitat:Ist es nicht eh so, dass z.B. in der MeasurementSubVi die Consumer Loop erst läuft, wenn diese aus der Producer Loop ein Element bekommt?
Das ist richtig. Aber: Was ist mit dem Rest des VIs?
Mir sind mehrere Sachen eingefallen, was an der Kombination SubPanel und Queue-gesteuert möglicherweise schlecht ist:
* Geht denn ein solches SubVI zu debuggen? Kommt man an das BD, wenn das FP im SubPanel läuft?
* Wenn man ein solches VI standalone ausführt, also nicht in SubPanel, kann man es nur schwer steuern. Dazu bräuchte man parallel ein VI, das die Queue bedient. Ist denn das praktikabel?
Zitat:FGV muss ich mir mal näher anschauen. Bisher habe ich das noch nie verwendet, aber ich habe hier irgendwo gelesen, dass man keine großen Datenarrays mit FGV speichern soll. Die Frage ist natürlich, was hier mit groß gemeint ist? Das Datenarray von mir kann im schlimmsten Fall auch über 1000 Elemente enthalten.
* 1000 Elemente ist relativ: Array of DBL => völlig irrelevant. Array of Cluster of (...) => kompliziert.
* Arrays, die z.B. Messdaten enthalten, würde ist gegebenenfalls auch nicht in einem FGV verwalten.
* Ich verwende FGV z.B. als "Globale Variable". Da ein FGV, das per Enumerator gesteuert werden kann, auch Methoden für die Manipulation der Daten enthalten kann, kann so eine FGV als Klasse im klassischen Sinne verstanden werden.
Hinweis: Die FGV würde die globale Variable, die in den Dauer-While-Schleife gelesen bzw. geschrieben wird, ersetzen. Die FGV wird immer dann gelesen bzw. geschrieben, wenn das auch so notwendig ist. Geschreiben wird sie z.B. dann, wenn infolge eines Benutzer-Events die Lokale Variable (das FP-Element) geändert wurde.
Zitat:Was auf jeden Fall die Auslastung minimiert, ist das Entfernen der Shift-Register in er GUI zum lagern der Daten.
Das bezweifle ich sehr!
Du solltes zuerst in die While-Schleifen eine z.B. 50ms-Wartezeit (Metronom) einfügen. Ich gehe sehr davon aus, dass dein Programm dann 0% (Max.Max 5%) Auslastung hat. Danach kannst du das mit den Schieberegistern nochmals prüfen.
Hinweis: Auch wenn LV eine Datenfluss-Sprache ist, kann man doch hervorragend Event-Gesteuert arbeiten => Auslastung geht gegen Null.
Zitat:Die Daten liegen ja sowieso in den Globals und damit sind diese Shift-Register überflüssig.
Globale Variablen? Das sind "Ressourcen-Fresser"!
Zitat:Ich hatte auch zuerst alles mit Queues gemacht, aber ich hatte das Lesen der globalen Variable mit der Schleifer des Queue-Elementes, was dazu geführt hat das die Daten beim Ausführen der Eventstruktur nicht angelegen haben.
Auch wenn LV nach Datenfluss arbeitet, muss du dieses Verfahren natürlich auch dort einhalten, wo kein expliziter Datenfluss besteht: Erst Daten in FGV schreiben, dann Queue beschreiben, dann im Consumer beim Queue-Event Daten aus FGV lesen.
Zitat:Grundsätzlich würde mich interessieren, warum das Konzept mit den Referenzen nicht übergreifend drahtlos auf verschiedene VIs anwendbar ist?
Diese Frage kann ich nur ganz allgemein beantworten, weil ich nicht genau weiß, was du meinst.
Selbstverständlich kannst du Referenzen auch drahtlos applikationsweit verwenden: Die Referenz sollte auf ein strict-typisiertes Element (Cluser, VI) gehen. Diese Referenz kann man in einer FGV vorhalten ...
Zitat:Wenn ich das Statisch mache und einen Draht anlegen, geht es... Also z.B. erstelle ich eine Referenz von einem Button aus dem Vertical Cluster. Speichere diese als Typedef Strict und kopiere diese in mein SubVI und greife mit einer Property Node drauf zu. Aber drahtlos geht es nicht (habe ich schon so ziemlich alle Varianten ausprobiert).
Eine Referenz ist auch nur eine Variable (im klassichen Sinne) und enthält einen Wert. Dieser Wert allerdings kann nur zur Laufzeit(!) erzeugt werden (weil das Objekt, das referenziert werden soll, erst zur Laufzeit seinen Wert bekommt).
Das Kopieren einer Referenz (beachte: du kopiert den Wert der Referenz mit!) zur Programmerstellungszeit funktioniert nicht, da bei der nächsten Laufzeit die Referenz einen anderen Wert haben kann. Du musst also z.B. in einem Init-Case den Wert der Referenz in eine FGV (oder bäh Globale Variable schreiben) und kannst den dann wo du willst verwenden.
Zitat:Macht man das immer so?
Ja, wenn es keine andere Möglichkeit gibt ...