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!
ich wollte wissen, wie ich in einem SubVI überprüfen kann, ob bestimmte Eingänge im aufrufenden VI verdrahtet sind oder nicht.
Hintergrund:
Ich habe eine FGV mit mehreren Eingängen. Es besteht die Notwendigkeit, bestimmte Kombinationen von Eingängen zu verdrahten, d.h. mal will ich in Eingang A und C schreiben, mal nur C, mal A, D und C und so weiter. Wenn ich aber einen "Schreibe auf allen Eingängen"-Case zulasse, so gehen die Daten der unverdrahteten verloren (da sie den Momentanwert des Bedienelements bekommen).
Weiß jemand eine Lösung?
Anzeige
19.11.2009, 19:47 (Dieser Beitrag wurde zuletzt bearbeitet: 19.11.2009 19:59 von Lucki.)
Mir fällt dazu auch nichts Besseres als das:
Als Standardwert einen Wert nehmen, der normalerweise bei angeschlossenem Eingang nicht vorkommt, also z.B NaN bei dbl-Format.
Und dann per Case-Unterscheidung dafür sorgen, daß, wenn der Standardwert vorkommt, also am Eingang nichts angeschlossen ist, der alte Wert im FGV-VI nicht überschrieben wird.
Die Methode im Beispiel funktioniert natürlich nicht, wenn NaN auch als regulärer Wert vorkommen kann, es ist also nicht unbedingt die Universal-Lösung. Besser wäre es, wenn ein VI direkt erkennen könnte, ob ein Eingang verdrahtet ist oder nicht. Die Funktionen von NI selbst beherschen diese Unterscheidung, aber es wird nach meinem Kenntnisstand nicht verraten, wie sie das machen.
Mir ist gerade selbst was eingefallen: Ich beschreibe im Spalt rechts zwischen Case- und For-Struktur per Eigenschaftsknoten das Bedienelement mit dem jeweils aktuellen Wert. So müsste das gehen...
Du könntest für jeden Fall einen Case machen. Wenn du nur A schreiben willst, dann nimm nur den Wert von A entgegen. Wenn du dafür die Werte alten Werte von B und C benötigst, dann holst du sie dir aus dem lokalen Speicher. Wenn das mit den Referenzen klappt solltest du es nur anwenden, wenn deine FGV nicht oft aufgerufen wird, da die Wertübergabe per Referenz sehr langsam ist.
@Lucki: Welche Funktion zeigt soch ein Verhalten? Ist mir völlig unbekannt. Kenne nur die Möglichkeit, einen Eingang als "Erforderlich" zu setzen, was zur Folge hat, dass das VI bei fehlender Verdrahtung nicht ausführbar ist.
Sinn eines FGV ist es doch, Werte, die ich im Speicher halten will, in einem Schieberegister der äußeren While-Schleife zu speichern.
Und wenn ich im Fall X den Eingang A nicht brauche, dann wird damit in Fall X nichts gemacht. Wenn Eingang A dafür im Fall Y gebraucht wird, wird er auch im Fall Y verwendet. Ich sehe keinen Bedarf, irgendeinen Wert per PropertyNode zu lesen oder zu schreiben...
Wenn du dir jetzt nicht merken willst, bei welchem Fall des FGV du welche Eingänge brauchst und welche nicht, dann schreibst du einfach für jeden Aufruffall ein eigenes VI.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
' schrieb:@Lucki: Welche Funktion zeigt soch ein Verhalten? Ist mir völlig unbekannt.
Nehmen wir als ein Beispiel von etlichen anderen die Funktion "Aus Array entfernen".
Wenn ich dort (oberes Bild) als Länge nichts anschliieße, wird als zu entfernende Länge 1 benutzt. Der gelöschte Teil ist eine einfache Zahl.
Wenn ich aber die Länge 1 an den Input tatsächlich anschließe, sollte man meinen es kommt das Gleiche heraus. Nicht ganz: der gelöschte Teil ist jetzt ein Array der Länge 1.
Und es geht weiter: Wenn ich an diesen Eingang mit der rechten Maustaste eine Konstante erzeuge, so hat diese den Wert 0. Der gelöschte Teil ist dann ein leeres Array.
Ich möchte den sehen, der ein solches Verhalten in einem eigenen SubVI nachbaut. Ich meine, daß NI beim Erstellen seiner VIs über Features verfügt, die den "Menschen draußen im Lande" (- wie unsere Bundeskanzlerin zu sagen pflegt -) nicht zur Verfügung stehen.
Anzeige
19.11.2009, 23:46 (Dieser Beitrag wurde zuletzt bearbeitet: 19.11.2009 23:47 von schrotti.)
' schrieb:Und wenn ich im Fall X den Eingang A nicht brauche, dann wird damit in Fall X nichts gemacht. Wenn Eingang A dafür im Fall Y gebraucht wird, wird er auch im Fall Y verwendet.
Also hier liegst Du entweder ganz falsch oder ich versteh nicht wie Du das meinst.
Wenn man den Eingang A nicht braucht, ihn also nicht anschließt, dann wird eben doch etwas gemacht: Es wird der Standardwert genommen, und der ist nicht identisch mit dem alten Wert im Shift-Register, den man erhalten möchte.
Ja, wenn es gelänge, ein SubVI bei mehrfachem Aufruf dazu zu bringen, daß es, wenn ein Eingang nicht angeschlossen ist, statt des Standardwertes den zuletzt eingegebenen Wert verwendet, dann wäre das Problem radikal gelöst. So radikal, daß man für die Speicherung eines Wertes in einer FGV gar kein Shiftegister mehr bräuchte.
Man braucht eben in einer FGV immer noch einen boolschen Eingang, mit dem ich dem VI sage, daß ein neuer Wert am Eingang anliegt. Den Knopf brauche ich deshalb, weil das SubVI zu dumm ist selbst zu erkennen, ob ein Eingang angeschlossen ist oder nicht.
Es ist durchaus aus möglich, in einer FGV beliebig viele Werte zu speichern, aber dann braucht man eben für jede dieser Varablen einen seperaten boolschen Knopf. Also so:
' schrieb:Nehmen wir als ein Beispiel von etlichen anderen die Funktion "Aus Array entfernen".
[attachment=50861:clipInputs.png]
Wenn ich dort (oberes Bild) als Länge nichts anschliieße, wird als zu entfernende Länge 1 benutzt. Der gelöschte Teil ist eine einfache Zahl.
Wenn ich aber die Länge 1 an den Input tatsächlich anschließe, sollte man meinen es kommt das Gleiche heraus. Nicht ganz: der gelöschte Teil ist jetzt ein Array der Länge 1.
Und es geht weiter: Wenn ich an diesen Eingang mit der rechten Maustaste eine Konstante erzeuge, so hat diese den Wert 0. Der gelöschte Teil ist dann ein leeres Array.
Ich möchte den sehen, der ein solches Verhalten in einem eigenen SubVI nachbaut. Ich meine, daß NI beim Erstellen seiner VIs über Features verfügt, die den "Menschen draußen im Lande" (- wie unsere Bundeskanzlerin zu sagen pflegt -) nicht zur Verfügung stehen.
Ist das nicht einfach ein optionaler Anschluss mit Standardwert 1???
LG
Torsten
"Über Fragen, die ich nicht beantworten kann, zerbreche ich mir nicht den Kopf!" (Konrad Zuse)
Ich habe mich vor einiger Zeit mit einer ähnlichen Problematik auseinandergesetzt.
In einer FGV werden die Daten in einem Cluster gespeichert. Damit wollte ich erreichen, nur ein Read im Enum zum steuern der FGV zu haben, ebenso nur ein Write. Das funktionierte auch ganz gut, nach dem Read kann man mit "unbundle by name" den Wert(oder mehrere) bekommen den man will.
Beim Schreiben mit "bundle by name" wurden aber immer nur die angeschlossenen Werte geschrieben, nicht angeschlossene Werte bekamen die Werte aus der Konstanten. Werte die in einem vorhergehenden Write in die FGV gespeichert wurden gingen so wieder verloren (Bild1).
Erste Abhilfe habe ich mir dann beschafft, indem ich die FGV vor dem Write einfach ausgelesen habe und die Ausgabe als "Konstante" für "bundle by name" genutzt habe (Bild2).
#1
#2
Funktioniert... hat mir aber nicht so gefallen. Daher habe ich nach einer Möglichkeit gesucht, nur Werte im Cluster der FGV zu speichern, wenn diese von einem Standardwert abweichen. In meinem Fall ein leerer String und NaN.
Was ich jetzt noch lösen müsste, wäre das Rücksetzen von einem Clustereintrag auf den Init-Wert. Einfach NaN zu speichern geht ja nicht, da das dem Standard entspeicht und ignoriert wird. Aber das ist für mich im Moment nicht so wichtig.
In der neuen FGV vergleiche ich also die Werte im Cluster mit den Standardwerten, nur wenn die neuen Werte ungleich dem Standard sind, werden sie gespeichert (Bild5) ansonsten wird der Wert aus dem Shiftreg. der FGV behalten (Bild6).
#3
#4
#5
#6
Vielleicht hilft es dir, bestimmt kann man das eleganter lösen...
Gruß SeBa
Dieser Beitrag soll weder nützlich, informativ noch lesbar sein.
Er erhebt lediglich den Anspruch dort wo er ungenau ist, wenigstens eindeutig ungenau zu sein.
In Fällen größerer Abweichungen ist es immer der Leser, der sich geirrt hat.
Rette einen Baum!
Diesen Beitrag nur ausdrucken, wenn unbedingt nötig!