LabVIEWForum.de - Problem bei Typ-Einstellung mit Variant

LabVIEWForum.de

Normale Version: Problem bei Typ-Einstellung mit Variant
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

also ich rätsel jetzt schon ziemlich lange an einem Problem mit diesen Variant-Daten rum und ich komme nicht drauf. Ich will im Haupt-vi einen Wert eingeben, der im Sub-vi verarbeitet werden soll. Nun will das vi "Variant nach Daten" den "Typ", den die Daten haben sollen logischerweise wissen und ich habe keine Ahnung wie das gehen soll bzw. was ich da anhängen soll.
Ich kann mit dem Haupt-vi das Sub-vi beenden, da hab ich das halt auch so mit dem vi "Variant nach Daten" gemacht und da war das mit der Typeinstellung auch nicht wirklich schwer, aber jetzt hab ich irgendwie einen Hänger. Ich hänge das vi einfach mal mit dran.

Lv85_img

[attachment=20026]

LG
Hi Cater,

wenn Du einen DBL übergibst und den später wieder haben möchtest, mußt Du an den Typ-Anschluß des Variant nach Daten Vi's einfach eine DBL-Konstante anschließen.

[attachment=20028]

Grüße
Andreas
He Andreas,

ja genauso hatte ich mir das vorgestellt. Es funktioniert. Danke für die schnelle Antwort!


LG
Gibt es einen bestimmten Grund, warum Du allgemeine Referenzen auf Kontrollelemente übergibst?

Da Du hinterher eine feste Konversion des Variant in die verschiedenen Datentypen ohne Fehlerüberprüfung vornimmst, könnstest Du auch gleich für die Referenzen einen festen Datentyp einstellen. Dann liefert die Eigenschaft Value gleich den gewünschten Datentyp. Bei der Verwendung als SubVI würde man beim Anschließen einer Referenz auch gleich merken, wenn man den falschen Datentyp verwendet.

Wenn aber auch der Datentyp der Referenz fest ist, warum übergibst Du nicht gleich den Wert selber?
@unicorn
Diese Frage hätte ich auch noch gestellt, wenn Du mir nicht zuvor gekommen wärest.Wink
hallo,

ja ist bestimmt ne gute Frage .... Da muss ich wahrscheinlich gestehen, dass ich jetzt nicht so die Ahnung habe von den Referenzen. :blush:Ich habe halt nach ein bisschen rumprobieren festgestellt, dass es so am besten klappt, wenn man Daten, die sich laufend ändern, übergeben will. Anders kann ich auch die Referenzen nicht "bedienen".

"... könnstest Du auch gleich für die Referenzen einen festen Datentyp einstellen"
Wie geht das?

"Wenn aber auch der Datentyp der Referenz fest ist, warum übergibst Du nicht gleich den Wert selber?"
Wie ist das gemeint? Den Wert selber übergeben? Im Moment gibt man ihn im Haupt-vi ein und der wird im Sub-vi verarbeitet und dann wieder zurückgegeben.
Wie halt schon erwähnt, ich kenn' im Moment nur die eine Möglichkeit, wie ich mit Referenzen umgehe und noch funktioniert es ja .... wer weiß wie lange noch. Bin immer offen für neue Vorschläge dann wirds wahrscheinlich noch effektiver.

LG
Also die korrekte und beste Weise ist um am SubVI einen Eingang zu haben an den man den Wert direkt anschliesst und dann einen Ausgang an dem der neue Wert wieder rauskommt. Diesen Ausgang schliesst man dann z.B. an eine lokale Variable des Kontrolls.

Wahrscheinlich denkst Du jetzt aber nein, das ist doch viel aufwendiger weil die Daten in einen Draht durch das ganze Diagramm, ins VI hinein und dann wieder hinaus, geschaufelt werden müssen. Aber nichts ist weniger wahr!

Erstens LabVIEW ist ziemlich gut im Wiederverwenden von Datenbuffern. Es gibt da ein paar Dinge die man beachten muss und die können manchmal auch eingewickelt werden, aber grundsätzlich ist die einzige richtige Art um Daten in LabVIEW zu transportieren eben durch einen Draht für die Daten selber. Nur einer der Tipps in diesem Zusammenhang, man sollte bei einem SubVI die Input und Output Terminals solcher Elemente im Diagram immer ausserhalb aller Strukturen (Loops, Cases, etc) plazieren und dann gegebenenfalls systematisch durchverdrahten um die optimale Performance zu gewähren.

Zweitens ermöglichen Referenzen sehr einfach Race-Konditionen zu produzieren. Da ist kein sauberer Datenfluss mehr und sobald Du auf ein Kontroll von mehr als einer Stelle über Referenzen zugreifst ist die Reihenfolge der Zugriffe, wenn keine anderen Datenflussabhängigkeiten vorhanden sind, völlig zufällig. Spätestens wenn Du ein paar mal eine Race-Kondition debuggen musstest wirst Du Dir schwören Referenzen nie mehr unnötig zu verwenden.

Last but not least. Die Property Nodes die auf Referenzen arbeiten werden immer synchron und im UI Thread ausgeführt. Terminals und lokale Variablen werden asyncron geupdated. Das hat zwei weitreichende Folgen.
Erstens wenn Du in einer Loop ein Kontroll schnell updatest wird das mit einem Terminal oder einer lokalen Variablen ohne weiteres 100000 Iterationen pro Sekunde erreichen. Bei einem Update über eine Referenz wirst Du kaum über 100 Iterationen pro Sekunde kommen. Der Grund ist folgender: Wenn Du einen Wert in ein Terminal oder eine lokale Variable schreibst werden diese Daten in einen Buffer geschrieben und ein Flag wird gesetzt dass das Kontroll ein Update nötig hat. Der UI Thread kommt regelmässig (~50 mal pro Sekunde) vorbei und zeichnet alle Kontrolls wo das Flag gesetzt ist neu. Ja das hat als Folge dass lange nicht alle 100000 Werte die Du in der Loop geschrieben hast auch auf dem Panel sichtbar werden, aber ein Mensch ist nicht mal im Stande die nur 50 Updates pro Sekunde die der UI Thread macht sinnvoll zu verarbeiten!!!

Und da die Property Node im UI Thread ausgeführt wird muss LabVIEW jedesmal einen Kontext Switch dorthin machen den Wert (und das Kontroll updaten) und dann zurück zum Diagram switchen um die Loop weiter auszuführen. Solche Kontextswitches sind recht kostbar und das Zeichnen des Kontrolls jedesmal mindestens so viel.

Rolf Kalbermatter
' schrieb:hallo,

ja ist bestimmt ne gute Frage .... Da muss ich wahrscheinlich gestehen, dass ich jetzt nicht so die Ahnung habe von den Referenzen. :blush:Ich habe halt nach ein bisschen rumprobieren festgestellt, dass es so am besten klappt, wenn man Daten, die sich laufend ändern, übergeben will. Anders kann ich auch die Referenzen nicht "bedienen".

"... könnstest Du auch gleich für die Referenzen einen festen Datentyp einstellen"
Wie geht das?

"Wenn aber auch der Datentyp der Referenz fest ist, warum übergibst Du nicht gleich den Wert selber?"
Wie ist das gemeint? Den Wert selber übergeben? Im Moment gibt man ihn im Haupt-vi ein und der wird im Sub-vi verarbeitet und dann wieder zurückgegeben.
Wie halt schon erwähnt, ich kenn' im Moment nur die eine Möglichkeit, wie ich mit Referenzen umgehe und noch funktioniert es ja .... wer weiß wie lange noch. Bin immer offen für neue Vorschläge dann wirds wahrscheinlich noch effektiver.

LG

Z. B. für Voltage sensitivity: lege auf dem FrontPanel ein Kontrollelement an und schließe es am Connector an so wie Du es mit der Referenz getan hast. Ebenso kann Du einfach das Anzeigeelement "Angehängtes Array" am Anschluss des VI angeschlossen werden. Dort wo Du das SubVI verwendest wird dann entsprechend ein Draht zu einem Array gezogen.

Nur der vollstängigkeithalber: Wenn Du die Klasee einer Referenz genauer festlegen willst: rechte Maustaste Select VI Server Class > ... und in den Sub-Menüs auswählen. Das Ganze wird aber für den Anfang und für die meisten VI nicht gebraucht (Rolf hat es ja schon erklärt). Es wundert mich schon ein wenig wie Du die Referenzen vor der anderen Methode kennengelernt hast.
Also ...

@rolfk: Danke für die Erklärung. Ich denke ich habe das sagen wir mal zu einem dreiviertel verstanden. Da ich kein Informatiker und eigentlich auch kein Programmierer bin, ist das immer etwas schwieriger zu verstehen. Hab ich das richtig verstanden, dass das Problem an Referenzen ist, dass der Datenfluss nicht sauber, eher zufällig, sehr aufwendig (Kontextswitch) ist und wahrscheinlich Werte verloren gehen?
Das mit den lokalen Variablen und normalen Ein- und Ausgängen am VI kenn ich auch, find ich auch wesentlich einfacher und logischer, aber die diesem Fall ist das wie ein bisschen sinnlos für mich. Ich versuch mal zu erklären warum das für mich bis jetzt so ist: Wenn ich im Haupt-VI eine Messung starte, bekomme ich Werte über den DAQ-Assistenten von einem Sensor. Das Einlesen der Werte findet in dem Sub-VI statt (hab icih schon gepostet), was ich auch schon geposted hab. Wie man ja in dem VI sieht, läuft das Sub-VI ja in einer While-Schleife. Das Problem ist ja nun, dass wenn die Schleife ertsmal läuft, werden die Veränderungen vom Haupt-VI nicht mehr übertragen, wenn man lokale Variablen verwendet oder die Werte direkt eingibt. Das nützt mir aber nichts. Deshalb benutze ich die Referenzen, weil das dann ziemlich gut funktioniert. Und umgekehrt ist das auch so: Die Werte, die der Sensor liefert, werden in einem Chart angezeigt, quasi als Verlaufskontrolle. Den Graphen brauch ich aber im Haupt-VI, weil ich ja sehen will, was der Sensor macht und das Sub-VI nur im Hintergrund läuft. Benutze ich jetzt eine lokale Variable oder über einen ganz normalen Aus-/ Eingang am Vi, erscheint der Graph erst wenn das Sub-VI beendet ist. Das bringt mir nur überhaupt nichts. Wenn die Messung ne Stunde lang geht und ich seh nicht was der Sensor macht und ich stell dann nach ner Stunde fest, dass das ne Runde Müll war, wärs schlecht. Also brauch ich was, das Veränderungen vom Sub-VI ins Haupt-VI direkt überträgt. Und da bin ich auf die Referenzen gekommen. Und wenn man ein Sub-VI vom Haupt-VI aus beenden will, geht das auch nicht mit ner lokalen Variablen. Vielleicht mit ner globalen Variable, aber da weiß ich nicht wie das mit LabVIEW geht. Und die anderen Werte, die ich übergebe, verändern sich auch immer und die Veränderung muss ich sehen. Deshalb mach ich alles über die Referenzen. Wenn das auch anders möglich ist, dann wär das wirklich schön, wenn mir das mal jemand erklären würde.

@unicorn
Doch die Methode kannte ich schon ein bisschen, hab das auch schonmal gemacht, aber wie schon gesagt die nützt mir nichts. Bei diesem "Voltage sensitivity" könnte ich das wirklich so machen, aber wenn ich den Wert während der Messung doch mal verändern muss, dann gehts wieder nicht. Ich würde das so machen, wenn ich einmal einen Wert am Anfang oder am Ende von der Messung übergeben muss. Da ich aber laufend Werte übergebe, geht das vorerst erstmal nicht anders.

"Es wundert mich schon ein wenig wie Du die Referenzen vor der anderen Methode kennengelernt hast." Das ist auch erst das 3. Programm was ich versuche zu schreiben. Normalerweise braucht man das vielleicht für den Anfang wirklich nicht, aber das 2. Programm war dann so groß, dass ich halt vieles in Sub-VIs auslagern musste und dann hab ich das auch mit den lokalen Variablen und den normalen Aus-/Eingängen am Sub-VI versucht. Hab das aber ziemlich schnell wieder sein gelassen, weil es mir in den meisten Fällen eh nichts gebracht hat, sobald ich halt diese veränderlichen Daten hatte. Ich versuch halt, mir das was ich brauch irgendwie anzueignen, so dass das läuft. Eigentlich ist das auch nicht mein Fachgebiet. Und bei LabVIEW gibts auch so viel ... wenn ich da erst alles lernen wöllte dass es effektiv ist und richtig und optimal, müsste ich wahrscheinlich erstmal nen 1-monatigen Lehrgang belegenWink

Jedenfalls danke nochmal für die Erklärungen und Vorschläge!

LG
Du könntest auch die While-Schleife in das Haupt-VI verlegen...
Referenz-URLs