Basisbibliothek
Das OTX Datenmodell besteht aus einem zentralen Kern (Core oder Basisbibliothek) und verschiedenen funktionsspezifischen Erweiterungen (Libraries). Der Core beschreibt die Struktur jedes OTX Dokuments. Es spezifiziert die allgemeine Ablauflogik und enthält alle Kontrollstrukturen, Deklarationen, Fehlerbehandlungs- und Erweiterungsmechanismen. Nachfolgend werden die wesentlichen Eigenschaften und Elemente beschrieben.
Core Basisbibliothek innerhalb der OTX Architektur |
Haupteigenschaften
Das Datenmodell hat folgende Haupteigenschaften:
- Imperative, strukturierte Programmierung
- Deklaration von Abläufen, Variablen, Konstanten und Metadaten
- Zugriff auf Umgebungsdaten
- Spezifikationsfeld in jedem Knoten sowie freie Kommentare
- Erweiterungspunkte für die Anbindung neuer Funktionen
- Kontrollstrukturen
- Schleifen (while, do-while, for, for-each)
- Verzeigungen (if-then-else)
- Parallelabläufe
- Aufrufe (Sequenzen, Berechnungen etc.)
- Fehler- und Ausnahmebehandlung
Hauptelemente
Das Datenmodell besteht aus folgenden Hauptelementen, siehe Bild:
- Datentypen
- Prozeduren
- Parameter
- Deklarationen
- Aktivitäten (Nodes)
- Ausdrücke (Terms)
Core Datenmodell - Hauptelemente |
Datentypen
In OTX müssen alle Variablen, Parameter und Eigenschaften einen Datentyp haben. Der Core definiert eine Reihe von Grunddatentypen, siehe Bild.
OTX Core Datentypen |
Die Datentypen werden folgende Gruppen eingeteilt:
- SimpleType
- Boolean
- Float
- ByteField
- Integer
- String
- ComplexType
- List (Array)
- Map (Key-Value Pairs)
- Exception
- UserException
- OutOfBoundsException
- TypeMismatchException
- ArithmeticException
- InvalidReferenceException
- SimpleType
Komplexe Datentypen können aus einfachen oder wiederum komplexen Datentypen zusammengesetzt sein. Die Typen List und Map sind generische Typen mit beliebiger Verschachtelungstiefe. Die UserException ist die einzige Ausnahme, die der Autor selbst mit Hilfe der Throw-Aktivität erzeugen kann. Mit den verschiedenen Bibliotheken kommen meist weitere komplexe Datentypen hinzu.
Prozeduren
Eine Prozedur beschreibt die Abläufe (Sequenzen). Sie besteht aus
- Parametern,
- verschiedenen Deklarationen (Constants, Variables, Comments, Throws, Visibility) und
- einer Sequenz (Flow) von Knoten (Nodes), siehe Bild.
Elemente einer OTX Prozedur |
Eine Prozedur ist der ausführbare Teil eines OTX-Dokuments. Sie kann als Einstiegspunkt eines Ablaufsystems verwendet oder von anderen Prozeduren auch außerhalb des OTX Dokuments aufgerufen werden.
Parameter
Die Parameter definieren die Ein- und Ausgabegrößen einer Prozedur. Sie werden eingeteilt in:
- InParameter
- Werte werden wie Konstanten behandelt und können innerhalb der Prozedur nicht geändert werden. Fehlende Parameter werden entweder mit dem Initialwert der Parameterdeklaration oder des Datentyps initialisiert.
- InOutParameter
- Es werden Referenzen übergeben, d.h. eine Werteänderung ist für den Aufrufer sichtbar. Fehlende Parameter werden entweder mit dem Initialwert der Parameterdeklaration oder des Datentyps initialisiert.
- OutParameter
- Rückgabewerte der Prozedur. Schreibt die Prozedur nichts in den Parameter wird entweder der Initialwert der Parameterdeklaration oder des Datentyps zurückgegeben.
OTX Parameter & Deklarationen |
Deklarationen
Variablen und Konstanten müssen deklariert werden. Für die Deklaration gibt es nur zwei Orte:
- global, auf Ebene des Dokuments oder
- lokal, auf EBene der Prozedur.
Konstanten werden zur Entwicklungszeit definiert und zur Laufzeit nicht geändert. Variablen können durch die Prozedur beliebig geändert werden. Wird kein Standardwert definiert wird eine Variable mit dem Standardwert des Datentyps initialisiert.
Knoten (Aktivitäten oder Nodes)
Ein Knoten repräsentiert einen einzelnen Schritt innerhalb eines Ablaufs (Flow). Er wird hier meist als Aktivität bezeichnet. Es gibt zwei Arten von Knoten:
- Atomic-Node
- Einfache Aktivität, welche keine weiteren Aktivitäten beinhalten kann. Beispiel: Action, Return, Continue, Break und Throw
- Compound-Node
- Kann weitere Aktivitäten und Abläufe in beliebiger Tiefe enthalten. Beispiel: Group, Loop, Branch, Parallel und Handler
OTX Core Hauptknoten (Aktivitäten) |
Compound Node – Group
Der Group Knoten ist der einfachste Compound Knoten. Er verbindet eine Sequenz von Knoten zu einem logischen Block (Gruppe) zusammen. Der Autor zeigt damit die Zusammengehörigkeit der Sequenz und unterstützt damit einen klaren und modularen Aufbau der Abläufe. Group Knoten können im OTX Designer zusammen- oder auseinandergeklappt werden.
Group Node |
Compound Node – Loop
Eine Schleife (Loop) wird zur wiederholten Ausführung von einer oder mehreren Aktivitäten eingesetzt. In der Abbildung sind die 4 Arten von Schleifen dargestellt:
OTX Loop Nodes (Schleifen) |
- ForLoop
- For-Schleife die durchlaufen wird, bis der Zähler den Endwert erreicht hat.
- ForEachLoop
- Schleife die für jedes Element einer Auflistung durchlaufen wird.
- WhileLoop
- Schleife die durchlaufen wird, bis die Bedingung den Wert False liefert. Die Bedingung wird zu Beginn der Schleife getestet.
- DoWhileLoop
- Schleife die durchlaufen wird, bis die Bedingung den Wert False liefert. Die Bedingung wird zu Beginn der Schleife getestet.
Ein Break Knoten beendet die aktuelle Schleife und setzt die Ausführung am nächsten Atomic-Knoten oder dem darüber liegenden Compound-Knoten fort. Ein Continue Knoten beendet die aktuelle Iteration in einer Schleife und setzt die Ausführung mit der nächsten Iteration fort. Bei Schleifen mit einer Bedingung, kann die Bedingung am Anfang (While) oder am Ende der Schleife (DoWhile) getestet werden.
Compound Node – Branch
Verzweigungen (Branch) werden für die bedingte Ausführung von Sequenzen verwendet. Sie bestehen aus einem oder mehreren Zweigen mit einer Bedingung (Condition) und einer Sequenz (Flow). Die Bedingungen werden von links nach rechts ausgewertet. Die erste Sequenz bei der die Bedingung wahr ist, wird ausgeführt. Zweige, bei denen die Bedingung nicht wahr ist, werden ignoriert. Gibt es mehr als einen Zweig, muss der letzte Zweig keine Bedingung haben. Er wird dann falls keine Bedingung zutrifft ausgeführt (Else).
OTX Branch Nodes (Verzweigungen) |
Compound Node – Parallel
Ein paralleler Knoten (Parallel) besteht aus mindestens zwei Sequenzen (Lane), die gleichzeitig ausgeführt werden. Jede Lane wird dabei in einem eigenen Thread ausgeführt. Die Reihenfolge der Ausführung der Lanes ist unbestimmt. Der Knoten kann normalerweise nur synchron beendet werden. Dies bedeutet, dass erst alle Lanes beendet sein müssen, bevor der Knoten beendet wird. Es gibt jedoch verschiedene Bedingungen, die eine spezielle Beendigung der Lanes erzwingen:
OTX Parallel Node |
- TerminateLanes Node
- Der TerminateLanes Knoten beendet die aktuelle Lane und signalisiert den anderen Lanes sich zu beenden. Die signalisierten Lanes arbeiten den aktuellen Atomic Knoten ab und beendet sich. Nachdem sich alle Lanes beendet haben, wird auch der gesamte Knoten beendet.
- Return Node
- Der Return Knoten beendet die aktuelle Lane, wartet bis sich alle anderen Lanes beendet haben und beendet dann die gesamte Prozedur.
- Ausnahme
- Wird innerhalb einer Lane eine unbehandelte Ausnahme ausgelöst, beendet sich die aktuelle Lane. Nachdem sich alle anderen Lanes beendet haben wird die Ausnahme an die darüber liegenden Schichten zur Bearbeitung weitergegeben.
- Achtung: Es ist kein Timeout definiert. Es ist somit möglich, den Ablauf in ein Deadlock zu bringen.
Compound Node – Handler
Atomic Nodes – EndNodes
Wird innerhalb einer Sequenz der letzte Knoten beendet, wird die Abarbeitung auf den nächsten Knoten in der äußere Sequenz übergeben. Ist keine weitere äußere Sequenz vorhanden, wird die Prozedur beendet. Dies ist das Standardverhalten bei Sequenzen. Mit EndNode Knoten können Sequenzen in einer anderen Weise als dem Standardverhalten beendet werden. Es gibt 4 verschiedene EndNode Knoten:
- Return
- Beendet die gesamte Prozedur sofort und übergibt die Abarbeitung an den Aufrufer.
- Continue
- Beendet die äußere Schleife sofort und setzt die Abarbeitung in der im Target-Attribut angegebenen Schleife fort. Vor der Weiterverarbeitung wird die Schleifenbedingung erneut geprüft.
- Break
- Beendet eine Schleife oder einen Parallel Knoten sofort. Die Abarbeitung wird an den nächsten Knoten in der im Target-Attribut angegebenen Schleife/Parallel fortgeführt.
- Throw
- Wirft eine explizite Exception/Ausnahme. Beendet die Abarbeitung des aktuellen Kontexts und übergibt die Abarbeitung an den nächsten Fehler-Handler.
Atomic Nodes – Action
In OTX ist eine Action ein atomarer Knoten, dessen Verhalten durch die sogenannte ActionRealisation bestimmt wird. Der OTX-Core und insbesondere alle Erweiterungsbibliotheken definieren die jeweiligen ActionRealisations.
- Core: Assignment, ProcedureCall, ListInsertItems, ...
- DiagCom: ExecuteDiagService, ...
- HMI: ConfirmDialog, ShowDocumentDialog, ...
OTX Action Nodes |
Ein Action Knoten kann mehrere Realisierungen haben, siehe Validity Konzept. Bei mehreren Realisierungen wird die erste Realisierung ausgeführt, deren ValidFor-Attribut entweder leer ist oder TRUE ergibt. Weitere Realisierungen werden ignoriert. Ein Action Knoten muss keine Realisierung haben, siehe Specification-Realisation Konzept. Eine Action ohne Realisierung dient nur der Spezifikation und wird zur Laufzeit ignoriert.
Ausdrücke (Terms)
Terms werden verwendet um Ausdrücke (Expressions) zu beschreiben. Terms werden an vielen verschiedenen Stellen eingesetzt:
- In Actions
- In Parametern
- In Bedingungen
Terms haben einen Rückgabewert und enthalten Werte, Variablen oder wiederum Terms in beliebiger Verschachtelungstiefe. Die Argumente eines Terms werden durch die Auswertung nicht verändert, d.h. ein Term hat keine Seiten-Effekte! Ein Term wird durch seinen Rückgabetyp kategorisiert, siehe Abbildung:
Typen von OTX Terms (Ausdrücke) |
Innerhalb des OTX Designers werden die meisten Terms grafisch als Aktivitäten dargestellt.
OTX Terms als Aktivitäten |
Jede Bibliothek kann von den Core-Terms abgeleitete neue Terms definieren
Beispielbedatung
Im folgenden Bild ist ein OTX Dokument im XML-Format dargestellt. Es zeigt exemplarisch einen einfachen Ablauf. Im globalen Bereich wird eine Validity definiert. Es gibt eine Prozedur mit einer Variablen vom Typ Integer. Im Ablauf wird eine Umgebungsvariable data1 auf den Wert "abc" gesetzt.
Einfacher OTX Beispielablauf im XML-Format |
Siehe auch