20.08.2014, 10:01
Beitrag #1
|
ElektroAnne
LVF-Grünschnabel
Beiträge: 18
Registriert seit: Jul 2014
2010
2013
kA
Deutschland
|
Schleife Zustandsautomat
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?
|
|
|
20.08.2014, 10:14
Beitrag #2
|
NoWay
LVF-Gelegenheitsschreiber
Beiträge: 241
Registriert seit: Jul 2013
LV-2019
2013
EN
Deutschland
|
RE: Schleife Zustandsautomat
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 Vielleicht kannst du das noch etwas genauer umschreiben.
Gruß
NoWay
|
|
|
20.08.2014, 10:24
Beitrag #3
|
ElektroAnne
LVF-Grünschnabel
Beiträge: 18
Registriert seit: Jul 2014
2010
2013
kA
Deutschland
|
RE: Schleife Zustandsautomat
Ich kann es ja nochmal detailierter versuchen zu beschreiben
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.
|
|
|
20.08.2014, 10:34
(Dieser Beitrag wurde zuletzt bearbeitet: 20.08.2014 10:37 von GerdW.)
Beitrag #4
|
GerdW
______________
Beiträge: 17.480
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: Schleife Zustandsautomat
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…
|
|
|
20.08.2014, 10:59
Beitrag #5
|
|
|
20.08.2014, 12:47
Beitrag #6
|
ElektroAnne
LVF-Grünschnabel
Beiträge: 18
Registriert seit: Jul 2014
2010
2013
kA
Deutschland
|
RE: Schleife Zustandsautomat
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 Leitung
|
|
|
20.08.2014, 12:50
Beitrag #7
|
GerdW
______________
Beiträge: 17.480
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: Schleife Zustandsautomat
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!
|
|
|
20.08.2014, 12:51
Beitrag #8
|
Lucki
Tech.Exp.2.Klasse
Beiträge: 7.699
Registriert seit: Mar 2006
LV 2016-18 prof.
1995
DE
01108
Deutschland
|
RE: Schleife Zustandsautomat
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.
QSM1.vi (Größe: 9,46 KB / Downloads: 429)
|
|
|
21.08.2014, 10:18
Beitrag #9
|
ElektroAnne
LVF-Grünschnabel
Beiträge: 18
Registriert seit: Jul 2014
2010
2013
kA
Deutschland
|
RE: Schleife Zustandsautomat
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 ?
|
|
|
21.08.2014, 10:23
(Dieser Beitrag wurde zuletzt bearbeitet: 21.08.2014 10:24 von GerdW.)
|
GerdW
______________
Beiträge: 17.480
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: Schleife Zustandsautomat
Hallo Anne,
was Ludwig in der Eile ( ) 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…
|
|
|
| |