Wiki Sisal
Automate
%%mtime(%Y-%m-%d)
Automates simples
Sisal permet de définir facilement des automates, c'est à dire une machine à états finis.
Une variable automate est une variable qui ne peut avoir qu'une seule valeur parmi un nombre fini.
Déclaration
Pour connaitre les différents états disponibles on déclare dans le bloc de déclaration des classes la liste des états possibles
etats_poste states, attente_piece, vissage, evacuation;
Ici on a trois états:
- attente_piece
- vissage
- evacuation
En fait pour Sisal il s'agit de la déclaration d'une nouvelle classe, ici etats_poste, qui hérite d'une classe système states.
Cette classe déclare des constantes numérotées de 0 à n correspondant à chacun des états; et sisal va assurer qu'un automate peut être affecté à un seul de ces états et afficher en clair l'état courant de cet automate ( afficher vissage plutôt que 1).
On va pouvoir déclarer plusieurs automates de ce type.
Var poste0 etats_poste; poste1 etats_poste, attente_piece; poste2 etats_poste, evacuation;
On a trois automates du même type ( etats_poste ), le premier est initialisé (par défaut) à l'état 0, le second est initialisé explicitement à l'état attente_piece (0) et le dernier est initialisé à l'état evacuation (2).
Exploitation
Dans le script on va pouvoir référencer l'état de l'automate en accédant à l'attribut state de l'automate
On horloge.touteslessecondes do poste0.state = poste0.state+1; On poste0.change do message( "Poste0 a changé ":poste0.print());
La première clause est exécutée toutes les secondes, elle fait incrémenter l'attribut step de l'automate, il va passer de etats_poste.attente_piece (0) à etats_poste.vissage, puis à etats_poste.evacuation et s'arrêter là car il n'y a pas d'autres états définis.
La deuxième clause va elle être activée deux fois sur les changements d'états suivants:
- etats_poste.attente_piece vers etats_poste.vissage
- etats_poste.vissage vers etats_poste.evacuation
On aura la trace suivante:
Poste0 a changé vissage Poste0 a changé evacuation
L'implémentation
L'implémentation des automates est particulière car elle repose sur la déclaration au vol d'une classe particulière héritant des propriétés d'une classe système définie dans le fichier d'inclusion states.sch.
Dans le cas de l'exemple précédent, c'est comme si on déclarait
etats_poste class sys_states begin attente_piece const 0; vissage const 1; evacuation const 2; create( initial_state=0); end function etats_poste.create( initial_state) begin labels.add( "attente_piece"); labels.add( "vissage"); labels.add( "evacuation"); state = initial_state; end
Ce qu'il faut retenir, c'est que ce fichier states.sch doit être inclus dans le source et que cette classe offre les méthodes suivantes
Méthode | Description |
---|---|
create( initial_state = 0) | Défini et utilisé exclusivement par Sisal |
set( value) | Permet de modifier l'état courant de l'automate ( state); affectation de l'état le plus proche |
print() | Permet d'afficher en clair l'état courant de l'automate (en particulier sous débogueur) |
next() | Permet de passer à l'état suivant si il existe |
previous() | Permet de passer à l'état précédent si il existe |
et que l'on est informé d'un changement d'état sur l'érection de l'événement change.