Frage zu Transitionen in einer Statemachine

Gast #4755079
Lesenswert?
• ▲
▼
Hallo Miteinander,

ich habe mir anhand der Anleitung 
(https://www.mikrocontroller.net/articles/Statemachine#Implementierung_einer_objektorientiert_Finite_State_Machine_in_C.2B.2B) 
eine FSM aufgebaut.

Die Umsetzung hat soweit auch ganz gut geklappt bis auf einen Punkt. In 
dem Beispiel wird nur eine Abfrage nach einer Induktionsschleife 
gemacht, also nur ein Schalterzustand mit der entsprechenden 
Übergangsbedingung im Zustands-Struct verglichen.

In der Form einer If-Anweisung:
1
void stateMachine()
2
{
3
    Ampel1(state_table[state].Ampel1);
4
    Ampel2(state_table[state].Ampel2);
5
 
6
    if (zaehler>0) {
7
        zaehler--;    
8
    } else {
9
        if ( (state_table[state].I_Schleife == 1 && Induktionsschleife() ) ||
10
             (state_table[state].I_Schleife == 0) )
11
        {
12
            state =   state_table[state].Naechster;
13
            zaehler = state_table[state].Wartezeit;
14
        }
15
    }
16
}

In meinem Projekt habe ich nicht nur einen Schalter wie die 
Induktionsschleife, sondern 3. Also habe ich 3 entsprechende If-Abfragen 
und nur wenn alle den gewünschten Zustand 1||0 haben, soll in den 
nächsten Zustand gesprungen werden.

Soweit so gut, aber:

Ich habe jetzt mehrere Zustände, wo unabhängig vom Wert des Schalters S3 
in den nächsten Zustand gesprungen werden soll. Es ist also egal, ob er 
gerade den Wert 0 oder 1 hat.

Die im Beispiel genutzte if-Abfrage lässt mir, nach meinem Verständnis 
aber keine Wahl, da immer ein bestimmter Bool-Wert des Schalters pro 
Zustand vorliegen MUSS um in den nächsten Zustand zu springen.

Ich hatte mir jetzt überlegt, die If-Abfragen als Funktion zu erstellen 
und je nach State nur die relevanten Schalter abzufragen. Gibt es da 
eine elegantere Lösung?
Gast #4755146
Lesenswert?
• ▲
▼
Jalo Sie schrieb:

> Die im Beispiel genutzte if-Abfrage lässt mir, nach
> meinem Verständnis aber keine Wahl, da immer ein
> bestimmter Bool-Wert des Schalters pro Zustand vorliegen
> MUSS um in den nächsten Zustand zu springen.

???

Wer zwingt Dich, immer ALLE Schalter abzufragen?
Gast #4755160
Lesenswert?
• ▲
▼
Possetitjel schrieb:

> Jalo Sie schrieb:
>
>> Die im Beispiel genutzte if-Abfrage lässt mir, nach
>> meinem Verständnis aber keine Wahl, da immer ein
>> bestimmter Bool-Wert des Schalters pro Zustand vorliegen
>> MUSS um in den nächsten Zustand zu springen.
>
> ???
>
> Wer zwingt Dich, immer ALLE Schalter abzufragen?

Mist. Ich habe die Frage missverstanden. Vergiss die
Antwort oben.

Jalo Sie schrieb:
> Ich hatte mir jetzt überlegt, die If-Abfragen als Funktion
> zu erstellen und je nach State nur die relevanten Schalter
> abzufragen. Gibt es da eine elegantere Lösung?

Eleganz liegt im Auge des Betrachters.

Eine Möglichkeit wäre, immer alle Sensoren abzufragen, aber
mittels AND/OR/NOT-Masken den Wahrheitswert für die Freigabe
zum Weiterschalten zu berechnen. Die Masken sind natürlich
zustandsspezifisch --> Tabelle.

Klappt aber nur bei hinreichend einfachen Bedingungen.
Antivalenz klapps so z.B. nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren