Les blocs¶
| Bloc | Élément SysML |
|---|---|
StateCharts.Initial |
pseudo-état initial (point noir) |
StateCharts.State |
état, avec entry / do / exit |
StateCharts.Transition |
transition déclencheur [garde] / effet |
StateCharts.Choice |
pseudo-état de choix (losange) |
StateCharts.FinalState |
état final (cible) |
StateCharts.Chart |
cadre stm : machine à états utilisée comme bloc |
StateCharts.Actions.SetBoolean, SetInteger, SetReal |
valeur de sortie selon l'état actif |

Ports des états¶
State, Initial, Choice et FinalState ont un tableau de ports sur chacun de leurs quatre côtés : top[nTop], right[nRight], bottom[nBottom], left[nLeft]. Un même port sert aux transitions qui partent et à celles qui arrivent. OMEdit augmente la taille du tableau à chaque connexion (onglet Ports du dialogue de paramètres).
Plusieurs transitions peuvent partir d'un même état, de n'importe quels côtés : c'est ainsi qu'on bifurque.
State¶
| Sortie booléenne | Position | Rôle |
|---|---|---|
entry |
droite, en haut | vraie pendant pulseDuration après chaque entrée dans l'état |
do |
droite, au milieu | vraie tant que l'état est actif |
exit |
droite, en bas | vraie pendant pulseDuration après chaque sortie de l'état |
| Paramètre | Défaut | Rôle |
|---|---|---|
pulseDuration |
0,1 s | durée des impulsions entry et exit ; 0 = impulsion instantanée |
| Variable | Rôle |
|---|---|
entryCount |
nombre d'entrées depuis le début de la simulation |
activeDuration |
temps passé dans l'état depuis sa dernière entrée (0 s'il est inactif) |
Une impulsion instantanée (pulseDuration = 0) n'est vraie qu'à l'instant de l'événement : elle suffit pour déclencher un when, mais ne se voit pas sur une courbe. Une transition d'un état vers lui-même provoque une sortie puis une entrée (impulsions exit et entry, activeDuration remis à 0).
En relecture des résultats dans OMEdit, l'état actif est colorié en vert, et les mots entry / do / exit passent en vert quand la sortie correspondante est vraie.
Initial¶
Le point noir. Il est actif au démarrage et quitté aussitôt par sa transition sortante, qui n'a pas de déclencheur (Completion), en général pas de garde, et peut avoir un effet. Un seul par machine à états.
Tous les états sont inactifs pendant l'initialisation ; le pseudo-état initial devient actif juste après, au premier instant de la simulation. L'impulsion entry du premier état a donc bien lieu à t = 0.
Transition¶
Une transition se pose sur la flèche entre deux états : source (à gauche) vers l'état de départ, target (à droite) vers l'état d'arrivée. La retourner ou la tourner pour suivre le tracé de la flèche. Son étiquette suit la notation SysML : déclencheur [garde] / effet, où l'effet porte le nom de la transition.
Déclencheur (trigger)¶

| Valeur | Étiquette | La transition franchit… |
|---|---|---|
Completion |
(rien) | dès que l'état source est actif et que la garde est vraie |
Signal |
signal ↑ |
au front montant de l'entrée signal (en bas à gauche) |
After |
after(delay) |
quand l'état source est actif depuis delay |
When |
when(change) |
quand l'expression change devient vraie, par exemple change = sensor.T > 294.15 |
Un événement Signal ou When qui survient alors que l'état source est inactif, ou que la garde est fausse, est perdu. Aucun événement n'a lieu au démarrage : seul un changement après l'instant initial compte. Avec Completion et After, la transition franchit dès que la garde devient vraie (une fois le délai écoulé).
Garde (guard)¶
| Paramètre | Défaut | Rôle |
|---|---|---|
useGuard |
false |
la transition a une garde |
guard |
true |
la garde, expression booléenne : weight > 5, count >= 4 and not stop… |
useGuardPort |
false |
lire la garde sur l'entrée guardPort (en bas) plutôt que dans guard |
priority |
1 | priorité parmi les transitions qui partent du même état (1 = la plus haute) |
La garde (comme l'expression change) peut citer toute variable visible depuis le modèle qui contient la transition : sorties d'autres blocs (sensor.T), entrées d'un Chart, paramètres, variables des états (pump.activeDuration > 10).
Priorités : quand plusieurs transitions qui partent d'un même état peuvent franchir au même instant, celle qui a le plus petit numéro priority l'emporte ; à égalité, la première dans l'ordre des ports (haut, droite, bas, gauche, puis indice). Le numéro s'affiche devant l'étiquette (2:) dès qu'il est supérieur à 1.
Effet (effect)¶
La sortie booléenne effect (en bas à droite) est vraie pendant pulseDuration (0,1 s par défaut) à chaque franchissement ; pulseDuration = 0 donne une impulsion instantanée. La variable fireCount compte les franchissements. En relecture des résultats, la flèche passe au vert pendant l'effet.
Choice¶
Le losange. La machine à états le traverse sans s'y arrêter : dès qu'il est atteint, il est quitté par la transition sortante de plus haute priorité dont la garde est vraie. Ses transitions sortantes n'ont pas de déclencheur ; donner à la branche « sinon » le numéro de priorité le plus grand et aucune garde. Si aucune garde n'est vraie, la machine reste dans le choix jusqu'à ce qu'une le devienne.
FinalState¶
La cible. Une fois atteint, la machine à états est terminée : completed = true. Avec stopSimulation = true, l'atteindre arrête la simulation.
Chart¶
Pour utiliser une machine à états comme un bloc dans un modèle plus grand — un cadre stm de SysML — créer un modèle qui hérite de StateCharts.Chart, y ajouter des entrées et sorties (Modelica.Blocks.Interfaces.RealInput, BooleanOutput…), puis les états et transitions :
model ThermostatChart
extends StateCharts.Chart;
Modelica.Blocks.Interfaces.RealInput T;
Modelica.Blocks.Interfaces.BooleanOutput heating;
StateCharts.Initial start;
StateCharts.State off;
StateCharts.Transition startHeating(useGuard = true, guard = T < 292.15);
...
equation
connect(on.do, heating);
...
end ThermostatChart;
Exemple complet : Examples.ThermostatChart, utilisé par Examples.Thermostat.
Actions¶
Ces blocs transforment les sorties do des états en un signal :
| Bloc | Sortie y |
|---|---|
SetBoolean |
vraie si au moins un des états reliés est actif |
SetInteger |
values[i] pour le premier état actif relié à u[i], sinon y_default |
SetReal |
idem, en réel |
Relier la sortie do de chaque état à l'entrée u du bloc ; nIn augmente à chaque connexion, et values doit avoir la même taille.