# Beispielmodell: Starttaste + Zylinder (Selmo)

Dieses Beispiel zeigt die vollständige Überführung eines einfachen PTFs in ein Selmo-Modell:

* Starttaste löst einen Zyklus aus
* Zylinder fährt aus bis Endlage „ausgefahren“
* Plausibilität (Pair-Check) überwacht widersprüchliche Endlagen
* CMZ schützt systemkritische Bedingungen
* MXIC erlaubt sichere manuelle Bewegungen im Handbetrieb

> Ziel: Ein minimaler, aber vollständiger Selmo-Kern, der deterministisch, diagnostizierbar und bedienbar ist.

***

### 1) Struktur (Plant → Hardware-Zone → Sequence → Zone)

#### Plant

**PLANT\_01** – Gesamtanlage (für dieses Beispiel minimal)

Plant-Aufgaben:

* plantweite Zustände (optional)
* plantweite CMZ (optional)

> Für dieses Beispiel wird die Plant bewusst schlank gehalten.

***

#### Hardware-Zone

**HWZ\_01 – Station\_01**

Aufgaben:

* Betriebsarten (Hand / Automatik)
* Automatikfreigabe
* Startkoordination (zentral)
* HW-Zonen-CMZ

***

#### Sequence

**SEQ\_01 – ExtendCylinder**

Aufgabe:

* Starttaste auswerten
* Zylinder ausfahren
* Endlage „ausgefahren“ erreichen
* Zyklus abschließen (bereit für nächsten Start)

***

### 2) Zonen (Technik & Bedeutung)

> Jede relevante Technik wird als Zone beschrieben.

#### Z\_01 – Starttaste

* **Typ:** Input-Zone
* **Signal(e):**
  * `I_Start` (Taster Start)
* **HMI-Text:** „Starttaste drücken“

***

#### Z\_02 – Zylinder (Ausfahren)

* **Typ:** In-Out-Zone
* **Signal(e):**
  * Output: `Q_Extend` (Ventil: Ausfahren)
  * Input: `I_Extended` (Endlage ausgefahren)
  * Input: `I_Retracted` (Endlage eingefahren)
* **HMI-Text (S-Führung):**
  * beim Ausfahren: „Zylinder fährt aus“
  * Ziel erreicht: „Zylinder ausgefahren“

**Pair-Check (Plausibilität):**

* Paar: (`I_Extended`, `I_Retracted`)
* Regel: *beide gleichzeitig TRUE ist physikalisch unmöglich → Diagnose*

***

#### Z\_03 – AirPressureOK

* **Typ:** Input-Zone
* **Signal(e):**
  * `I_AirOK` (Druckluft i.O.)
* **HMI-Text:** „Druckluft i.O.“

> Diese Zone wird als **HW-Zonen-CMZ** verwendet (siehe CMZ).

***

#### Z\_04 – CycleDone (optional)

* **Typ:** Mem-Zone
* **Signal(e):**
  * `M_CycleDone`
* **HMI-Text:** „Zyklus abgeschlossen“

***

### 3) Logic-Layer (Zustandsmodell)

> Der Logic-Layer beschreibt den Ablauf als Zustandsautomat.

#### Zustände

* **S0 – Idle / WaitStart**\
  Wartet auf Startanforderung
* **S1 – ExtendCommand**\
  Zylinder ausfahren (Befehl + Erwartung)
* **S2 – Done**\
  Zyklus abgeschlossen, bereit für nächsten Start (oder Reset-Logik nach Bedarf)

#### Übergänge (vereinfacht)

* S0 → S1, wenn Startanforderung erfüllt
* S1 → S2, wenn Zylinder ausgefahren ist
* S2 → S0, wenn Starttaste losgelassen (oder Reset/Quittierung, je nach Stil)

> Hinweis: Die *technische Erfüllung* wird nicht im Logic-Layer beschrieben, sondern im System-Layer über Bit-Control.

***

### 4) System-Layer (Bit-Control / Kreuztabelle)

Operanden:

* `0` = Don’t care
* `S` = Sequence Check (Erwartung / Führung)
* `i` = Interlock (zwingende Bedingung, bei Abweichung Automatikfreigabe entzogen)

#### Bit-Control-Matrix

| Zone \ Zustand              | S0 WaitStart | S1 ExtendCommand | S2 Done |
| --------------------------- | -----------: | ---------------: | ------: |
| Z\_01 Starttaste (Input)    |            S |                0 |       0 |
| Z\_02 Zylinder (In-Out)     |            0 |                S |       0 |
| Z\_03 AirPressureOK (Input) |            i |                i |       i |
| Z\_04 CycleDone (Mem)       |            0 |                0 |       S |

**Interpretation:**

* In **S0** wird `Z_01` als `S` geführt: das System erwartet eine Startanforderung.
* In **S1** wird `Z_02` als `S` geführt: Output wird gesetzt (`Q_Extend`) und Feedback `I_Extended` wird erwartet.
* `Z_03` ist in allen Zuständen `i`: fällt `I_AirOK` weg, wird Automatikfreigabe entzogen und die Sequence stoppt.
* In **S2** wird `Z_04` als `S` gesetzt (optional): der Zyklus markiert sich als abgeschlossen.

***

### 5) Parameter-Layer (optional, aber sauber)

> Parameter ändern Werte, nicht Logik.

* `P_ExtendTimeout` (Zeitlimit für Ausfahren, falls benötigt)
* `P_DoneHoldTime` (Anzeige-/Haltezeit in Done, optional)

> Wenn ihr „Timeout“ modelliert, gehört die Logik dafür in einen Timer-State – der Wert kommt aus dem Parameter-Layer.

***

### 6) CMZ (Constantly Monitoring Zone)

#### HW-Zonen-CMZ: `Z_03 AirPressureOK`

* Ebene: **Hardware-Zone**
* Regel: `I_AirOK` muss **immer** korrekt anliegen
* Wirkung bei Fehler:
  * Automatikfreigabe entziehen
  * alle Sequences der HW-Zone stoppen
  * **keine manuelle Bewegung möglich** (CMZ-Regel)

> Diese CMZ macht klar: Ohne Druckluft kein sicherer Betrieb – weder Automatik noch Hand.

***

### 7) Pair-Check (Plausibilität)

#### Für `Z_02 Zylinder`

* Paar: (`I_Extended`, `I_Retracted`)
* Unmöglich: beide TRUE gleichzeitig
* Reaktion:
  * automatische Diagnose „Zylinder-Endlagen widersprüchlich“
  * Ablauf kann nicht fortgesetzt werden

> Der Pair-Check ist kein Ablaufbaustein, sondern Plausibilitätsüberwachung mit eindeutiger Diagnose.

***

### 8) MXIC (Manual Cross Interlock) – Handbetrieb

Ziel:

* Manuelle Bewegung nur, wenn sie **modellkonform und sicher** ist
* Im Zweifel: **Diagnose statt Bewegung**

#### Manuelle Aktionen (Buttons)

* `BTN_Extend` → steuert Zone `Z_02` (Ausfahren)
* `BTN_Retract` → steuert Zone `Z_02` (Einfahren) *(wenn Einfahren im Beispiel erlaubt sein soll)*

#### MXIC-Bedingungen (Beispielregeln)

* `BTN_Extend` ist erlaubt, wenn:
  * **kein CMZ-Fehler** aktiv ist (AirPressureOK muss stimmen)
  * *(optional)* der aktuelle Zustand S0 oder S1 ist (kein willkürliches Fahren in Done)
* `BTN_Retract` ist erlaubt, wenn:
  * **kein CMZ-Fehler** aktiv ist
  * *(optional)* der Ablauf nicht in kritischem Zustand ist

Wenn Bedingung nicht erfüllt:

* Bewegung wird verhindert
* Diagnose: „Manuelle Bewegung nicht erlaubt: “

***

### 9) HMI-Verhalten (kurz, modellbasiert)

* In **S0**:
  * Anzeige `Z_01` mit `S` → „Starttaste drücken“ (Führung)
* In **S1**:
  * Anzeige `Z_02` mit `S` → „Zylinder fährt aus“
  * sobald `I_Extended` erfüllt → Übergang nach S2
* Bei `i`-Abweichung (`I_AirOK` weg):
  * Automatikfreigabe entzogen, Stop, Diagnose an `Z_03`
* Bei Pair-Check-Fehler:
  * Diagnose an `Z_02` („Endlagen widersprüchlich“)

> Grundprinzip: Meldungen entstehen dort, wo das Modell Erwartung und Abweichung kennt (Zustand + Zone + Operand).

***

### 10) Zusammenfassung: Was dieses Modell zeigt

Dieses Beispiel ist vollständig, weil es:

* Struktur (Plant/HWZ/Sequence/Zone) definiert
* Ablauf (Logic-Layer) eindeutig beschreibt
* Verhalten (System-Layer/Bit-Control) formal festlegt
* Sicherheit/Integrität (CMZ) integriert
* Plausibilität (Pair-Check) automatisch überwacht
* Handbetrieb (MXIC) sicher begrenzt
* Diagnose/HMI aus dem Modell ableitbar macht

> Damit ist das Beispiel ein minimaler „Selmo-Standardfall“: klein, aber vollständig.
