INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

SubVI in einer While-Schleife



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!

11.10.2007, 08:17
Beitrag #1

Blondchen Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 64
Registriert seit: Apr 2006

2018
1996
DE

70180
Deutschland
SubVI in einer While-Schleife
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!


   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
11.10.2007, 23:33
Beitrag #2

PeeGee Offline
LVF-Grünschnabel
*


Beiträge: 10
Registriert seit: Sep 2007

2012
1997
kA

40699
Deutschland
SubVI in einer While-Schleife
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

Tee trinken und die Welt verbessern...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
12.10.2007, 07:46
Beitrag #3

Blondchen Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 64
Registriert seit: Apr 2006

2018
1996
DE

70180
Deutschland
SubVI in einer While-Schleife
Danke PeeGee!

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

Gruß Blondchen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
12.10.2007, 07:50
Beitrag #4

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
SubVI in einer While-Schleife
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]
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
12.10.2007, 08:30 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2007 13:43 von jg.)
Beitrag #5

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
SubVI in einer While-Schleife
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
   

(VI LV 8.2)


Angehängte Datei(en)
Sonstige .vi  Magnetfeld_Zulauf.vi (Größe: 9,86 KB / Downloads: 181)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
12.10.2007, 12:10
Beitrag #6

Blondchen Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 64
Registriert seit: Apr 2006

2018
1996
DE

70180
Deutschland
SubVI in einer While-Schleife
' 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!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
12.10.2007, 13:20
Beitrag #7

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
SubVI in einer While-Schleife
' 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:
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
12.10.2007, 13:37
Beitrag #8

Blondchen Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 64
Registriert seit: Apr 2006

2018
1996
DE

70180
Deutschland
SubVI in einer While-Schleife
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!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.10.2007, 10:47
Beitrag #9

PeeGee Offline
LVF-Grünschnabel
*


Beiträge: 10
Registriert seit: Sep 2007

2012
1997
kA

40699
Deutschland
SubVI in einer While-Schleife
"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

Tee trinken und die Welt verbessern...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.10.2007, 12:22 (Dieser Beitrag wurde zuletzt bearbeitet: 08.12.2007 13:44 von jg.)
Beitrag #10

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
SubVI in einer While-Schleife
' 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)


Angehängte Datei(en)
Sonstige .vi  Magnetfeld_Zulauf.vi (Größe: 10,22 KB / Downloads: 195)

Sonstige .vi  Magnetfeld_Zulauf_Sub.vi (Größe: 8,97 KB / Downloads: 160)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Schleife stoppen in subVI illy777 31 13.557 14.09.2020 18:00
Letzter Beitrag: illy777
  Drei Queues in einer While-Schleife mit case-Struktur EinVolvic 12 13.170 17.05.2017 20:25
Letzter Beitrag: EinVolvic
  Probleme seit einfügen einer For-Schleife JUON 7 5.929 14.02.2017 18:01
Letzter Beitrag: TR61
  Rechenzeit einer Schleife pro runde bekommen aidinnikoo 1 3.699 30.11.2016 13:53
Letzter Beitrag: GerdW
  Dauer einer Schleife berechnen Marius89 3 6.454 31.10.2016 09:24
Letzter Beitrag: jg
  Ansteuern einer Case Struktur mit for-Schleife berlinfatih 10 10.154 22.04.2016 05:25
Letzter Beitrag: berlinfatih

Gehe zu: