Frage zu Transitionen in einer Statemachine

Gast #4755079
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.