LabVIEWForum.de - "rentrant" SubVI zum Triggern von Events

LabVIEWForum.de

Normale Version: "rentrant" SubVI zum Triggern von Events
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen

Ich habe ein Problem mit einem als "reentrant. definiertem VI welches ich hier mal versuche zu beschreiben.
Meine Steuerung hat mehrere Buttons, wobei jeder bei Betätigung einen "Event" auslöst.
Am Ende jedes "Events" wird der entsprechende Button zurückgesetzt.
Für den Aufruf der Events habe ich mir nun ein kleines SubVI gebaut welches die Buttons mit einer Property Node -> "Value (Signaling)" setzt.
In diesem SubVI möchte ich eigentlich so lange hängen bleiben, bis der entsprechende Event abgearbeitet ist.
Das Ganze funktioniert aber nicht mehr, sobald das SubVI als "reentrant" definiert ist.

An meiner aktuellen Problemstelle habe ich das genannte SubVI 4x nebeneinander platziert .
Anstatt nun das erste ausgeführt wird und darin gewartet wird bis der Event beendet ist werden die anderen direkt anschliessend ausgeführt und ich bekommen ein Durcheinander mit meinen Events.
Ist dieses Verhalten nachvollziehbar? Wenn ja, gibt es ev. eine Möglichkeit bei der ich die SubVI's trotzdem "reentrant" lassen kann?


Ich hoffe meine Problematik ist einigermassen verständlich. Angel_not

Gruss
Oli
Hallo Oli,

Zitat:In diesem SubVI möchte ich eigentlich so lange hängen bleiben, bis der entsprechende Event abgearbeitet ist.
Das Ganze funktioniert aber nicht mehr, sobald das SubVI als "reentrant" definiert ist. …
Ist dieses Verhalten nachvollziehbar?
Ok, du feuerst ein Event durch Aufruf der ValSgnl-Property. Dann startet das Event und du wartest, bis im Event der Button zurückgesetzt wird.
Das wird mit einem subVI prima funktionieren.

Nun probierst du mit dem reentrantVI, mehrere Events zu starten und abzuwarten - gleichzeitig.
Das mit dem Triggern wird gleichzeitig funktionieren. Nur beim Warten hast du ein Problem: sehr wahrscheinlich verwendest du genau eine Event-Struktur mit mehreren Event-Cases. Und die wiederum befolgen strikt den DATAFLOW - THINK DATAFLOW!
Es hilft nichts, dein subVI reentrant zu gestalten, wenn die eine Event-Struktur eben nicht reentrant arbeitet!

Es kann in einer Event-Struktur immer nur ein Event bearbeitet werden, die anderen Events kommen in eine Queue und werden abgearbeitet, sobald dafür Zeit (und DATAFLOW) ist!

Mögliche Lösungen:
- parallele Eventstrukturen für die verschiedenen Buttons: das fällt unter die Kategorie "fehleranfällig" und "nicht empfohlen"
- ein besseres Producer-Consumer-Schema aufbauen, mit mehreren Consumern, die sich parallel um die Buttons kümmern…
- Es gibt da dieses ActorFramework, das sollte damit umgehen können. Habe ich aber noch nicht benutzt…
- Verzicht auf die PropertyNodes (es ist eh idiotischhochgradig unvernünftig, PropertyNodes im 1kHz-Takt zu pollen) und eben ein Producer-Consumer-Schema aufbauen!
Besten Dank GerdW

Mein aktuelles Problem liegt darin, dass ich die Events eigentlich nicht gleichzeitig triggern möchte, sondern bewusst sequenziell.
Solange mein gezeigtes SubVI nicht "reentrant" war hat auch alles prima funktioniert.
Der Grund dass ich es nun "reentrant" gemacht habe hat einen anderen Hintergrund. Vieleicht ist es am besten wenn ich es versuche wieder "nicht reentrant" zu machen und mein anderes Problem anders löse.
Ich verstehe nur noch nicht ganz wieso nicht im SubVI gewartet wird bis der entsprechende Event beendet wird, wenn das SubVI als "reentrant" definiert ist. Wenn ich z.B. 4 SubVIs nebeneinander platziere sollten diese doch trotzdem sequenziell abgearbeitet werden, auch wenn sie "reentrant" sind.

Bis anhin habe ich meine Steuerungen immer ähnlich aufgebaut und das hat auch immer prima funktioniert.
Ich habe das Ganze hier mal "sehr" vereinfacht versucht darzustellen:
[attachment=52950]


Bei meinem aktuellen Problem sieht das Ganze dann "sehr" vereinfacht etwa so aus:
[attachment=52951]

Das heisst wenn die Events nun durch definieren von "reentrant" gleichzeitig getriggert werden, verstehe ich dass das Ganze nicht funktionieren kann.

Gruss
Oli
Dein Screenshot 2 funktioniert generell nicht, egal ob reentrant oder Standard, denn:
  • Reentrant ist vollkommen überflüssig, da du das VI durch die Sequenzstruktur zwingend sequentiell abarbeitest
  • In der Event-Struktur hast du im Screenshot aber nur das Event für Button 1 definiert, obwohl du in diesem Event eigentlich auch auf Button 2 & 3 regieren willst. Da stimmt was nicht...
Besten Dank auch dir jg

Du hast natürlich recht, da habe ich etwas zu viel vereinfacht, das war mein Fehler.
Selbstverständlich sieht es so aus:
[attachment=52952]

Ich habe ebenfalls "sehr" vereinfacht noch versucht darzustellen wieso ich das SubVI überhaupt auf "reentrant" gesetzt habe.
Eigentlich existiert noch ein dritter Loop in dem ebenfalls Events getriggert werden. (Loop mit "Routine 1")
Wenn nun das SubVI nicht "reentrant" ist, so wird es im dritten Loop (im untersten) nie ausgeführt, da es zu diesem Zeitpunkt noch im obersten Loop am abarbeiten ist.
Dieser dritte Loop habe ich im Nachhinein ergänzt, ich fand gerade keine schlauere Lösung dazu.
Hier das Ganze noch bildlich dargestellt:
[attachment=52953]

Gruss
Oli
Hallo Oli,

Zitat:Wenn nun das SubVI nicht "reentrant" ist, so wird es im dritten Loop (im untersten) nie ausgeführt, da es zu diesem Zeitpunkt noch im obersten Loop am abarbeiten ist.
Für "Routine 1" gibt es kein Event, auf dass dein subVI schauen kann?

Zitat:ich fand gerade keine schlauere Lösung dazu.
Wie wäre es mit einer "queue driven state machine"?
Eine Statemachine bietet sich immer an, wenn man halbwegs feste (aka "definierte") Abläufe automatisieren will…
Referenz-URLs