Was kam zuerst - der Zustand oder ein Übergang?

Gast #4392620
Implementierung eines Endlichen Automaten: wie wird ein Übergang 
ausgelöst, und wo wird er erfasst? Prüfe ich im Zustand die Ereignisse, 
die einen Übergang auslösen, und führe diese dann aus oder sind mögliche 
Übergange ständig "aktiv" und prüfen ihr Startereignis; sobald es 
eintritt, werden die anderen gesperrt/deaktiviert.
Gast
In der Regel wird im Zustand geprüft, ob ein Ereignis eintritt und dann 
der entsprechende Übergang eingeleitet. Ansonsten verbleibt man im 
Zustand.

So habe ich es jedenfalls immer implementiert.
Gast
Das ist schlüssig, allerdings habe ich mehrere Übergänge, die in 
verschiedenen Zuständen auftreten können. Die erforderlichen Prüfungen 
müssten dann mehrfach aufgerufen oder implementiert werden.
Ich werde wohl versuchen, dass die Prüfung in der Übergangsfunktion 
erfolgt. Die wartenden Übergänge werden vom Zustand bestimmt.
Daraus ergibt sich aber auch das Problem, dass das Ziel (der neue 
Zustand) bestimmt werden muss.
Alles eine Frage der Sprache :-(
N.A. schrieb:
> Das ist schlüssig, allerdings habe ich mehrere Übergänge, die in
> verschiedenen Zuständen auftreten können. Die erforderlichen Prüfungen
> müssten dann mehrfach aufgerufen oder implementiert werden.

Ja. Und?
('aufgerufen' ist natürlich bevorzugt, wenn die Übergangsprüfung 
komplexer ist)
Gast
Die Frage ist an sich interessant, aber man muss doch sehr aufpassen, 
dass man sie präzise formuliert und dabei die Verarbeitungsmodelle von 
finiten Automaten und Prozessor auf passende Weise vergleicht.

Zu den theoretischen Aspekten empfehle ich einige Lektüre zur 
Übersicht.


Die praktische Antwort auf Deine Frage ist kurz so:

1. Es ist möglich und nützlich von einem Ausgangszustand auszugehen, der 
von keiner Bedingung abhängt. Man kann es anders machen, aber es handelt 
sich erst einmal um eine völlig freie Wahl und das führte im 
wesentlichen nur zu einer Variation.

2. In diesem Zustand implementiert man alle "möglichen" Übergänge von 
ihm weg (plus der zu ihm selbst führenden). Die Implementierung sieht 
einfach wie eine Bedingung aus mit einem Kontroll-Statement aus. Also 
ein if in C.

Mehr brauchts nicht.

Denke an die gute alte Daumenregel: So einfach wie möglich und so 
kompliziert wie nötig.
Gast
N.A. schrieb:

> Implementierung eines Endlichen Automaten: wie wird ein
> Übergang ausgelöst,

Durch ein Eingangssignal ("Ereignis").

> und wo wird er erfasst?

Der Übergang? I.d.R. nirgendwo.
Der Zustand? In der Zustandsvariablen.

Man kann bei Bedarf den Übergang identifizieren, indem man
eine zusätzliche Variable für den vorigen Zustand verwendet
("History"). Start- und Endzustand legen i.d.R. den Übergang
eindeutig fest.

> Prüfe ich im Zustand die Ereignisse, die einen Übergang
> auslösen, und führe diese dann aus

Das ist sinnvoll, wenn Du einen Automaten mit einem
aktiven Zustand implementieren willst.

> oder sind mögliche Übergange ständig "aktiv" und prüfen
> ihr Startereignis; sobald es eintritt, werden die anderen
> gesperrt/deaktiviert.

Das ist sinnvoll, wenn Du mehrere Automaten simultan
implementieren willst. In der SPS-Programmierung macht(e)
man das so.
Gast
Karl H. schrieb:

> N.A. schrieb:
>> Das ist schlüssig, allerdings habe ich mehrere Übergänge,
>> die in verschiedenen Zuständen auftreten können. Die
>> erforderlichen Prüfungen müssten dann mehrfach aufgerufen
>> oder implementiert werden.
>
> Ja. Und?

Verstehe ich nicht.

Der gegenwärtige Zustand ist ja bekannt. Also muss nur für
jeden Übergang, der aus dem gegenwärtigen Zustand herausführt,
die dazu notwendige "Freigabe" geprüft werden.

Jede erforderliche Prüfung muss genau einmal implementiert
werden.

In jedem Zustand wird jede implementierte Prüfung höchstens
einmal aufgerufen.
Possetitjel schrieb:
> Karl H. schrieb:
>
>> N.A. schrieb:
>>> Das ist schlüssig, allerdings habe ich mehrere Übergänge,
>>> die in verschiedenen Zuständen auftreten können. Die
>>> erforderlichen Prüfungen müssten dann mehrfach aufgerufen
>>> oder implementiert werden.
>>
>> Ja. Und?
>
> Verstehe ich nicht.
>
> Der gegenwärtige Zustand ist ja bekannt. Also muss nur für
> jeden Übergang, der aus dem gegenwärtigen Zustand herausführt,
> die dazu notwendige "Freigabe" geprüft werden.

Ja. Aber will die bei 3 Zuständen identische Überprüfung auf den 
Auslöser nicht 3 mal schreiben wenn die komplex ist. Dazu gibt es ja 
Funktionen die man aufrufen kann, so dass man den Code nur einmal 
schreibt.

Obwohl: Das ist so trivial, dass ich mich die ganze Zeit frage, ob 
hinter der Frage noch mehr steckt. Am schreiben einer Funktion wirds ja 
wohl hoffentlich nicht scheitern.
Gast
Möglicherweise!

Der Punkt ist ja, das beim Automatenmodell jedwede Verarbeitung im 
engeren Sinne fast nie behandelt wird. Also etwa eine Umrechnung. Auch 
ist das "lesen eines Portpins" eine intrinsische Eigenschaft eines 
Automaten während sie bei einem uC oder uP ausdrücklich hingeschrieben 
werden muss.

Dieser Satz mit dem "mehrfachen Hinschreiben" deutet irgendwie in die 
Richtung, "falls ich mich nicht irre". (Sam Hawkins)
Gast
Wie erstellst Du denn Deinen Automaten bevor Du anfängst zu coden ?
Normalerweise malt man sich den auf ein Blatt Papier und hat dann 
Zustandsblasen an denen dann die Übergänge als Pfeil auf den nächsten 
Zustand zeigen.
Wenn Du nun mehrere Übergänge von einem Zustand hast kannst Du nun 
entweder in Deinem Zustand die einzelnen Übergänge ansprechen oder Du 
erzeugst "Zwischenzustände" so das es immer nur einen Übergang gibt.
Wenn man ja wüßte was es werden soll ?
Gast
Karl H. schrieb:
> Am schreiben einer Funktion wirds ja
> wohl hoffentlich nicht scheitern.

Doch, das ist ein bisschen das Problem, denn ich habe nur proprietäre 
"Flowcharts", mit denen ich das Ganze umsetzen muss. Naja, mal sehen.
Danke für die Beiträge.

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.