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 :
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 :
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 :
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é.
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 :
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