A4A : Mangez du booléen en Ada !

Bonjour,

Les booléens, c’est un peu la matière première de l’automaticien.

Que ce soit pour les capteurs, vanne ouverte ou fermée, pompe en marche ou à l’arrêt, porte en position haute, en position basse… comme pour les actionneurs dont les commandes sont de type tout ou rien ouvrir, fermer, chauffer, etc… une variable prenant une valeur vraie ou fausse convient pour la représentation de ces états et commandes.

Les automates programmables disposent d’instructions spécialisées pour traiter la logique combinatoire dans des langages adaptés.

Quand on prône l’usage de Ada pour cette même tâche d’automatisation on peut s’intéresser à ce que propose ce langage en la matière.

Le langage dispose du type booléen et on déclare ci-dessous trois variables de ce type avec une valeur initiale :

  -- deux variables représentant l'état de deux vannes
  Valve1_Is_Open   : Boolean := True;
  Valve2_Is_Closed : Boolean := False;

  -- une variable pilotant la commande d'une pompe
  Pump1_On : Boolean := False;

Un peu plus loin, dans le code d’une fonction, on peut écrire une équation booléenne comme celle-ci en utilisant des opérateurs :

  -- commande de la pompe
  Pump1_On := Valve1_Is_Open and Valve2_Is_Closed;

  -- on pourrait également utiliser les autres opérateurs
  -- logiques comme "not", "or" et "xor"
  Pump2_On := not Valve1_Is_Open or Valve2_Is_Closed;

  Pump3_On := Valve1_Is_Open xor Valve2_Is_Closed;

On peut bien sûr y combiner avec les opérateurs relationnels comme ici :

  Pump4_On := Valve1_Is_Open and Counter > 5;

On retrouve donc bien naturellement les mêmes opérateurs que dans le « Ladder » ou le « Structured Text ».

Je vous propose l’exemple suivant que vous pourrez compiler et exécuter, éventuellement en pas à pas avec le débogueur, et qui vous éditera la table de vérité de chacun des opérateurs évoqués ci-dessus.

Pour comprendre cet exemple, il faut savoir que le type Booléen est une énumération qui peut prendre les valeurs (False, True) dans l’intervalle donc False .. True.

Ainsi, for A in Boolean’Range loop est équivalent à for A in False .. True loop.

Il y aurait bien d’autres choses à dire sur ce bout de programme mais il n’est là que pour illustrer le propos et montrer un peu d’Ada à l’œuvre en espérant aiguiser votre curiosité.

with Ada.Text_IO; use Ada.Text_IO;

procedure Tutorial_00 is

   Valve1_Is_Open   : Boolean := True;
   Valve2_Is_Closed : Boolean := False;
   
   Pump1_On         : Boolean := False;
   Pump2_On         : Boolean := False;
   Pump3_On         : Boolean := False;

   Pump4_On         : Boolean := False;

   Counter : Integer := 10;
   
begin
   
   Pump1_On := Valve1_Is_Open and Valve2_Is_Closed;
   Pump2_On := not Valve1_Is_Open or Valve2_Is_Closed;
   Pump3_On := Valve1_Is_Open xor Valve2_Is_Closed;
   
   Pump4_On := Valve1_Is_Open and Counter > 5;
   
   for A in False .. True loop
      Put_Line ("not " & A'Img & " = " & Boolean'Image (not A));
      delay 1.0;
   end loop;
   New_Line;

   for A in Boolean'Range loop
      for B in Boolean'Range loop
         Put_Line (A'Img & " and " & B'Img & " = " & Boolean'Image (A and B));
         delay 1.0;
      end loop;
   end loop;
   New_Line;

   for A in Boolean'Range loop
      for B in Boolean'Range loop
         Put_Line (A'Img & " or " & B'Img & " = " & Boolean'Image (A or B));
         delay 1.0;
      end loop;
   end loop;
   New_Line;

   for A in Boolean'Range loop
      for B in Boolean'Range loop
         Put_Line (A'Img & " xor " & B'Img & " = " & Boolean'Image (A xor B));
         delay 1.0;
      end loop;
   end loop;
   New_Line;

   Put_Line ("Tutorial_00 finished !");
end Tutorial_00;

Chez moi ça donne ceci :

/home/slos/Ada/A4A/tutorial/exe/tutorial_00
not FALSE = TRUE
not TRUE = FALSE

FALSE and FALSE = FALSE
FALSE and TRUE = FALSE
TRUE and FALSE = FALSE
TRUE and TRUE = TRUE

FALSE or FALSE = FALSE
FALSE or TRUE = TRUE
TRUE or FALSE = TRUE
TRUE or TRUE = TRUE

FALSE xor FALSE = FALSE
FALSE xor TRUE = TRUE
TRUE xor FALSE = TRUE
TRUE xor TRUE = FALSE

Tutorial_00 finished !
[2015-11-16 23:41:39] process terminated successfully (elapsed time: 14.09s)

Pour plus d’information, je vous invite à visiter :
https://en.wikibooks.org/wiki/Ada_Programming/Operators

Cordialement,
Stéphane