Aller au contenu

Architecture

Principe

StateCharts est une bibliothèque Modelica pure, sans code externe. Une machine à états est un ensemble de blocs — états (State, Initial, Choice, FinalState) et transitions (Transition) — reliés par des connecteurs causaux (booléens, entier, réel). Chaque transition est un bloc posé sur la flèche entre deux états, qui porte son étiquette SysML déclencheur [garde] / effet. La machine est simulée par le même solveur que le modèle physique, en temps continu ; ses changements d'état sont des événements Modelica. Le choix et ses alternatives sont décrits dans requirements.md (décisions « Mécanisme d'exécution des diagrammes » et « Notation SysML dans OMEdit »).

Arborescence

StateCharts/
├── package.mo, package.order
├── Chart.mo                -- partial model : cadre « stm », base d'une machine à états utilisée comme bloc
├── Initial.mo              -- pseudo-état initial (point noir)
├── State.mo                -- état : compartiments entry / do / exit, sorties booléennes, pulseDuration
├── Choice.mo               -- pseudo-état de choix (losange)
├── FinalState.mo           -- état final (cible), completed, stopSimulation
├── Transition.mo           -- trigger (Completion / Signal / After / When), garde, priorité, effet
├── Types/                  -- package.mo seul : enumeration Trigger
├── Interfaces/             -- StatePort (bord d'un état), TransitionPort (extrémité d'une transition)
├── Internal/               -- StateLogic (activité d'un état, partagée), availability (priorités)
├── Actions/                -- SetBoolean, SetInteger, SetReal
├── Examples/               -- TrafficLight, Thermostat (+ ThermostatChart), Toggle, Sorting
├── Sandbox/                -- bricolage hors vérification
└── Resources/Verification/ -- verify_*.mos + run_tests.sh

Les quatre blocs d'état déclarent chacun leurs ports et leur icône (géométries différentes : rectangle 240 × 160, point, losange, cible) et délèguent toute leur logique à un composant logic de type Internal.StateLogic, relié à leurs ports par connect. Le composant logic est public (ses variables sont dans les résultats, et les DynamicSelect de Choice y lisent logic.active) mais invisible dans les schémas (Placement(visible = false)).

Connecteurs

Un même connecteur sert aux transitions qui partent et à celles qui arrivent : c'est ce qui permet de relier une flèche à n'importe quel côté d'un état, dans les deux sens.

Variable StatePort (état) TransitionPort (transition) Rôle
active output input l'état est actif
available output input l'état est actif et aucune transition sortante plus prioritaire n'est franchissable
entryTime output input instant de la dernière entrée (pour after)
enabled input output côté source : déclencheur et garde satisfaits ; false côté cible
priority input output côté source : priorité de la transition
reset input output côté source : la transition franchit, l'état est quitté
set input output côté cible : la transition franchit, l'état est entré

Chaque état a quatre tableaux de ports (top, right, bottom, left) avec Dialog(connectorSizing = true) et une taille 0 par défaut : OMEdit les agrandit à chaque connexion. Un élément de port ne reçoit qu'une extrémité de transition.

Icônes

Convention reprise de modelica_micropython3 (décision « Taille des icônes » de requirements.md) : initialScale = 0.2, broches de 10 unités d'icône centrées sur des multiples de 10.

Bloc extent de l'icône Taille dans le schéma Ports
State {{-120, -80}, {120, 80}} 48 × 32 haut (0, 90), bas (0, -90), gauche (-130, 60), droite (130, 60) ; sorties entry / do / exit à droite en (130, 10 / -20 / -50)
Transition {{-100, -40}, {100, 40}} 40 × 16 source (-110, 0), target (110, 0), signal (-60, -50), guardPort (-20, -50), effect (60, -50)
Initial {{-30, -30}, {30, 30}} 12 × 12 côtés à ±30
Choice {{-50, -50}, {50, 50}} 20 × 20 sommets à ±50
FinalState {{-40, -40}, {40, 40}} 16 × 16 côtés à ±40

L'étiquette d'une transition est faite de textes dont la visibilité dépend des paramètres (visible = trigger == StateCharts.Types.Trigger.After, useGuard…) ; OMEdit 1.27 évalue ces expressions et substitue %delay, %guard, %change, %priority par leur valeur ou leur expression. L'effet s'affiche comme / %name. StatePort est un petit carré gris clair, TransitionPort un point gris : les ports inutilisés restent discrets.

Ce qui viendra

Les états composites et les régions parallèles (TODO de requirements.md) passeront par un inner porté par Chart et par les états composites, sur le modèle de StateGraphRoot / PartialCompositeStep de Modelica.StateGraph : suspension / reprise des sous-états, historique.