Wiki Sisal

Automate

2018-01-17

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 step de l'automate

On horloge.touteslessecondes do poste0.step = poste0.step+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:

  1. etats_poste.attente_piece vers etats_poste.vissage
  2. 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_step=0);
end

function etats_poste.create( initial_step)
begin
   labels.add( "attente_piece");
   labels.add( "vissage");
   labels.add( "evacuation");
   step = initial_step;
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_step = 0) Défini et utilisé exclusivement par Sisal
set( value) Permet de modifier l'état courant de l'automate ( step); 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.