Zustandsdiagramm: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(12 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Datei:E40 Zustandsmaschine.png|thumb|rigth|450px|Abb. 1: Zustandsdiagramm für eine LED-Schaltung mit 3 Zuständen]]
{|class="wikitable"
{|class="wikitable"
|-
|-
Zeile 8: Zeile 9:
|}
|}
= Einleitung =
= Einleitung =
Zustandsdiagramme sind ein zentrales Werkzeug der Modellierung in der Informatik und Systemtechnik, um das Verhalten eines Systems über die Zeit hinweg anschaulich darzustellen. Sie beschreiben, in welchen **Zuständen** sich ein System befinden kann und wie es durch **Ereignisse oder Bedingungen** von einem Zustand in einen anderen wechselt.
Zustandsdiagramme sind ein zentrales Werkzeug der Modellierung in der Informatik und Systemtechnik, um das Verhalten eines Systems über die Zeit hinweg anschaulich darzustellen. Sie beschreiben, in welchen Zuständen sich ein System befinden kann und wie es durch '''Ereignisse oder Bedingungen''' von einem Zustand in einen anderen wechselt.


Typischerweise werden Zustandsdiagramme verwendet, um reaktive Systeme zu modellieren, also Systeme, die auf äußere Eingaben reagieren – etwa Steuerungen, eingebettete Systeme oder Benutzeroberflächen. Dabei steht nicht die Berechnung einzelner Werte im Vordergrund, sondern der Ablauf von Zustandsänderungen.
Typischerweise werden Zustandsdiagramme verwendet, um reaktive Systeme zu modellieren, also Systeme, die auf äußere Eingaben reagieren – etwa Steuerungen, eingebettete Systeme oder Benutzeroberflächen. Dabei steht nicht die Berechnung einzelner Werte im Vordergrund, sondern der Ablauf von Zustandsänderungen.


Ein Zustandsdiagramm besteht im Kern aus **Zuständen**, **Übergängen** und den dazugehörigen **Auslösern (Events)** sowie optionalen **Bedingungen (Guards)** und **Aktionen**. Durch diese Struktur lassen sich komplexe Verhaltenslogiken übersichtlich und nachvollziehbar darstellen.
Ein Zustandsdiagramm besteht im Kern aus  
#Zuständen,  
#Eingangs- und Ausgangsaktionen (E/A),
#Zustandsübergänge (Transitions) und
#Bedingungen für Zustandsübergänge (Guards)
 
Durch diese Struktur lassen sich komplexe Verhaltenslogiken übersichtlich und nachvollziehbar darstellen.


In der Praxis helfen Zustandsdiagramme dabei, Systeme frühzeitig zu verstehen, Fehler in der Logik zu erkennen und die Implementierung in Programmiersprachen oder Steuerungssystemen gezielt vorzubereiten.
In der Praxis helfen Zustandsdiagramme dabei, Systeme frühzeitig zu verstehen, Fehler in der Logik zu erkennen und die Implementierung in Programmiersprachen oder Steuerungssystemen gezielt vorzubereiten.
= 1. Zustandsbeschreibung (State) =
= 1. Zustandsbeschreibung (State) =


Zeile 51: Zeile 59:
Läuft während der Zustand aktiv ist.
Läuft während der Zustand aktiv ist.
  do / Aktion
  do / Aktion
=== Beispiel==
=== Beispiel===
  do / Temperatur messen
  do / Temperatur messen


Zeile 89: Zeile 97:


= Demo =
= Demo =
Hier ist ein einfaches Beispiel für eine Zustandsmaschine (Finite State Machine, FSM) in der Arduino IDE. Typisch ist das z. B. für LED-Steuerungen oder kleine Abläufe.


Beispiel: LED mit 3 Zuständen
Hier ist ein einfaches Beispiel für eine Zustandsmaschine (Engl.: Finite State Machine, FSM) in der Arduino IDE. Typisch ist das z. B. für LED-Steuerungen oder kleine Abläufe.
 
Beispiel: LED mit 3 Zuständen  


Wir definieren drei Zustände:
Wir definieren drei Zustände:
Zeile 98: Zeile 107:
* BLINKEN
* BLINKEN


Umschaltung erfolgt über einen Taster.
Umschaltung erfolgt über einen Taster. Das zugehörige Zustandsdiagramm zeigt Abb. 1.
<syntaxhighlight lang="c" style="background-color: #EFF1C1; font-size:small">
 
// Pin-Definitionen
URL: https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Arduino/ArduinoLibOrdner/AlphaBot/examples/E40_Zustandsmaschine/E40_Zustandsmaschine.ino
const int ledPin = 13;
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
const int buttonPin = 2;
| <strong>E40_Zustandsmaschine.ino&thinsp;</strong>
|-
| <syntaxhighlight lang="c" style="background-color: #EFF1C1; font-size:small">
const byte LED_PIN_u8 = 13;
const byte INTERRUPT_PIN_u8  = 2;     // Interrupt an Pin D2


// Zustände definieren
enum State {
enum State {
   LED_OFF,
   LED_OFF, // LED ist aus
   LED_ON,
   LED_ON,   // LED ist dauerhaft an
   LED_BLINK
   LED_BLINK // LED blinkt
};
}; // Zustände
 
State Status = LED_OFF; // LED ist aus


State currentState = LED_OFF;
// Taster
volatile bool TasterZustand_bit = false;     // Definiere eine globale volatile Variable für den Status der LED
// Eine Variable sollte als volatile deklariert werden, wenn sie von irgendwo anders geändert werden kann außer in dem Codeteil, in dem sie auftaucht (z.B. ISR).
volatile unsigned long alteZeit_u32=0, entprellZeit_u32=70;  // Variablen für das Entprellen des Schalters, Entprellzeit 20 ms


// für Tasterentprellung
// Blink-Timer
bool lastButtonState = LOW;
unsigned long alteBlinkZeit_u32 = 0;
unsigned long lastDebounceTime = 0;
bool LEDStatus_bit = LOW;
const unsigned long debounceDelay = 50;


void setup() {
void setup() {
   pinMode(ledPin, OUTPUT);
   pinMode(LED_PIN_u8, OUTPUT);
   pinMode(buttonPin, INPUT);
   pinMode(INTERRUPT_PIN_u8, INPUT_PULLUP); // Lege den Interruptpin als Eingang mit Pullupwiderstand fest
   Serial.begin(9600);
 
   // Lege die ISR ISRwechselLED auf den Interruptpin mit Modus 'CHANGE':
  // Bei wechselnder Flanke auf dem Interruptpin --> Führe die ISR aus
  attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN_u8), ISRTaster, RISING);
}
}
void loop() {
void loop() {
   handleButton();
   // =========================
   runStateMachine();
  // 2. ZUSTANDSMASCHINE
}
  // =========================
   switch (Status) {


void handleButton() {
    // =========================
  bool reading = digitalRead(buttonPin);
     case LED_OFF:
 
      // AUSGANGSAKTION (A)
  if (reading != lastButtonState) {
      digitalWrite(LED_PIN_u8, LOW);
    lastDebounceTime = millis();
  }
 
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading == HIGH && lastButtonState == LOW) {
      // Zustand wechseln bei Tastendruck
      switchState();
    }
  }
 
  lastButtonState = reading;
}
 
void switchState() {
  if (currentState == LED_OFF) {
    currentState = LED_ON;
  }
  else if (currentState == LED_ON) {
    currentState = LED_BLINK;
  }
  else {
     currentState = LED_OFF;
  }
 
  Serial.print("Neuer Zustand: ");
  Serial.println(currentState);
}


void runStateMachine() {
      // ZUSTANDSÜBERGANG
  switch (currentState) {
      if (TasterZustand_bit) {
 
        Status = LED_ON;
    case LED_OFF:
        TasterZustand_bit = false;
       digitalWrite(ledPin, LOW);
       }
       break;
       break;


    // =========================
     case LED_ON:
     case LED_ON:
       digitalWrite(ledPin, HIGH);
      // AUSGANGSAKTION (A)
       digitalWrite(LED_PIN_u8, HIGH);
 
      // ZUSTANDSÜBERGANG
      if (TasterZustand_bit) {
        Status = LED_BLINK;
        TasterZustand_bit = false;
      }
       break;
       break;


    // =========================
     case LED_BLINK:
     case LED_BLINK:
       digitalWrite(ledPin, millis() % 500 < 250);
       // E/A: Blinklogik (Output Action)
      if (millis() - alteBlinkZeit_u32 > 500) {
        alteBlinkZeit_u32 = millis();
        LEDStatus_bit = !LEDStatus_bit;
        digitalWrite(LED_PIN_u8, LEDStatus_bit);
      }
 
      // ZUSTANDSÜBERGANG
      if (TasterZustand_bit) {
        Status = LED_OFF;
        TasterZustand_bit = false;
      }
       break;
       break;
   }
   }
}
void ISRTaster() {
  // =========================
  // 1. EINGANGSAKTIONEN (E)
  // =========================
    if((millis() - alteZeit_u32) > entprellZeit_u32) { // innerhalb der entprellZeit nichts machen
      TasterZustand_bit = true;
      alteZeit_u32 = millis();                        // letzte Schaltzeit merken 
    }
}
}
</syntaxhighlight>
</syntaxhighlight>
|}


= Videos =
= Videos =

Aktuelle Version vom 6. Juli 2026, 13:45 Uhr

Abb. 1: Zustandsdiagramm für eine LED-Schaltung mit 3 Zuständen
Autor: Prof. Dr.-Ing. Schneider
Modul: Praxismodul II
Lehrveranstaltung: Mechatronik, Informatik Praktikum 2, 2. Semester

Einleitung

Zustandsdiagramme sind ein zentrales Werkzeug der Modellierung in der Informatik und Systemtechnik, um das Verhalten eines Systems über die Zeit hinweg anschaulich darzustellen. Sie beschreiben, in welchen Zuständen sich ein System befinden kann und wie es durch Ereignisse oder Bedingungen von einem Zustand in einen anderen wechselt.

Typischerweise werden Zustandsdiagramme verwendet, um reaktive Systeme zu modellieren, also Systeme, die auf äußere Eingaben reagieren – etwa Steuerungen, eingebettete Systeme oder Benutzeroberflächen. Dabei steht nicht die Berechnung einzelner Werte im Vordergrund, sondern der Ablauf von Zustandsänderungen.

Ein Zustandsdiagramm besteht im Kern aus

  1. Zuständen,
  2. Eingangs- und Ausgangsaktionen (E/A),
  3. Zustandsübergänge (Transitions) und
  4. Bedingungen für Zustandsübergänge (Guards)

Durch diese Struktur lassen sich komplexe Verhaltenslogiken übersichtlich und nachvollziehbar darstellen.

In der Praxis helfen Zustandsdiagramme dabei, Systeme frühzeitig zu verstehen, Fehler in der Logik zu erkennen und die Implementierung in Programmiersprachen oder Steuerungssystemen gezielt vorzubereiten.

1. Zustandsbeschreibung (State)

  • Ein Zustand beschreibt eine stabile Situation eines Systems.
  • Ein System bleibt in einem Zustand, bis ein Ereignis einen Übergang auslöst.

Eigenschaften eines Zustands:

  • beschreibt „Was gilt gerade?“
  • kann interne Variablen enthalten
  • kann Aktionen ausführen (Entry / Do / Exit)

Beispiele:

  • Warten
  • MotorEin
  • Fehlerzustand

2. Eingangs- und Ausgangsaktionen (E/A)

Zustände können Aktionen ausführen, wenn sie betreten oder verlassen werden.

Eingangsaktion (Entry Action)

Wird einmal beim Betreten des Zustands ausgeführt.

entry / Aktion

Beispiel

entry / LED = ON
entry / Zähler = 0

Ausgangsaktion (Exit Action)

Wird einmal beim Verlassen des Zustands ausgeführt.

exit / Aktion

Beispiel

exit / Motor stoppen
exit / Daten speichern

Do-Aktion (optional)

Läuft während der Zustand aktiv ist.

do / Aktion

Beispiel

do / Temperatur messen

3. Zustandsübergänge (Transitions)

Ein Zustandsübergang beschreibt den Wechsel von einem Zustand in einen anderen. Er wird durch ein Ereignis ausgelöst.

Darstellung:

Ereignis / Aktion

oder erweitert:

Ereignis [Bedingung] / Aktion

Beispiel

TasterGedrückt / LED = ON

Bedeutung:
Wenn der Taster gedrückt wird → LED einschalten

4. Bedingungen für Zustandsübergänge (Guards)

Eine Bedingung (Guard) ist eine logische Voraussetzung, die erfüllt sein muss, damit ein Übergang stattfindet.

Schreibweise:

Ereignis [Bedingung]

Beispiel

TasterGedrückt [Temperatur > 50°C] / Alarm = ON

Bedeutung:
Übergang nur, wenn Temperatur größer als 50°C ist

Eigenschaften von Bedingungen:

  • sind logische Ausdrücke (true/false)
  • werden vor dem Übergang geprüft
  • verhindern oder erlauben Übergänge

Demo

Hier ist ein einfaches Beispiel für eine Zustandsmaschine (Engl.: Finite State Machine, FSM) in der Arduino IDE. Typisch ist das z. B. für LED-Steuerungen oder kleine Abläufe.

Beispiel: LED mit 3 Zuständen

Wir definieren drei Zustände:

  • AUS
  • AN
  • BLINKEN

Umschaltung erfolgt über einen Taster. Das zugehörige Zustandsdiagramm zeigt Abb. 1.

URL: https://svn.hshl.de/svn/Informatikpraktikum_1/trunk/Arduino/ArduinoLibOrdner/AlphaBot/examples/E40_Zustandsmaschine/E40_Zustandsmaschine.ino

Videos

Mealy Automat - einfache Erklärung & anschauliches Beispiel!
Snack-Automat als Zustandsdiagramm

Tutorials


→ zurück zum Hauptartikel: Informatik Praktikum 2