Aller au contenu

Les Bistables _B

Un bistable est un bit interne de la mémoire d'information, de classe _B.

Chaque bistable a pour valeur booléenne soit 0, soit 1. Il peut être utilisé dans une EXPRESSION, ou dans une LISTE_ACTIONS.

Contrairement au monostable, un bistable est maintenu dans le temps : une fois positionné à 1, sa valeur reste à 1 même si la condition qui l'a activé disparaît. Il faut explicitement coder le passage à 0.

Déclarer un Bistable

Dans la zone d'ALIAS, déclarez un bistable de la manière suivante:

#define ACRONYME <-> _B(libelle="Ceci est mon bistable");

La définition commence par le mot clé #define, puis une chaine de caractères représentant l'ACRONYME du bistable, puis une double flèche (un inférieur « < », un tiret « - », un supérieur « > »), la classe _B, un couple de parenthèses, et enfin un point virgule terminal.

De manière optionnelle, il est possible d'adjoindre un libellé au bistable en lui ajoutant l'option libelle.

Les options d'un bistable

Options à la déclaration

  • libelle: permet de documenter le rôle du bistable.
  • groupe: permet de créer un groupe de bistables mutuellement exclusifs. Lorsqu'un bistable du groupe est activé, tous les autres bistables du même groupe sont automatiquement remis à 0. Le groupe est représenté par un entier dont la portée est limitée au module D.L.S propriétaire.

Exemple :

/* Un seul mode actif à la fois parmi les trois */
#define MODE_ECO    <-> _B(libelle="Mode économique",  groupe=1);
#define MODE_CONFORT <-> _B(libelle="Mode confort",    groupe=1);
#define MODE_HORS_GEL <-> _B(libelle="Mode hors-gel", groupe=1);

Options d'usage dans une EXPRESSION

  • edge_up: permet de ne prendre en compte que les fronts montants (vrai lorsque le bistable passe de 0 à 1)
  • edge_down: permet de ne prendre en compte que les fronts descendants (vrai lorsque le bistable passe de 1 à 0)

Positionnement

La différence fondamentale avec le monostable est qu'il faut deux lignes distinctes pour gérer la montée à 1 et le retour à 0.

Prenons en exemple:

/* Si la porte est ouverte, on mémorise l'intrusion */
- PORTE_OUVERTE → MON_BISTABLE;

/* Si l'utilisateur acquitte, on efface la mémorisation */
- ACQUIT → /MON_BISTABLE;

Si PORTE_OUVERTE devient FALSE, MON_BISTABLE reste quand même à 1 jusqu'à ce que la deuxième ligne soit évaluée vraie.

Tip

Par convention, le / devant un bistable en LISTE_ACTIONS le force à 0. Il n'existe pas d'opérateur spécifique de RAZ : c'est le même mécanisme que pour toute action de mise à 0 (/BISTABLE).

Exemple d'usage

/* Nous sommes dans le DLS "ALARME" */
#define INTRUSION <-> _B(libelle="Mémorisation d'une intrusion");
#define ACQUIT    <-> _DI(libelle="Bouton d'acquittement");

/* Positionnement à 1 : lorsque la porte est ouverte */
- PORTE:OUVERTE → INTRUSION;

/* Remise à 0 : sur acquit opérateur */
- ACQUIT → /INTRUSION;

/* Utilisation dans une expression : si on est en intrusion et qu'il fait nuit */
- INTRUSION . NUIT:ACTIF → MSG_ALARME_INTRU;

Usage des options edge_up / edge_down

/* MON_BISTABLE passe de 0 à 1 : on envoie une notification */
- MON_BISTABLE(edge_up) → MSG_MONTEE;

/* MON_BISTABLE passe de 1 à 0 : on envoie une autre notification */
- MON_BISTABLE(edge_down) → MSG_DESCENTE;

Warning

Un bistable ne peut être positionné que dans le module D.L.S à qui il appartient. Le positionnement d'un bistable d'un autre module D.L.S lèvera une erreur à la compilation.