Forum: Mikrocontroller und Digitale Elektronik Frage zu Transitionen in einer Statemachine


von Jalo Sie (Gast)


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?

von Possetitjel (Gast)


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?

von Possetitjel (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.