FSM Library (Brevig)

Hallo,

kann mir jmd. Beispiele zu diesen beiden Funktionen nennen:

boolean isInState( State &state );        // Prüft, ob der momentane Zustand dem angegebenen Zustand entspricht

und

unsigned long timeInCurrentState();       // Gibt zurück, wie lange der Momentane Zustand bereits andauert

Ich verstehe nicht, wie ich das anwenden kann.

Es geht um die FSM Library auf dieser Seite.

Gruß Chris

Wenn du dir das beiliegende Beispiel durchliest, da ist es beschrieben.

Und obendrein noch hier:
http://playground.arduino.cc/Code/FiniteStateMachine

Ein Beispiel?

Oft hat man mehrere FSM in einer Maschinensteuerung.
(dutzende)

Es ist meist sehr sinnvoll eine Fehlererkennung außerhalb dieser Automaten zu etablieren.
Denn:

  1. Der Fehler könnte in der Logik des Automaten stecken
  2. Die Fehlerprüfung im Automaten würde den Automaten verkomplizieren, unübersichtlich machen
  3. So kann man alle Fehlerprüfungen an einem Punkt sammeln und garantieren, dass sie auch gemacht werden.

Ein Wasserkocher, wird von einer FSM gesteuert....

if(FSM_Kocher.isInState(heizen) && FSM_Kocher.timeInCurrentState() > 360000L)
{
  // Störung! Wasser aufheizen dauert zu lange.
  notabschaltung();

}

Danke!

Gruß Chris

Ich verstehe nicht, warum bei folgendem Code nicht sekündlich zwischen zustand_01 und zustand_02 gewechselt wird, sondern permanent (ohne Pause).

#include <FiniteStateMachine.h>

State zustand_01 = State(enter_01, update_01, exit_01); // Definiert Zustände inkl. Vor- und Nachbau
State zustand_02 = State(enter_02, update_02, exit_02);

FSM fsm_01 = FSM(zustand_01);

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  fsm_01.update();
}

void enter_01() // zustand_01
{
  Serial.println("zustand_01");
}
void update_01()
{
  if (fsm_01.timeInCurrentState() >= 1000L) fsm_01.transitionTo(zustand_02);
}
void exit_01() {}

void enter_02() // zustand_02
{
  Serial.println("zustand_02");
}
void update_02()
{
  if (fsm_01.timeInCurrentState() >= 1000L) fsm_01.transitionTo(zustand_01);
}
void exit_02() {}

Gruß Chris

Glückwunsch!

Da hast du dir ein feines Problem eingefangen.
Es ist scheinbar von recht hoher Qualität.

So auf Anhieb kann ich keinen Fehler in der Lib, und auch nicht in deinem Code, finden.

Nachtrag:
In der Lib ist ein Fehler!

So musses:

unsigned long FiniteStateMachine::timeInCurrentState() { 
	return millis() - stateChangeTime; 
}

Fein- funktioniert jetzt tatsächlich einwandfrei.

Einen hab ich noch.

Folgender Code kompiliert nicht und ich weiss nicht warum:

#include <FiniteStateMachine.h>

State zustand_01 = State(enter_01, update_01, exit_01); // Definiert Zustände inkl. Vor- und Nachbau
State zustand_02 = State(enter_02, update_02, exit_02);

FSM fsm_01 = FSM(zustand_01);

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  fsm_01.update();
  if(fsm_01.getCurrentState() == zustand_02) Serial.println("x");
}

void enter_01() {} // zustand_01
void update_01() {}
void exit_01() {}

void enter_02() {} // zustand_02
void update_02() {}
void exit_02() {}

Mit getCurrentState() scheint es offensichtlich ebenfalls ein Problem zu geben.

Gruß Chris

Wäre nett wenn du bei sowas auch die Fehler kopieren würdest

In der State Klasse ist der Vergleichs-Operator nicht überladen. Dadurch kannst du zwei State Objekte nicht vergleichen.

Mit getCurrentState() scheint es offensichtlich ebenfalls ein Problem zu geben.

Nein!

if(&fsm_01.getCurrentState() == &zustand_02) Serial.println("x");

Machs besser so:

  if(fsm_01.isInState(zustand_02)) Serial.println("x");

Dankeschööön!!

Karma klick klick

Gruß Chris

Edit: Wie soll man da aber auch draufkommen!?

Chris72622:
Edit: Wie soll man da aber auch draufkommen!?

Ach, das geht schon...
C/C++ ist, was Zeiger, Adressen und Referenzen angeht, ein bisschen... naja...
Ein paar blutige Nasen später, macht man das schon fast per Intuition...