Grundlagen
Das UML Zustandsdiagramm ist ein grafischer Formalismus, um den Ablauf eines ereignisdiskreten Systems zu spezifizieren und zu designen bzw. um ein Zeitverhalten zu programmieren. Integriert in den SPS-Bereich der TwinCAT 3 Entwicklungsumgebung verfügt ein Zustandsdiagramm über einen Editor mit Zustands- und Transitionselementen. Beim Kompilieren der Applikation wird ausführbarer Code erzeugt. Das Schaltverhalten eines Zustandsdiagramms ist bei der Ausführung standardmäßig abhängig vom Taskzyklus getaktet, aber je nach Konfiguration der Zustände kann es auch unabhängig schalten. In diesem Fall handelt es sich um zyklusinterne Zustände. Leistungsstarke Funktionalitäten wie Syntaxüberwachung oder Debuggen im Online-Modus unterstützen den Entwicklungsprozess.
Anwendungsfall
Ein Zustandsdiagramm wird verwendet, um zeitdiskrete Systeme zu programmieren. Programme, Funktionsbausteine, Funktionen, Methoden oder Aktionen können mit der Implementierungssprache Zustandsdiagramm als Graph aus Zuständen und Transitionen erstellt werden.
Funktionen/Methoden und ihre Daten sind üblicherweise temporär. Wenn Sie eine Funktion/Methode mit der Implementierungssprache UML Zustandsdiagramm implementieren, beinhaltet das Diagramm zyklusinterne Zustände und initialisiert am Anfang des Taskzyklus die Daten neu.
Bei Methoden gibt es hingegen die Möglichkeit, die Methode als VAR_INST zu deklarieren. Dann werden die Daten wie bei einem Funktionsbaustein gehalten und sind nicht mehr temporär, sodass das Zustandsdiagramm wie gewohnt in mehreren Taskzyklen durchlaufen wird. Sehen Sie hierzu auch die Option VarInstNutzen (UseVarInst). Bei Funktionen steht diese Option nicht zur Verfügung.
Syntax
Die Syntax wird vom Compiler überprüft:
- Eine Transition zwischen Zuständen, die in unterschiedlichen Regionen liegen, ist nicht erlaubt
- Orthogonale Zustände können nicht in anderen Zuständen verschachtelt werden
- Genau eine Abschlusstransition und/oder eine Ausnahmetransition geht von einem zusammengesetzten Zustand ab
- Eine bedingte Transition in einen orthogonalen Zustand hinein ist nicht erlaubt. Dann ist zusätzlich eine Gabelung oder Verbindung erforderlich
Befehle
Für das Zustandsdiagramm stehen folgende Befehle bzw. Aktionsmöglichkeiten zur Verfügung:
Beachten Sie außerdem die Befehle, die für alle UML-Diagramme verfügbar sind: Gemeinsame Befehle aller UML-Diagramme.
Implizite Variablen eines Zustandsdiagramms
Die impliziten Variablen befinden sich in der Programmeinheit, die das Zustandsdiagramm abbildet (z.B. in der Instanz des Funktionsbaustein oder in einem Programm). Die internen Variablen befinden sich innerhalb der Programmeinheit unter dem Elementnamen „UML_SC_<POU-Name>“ mit dem Datentyp „UML_SC_<id>“.
Für den Funktionsbaustein „FB_UML“ lautet der Elementname der impliziten Variablen beispielsweise „UML_SC_FB_UML“. Sie befinden sich in der Funktionsbausteininstanz „fbUml“.
„UML_SC_<POU-Name>“ vom Datentyp _UML_SC_<id>:
Einige implizite Variablen geben den Status des Objekts während der Laufzeit wieder (InFinalState, States), andere dienen zur Verhaltenssteuerung zur Laufzeit (Reinit, Abort, AutoReInit).
Name | Datentyp | Bedeutung |
---|---|---|
InFinalState | BOOL | Diese Variable besitzt den Wert TRUE, wenn sich das Zustandsdiagramm im Endzustand befindet. |
ReInit | BOOL | Wenn Sie diese Variable auf TRUE setzen, wird das Zustandsdiagramm reinitialisiert, d.h. der Startzustand des Diagramms wird aktiviert. |
Abort | BOOL | Wenn Sie diese Variable auf TRUE setzen, wird die aktuelle Operation des Diagramms abgebrochen und der Endzustand des Diagramms wird aktiviert. |
AutoReInit | BOOL | Wenn diese Variable den Wert TRUE besitzt, wird automatisch wieder in den Startzustand geschaltet, sobald der Endzustand des Diagramms erreicht ist. Default-Wert: TRUE |
States | ARRAY[<Anzahl der Zustände>] OF _UML_SC_State | siehe unten |
Names | _UML_SC_<id>_Names | siehe unten |
„UML_SC_<POU-Name>.States“ vom Datentyp ARRAY[<Anzahl der Zustände>] OF _UML_SC_State:
Die Variablen der Struktur _UML_SC_State dienen der Beschreibung eines Zustands. Dieser Datentyp ist der Basistyp eines Arrays mit dem Namen „States“, das in den impliziten Variablen deklariert ist und die einzelnen Zustände des Zustandsdiagramms beschreibt.
In der nachfolgenden Tabelle sind die einzelnen Variablen der Struktur _UML_SC_State beschrieben.
Name | Datentyp | Bedeutung |
---|---|---|
Active | BOOL | Flag, um zu ermitteln, ob der Zustand aktuell aktiv ist. |
FastExecutionFault | BOOL | Relevant für IntraCycle-States: Wenn ein IntraCycle-State länger als einen Zyklus aktiv ist, wird dieses Flag vom System gesetzt. Das Flag wird bei Verlassen des IntraCycle-States zurückgesetzt. |
ID | INT | ID des Zustands Die ID des Zustands entspricht dem Index, an dem der Zustand im „States“-Array beschrieben ist. |
ActivationTime | TIME | Zeitstempel der letzten Aktivierung des Zustands |
Name | STRING | Name des Zustands |
„UML_SC_<POU-Name>.Names“ vom Datentyp _UML_SC_<id>_Names:
Der Datentyp _UML_SC_<id>_Names enthält für jeden Zustand des Zustandsdiagramms eine INT-Variable, die mit dem Namen des Zustands deklariert ist und deren Wert die ID des Zustands repräsentiert. Die ID des Zustands entspricht dem Index, an dem der Zustand im „States“-Array beschrieben ist.
Name | Datentyp | Bedeutung |
---|---|---|
<Name des Zustands> Beispiel: StartState1 | INT | ID des Zustands (= Index, an dem der Zustand im „States“-Array beschrieben ist) Beispiel: ID des Zustands „StartState1“, z.B. 4 |
<Name des Zustands> Beispiel: State1 | INT | ID des Zustands (= Index, an dem der Zustand im „States“-Array beschrieben ist) Beispiel: ID des Zustands „State1“, z.B. 5 |
<Name des Zustands> Beispiel: State2 | INT | ID des Zustands (= Index, an dem der Zustand im „States“-Array beschrieben ist) Beispiel: ID des Zustands „State2“, z.B. 6 |
… | … | … |
Beispiel:
Es wird ein Funktionsbaustein mit der Implementierungssprache UML SC und dem Namen „FB_UML“ angelegt. Das Statechart-Diagramm verfügt über einen Zustand mit dem Namen „MyStateName“. Der FB beinhaltet zusätzlich die Methode „MyMethod“ in der Sprache ST. In dem folgenden Beispiel wird von innerhalb sowie von außerhalb des FBs abgefragt, ob sich das Statechart-Diagramm aktuell in dem Zustand „MyStateName“ befindet.
Zugriff von innerhalb des FBs / in FB_UML.MyMethod:
FUNCTION_BLOCK FB_UML
VAR
bInSpecificState : BOOL;
…
END_VAR
METHOD MyMethod : BOOL
bInSpecificState := UML_SC_FB_UML.States[UML_SC_FB_UML.Names.MyStateName].Active;
Zugriff von außerhalb des FBs / in MAIN:
PROGRAM MAIN
VAR
fbInstance : FB_UML;
bInSpecificState : BOOL;
END_VAR
fbInstance();
fbInstance.MyMethod();
bInSpecificState := fbInstance.UML_SC_FB_UML.States[fbInstance.UML_SC_FB_UML.Names.MyStateName].Active;