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
combie
October 9, 2015, 9:25am
3
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:
Der Fehler könnte in der Logik des Automaten stecken
Die Fehlerprüfung im Automaten würde den Automaten verkomplizieren, unübersichtlich machen
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();
}
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
combie
October 16, 2015, 1:23pm
6
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.
combie
October 16, 2015, 2:23pm
9
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!?
combie
October 16, 2015, 4:29pm
11
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...