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.