LabVIEWForum.de - Schleife Zustandsautomat

LabVIEWForum.de

Normale Version: Schleife Zustandsautomat
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo liebes Forum !

Ich habe folgendes Problem. Zum Aufbau eines Messplatzes hab ich einen Zustandsautomaten gebaut.
Der Messplatz umfasst mehrere Komponenten (Zustande) die je nach Usereingabe mehrfach ausgeführt werden müssen.
Ich weiß nun nicht so recht wie ich dies umsetzen soll, es wäre "praktisch" wie eine For-Schleife aber nur um mehrere Zustände.
Habt ihr eine Idee?
Hallo ElektroAnne.

Die simpelste Methode wäre folgende, denke ich: Du baust dir ein Enum (TypeDef), mit allen Zuständen, dei du brauchst. Innerhalb der Zustände verwendest du das Enum dann mittels Schieberegister, um gezielt Zustände aufzurufen. Wenn die Zustände nicht einfach nur stumpf nacheinander aufgerufen werden sollen, braucht es natürlich noch eine Logik innerhalb des jeweiligen Zuständes, über die der nächste Zustand bestimmt wird.

Es ist schwer, dein konkretes Problem aus der Beschreibung herauszulesen. Für mich jedenfalls Tongue Vielleicht kannst du das noch etwas genauer umschreiben.

Gruß
NoWay
Ich kann es ja nochmal detailierter versuchen zu beschreibenSmile

Also sagen wir ich hab Zustand1, Zustand2, Zustand3 und Zustand4

Der User gibt dem Programm als Anweisung die Zahl 4.

Das Programm soll dann folgend ablaufen: Zustand1 läuft normal ab. Zustand2 und Zustand3 sollen jetzt jedoch 4-mal hintereinander ablaufen. Und danach soll dann Zustand 4 kommen.

So ist mein Plan, jedoch scheitert es an der Umsetzung.
Hallo Anne,

dann baust du dir ein kleines VI, das mit der Eingabe "4" ein Array wie folgt erstellt:
Z1, Z2, Z2, Z2, Z2, Z3, Z3, Z3, Z3, Z4

Dazu brauchst du zweimal InitArray und einmal BuildArray. Fertig…

Dieses Array ist dann die Vorgabe für deine StateMachine: einfach stupide einen Zustand nach dem anderen aus dem Array abarbeiten…
Oder tatsächlich mit forschleife.
Danke für eure Hilfe.

NoWay, so weit hab ich dein Programm verstanden.
Jetzt ist nur noch mein Problem, wie stell ich das an, das es so ablaufen würde:

Zustand 1, Zustand 2, Zustand 3, Zustand 2, Zustand 3, Zustand 4 (Usereingabe 2)

Das die Usereingabe praktisch angibt wie oft Zustand 2 und Zustand 3 hintereinander ablaufen sollen...
Da steh ich noch etwas auf der LeitungBahn
Hallo Anne,

was ist daran so schwierig?
Code:
x1 = InitArray(Z2, Anzahl)
x2 = InitArray(Z3, Anzahl)
x3 = 1DArrayÜberführen(x1, x2)
x4 = BuildArray(Z1, x3, z4)
Fertig!
Hier bietet sich eine "Queue driven State Machine" (QSM) an, siehe Beispiel. Der Vorteil offenbart sich natürlich erst, wenn Du mehr als nur den "Ablauf Nr 4" im Programm hast.
[attachment=50489]
Nochmal eine kurze Frage zu dem geposteten Vi.
Ich würde gern noch weitere Zustände hinzufügen.
Dies funktioniert allerdings durch einfaches hinzufügen im State und im Case nicht.
Kann mir jemand sagen, wie ich da vorgehen muss ?
Hallo Anne,

was Ludwig in der Eile (Smile) vergessen hat zu erwähnen: ein Enum sollte (so gut wie immer) als Typdefinition angelegt werden.

Also: mach aus dem Enum mit den States in Ludwigs Beispiel-VI ein typdefiniertes Enum und ersetze alle Instanzen dieses Enums durch die Typdefinition. Wenn das erledigt ist, öffnest du die Typdefinition erneut und fügst einen neuen Zustand (z.B. Z5) hinzu (speichern nicht vergessen). In allen Instanzen der Typdefinition taucht dieser Zustand nun auch auf und du kannst ihn per Queue versenden. Jetzt noch einfach einen neuen Case dafür im Consumer einrichten und fertig. Tipp hierzu: entferne aus der Consumer-Case-Struktur den Standard ("Voreinstellung"), dann bekommst du eine Fehlermeldung, wenn du für einen State im Enum noch keinen Case angelegt hast…
Seiten: 1 2
Referenz-URLs