Aller au contenu

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

De gauche à droite : Initial, State, Choice, FinalState et une Transition avec sa garde

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)

Les quatre déclencheurs : complétion gardée, signal, after avec garde, when avec priorité 2

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.