Ensembles▲
Un ensemble est une "collection" d'éléments de même type (cf cours maths 6ème).
Supposons vouloir représenter des vendeurs et leurs domaines d'action.
Le type ensemble est défini par SET OF :
TYPE
produits = (velos,motos,autos,accessoires);
VAR
vendeur1, vendeur2 : SET
OF
produits;
On "remplit" un ensemble en donnant ses éléments entre crochets :
vendeur1 := [velos,motos];
vendeur2 := [motos,accessoires];
L'ensemble vide est : [].
On peut faire les opérations suivantes :
- Union : vendeur1 + vendeur2 = [velos,motos,accessoires]
- Intersection : vendeur1 * vendeur2 = [motos]
- Complément : vendeur1 - vendeur2 = [velos] vendeur2 - vendeur1 = [accessoires]
Les tests booléens possibles sont : = , <> , <= (inclus) , >= (contenant).
On teste l'appartenance d'un élément par IN : si X vaut motos, alors X IN VENDEUR1 et [motos] <= VENDEUR1 sont équivalents (IN compare un élément et un ensemble, alors que <= compare deux ensembles.
Remarque : En général, on ne pense pas à utiliser lesensembles (le prof de maths aurait-il oublié de nous dire à quoi ça sert ?), et l'on s'embrouille dans des programmes complexes.
Voici par exemple, des idées pour programmer facilement un automatisme défini par plusieurs Grafcet complexes ([xx] se lisant "ensemble des xx") :
[étapes actives] := [étapes initiales]
Pour chaque transition :
si [étapes immédiatement précédentes] <= [étapes actives]
et [capteurs nécessaires] <= [capteurs]
alors [étapes actives] := [étapes actives] - [précédentes] + [suivantes]
activer [sorties] en fonction [étapes actives] et boucler
On peut trouver un exemple détaillé dans mon document sur la mise en oeuvre du Grafcet.
{ Ce programme correspond au GRAFCET 2 "mise en oeuvre du grafcet sur automate" }
PROGRAM
grafcet_2 (input,output);
CONST
adresse_port = $330
;
TYPE
liste_capteurs = (e1,e2,e3);
ensemble_capteurs = SET
OF
liste_capteurs;
liste_actions = (sortie1,sortie2,sortie3);
ensemble_actions = SET
OF
liste_actions;
VAR
{ pour le programme principal }
etape : array
[1
..4
] of
boolean
;
transition : array
[1
..4
] of
boolean
;
capteurs : ensemble_capteurs;
sorties : ensemble_actions;
i : integer
;
PROCEDURE
lire_capteurs (VAR
etat_actuel_capteurs : ensemble_capteurs);
{ cette procédure lit les capteurs et rend un ensemble contenant les
capteurs à 1. Cette procédure dépend du type de machine }
var
{ locale }
etat : record
case
integer
of
1
: (compatible_port : byte
);
2
: (compatible_ensemble : ensemble_capteurs)
end
;
begin
etat.compatible_port := port[adresse_port];
etat_actuel_capteurs := etat.compatible_ensemble
end
;
PROCEDURE
affecte_sorties (etat_sorties : ensemble_actions);
{ affecte les sorties }
var
etat : record
case
integer
of
1
: (compatible_port:byte
);
2
: (compatible_ensemble:ensemble_actions)
end
;
begin
etat.compatible_ensemble := etat_sorties;
port[adresse_port] := etat.compatible_port
end
;
BEGIN
{ programme principal }
{initialisation}
sorties := []; { ensemble vide }
affecte_sorties(sorties);
etape[1
] := true
;
for
i := 2
to
4
do
etape[i] := false
;
repeat
lecture des entrées}
lire_capteurs(capteurs);
{-----------------------------------------------
write('capteurs : ');
if e1 in capteurs then write('E1);
if e2 in capteurs then write('E2 ');
if e3 in capteurs then write('E3 ');
writeln;
------------------------------------------------}
{ conditions d'évolution }
transition[1
] := etape[1
] and
(e1 in
capteurs);
transition[2
] := etape[2
] and
etape[3
] and
([e2,e3] * capteurs = []); { intersection vide }
transition[3
] := etape[3
] and
(e2 in
capteurs) and
not
(e3 in
capteurs);
transition[4
] := etape[4
] and
not
(c2 in
capteurs);
{ désativation }
if
transition[1
] then
etape[1
] := false
;
if
transition[2
] then
begin
etape[2
] := false
;
etape[3
] := false
end
;
if
transition[3
] then
etape[3
] := false
;
if
transition[4
] then
etape[4
] := false
;
{ activation }
if
transition[1
] then
begin
etape[2
] := true
;
etape[3
] := true
end
;
if
transition[2
] then
etape[1
] := true
;
if
transition[3
] then
etape[4
] := true
;
if
transition[4
] then
etape[3
] := true
;
{ affectation sorties }
{-----------------------------------------------
write('Etapes : ');
for i := 1 to 4 do if etape[i] then write(i,' ');
writeln;
------------------------------------------------}
sorties := [];
if
etape[2
] then
sorties := sorties + [sortie1];
if
etape[3
] then
sorties := sorties + [sortie2];
if
etape[4
] then
sorties := sorties + [sortie3];
affecte_sorties(sorties);
UNTIL
false
; { boucler jusqu'Ã extinction }
END
.