LabVIEWForum.de
Enum-Variable "zurücksetzen" - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Enum-Variable "zurücksetzen" (/Thread-Enum-Variable-zuruecksetzen)



Enum-Variable "zurücksetzen" - Hans96 - 04.01.2023 15:33

Hallo zusammen,

ich bin mal wieder auf ein Problem bei meiner Programmierung gestoßen.
Ich bediene ein externes Gerät mit LabVIEW und schicke verschiedene Befehle. Die Befehle sind in einer Case-Struktur, welche über einen Enum-Selektor bedient wird.
Nun möchte ich aber dass nicht dauernd der Befehl gesendet wird sondern nach der Ausführung wieder der Standard-Case ausgewählt wird.
Meine ersten Gedanken waren eine Ereignisstruktur die auf Knopfdruck reagiert. Allerdings habe ich damit noch nicht so viel gearbeitet und wollte daher erst fragen ob das überhaupt möglich ist bevor ich darein Zeit investiere.
Mein zweiter Gedanke war die Enum-Variable irgendwie wieder auf den Standardwert zu setzen aber da weiß ich leider nicht wie. Evtl über eine globale Variable?

Ich freue mich über eure Antwort und evtl. auch andere Lösungsvorschläge.

PS: Screenshot kann ich gerade aufgrund PC-Wartung nicht machen aber ich hoffe es ist verständlich geworden.


RE: Enum-Variable "zurücksetzen" - GerdW - 04.01.2023 16:09

Hallo Hans,

Zitat:Ich bediene ein externes Gerät mit LabVIEW und schicke verschiedene Befehle. Die Befehle sind in einer Case-Struktur, welche über einen Enum-Selektor bedient wird.
Nun möchte ich aber dass nicht dauernd der Befehl gesendet wird sondern nach der Ausführung wieder der Standard-Case ausgewählt wird.
Meine ersten Gedanken waren eine Ereignisstruktur die auf Knopfdruck reagiert. Allerdings habe ich damit noch nicht so viel gearbeitet und wollte daher erst fragen ob das überhaupt möglich ist bevor ich darein Zeit investiere.
Mein zweiter Gedanke war die Enum-Variable irgendwie wieder auf den Standardwert zu setzen aber da weiß ich leider nicht wie. Evtl über eine globale Variable?

PS: Screenshot kann ich gerade aufgrund PC-Wartung nicht machen aber ich hoffe es ist verständlich geworden.
So richtig verständlich ist es nicht…

Du hast einen ENUM-Wert, der einen Case in einer Case-Struktur selektiert.
Warum musst du den Wert "zurücksetzen", wenn der Case abgearbeitet wurde???

Wie wird denn das ENUM an diese Case-Struktur übergeben? Du verwendest doch hoffentlich eine Producer-Consumer-Struktur mit einer Queue, sodass immer nur ein Befehl nach dem anderen abgearbeitet wird? Wie kann es da zu Wiederholungen kommen???


RE: Enum-Variable "zurücksetzen" - TpunktN - 05.01.2023 07:27

(04.01.2023 15:33 )Hans96 schrieb:  Meine ersten Gedanken waren eine Ereignisstruktur die auf Knopfdruck reagiert. Allerdings habe ich damit noch nicht so viel gearbeitet und wollte daher erst fragen ob das überhaupt möglich ist bevor ich darein Zeit investiere.

Hallo Hans,

soweit ich es verstanden habe ist die Ereignisstruktur keine schlechte Idee und wenn du noch nicht so viel Erfahrung hast ist das auf jedenfall keine Zeitverschwendung dir die mal genauer anzuschauen.

Leider kann hier niemand hellsehen und ohne VI sachlich richtig helfen.

Gut's neu's
Timo


RE: Enum-Variable "zurücksetzen" - Hans96 - 05.01.2023 08:57

Erstmal danke für eure Antworten.
Ich hab das VI jetzt auf das Wesentliche heruntergebrochen und einen Screenshot angehängt.

Grundsätzlich läuft das Programm in einer While-Schleife in der eine große Case-Struktur ist, die über eine Enum-Konstante umgeschaltet wird.
In einer dieser Case-Strukturen ist ein Enum-Bedienelement über das ich die verschiedenen Befehle A,B,C und D schicken möchte je nach Auswahl des Bedienelementes.
Nun möchte ich aber dass nach jedem geschickten Befehl (A,B oder C) automatisch wieder der Case D ausgewählt wird, damit nicht bei jedem Schleifendurchlauf erneut der ausgewählte Befehl gesendet wird.

Ich hoffe jetzt ist es etwas verständlicher geworden.

EDIT: Mir ist bewusst, dass ich das auch über eine lokale Variable zurücksetzen kann aber das versuche ich zu vermeiden.


RE: Enum-Variable "zurücksetzen" - GerdW - 05.01.2023 09:49

Hallo Hans,

Zitat:In einer dieser Case-Strukturen ist ein Enum-Bedienelement über das ich die verschiedenen Befehle A,B,C und D schicken möchte je nach Auswahl des Bedienelementes.
Nun möchte ich aber dass nach jedem geschickten Befehl (A,B oder C) automatisch wieder der Case D ausgewählt wird, damit nicht bei jedem Schleifendurchlauf erneut der ausgewählte Befehl gesendet wird.

Ich hoffe jetzt ist es etwas verständlicher geworden.
Etwas…

Warum verwendest du kein Schieberegister für diesen Befehl, wenn du nach Abarbeiten eines Cases deiner Statemachine einen anderen Befehl im nächsten Durchlauf ausführen willst?

Und eine Frage ist immer noch offen: wie kommen die Befehle in die Statemachine hinein?
Wenn es sich um User-Input auf dem FP handelt:
- einen State einfügen, der sich um Userinput kümmert und dann den gewünschten Befehl ins Schieberegister einträgt
- gern eine Eventstruktur verwenden, um Userinput abzufragen…

Zitat:EDIT: Mir ist bewusst, dass ich das auch über eine lokale Variable zurücksetzen kann aber das versuche ich zu vermeiden.
Dein User wird sich freuen, wenn dein Programm seinen Input eventuell gleich wieder überschreibt.
Stichwort "race conditions"…


RE: Enum-Variable "zurücksetzen" - TpunktN - 05.01.2023 12:35

So wirklich verstehe ich es nicht. Kannst du mal erklären was der Sin ndahinter ist und was du erreichen willst?

In Bildern geht sehr viel kontext verloren, vorallem wenn die noch gekürzt/vereinfacht werden.

Grüße Timo


RE: Enum-Variable "zurücksetzen" - Hans96 - 05.01.2023 14:08

Der ganze Sinn dahinter ist, dass ich ein externes Gerät steuern möchte mit den Befehlen Start, Pause, Stopp und Auswahl.
Beim Befehl Start fährt das Gerät einen Zyklus über 32h ab.
Das funktionierte auch alles so wie es soll. Das Problem war nur, dass nach diesem Zyklus das Enum-Bedienelement immer noch auf Start stand und somit im Anschluss direkt ein weiterer Zyklus gestartet wird.
Daher die Frage mit dem "Zurücksetzen" des Bedienelementes auf Auswahl.
Das Bedienelement sollte aber jederzeit bedienbar bleiben.

Ich hoffe ich konnte das Anliegen etwas verdeutlichen. Ich würde gerne das VI hochladen aber aufgrund von Firmeninterna ist dies nicht gestattet.

Ich hab das Ganze nun mit einer Ereignisstruktur gelöst die bei Wertänderung aktiviert wird und dann in den jeweiligen Case springt. Das ganze ist mit einem Timeout versehen, sodass 2s nach Aktivierung der Ereignisstruktur diese wieder in den Case Auswahl springt.


RE: Enum-Variable "zurücksetzen" - TpunktN - 05.01.2023 15:54

Somit ist also dein Enum gleichzeitig dein Trigger zum Starten, klingt jetzt sehr gewöhnungsbedürftig als Eingabe, hat sicher seinen Grund Wink

(05.01.2023 14:08 )Hans96 schrieb:  Ich hab das Ganze nun mit einer Ereignisstruktur gelöst die bei Wertänderung aktiviert wird und dann in den jeweiligen Case springt. Das ganze ist mit einem Timeout versehen, sodass 2s nach Aktivierung der Ereignisstruktur diese wieder in den Case Auswahl springt.
Da verstehe ich jetzt nicht was du meinst.

Um sicher zu gehen, schau dir mal im Exampelfinder ('Help' -> 'Find Examples...') unter 'Fundamentals' -> 'Loops and Structures' das Beispiel 'State Machine Fundamentals.vi' an. Das sollte so in etwa dem entsprechen was du machst (hier sind 2 Knöpfe anstatt einem Enum verwendet, welche den Vorteil der Latch-Funktion haben).

Grüße Timo


RE: Enum-Variable "zurücksetzen" - Hans96 - 06.01.2023 07:48

(05.01.2023 15:54 )TpunktN schrieb:  Somit ist also dein Enum gleichzeitig dein Trigger zum Starten, klingt jetzt sehr gewöhnungsbedürftig als Eingabe, hat sicher seinen Grund Wink

Genau dient nur der schnellen Programmauswahl die eigentliche Steuerung funktioniert ganz normal über Schalter.

(05.01.2023 14:08 )Hans96 schrieb:  Ich hab das Ganze nun mit einer Ereignisstruktur gelöst die bei Wertänderung aktiviert wird und dann in den jeweiligen Case springt. Das ganze ist mit einem Timeout versehen, sodass 2s nach Aktivierung der Ereignisstruktur diese wieder in den Case Auswahl springt.
Da verstehe ich jetzt nicht was du meinst.

Die Ereignisstruktur springt bei Nichtaktivierung nach einer voreingestellten Zeit wieder in den Standard-Case Timeout und somit meinen Befehl Auswahl der dort definiert ist.

Um sicher zu gehen, schau dir mal im Exampelfinder ('Help' -> 'Find Examples...') unter 'Fundamentals' -> 'Loops and Structures' das Beispiel 'State Machine Fundamentals.vi' an. Das sollte so in etwa dem entsprechen was du machst (hier sind 2 Knöpfe anstatt einem Enum verwendet, welche den Vorteil der Latch-Funktion haben).

Grüße Timo

Das ist genau das was ich gesucht habe und es ist auch noch so simpel. Da muss ich nur einen Case ergänzen dann habe ich es.
Vielen Dank!!!