Wir müssen in einem Projekt ein selbstfahrendes Fahrzeug basteln, dass einen vorgegebenen Parkour abfährt und bestimmte Aufgaben (Temp messen, Morsecode lesen,NFC Tag lesen, Magnetfeld messen) erfüllt.
Wir haben 5 IR Sensoren,lineArray, 2 Motorencoder zur verfügung.
Ich habe begonnen eine Zustandautomat zu implementieren. Für jeden kleinen Teilschritt gibt es einen Case, bei dem er die benötigten Sensoren ausliest und dann entscheidet, ob die Aufgabe erfüllt ist oder nicht. So kann der loop ziemlich schnell "durchrattern" und wird nicht blockiert. Jedoch sind die Nachteile offensichtlich. Er ist sehr Fehler anfällig und gar nicht flexibel. Dreht er zuweit, erkennt die Linie nicht, dann können evt. die Transitionen nicht erfüllt werden und man hat verloren. Zudem muss man zig Cases schreiben...
Was wäre eine bessere Lösung/Struktur?
Wäre eine Klassen mit mehreren Instanzen eine Möglichkeit?
Wie würde das aussehen/funktionieren?
dafür kann switch case nichts. Klingt eher danach das eure Steuer-Funktionen noch nicht richtig funktionieren oder diese selbst blockierend arbeiten ... ?
Was heißt denn "entscheidet ob Aufgabe erfüllt ist"?
Wartet der case Zweig darauf?
Oder wird er solange erneut angesprungen bis er erfüllt ist?
Euer switch case muss laut meiner Vorstellung ständig von case zu case springen. Es darf nie in einem Zustand stehen bleiben.
Nur die aufgerufenen Funktionen in den case Zweigen müssen für sich Dinge entscheiden, aber nicht blockieren.
TobiDuesentrieb:
Ich habe begonnen eine Zustandautomat zu implementieren.
Möglicherweise benötigst Du mehrere. Mit switch/case dürfte Dir irgendwann die Übersichtlichkeit abhanden kommen, in diesem Punkt könnten Dir Klassen helfen.
Mit einem Wachhund (watchdog) kannst Du Dein Programm aus einer verfahrenen Situation befreien. Dazu kann beispielsweise ein zeitgesteuerter Interrupt benutzt werden. Drückt ein Lokführer nicht regelmäßig einen Knopf, bremst der Zug selbständig.
an Watchdog darf er noch gar nicht denken. Das lenkt nur ab. Das Programm muss ohne funktionieren. Zudem das auch nicht viel bringen würde. Sobald der aktiv wäre ist eh alles zu spät und paar Werte auf Grundeinstellung.
Im Anhang ist mal ein Ausschnitt des Ablaufdiagramms und
der Entwurf der State Machine.
die PacMan Klasse hat bis jetzt alle read-Funktionen und Funktionen für die LCD Textausgabe.
Doc_Arduino:
Was heißt denn "entscheidet ob Aufgabe erfüllt ist"?
Wartet der case Zweig darauf?
Oder wird er solange erneut angesprungen bis er erfüllt ist?
Wie ihr sehen könnt, werden die Cases erneut angesprungen.
Wenn ich Doc_Arduino richtig erstanden habe, sollte im loop() eine switch/case Struktur sein mit den Teilaufgaben, welche abgefragt wird. In den Funktionen werden Variablen beschrieben, aufgrund ein Zustand ändert. oder welche Dinge sollen in den Funktionen entschieden werden?
Vielleicht könnt ihr ein Beispiel für den Start machen.
Teilaufgaben:
Temperatur an Punkt1 messen (mitten einer weissen Fläche, ca 15 cm entfernt vom Start)
Morsecode auslesen (an der Bande entlang fahren)
...
was die Funktionen zurückgeben sollen hängt von deren Aufgabe ab. Das müsst ihr wissen.
Bsp. Abstandssensor. Wenn ein Abstand zur Wand oder ähnlichen unterschritten wird muss entschieden werden fahre ich mit reduzierter Geschwindigkeit weiter oder bleibe ich gleich stehen. Wenn ich vor der Wand stehe muss entschieden werden habe ich Platz zum drehen oder muss ich kurz rückwärts fahren usw. Der/die Rückgabewert(e) müssen an die Fahrfunktion übermitteln werden. Bzw. müssen diese immer den aktuellen Wert zur Verfügung gestellt bekommen.
Die Hauptaufgaben, Sensoren abfragen und fahren müssen in den cases immer nacheinander abgearbeitet werden. Ohne Pause. Nur Nebenarbeiten werden bei Bedarf angesprungen und wieder "zurück".
Ich würde zumindestens Daten die zusammengehören auch zusammenfassen. In structs zum Bsp. Wenn ihr mehrere gleiche Sensoren habt könnt ihr auch Objekte erstellen.
Nochwas. Dein gezeigtes switch case ist nur hingerotzt. Das kompiliert nicht einmal. Überarbeitet den Ablaufplan. Erst wenn der schlüssig ist wird er umgesetzt.
was willst Du machen wenn im Teilabschnitt Messen das Ding gerade vor die Wand fährt. Mit einer Schrittkette oder Ablaufsteuerung wirst Du da nicht weit kommen. Es sei denn bei Temp messen gibt es keine Wand weil das Ding dann immer steht.
Ich sehe das so das eigendlich zu jedem Zeitpunkt alle Sensoren abgearbeite werden können und abhängig davon Entscheidungen getroffen werden.
Aber die Aufgabenstellung hast Du bekommen , schreibe sie auf zerlege sie in Teilaufgaben, gehe diese einzeln an.
Mit einer Schrittkette oder Ablaufsteuerung wirst Du da nicht weit kommen.
Wo ist das Problem? Sie muss nur ständig durchlaufen werden. Was anderes wie sequentiell geht eh nicht.
Ich sehe das so das eigendlich zu jedem Zeitpunkt alle Sensoren abgearbeite werden können und abhängig davon Entscheidungen getroffen werden.
Genau das macht eine Ablaufsteuerung. Eine SPS macht das ähnlich. Eingänge einlesen, alles verarbeiten, Ausgänge setzen und wieder von vorn. Ich verstehe auch nicht warum eine Temperaturmessung Probleme machen soll. Löse dich von der delay Denkweise. Arbeite mit Uhren.
Doc_Arduino:
Genau das macht eine Ablaufsteuerung. Eine SPS macht das ähnlich. Eingänge einlesen, alles verarbeiten, Ausgänge setzen und wieder von vorn. Ich verstehe auch nicht warum eine Temperaturmessung Probleme machen soll. Löse dich von der delay Denkweise. Arbeite mit Uhren.
Sorry,
das sehe ich nicht ganz so. Nur weil eine SPS die Programzeilen sequenziell bearbeitet hat das doch noch nichts mit einer Schrittketten Anwendung zu tun.
Wenn eine Steuerug eine endliche Anzahl von Schaltvorgängen steuert die logisch nichts miteinader zu tun haben würde man nicht von einer Schrittkette sprechen. Selbst wenn es dabei Abhänigkeiten untereinander geben sollte.
Wenn allerdings Schaltvorgänge erfolgen die logisch auf einen bereits gemachten Schlatlvorgang in einer festgelegten Reihenfolge erfolgen kann man von einer Schrittkette reden und das Programm dazu entsprechend organisieren.
Wenn man nun für eine Steuerungsaufgabe eine Schrittabfolge deffiniert , es aber letztlich dazu kommt das man bei vielen Bedingung in einen anderen Schritt springen muss ,da es sich letztlich um asynchrone Vorgänge handelt, hat es eigendlich auch nichts mehr mit einer Schrittkette zu tun und der Ansatz war falsch.
Aus Wikepedia
Eine Ablaufsteuerung (englisch: sequential control) oder auch Schrittkette ist eine Steuerung, die schrittweise abläuft. Dieser Ablauf erfolgt zwangsläufig, wobei das Weiterschalten von Schritt A zu Schritt B durch Weiterschaltbedingungen (Transitionen) erfolgt, z. B. ein Zylinder fährt aus, transportiert ein Werkstück, dieses wird dann gespannt.