LabVIEWForum.de
Vermeiden von Globalenvariablen aber wie? - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Vermeiden von Globalenvariablen aber wie? (/Thread-Vermeiden-von-Globalenvariablen-aber-wie)

Seiten: 1 2 3 4 5


Vermeiden von Globalenvariablen aber wie? - cb - 21.01.2009 10:26

' schrieb:Vielen dank! Werde mir das mal anschauen! Gibt es alles in LabVIEW 6.1?
Was ist eigentlich der unteschied von notifier zu queues? Und wann braucht man welches?

eine queue ist eine Warteschlange, das kann man sich vorstellen wie eine Drucker-Warteschlange, man schickt viele Druck-Jobs ab und die werden nach und nach abgearbeitet, die Queue speichert alle Elemente die man einfügt und gibt bei jedem Auslesen das älteste Element zurück

ein Notifier ist eigentlich das gleiche wie eine Queue, allerdings ohne die Warteschlange, d.h. er kann immer nur EIN Element transportieren. Wenn man ein neues Element einfügt bevor das alte ausgelesen wurde, wird das ältere Element überschrieben

Und zum Thema:
ich hab auch kein Problem damit Globale Variablen und lokale Variablen zu verwenden. Der schlechte Ruf dieser Elemente kommt unter anderem daher, dass der massive Einsatz von lokalen und globalen Variablen dazu führt dass man Spaghetti-Code bekommt, denn kein Schwein mehr lesen kann ...


Vermeiden von Globalenvariablen aber wie? - Y-P - 21.01.2009 10:28

Schau' auch mal hier.
Noch was: Mit LabVIEW 6.1 wird die Luft immer dünner. Schon jetzt gibt es nur noch wenige User mit LabVIEW 7, die Dir auf Deine Version zurückspeichern können. Ich würde Dir raten, mal aufzurüsten. Im Sommer kommt ja (wohl) LabVIEW 9 raus.

Gruß Markus

' schrieb:Vielen dank! Werde mir das mal anschauen! Gibt es alles in LabVIEW 6.1?
Was ist eigentlich der unteschied von notifier zu queues? Und wann braucht man welches?



Vermeiden von Globalenvariablen aber wie? - Cardinal1664 - 21.01.2009 10:33

Ich hätte mir schon längst LabVIEW 8.6 besorgt! Aber in meinem Betrieb ist es im moment wohl nicht gerade ideal für neuanschaffunfenAngry!
Danke für den Link!

PS: habe dies aus der LabVIEW Help zum Thema Globale variablen:
"Use local and global variables only when necessary. Overuse can cause slower execution, inefficient memory usage, or race conditions. "
Wie sieht dies eigentlich bei queues aus mit slower execution, inefficient memory usage?


Vermeiden von Globalenvariablen aber wie? - Lucki - 21.01.2009 10:48

' schrieb:Gibt es alles in LabVIEW 6.1?
Weiß ich jetzt auch nicht, aber auf jeden Fall kann man (mit etwas umständlcierer Programmierung) einen Melder auch durch ein VI (funktionale gloabel Variable) ersetzen. In dem VI muß außer dem Wert noch eine boolsche Variable enthalten sein, damit lassen sich dann bei entprechender Abfrage Sender- und Empfänger-VI synchronisieren:
[attachment=16228]


Vermeiden von Globalenvariablen aber wie? - Cardinal1664 - 21.01.2009 11:16

So ich versuch mal mein Programm zu beschreiebn!

Um was gehts
Ich habe eine Programmierbox wo ich 8 Mikrokontroller Systeme drauf stecken kann!
Das ziel meines Programmes ist es auf die 8 Mikrokontroller parallel die Software (Applikation) zu flashen!

Das LabVIEW programm
Haupt VI
Im HauptVI kann die Softwere die auf alle 8 MCUs Programmiert werden soll ausgewählt werden!
Es sollen diverse Sachen wie MSK Programmiert den Status (Wo ist mein Programm gerade z.B. MCU wird gelöscht) angezeigt werden!

SUBVI (Statmachine):
Das VI Statemachine wird dann später einmal 8mal Parallel ausgeführt um die 8 MCUs gleichzeitig zu programmieren!
Ich habe diverse States (Cases) z.B. Programmieren,CRC Check usw.! In diesen Cases will ich immer den Status (z.B. CRC Check OK!) im hauptVI anzeigen!

Am anfang habe ich dies mit Globalen Variablen gelöst!
Ich habe nun die Globale Variable "MSK Status" mit einem queue ersetzt!

Ist dies so richtig wie ich die queue verwende oder gibt es da noch eine andere möglich keit?

Ich hoffe ihr versteht was ich meine!


Vermeiden von Globalenvariablen aber wie? - eg - 21.01.2009 11:28

Im Prinzip würde ich es mit Queues machen, also weiter so, du kriegst es shon hin.
Anderer Vorschlag zu deinen unübersichtlichen VIs. Du kannst alle deine Schieberegister im SubVI zu einem Schieberegister zusammenfügen. Mache dir einen Cluster aus allen nötigen Elementen und lass diesen Cluster im Schieberegister laufen. Mit Bundle/Unbundle by Name kannst du auf die Elemente innerhalb deiner Cases zugreifen.
Und zuletzt: versuche Mal all deine globale Variablen mit Queues ersetzen. Ich meine du brauchst ja im Prinzip nur eine Queue pro Schleife. Diese Queue machst du von einem unbestimmten Datentyp (String oder Variant) und kannst beliebige Daten (vorher in String oder Variant umwandeln) in die Queue schreiben und genauso beim Empfänger in den entsprechenden Datentyp zurückwandeln.

Gruß, eg


Vermeiden von Globalenvariablen aber wie? - Cardinal1664 - 21.01.2009 11:55

Vielen dank für deine schnelle antwort!!

Wie soll das gehen nur ein queue pro schleife? Du meinst in der Statemachine nur ein queue wo ich alle "Variablen" reinschreibe?
Wie weiss dann der Empfänger (sind ja mehrere empfänger) Welche Daten für ihn sind und welchenicht?


Vermeiden von Globalenvariablen aber wie? - eg - 21.01.2009 12:00

Screibe noch vor den eigentlichen Daten einen Header rein. Zum Beispiel willst du einen Cluster mit Namen und Alter abschicken. Nennen wir es "User Data" und anderes Mal nur einen boolschen Wert, nennen wir es "Online". Dann machst du dir einen Cluster aus:

Datentypbezeichnung
Daten selbst

Im ersten Fall wäre es dann:

User Data
Eugen
29

Im zweiten:

Online
TRUE

Der Empfänger schaut zuerst auf die Datentypbezeichnung und abhängig davon kann er die Daten in den richtigen Datentyp wandeln.

Gruß, eg


Vermeiden von Globalenvariablen aber wie? - eg - 21.01.2009 12:04

' schrieb:Vielen dank für deine schnelle antwort!!

Wie soll das gehen nur ein queue pro schleife? Du meinst in der Statemachine nur ein queue wo ich alle "Variablen" reinschreibe?
Wie weiss dann der Empfänger (sind ja mehrere empfänger) Welche Daten für ihn sind und welchenicht?

Und ja, jeder Empfänger hat ja nur eine Queue. Der Absender wählt einfach die passende Queuereferenz (die zum richtigen Empfänger gehört) aus und schickt die Daten in diese Queue ab. Der Empfänger wartet ja nur auf die Daten nur von einer Queue, nähmlich seine Queue. Warum muss er noch wissen ob die Daten für ihn sind? Das sind sie ja, sonst würde er diese Daten nicht bekommen.


Vermeiden von Globalenvariablen aber wie? - eg - 21.01.2009 12:15

1) Cluster mit allen Queue-Referenzen (so viele wie es parallele Schleifen gibt)
2) Daten in String umwandeln ("temp" ist die Datentypbezeichnung, "eur" ist der Empfänger)
3) Daten aus dem String umwandeln ("aq2 data" ist die Datentypbezeichnung)
4) alle parallelen Schleifen

Den Cluster mit allen Queuereferenzen (siehe Punkt 1) bekommen ALLE parallele Schleifen (Tasks) und können damit jeder-zu-jedem Daten austauschen.

Im zweiten Bild also eine parallele Task. Sie bekommt den Befehl (oder auch Datentypbezeichnung) "temp" setzt die Temperatur und sendet eine Antwort (OK oder nicht OK) an die Main-Task zurück. Das nennt man dann schon Handshake.

Und ja, damit ihr es glaubt, dass das ganze Funktioniert, noch ein Bild der OberflächeBig Grin