LabVIEWForum.de
Clusterelemente in Enum - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Clusterelemente in Enum (/Thread-Clusterelemente-in-Enum)



Clusterelemente in Enum - Mrindfleisch - 13.08.2013 07:51

Hallo zusammen,

brauche mal wieder einen Tip von Euch 2hands

ich habe mir eine recht umfangreiche LabView Anwendung gebaut und stehe jetzt vor dem Problem, dass ich einen recht großen Cluster habe in dem alle möglichen Informationen über eine queue zwischen den verschiedenen parallelen Schleifen ausgetauscht werden. Die queue ist mit der größe 1 definiert (also der gesamte cluster steht genau einmal drin). Nun soll jede Schleife beliebig einzelne elemente des Clusters beschreiben können und den gesamten Cluster lesen können.
Das lesen ist kein Problem.
Zum schreiben müsste ich die queue kurzzeitig sperren, das immer nur einer am Auslesen, verändern und schreiben ist...
Eigentlich auch kein Problem den zugriff kann man in ein SubVI packen und dieses nur einmal gleichzeitig aufrufbar machen.
Jetzt zu meinem Problem:

Ich möchte jeweils nur ein Element des Clusters ändern. Wie kann ich dem SubVI mitteilen um welches element es sich handelt.
Gibt es die Möglichkeit die Namen und Position (Reihenfolgenummern) vom Cluster (Strikte Typedef) in eine Enum oder ähnliches zu übertragen? Natürlich möglichst ohne den ganzen cluster per hand eintippen zu müssen.

die Idee ist ein SubVI zu erstellen, das einen Eingang z.B. Enum für die Position im Cluster und einen Eingang Variant für die Information besitzt. Die Information kann dann im SubVI in den Cluster einsortiert werden.

Danke schon mal

Gruß Mario


RE: clusterelemente in enum - GerdW - 13.08.2013 08:03

Hallo Mario,

mehrere Kommentare:
Zitat:Die queue ist mit der größe 1 definiert (also der gesamte cluster steht genau einmal drin).
Das ist ein klassisches Konzept, um eine Datenstruktur kollisionsfrei zu verwalten.

Zitat:Zum schreiben müsste ich die queue kurzzeitig sperren, das immer nur einer am Auslesen, verändern und schreiben ist...
Musst du nicht. Eine RMW-Operation (Read-Modify-Write) holt den Cluster aus der Queue, verändert ihn und schreibt ihn zurück. Solange die Queue leer ist, kann keine andere Instanz mit dem Cluster arbeiten - es muss ja erst gewartet werden, bis der Cluster zurückgeschrieben wurde!

Zitat:Ich möchte jeweils nur ein Element des Clusters ändern. Wie kann ich dem SubVI mitteilen um welches element es sich handelt.
Genau hier sollte man sich überlegen, ob die 1-Element-Queue immer noch das passende Konstrukt darstellt. Ich z.B. würde spätestens jetzt auf eine FGV oder ein OOP-Objekt umsteigen. Beide erlauben das Bearbeiten einzelner Elemente des Clusters, indem man entsprechende Aufrufe der FGV oder passende OOP-Methoden aufruft...

Zitat:die Idee ist ein SubVI zu erstellen, das einen Eingang z.B. Enum für die Position im Cluster und einen Eingang Variant für die Information besitzt. Die Information kann dann im SubVI in den Cluster einsortiert werden.
Meine Rede: speicher den Cluster jetzt noch in einem Schieberegister in eben diesem subVI und du hast eine saubere FGV-Lösung!


RE: clusterelemente in enum - Lucki - 13.08.2013 08:05

Mir scheint, das für Dein Problem Melder anstelle von Queues passen.
Der Unterschied: Beim Melder ist die "Queuegröße" nur 1. Die Daten werden aber nicht wie bei der Queue durch Lesen zerstört, sondern nur durch Überschreiben mit neuen Daten. Deshalb können sie von mehreren Stellen aus gelesen werden, was bei einer Queue nicht geht. (Es gibt bei Meldern noch etliche Optionen, z.B die, dass die Daten erst dann überschrieben werden können, wenn die alten Daten von allen N Stellen gelesen wurden)
Der Unterschied zwischen Meldern und Globalen/Lokalen Veriablen, FGVs beteht in der Synchronisation. Bei einer globalen Variablen weiß man nie, ob es sich um einen neuen Wert handelt, oder ob es wieder derselbe Werte ist, denn man schon 10 mal gelesen hat. Melder und Queues können beim Lesen warten, bis neue Werte da sind.
Zitat:Ich möchte jeweils nur ein Element des Clusters ändern. Wie kann ich dem SubVI mitteilen um welches element es sich handelt.
Jedes Element im Cluster hat einen Index. Du müßtest ein zusätzliches numerisches Element in den Cluster nehmen und damit dem SubVI den Index des geänderten Elementes mitteilen. (oder auch so: neuen Cluster erstellen, bestehend aus den Elementen "alter Cluster" und "Index")


RE: clusterelemente in enum - Mrindfleisch - 13.08.2013 08:51

Hallo und danke für die schnelle Antwort.

(13.08.2013 08:05 )Lucki schrieb:  Jedes Element im Cluster hat einen Index.
das weis ich, genau darauf will ich raus.

Zitat: Du müßtest ein zusätzliches numerisches Element in den Cluster nehmen und damit dem SubVI den Index des geänderten Elementes mitteilen.
genau aber wie komme ich automatisch an den Index und Namen? Giebt es da einen Eingenschaftenknoten oder sowas? und wie kommt das ganze dann vernünftig auswählbar in eine Enum oder Ring oder so?


RE: clusterelemente in enum - GerdW - 13.08.2013 08:54

Hallo Mario,

Zitat:wie komme ich automatisch an den Index und Namen? Giebt es da einen Eingenschaftenknoten oder sowas? und wie kommt das ganze dann vernünftig auswählbar in eine Enum oder Ring oder so?
Wieso willst du das automatisch machen? Der Cluster wird zur Edit-Zeit definiert, also kannst du den Index/das Enum auch zur Edit-Zeit definieren...
Ansonsten:
Referenz auf den Cluster -> Property "Controls" -> "Label"-Proerpty für jedes Control liefert dir eine Liste der Namen!
Mit dem Namensarray einen Ring erstellen, diesen dann in ein Enum umwandeln...


RE: clusterelemente in enum - Mrindfleisch - 13.08.2013 11:05

Hy,

Zitat:Wieso willst du das automatisch machen? Der Cluster wird zur Edit-Zeit definiert, also kannst du den Index/das Enum auch zur Edit-Zeit definieren...
Es soll ja garnicht während der Laufzeit erstellt werden. ich möchte einfach nur den Pflegeaufwand und die damit verbundenen Fehler minimieren, desswegen habe ich ja auch eine strikte Typdefinition aus dem Cluster gemacht. Es soll lediglich in der Editierphase das Enum automatisch geändert werden wenn ich in der Typdefinition des Clusters etwas ändere.


RE: clusterelemente in enum - jg - 13.08.2013 11:26

Ganz automatisch geht das wohl nicht, aber per VI-Skripting sollte es möglich sein, eine Enum-Typdefinition im Edit-Modus zu ändern.

Du wirst aber nicht umhin kommen, ein kleines VI zu schreiben, welches genau das macht. Automatisches Auslösen bei Änderung am Cluster Hmm schwierig...

Gruß, Jens


RE: clusterelemente in enum - gottfried - 14.08.2013 13:30

(13.08.2013 08:54 )GerdW schrieb:  [quote]wie komme ich automatisch an den Index und Namen? Giebt es da einen Eingenschaftenknoten oder sowas? und wie kommt das ganze dann vernünftig auswählbar in eine Enum oder Ring oder so?

nur so zum drüberstreuen: das geht wirklich sehr gut mit dem ClusterToolkit von Autotestware (gratis)

Gottfried.

PS.: auch Cluster on the fly erzeugen etc....


RE: Clusterelemente in Enum - Lucki - 14.08.2013 14:35

(Mist, jetzt habe ich ein Beispiel gemacht wie man den Index ermittelt, png-Bild enthielt aber Fehler, und das VI hatte ich gelöscht. Noch mal habe ich keine Lust.)

Denn was ich eigentlich sagen wollte: ich bereue meinen Vorschlag, den Index des geänderten Elementes zu übertragen, aufrichtig und ziehe ihn zurück.
Warum denn nicht gleich die Beschriftung (den Namern) des Elementes nehmen? Das sind zwar ein paar Bytes mehr, aber dafür ist das Selbst-Dokumentierend, während der Element-Index eher etwas Kryptisches ist.