LabVIEWForum.de - SubVI parallel ausführen mit Rückgabewert

LabVIEWForum.de

Normale Version: SubVI parallel ausführen mit Rückgabewert
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

ich habe ein Main, welches ein SubVI über Referenz aufruft (Eingabeparameter ebenfalls als Referenz). Dadurch wird dieses parallel ausgeführt.

Funktionsbeschreibung:
Das Main beinhaltet ein Rundinstrument mit zwei Zeigern, welches die Ist- (blau) und Soll-Geschwindigkeit (rot) anzeigt.
Beim Drücken des Buttons "Bremsen" wird das SubVI v_Soll.vi aufgerufen und der zweite Zeiger (rot, Soll-Geschwindigkeit) läuft im Hintergrund eine Bremskurve ab.
Parallel besteht die Möglichkeit, die Ist-Geschwindigkeit mit + oder - zu verändern. Nach Ablauf der Bremskurve soll allerdings die Soll-Geschwindigkeit genau auf dem
Wert stehen bleiben, der als letztes vom SubVI ausgegeben wurde.

Dies bekomme ich nicht hin. Bei mir "hüpft" die Soll-Geschwindigkeit immer wieder auf 0.

Anbei die zwei VIs. [attachment=52568][attachment=52569]

Ich hoffe jemand versteht mein Problem. Undecided

Gruß
Stefan
Hallo Skywalker,

Zitat:Nach Ablauf der Bremskurve soll allerdings die Soll-Geschwindigkeit genau auf dem Wert stehen bleiben, der als letztes vom SubVI ausgegeben wurde.
Die rote Nadel bleibt doch genau da stehen, wo sie vom subVI hingestellt wurde: bei einem Wert von ~95…

Zitat:Ich hoffe jemand versteht mein Problem.
Nicht wirklich…
Wieso muss das mit einem subVI erledigt werden, welches per VI-Server aufgerufen wird?
Wieso über Referenzen die Anzeigen beeinflussen?

Ich kann mir auch nicht vorstellen, warum zum Bremsen die Soll-Geschwindigkeit auf 165 erhöht werden muss!?
Hallo,

die rote Nadel bleibt da stehen, aber sobald ich wieder die Ist-Geschwindigkeit verändere, springt die rote Nadel auf 0. Genau das soll nicht passieren, sondern in diesem Fall auf 95 bleiben.

Das gezeigt Programmbeispiel repräsentiert nur einen Teil des gesamten Programms. Die Bremskurve für die Soll-Geschwindigkeit (rot) beginnt nun Mal bei 165 km/h und läuft die definierte lineare Bremskurve bis 95 km/h ab.
Wie kann ich denn die Anzeigen ohne Referenzen von SubVI aus beeinflussen?
Hallo skywalker,

THINK DATAFLOW!
Im Erhöhen/Verringern-State greifst du auf ein Schieberegister zu- im Bremsen-State dagegen nicht.

Wie soll das Schieberegister mitbekommen, dass du irgendwelche Werte geändert hast? Also bleibt dieser Sollwert dort immer Null…

Zitat:Wie kann ich denn die Anzeigen ohne Referenzen von SubVI aus beeinflussen?
Mit einer sauberen Statemachine.
Mit einem subVI, welches Eingangsparameter hat und Werte ausgibt (oder gleich diesen Cluster bearbeitet).
Guten morgen,

ich stehe irgendwie auf dem Schlauch.

Mir ist bewusst, dass ich im Verringern-/Erhöhen-State ein Schieberegister nutze und im Bremsen-State nicht.
Aber wie kann ich von SubVI sagen, dass die Soll-Geschwindigkeit in das Schieberegister des Main geschrieben werden soll?

Wie gesagt, das gepostete Beispiel repräsentiert nur einen Ausschnitt des Gesamtprogrammes. Im "richtigen" Programm nutze ich die Statemachine mit Typedefs.

@GerdW: Könntest du bitte erklären, was das bedeutet?
Zitat:Mit einem subVI, welches Eingangsparameter hat und Werte ausgibt (oder gleich diesen Cluster bearbeitet).

Stefan
Hallo skywalker,

Zitat:Aber wie kann ich von SubVI sagen, dass die Soll-Geschwindigkeit in das Schieberegister des Main geschrieben werden soll?
Direkt vom subVI aus kannst du nicht auf das Schieberegister zugreifen.

Aber du kannst ja dein MainVI entsprechend anpassen - z.B. mit Events statt mit Referenzen arbeiten und neue Werte per Event (ValueSignalling oder UserEvent) vom subVI ins MainVI schicken. Dann kann das MainVI dafür sorgen, dass der neue Wert an der korrekten Stelle gespeichert wird…

Zitat:Könntest du bitte erklären, was das bedeutet?
Ich meine damit ein handelsübliches subVI mit Ein- und Ausgängen, welches direkt im MainVI eingebunden wird, statt eines Aufrufs über den VIServer…
Ich kann vom SubVI Events ins Main schicken? Das wusste ich nicht. Wie geht das?

Im Main greife ich dann mit der Eventstruktur (seperate while-Schleife) die Wertänderung des Drehknopfes (Geschwindigkeit) ab und schicke diese in diese in den entsprechenden Case.
Hallo skywalker,

Zitat:Wie geht das?
Ich wiederhole aus meinem vorigen Beitrag:
Zitat:per Event (ValueSignalling oder UserEvent)
Hallo,

ich habe es jetzt mit einer Queue realisiert und es scheint zu klappen.

[attachment=52585][attachment=52584]

Allerdings rufe ich das SubVI weiterhin über VIServer auf. Anders sehe ich keine Möglichkeit, die Bremskurve parallel im Hintergrund laufen zu lassen und gleichzeitig die Ist-Geschwindigkeit im Main zu ändern.
Hallo skywalker,

Zitat:Anders sehe ich keine Möglichkeit, die Bremskurve parallel im Hintergrund laufen zu lassen und gleichzeitig die Ist-Geschwindigkeit im Main zu ändern.
Pack die "Bremskurve" in eine parallel laufende Schleife mit einer kleinen Statemachine (Idle, Bremsen, Quit)…
Referenz-URLs