LabVIEWForum.de - SubVI in einer While-Schleife

LabVIEWForum.de

Normale Version: SubVI in einer While-Schleife
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

das unten angehängte (vereinfachte) VI soll beim Erreichen eines Maximalwertes für den Füllstand eines
Tankes ein Zulauf-Ventil schließen, und dann beim Erreichen des Minimums wieder öffnen, bis wieder
der Maximalwert erreicht ist usw.

Wird das VI als SubVI in einer While-Schleife ausgeführt, wird jedoch zwischen Minimum und
Maximum immer der Standardwert für das Ventil (True oder False) übergeben. Dies wurde
gelöst, indem die "Lokale Variable" des Ventils, an das "Ventil" selbst übergeben wird.
Diese Lösung erscheint mir aber sehr unsauber.

Meine Frage ist, wie ich so etwas besser und eleganter bewerkstelligen kann?


Für Anregungen und Tipps wäre ich sehr dankbar!


[attachment=9097]
Hallo Blondchen,

ja, da kann man Dir nur recht geben, so ist's unsauber!
So leid es mir tut, aber es schreit mal wieder nach einer State-Machine
(endlicher Zustandsautomat), hier mit drei Zuständen:
Z1: leer ->Aktion: Ventil öffnen -> Z2: füllend
Z2: füllend (wartet bis voll) -> Aktion: Ventil schliessen -> Z3: leer-laufend
Z3: leer-laufend (wartet bis leer) -> Z1:leer

Aber bevor Du Dich in der Zustandsautomaten stürtzt:
ein shift-register tut's auch:
nicht parallel testen, sondern die cases schachteln
den Test auf >= max in den false case des Tests <= min
oder so
dann hast Du ein endergebnis, welches Du ausgeben kannst.
Das shiftregister brauchst Du, um das Ventil offen zu halten, bis voll ist
bzw zu bis leer ist

meld' Dich, wenn das vollkommen unklar war!
Gruss
PeeGee
Danke PeeGee!

Werde das ganze Mal ausprobieren und wenn ich noch
Fragen habe, melde ich mich nochmal!

Gruß Blondchen
Wenn nichts zu tun ist (also im Zustand zwischen min und max), dann mußt du doch auch an den "Magnetventil-Zulauf" nichts übergeben. Die Problem scheint zu sein, daß Du nicht weißt, was Du mit dem freistehenden Element anfangen könntest, und gewissermaßen als Verzweiflungstat übergibt Du mittels einen lokalen Variablen den Wert des Elementes an sich selbst.

2 Vorschläge:[list=1]
[*]ein einem der beiden Cases den true/False -Wert nicht an die lokale Variable übergeben, sondern an das Element selbst. Dann hast Du 2 lokale Variable weniger.<>
[*]Das Element auf "Anzeige" konfigurieren. Dann mußt Du nichts mehr daran anschließen.<>
[st]
Habe nochmal nachgedacht, mein Rat war eher suboptimal.
Du willst es ja als Sub-Vi haben.
Das Sub-VI muß die Möglichkeit haben, zwischen zwei Aufrufen sich den zuletzt gültigen Wert merken zu können. Das geschieht gewöhnlich mit einem nicht initialisierten Schieberegister, wobei man als Hilfsmittel eine While-Schleife braucht, die nur ein einziges Mal durchlaufen wird.

Eine andere Möglichkeit wäre natürlich, wenn das Sub.Vi für das Magnetventil einen Ein-und Ausgang hat. Auf den Eingang wird der bisherige Wert gegeben, am Ausgang liegt der neue Wert an. Dann braucht sich das Sub-VI nichts zu merken.
Edit: An der Max/Min-Logik stimmt einiges nicht, bitte selbst korrigieren
[attachment=9099]

(VI LV 8.2)
' schrieb:Wenn nichts zu tun ist (also im Zustand zwischen min und max), dann mußt du doch auch an den "Magnetventil-Zulauf" nichts übergeben. Die Problem scheint zu sein, daß Du nicht weißt, was Du mit dem freistehenden Element anfangen könntest, und gewissermaßen als Verzweiflungstat übergibt Du mittels einen lokalen Variablen den Wert des Elementes an sich selbst.

Das stimmt nicht ganz. Zuerst war das Element freistehend. Da hatte ich ja das Problem, dass das VI als Sub VI in der While-Schleife immer den "Standardwert" zugewiesen bekommen hat, wenn der Wert von Tank zwischen Min und Max lag. Dieses Problem trat nicht mehr auf, als ich die loakle Variable angeschlossen habe, da diese immer
noch den Wert für das Ventil vom vorhergehenden Durchlauf hatte.


' schrieb:Habe nochmal nachgedacht, mein Rat war eher suboptimal.
Du willst es ja als Sub-Vi haben.
Das Sub-VI muß die Möglichkeit haben, zwischen zwei Aufrufen sich den zuletzt gültigen Wert merken zu können. Das geschieht gewöhnlich mit einem nicht initialisierten Schieberegister, wobei man als Hilfsmittel eine While-Schleife braucht, die nur ein einziges Mal durchlaufen wird.

Eine andere Möglichkeit wäre natürlich, wenn das Sub.Vi für das Magnetventil einen Ein-und Ausgang hat. Auf den Eingang wird der bisherige Wert gegeben, am Ausgang liegt der neue Wert an. Dann braucht sich das Sub-VI nichts zu merken.
Edit: An der Max/Min-Logik stimmt einiges nicht, bitte selbst korrigieren
[attachment=36022:Magnetfeld_Zulauf.png]


Danke werde ich auch ausprobieren. Komme grad nicht dazu eure beiden Vorschläge zu testen. Jedoch vielen Dank schonmal!
' schrieb:Dieses Problem trat nicht mehr auf, als ich die loakle Variable angeschlossen habe, da diese immer
noch den Wert für das Ventil vom vorhergehenden Durchlauf hatte.

Das konnte ich nicht glauben und habs gleich probiert. Und Du hast recht: Es funktioniert tatsächlich. (Aber irgendwie suspekt ist es mir noch immer).
Also, wenn Du es so beibehalten willst und nur die Eleganz Deines SubVis etwas verbessern möchtest, dann so:
[attachment=9139]
Ich habe jetzt den Vorschlag mit der While Schleife und dem Register umgesetzt
und es funktioniert wunderbar. Das ist sicher die bessere Lösung.

Nochmals vielen Dank!
"und es funktioniert wunderbar."

... und das ist die Hauptsache!
(auch wenn ich mich schon entschuldigen wollte, dass doch der Zustandsautomat
eigentlich vier Zustände gebraucht hätte - einen für voll)Hehe

Nebenbei:
@Lucky: Diene letzte Lösung scheint mir falsch, da für Tank<Max das Ventil _immer_ zu bleibt, oder?
Aber die Verwendung der True/False-selects ist schöner lesbar als die von mir vorgeschlagenen cases!

herzlichen Gruß
PeeGee
' schrieb:Nebenbei:
@Lucky: Diene letzte Lösung scheint mir falsch, da für Tank<Max das Ventil _immer_ zu bleibt, oder?
Aber die Verwendung der True/False-selects ist schöner lesbar als die von mir vorgeschlagenen cases!

Hier die VIs zur Überprüfung.

NB: Wenn man aus dem Ausgabeelement (Anzeige) des SubVi den zuletzt übergebenen Wert mit einer lokalen Variablen beim nächsten Aufruf auslesen kann, dann könnte man das doch als Alternative für ein nichtinitialisiertes Schieberegister allgemein verwenden. Die Sache erscheint mir aber irgendwie suspekt. Mich würden dazu mal andere Meinungen interessieren.

(VIs LV 8.2)
Referenz-URLs