SCXML ist ein Dateiformat zur Beschreibung von Zustandsautomaten. Obwohl es weit verbreitet ist, mangelt es an guter Tool-Unterstützung. Wenn Sie nicht nur einen grafischen Editor für Ihren Statechart möchten, sondern auch SCXML-konforme Verifikation, Simulation und Möglichkeiten zum Schreiben von Unit-Tests, sollten Sie diesen Blogpost lesen, der zeigt, wie Sie SCXML-Modellierung auf das nächste Level bringen.
Was ist State Chart XML und wofür ist es gut?
SCXML, kurz für State Chart XML, ist ein Statechart-Austauschformat. Es basiert auf XML und wurde vom W3C standardisiert. Die SCXML-Standardisierung ist ein wichtiger Vorteil, da sie Statecharts hochgradig portabel und unabhängig von einer bestimmten Implementierung macht. Voraussetzung ist natürlich, dass die jeweilige Ausführungsumgebung der SCXML-Spezifikation entspricht.
Die aktuelle Version der Spezifikation wurde vom W3C im September 2015 veröffentlicht. Ein „Hello World" in SCXML sieht so aus:
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="hello">
<final id="hello">
<onentry>
<log expr="'hello world'" />
</onentry>
</final>
</scxml>
SCXML ist ein Austauschformat für Harel-Statecharts. Das XML definiert alle Zustände, Transitionen, Events und Variablen, die im Zustandsautomaten verwendet werden. Neben den strukturellen Elementen des Zustandsautomaten definiert der SCXML-Standard auch die Ausführungssemantik des Zustandsautomaten. Und das ist einer der größten Vorteile von SCXML – dasselbe Statechart-Modell kann auf verschiedenen SCXML-Engines auf verschiedenen Plattformen laufen und verhält sich immer genau gleich – solange die Engines der spezifizierten Ausführungssemantik entsprechen.
SCXML wird auf nahezu allen Plattformen unterstützt. Für Java ist Apache Commons SCXML die beliebteste SCXML-Engine. Es gibt sogar SCXML-Engines, die in JavaScript geschrieben sind und in Webanwendungen eingesetzt werden können, wie SCION. Eine weitere sehr beliebte Plattform, die SCXML für Human Machine Interfaces verwendet, ist der SCXML Interpreter für Qt.
Was ist der Vorteil von itemis CREATE?
SCXML ist ein Austauschformat für Maschinen und keine erstklassige Programmiersprache für Menschen. Wie viele andere XML-Formate ist es ziemlich schwer zu lesen und noch schwerer von Hand zu schreiben. Daher ist gute Tool-Unterstützung bei der Arbeit mit SCXML unerlässlich. Der Qt Creator bietet einen einfachen grafischen Editor für SCXML-Dokumente. Das ist ein großer Vorteil gegenüber dem manuellen Schreiben von State Chart XML.
Neben einem grafischen Editor bietet itemis CREATEs sogenannte SCXML-Domain ein umfangreiches Feature-Set, das Higher-Level-Modellierung, interaktive Simulation und Unit-Tests von SCXML-Statecharts ermöglicht. Bei der Verwendung der SCXML-Domain ist alles vollständig konform mit dem SCXML-Standard. Wir haben die integrierte Simulation Engine angepasst, um die SCXML-Ausführungssemantik abzubilden, und natürlich unterstützt auch das SCTUnit-Framework den SCXML-Standard. So können Sie sicher sein, dass Ihre SCTUnit-Testergebnisse genau das Verhalten der SCXML-Engine Ihrer Wahl widerspiegeln.
Schauen wir uns das Feature-Set jetzt genauer an.
Higher-Level-Modellierungskonzepte
Harel-Statecharts unterstützen generell bestimmte Higher-Level-Features wie Choices, Synchronization, Time Trigger und Named Entry und Exit Points. Diese Konzepte sind äußerst nützlich, werden aber von SCXML nicht out-of-the-box unterstützt. Der itemis CREATE Code-Generator umgeht diese Einschränkung, indem er solche Higher-Level-Konzepte in einfaches SCXML umwandelt.
Zum Beispiel hat die itemis CREATE Sprache erstklassige Unterstützung für Time Trigger. Betrachten Sie den folgenden Statechart, der jede Sekunde einen Integer-Wert inkrementiert:

In SCXML können wir einen äquivalenten Statechart wie folgt spezifizieren:
<?xml version="1.0" encoding="UTF-8"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" datamodel="ecmascript" name="StateTimeTriggerAfter" initial="StateA">
<datamodel>
<data expr="0" id="value" />
</datamodel>
<state id="main_region">
<state id="StateA">
<onentry>
<send event="StateA_timeEvent_0" delay="1s"/>
</onentry>
<transition event="StateA_timeEvent_0" cond="">
<assign location="value" expr="value + 1"/>
<send event="StateA_timeEvent_0" delay="1s"/>
</transition>
<onexit>
<cancel sendid="StateA_timeEvent_0" />
</onexit>
</state>
</state>
</scxml>
Wie Sie sehen können, spiegelt sich der einfache Time Trigger in mehreren Teilen des SCXML wider. Wir müssen ein verzögertes Event senden, wenn wir den Zustand betreten, wir müssen dasselbe Event in der Self-Transition des Zustands senden und wir müssen das Event abbrechen, wenn wir den Zustand verlassen. Das Timing von 1 s auf etwas anderes zu ändern bedeutet, zwei Teile des SCXML zu ändern. Das ist fehleranfällig, wenn es manuell gemacht wird. Und das ist nur ein sehr einfaches Beispiel. Dasselbe gilt für Choices, Synchronization, Time Trigger und Named Entry und Exit Points.
Interaktive Simulation von SCXML-Modellen
Mit itemis CREATE können Modelle direkt im Simulator ausgeführt werden. Das folgende Beispiel wurde aus den Qt-Beispielen entnommen und mit itemis CREATE modelliert. Mit der itemis CREATE Simulation Engine, die unter der Haube Apache Commons SCXML verwendet, können Sie Ihr Modell direkt ausführen, um zu prüfen, ob es sich wie erwartet verhält. Sie können Events interaktiv auslösen und Variablenwerte in der Simulation View inspizieren.

Unit-Tests für SCXML-Statecharts
Wir haben auch unser Test-Framework SCTUnit angepasst, um mit SCXML-Modellen zu arbeiten. Für Qt gibt es sogar einen SCTUnit Code-Generator, der eine C++-Test-Suite aus der Test-Spezifikation generiert.

Alles zum Laufen bringen
Wenn Sie neu bei itemis CREATE sind, können Sie hier eine 30-Tage-Testversion herunterladen. Um alles in Aktion zu sehen, haben wir ein Beispiel zum Beispiel-Wizard hinzugefügt. Es enthält den Traffic-Light-Statechart, der on-the-fly in eine SCXML-Datei umgewandelt wird. Zusätzlich kommt das Beispiel mit etwas Qt-Code, sodass Sie es in Ihrer Qt-Umgebung ausführen und die Ampel in Aktion sehen können. Sie können den Statechart genauso bearbeiten, simulieren und testen wie einen „normalen" Statechart. Um dieses Beispiel zu Ihrem Workspace hinzuzufügen, wählen Sie
File -> New -> Example -> itemis CREATE Examples. Wählen Sie das Beispiel „Traffic Light (SCXML) for QT" aus und drücken Sie Finish.

Vergessen Sie nicht, uns Feedback im Kommentarbereich unseres Blogs oder über unsere User Group zu hinterlassen!
Model-Driven Software Development bei itemis — Modellieren Sie Statecharts, simulieren Sie das Verhalten und generieren Sie produktionsreifen Code mit itemis CREATE: Model-Driven Software Development →