Historique et genèse Les statecharts ont été introduits en 1987 par David Harel dans un article fondateur intitulé Statecharts: A Visual Formalism for Complex Systems. L’objectif était d’étendre les automates finis classiques afin de modéliser des systèmes réactifs complexes, en ajoutant des notions hiérarchiques, de parallélisme et de communication entre états. Cette formalisation est devenue un standard dans l’ingénierie logicielle et l’automatisation industrielle.

Formalisation avec SCXML Pour standardiser l’usage des statecharts, le W3C a défini le langage SCXML (State Chart XML).

SCXML est une description formelle et exécutable des machines à états, basée sur XML mais enrichie de sémantique de programmation: états, transitions, événements, conditions et actions. Contrairement à XML qui n’est qu’un markup language destiné au balisage de données, SCXML est un véritable langage de programmation déclaratif, permettant l’exécution de comportements.

En pratique, un interpréteur SCXML exécute le graphe d’états défini dans le fichier. SCXML peut être utilisé seul ou intégré dans d’autres systèmes pour orchestrer des comportements complexes.

Applications des statecharts Les statecharts et SCXML sont utilisés dans de nombreux domaines où la modélisation de comportements dynamiques est essentielle:

Interfaces Homme-Machine (IHM) Gestion de la navigation dans des systèmes embarqués ou mobiles. Contrôle du flux entre écrans et états interactifs. Automatisation industrielle Orchestration de séquences de machines, gestion d’alarmes et transitions conditionnelles. Représentation et exécution des processus et machines à états complexes. Systèmes distribués et IoT Coordination d’événements entre objets connectés. Contrôle de protocoles de communication ou de séquences complexes dans des environnements multi-appareils. Télécommunications Stratégies "outbound" et “treatments” de campagnes. Documentation officielle architecture et déploiement. SCXML combine des concepts de CCXML (Call Control XML). CCXML est un standard W3C pour le contrôle d’appels et s’interface avec VoiceXML.

Exemple Voici un exemple de SCXML, comprenant une partie des actions, des conditions et des commandes de gestion d’un moteur contrôlé par deux capteurs, avec une verrine (stacklight) qui passe du vert au jaune selon l’état du moteur.<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="initializing">

<!-- Variables de données liées aux symboles --> <datamodel> <data id="moteurEtat" expr="readSymbol('')"/> <!-- Par exemple TRUE si en marche, FALSE si à l'arrêt --> <data id="stacklightEtat" expr="readSymbol('')"/> <!-- Par exemple 'green', 'yellow', 'red' --> <data id="capteurEtat" expr="readSymbol('')"/> <!-- Par exemple TRUE si capteur activé --> </datamodel>

<!-- Transitions globales pour garder les variables synchronisées avec les symboles --> <transition event="symbolValueChanged" cond="_event.data.symbol_id == ''"> <assign location="moteurEtat" expr="_event.data.value"/> </transition>

<transition event="symbolValueChanged" cond="_event.data.symbol_id == ''"> <assign location="stacklightEtat" expr="_event.data.value"/> </transition>

<transition event="symbolValueChanged" cond="_event.data.symbol_id == ''"> <assign location="capteurEtat" expr="_event.data.value"/> </transition>

<!-- État d'initialisation pour définir l'état initial correct --> <state id="initializing"> <onentry> <if cond="moteurEtat == true"> <raise event="init.to.running"/> <else/> <raise event="init.to.idle"/> </if> </onentry> <transition event="init.to.running" target="running"/> <transition event="init.to.idle" target="idle"/> </state>

<!-- État de démarrage du moteur --> <state id="starting"> <onentry> <script> writeSymbol('', true); <!-- Démarrer le moteur --> writeSymbol('', 'yellow'); <!-- Stacklight jaune pendant le démarrage --> </script> <send event="timer.start" delay="3s" id="start_timer"/> </onentry> <onexit> <cancel sendid="start_timer"/> </onexit> <transition event="symbolValueChanged" cond="_event.data.symbol_id == '' && _event.data.value == true" target="running"/> <transition event="timer.start" target="fault"/> </state>

<!-- État d'arrêt du moteur --> <state id="stopping"> <onentry> <script> writeSymbol('', false); <!-- Arrêter le moteur --> writeSymbol('', 'green'); <!-- Stacklight verte à l'arrêt --> </script> <send event="timer.stop" delay="3s" id="stop_timer"/> </onentry> <onexit> <cancel sendid="stop_timer"/> </onexit> <transition event="symbolValueChanged" cond="_event.data.symbol_id == '' && _event.data.value == false" target="idle"/> <transition event="timer.stop" target="fault"/> </state>

</scxml> vignette|Statechart du scxml d'exemple représenté sous forme de diagramme

Explication idle: le moteur est arrêté, la stacklight est verte. running: le moteur est en marche, la stacklight est jaune. Les événements sensor.start et sensor.stop sont déclenchés par les deux capteurs (ex. capteur de présence matière ou capteur de sécurité). Les actions send event="..." représentent les commandes envoyées aux actionneurs (moteur, stacklight). Les scripts et expressions avec des appels à des fonctions telles que writeSymbol(...) et readSymbol(...) qui sont spécifiques à certains moteurs d'exécution de scxml.

Références

Catégorie:Programmation informatique