Statecharts

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[1]. 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[2]).

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:

  1. 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.
  2. Automatisation industrielle[3]
    • Orchestration de séquences de machines, gestion d’alarmes et transitions conditionnelles.
    • Représentation et exécution des processus et machines à états complexes.
  3. Systèmes distribués et IoT[4]
    • Coordination d’événements entre objets connectés.
    • Contrôle de protocoles de communication ou de séquences complexes dans des environnements multi-appareils.
  4. 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[5].

<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 == '' &amp;&amp; _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 == '' &amp;&amp; _event.data.value == false" target="idle"/>
    <transition event="timer.stop" target="fault"/>
  </state>

</scxml>
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

  1. ↑ David Harel, « Statecharts: a visual formalism for complex systems », Science of Computer Programming, vol. 8, no 3,‎ , p. 231–274 (ISSN 0167-6423, DOI 10.1016/0167-6423(87)90035-9, lire en ligne, consulté le )
  2. ↑ (en) « State Chart XML (SCXML): State Machine Notation for Control Abstraction » [archive du ], sur www.w3.org (consulté le )
  3. ↑ (en) « Software PLC based on statecharts (SCXML) » Accès libre, sur Vitesse Automation (consulté le )
  4. ↑ Dirk Schnelle-Walka, Stefan Radomski, Jim Barnett et Max Mühlhäuser, « Engineering interactive systems with SCXML », Proceedings of the 7th ACM SIGCHI Symposium on Engineering Interactive Computing Systems, ACM,‎ , p. 298–299 (DOI 10.1145/2774225.2777462, lire en ligne, consulté le )
  5. ↑ (en) « Vitesse, outil de gestion des scxml par l'IA » Accès libre, sur Vitesse automation, (consulté le )
  • icône décorative Portail de l’informatique