Page 1 sur 4

[Unity] Compréhension Scrutation Langage ST

Posté : 14 janv. 2024, 19:31
par cojac65
Bonjour. Voici mon problème, c’est un peu long et j’espère être suffisamment clair.

J'utilise un robot cartésien X,Y et Z( pour la descente et la montée de la pince). L'objectif de ce robot est de prendre un carton sur un tapis puis de le déposer sur une palette. Il peut déposer jusqu'à 6 cartons sur la palette en fonction d’une consigne opérateur.
Pour prendre le carton : X =800, Y = 560 et Z = 550 et ce sont toujours les même coordonnées.
J’appelle la fonction PRENDRE le robot se déplace en X et Y puis la pince descend en Z , saisie le carton et remonte.

Ensuite, j’appelle la fonction DEPOSE dont les paramètres seront différents en fonction du carton.
2: dépose Carton 1 X=200, Y=160, Z=1000
3: dépose Carton 2 X=200, Y=520, Z=1000
4: dépose Carton 3 X=90, Y=400, Z=550
5: dépose Carton 4 X=280, Y=400, Z=550
6: dépose Carton 5 X=200, Y=160, Z=0
7: dépose Carton 6 X=200, Y=520, Z=0

Voici le programme PRENDRE écrit dans Types FB Dérivés:
(* Prendre carton *)
If (* etapes=100 and*) ( ExC>=0 and ExC<=300 and EyC>=0 and EyC<=530 and EzC>=0 and EzC<=20(* CI robot*))then etapes:=101;
end_if;
IF etapes=101 and (ExC>=790 and ExC<=810 and EyC>=550 and EyC<=570 and EzC>=0 and EzC<=20) THEN
etapes:=102;
END_IF;
IF etapes=102 and (asp=TRUE and EzC>=540 and EzC<=560) THEN
etapes:=103;
END_IF;
IF etapes=103 THEN
etapes:=104;
END_IF;
IF etapes=104 and (asp=TRUE and EzC>=0 and EzC<=20) THEN
etapes:=105;
END_IF;

(* cde des sorties *)
IF etapes=101 THEN
(* Déplacement robot *)
QpX:= MOVE (IN := Xc);
QpY:= MOVE (IN := Yc);
QpZ:= MOVE (IN := Zhaut)(* = à zéro *);
END_IF;

(* Descente du bras *)
IF etapes=102 THEN
QpZ:= MOVE (IN := Zc)(* = à 550 *);
END_IF;

(* prendre carton *)
IF etapes=103 THEN
Qasp:= TRUE;
END_IF;

(* Remontée du bras *)
IF etapes=104 THEN
Qasp:= TRUE;
QpZ:= MOVE (IN := Zhaut);

CTU_1 (CU := 1(*BOOL*),

CV => Compteur_carton(*INT*)); (*incrémentation du compteur carton)

END_IF;

(* Prise finie quand on est à l'étape 105*)

Voici la fonction DEPOSE écrit aussi dans Types FB Dérivés:

(* Depose carton *)
If etape=105 then etape:=106;
end_if;

IF etape=106 and (Ex>=X-10 and Ex<=X+10 and Ey>=y-10 and Ey<=y+10 and Ez>=zhaut-10 and Ez<=zhaut+10 ) THEN
etape:=107;
END_IF;

IF etape=107 and (asp=TRUE and Ez>=Z-10 and Ez<=Z+10) THEN
etape:=108;
END_IF;
IF etape=108 THEN
etape:=109;
END_IF;
IF etape=109 and ( Ez>=zhaut-10 and Ez<=zhaut+10 ) THEN
etape:=110;
END_IF;

(* cde des sorties *)
(* Déplacement robot *)
IF etape=106 THEN
Qasp:= TRUE;
QdX:= MOVE (IN := X);
QdY:= MOVE (IN := Y);
QdZ:= MOVE (IN := Zhaut);(* = à zéro *);
END_IF;

(* Descente du bras *)
IF etape=107 THEN
QdZ:= MOVE (IN := Z);
Qasp:= TRUE;
END_IF;

(* lacher carton *)
IF etape=108 THEN
Qasp:= False;
END_IF;

(* Remontée du bras *)
IF etape=109 THEN
Qasp:= False;
QdZ:= MOVE (IN := Zhaut);
END_IF;

Voici maintenant le programme du robot ( pour un seul carton)écrit en ST dans une section MAST :
(* Cde du robot *)
(* CI robot assez large: Z en haut et X et Y au dessus de la palette *)
case correspondante:
1:Prendre X=800, Y=560, Z=550
2: dépose Carton 1 X=200, Y=160, Z=1000
3: dépose Carton 2 X=200, Y=520, Z=1000
4: dépose Carton 3 X=90, Y=400, Z=550
5: dépose Carton 4 X=280, Y=400, Z=550
6: dépose Carton 5 X=200, Y=160, Z=0
7: dépose Carton 6 X=200, Y=520, Z=0
*)

IF Nbr_carton <=Nbr_carton_Consigne and Nbr_carton_Consigne>0 and ( Sp(* palette en position SP*))THEN
Numero:=1;

CASE Numero OF
1: Prise_carton_5 (Xc := Xp(*INT*),
Yc := Yp(*INT*),
Zc := Zp(*INT*),
Zhaut := Z0(*INT*),
ExC := E_RO_X(*INT*),
EyC := E_RO_Y(*INT*),
EzC := E_RO_Z(*INT*),
asp := E_asp(*BOOL*),
etapes := etapes_grafect_robot(*INT*),
QpX => Q_RO_X(*INT*),
QpY => Q_RO_Y(*INT*),
QpZ => Q_RO_Z(*INT*),
Compteur_carton => Nbr_carton(*INT*),

Qasp => Q_RO_ASP(*BOOL*));H1_R:=1;IF Nbr_carton=1 THEN Numero:=2;

END_IF;

2: Depose_Carton_7 (X := 200(*INT*),
Y := 160(*INT*),
Z := 1000(*INT*),
asp := E_asp(*BOOL*),
Zhaut := Z0(*INT*),
EX := E_RO_X(*INT*),
EY := E_RO_Y(*INT*),
EZ := E_RO_Z(*INT*),
etape := etapes_grafect_robot(*INT*),
QdX => Q_RO_X(*INT*),
QdY => Q_RO_Y(*INT*),
QdZ => Q_RO_Z(*INT*),
Qasp => Q_RO_ASP(*BOOL*));

END_CASE;

ELSE
(* Evacué palette *)
Nbr_carton:=0;

END_IF;


La prise du carton se fait correctement mais ensuite le robot ne bouge pas pour aller déposer le carton.
Les sorties QpX, QpY et QpZ gardent les valeurs de la fonction Prendre et non pas les paramètres de la fonction DEPOSE.
Comme si j’étais encore en case 1 ou que je scruté encore la fonction PRENDRE et pourtant je passe bien en case 2. Il faudrait peut être « désactivé » la fonction PRENDRE pour que QpX, QpY et QpZ prennet les valeurs de la fonction DEPOSE.
Je souhaite faire ce programme en Langage ST et non en LD .
J’y ai passé déjà pas mal d’heures. Il doit me manquer un truc mais quoi ????

Merci beaucoup pour votre aide

Re: [Unity] Compréhension Scrutation Langage ST

Posté : 14 janv. 2024, 19:47
par MiGaNuTs
Bonjour,

Pourrait tu, stp, mettre tes extraits de programme entre des balises [_code] et [/_code] ?
Parce que la c'est vraiment très difficile a lire.

Re: [Unity] Compréhension Scrutation Langage ST

Posté : 15 janv. 2024, 08:34
par Cedric39
Bonjour, c'est assez indigeste a lire, alors ca m'as intéressé :lol:

déja quand on lit cela :
"IF etapes=103 THEN
etapes:=104;
END_IF;"

on se dit que l'étape 103 est une réserve ?

sauf que plus bas, une sortie est associée
"(* prendre carton *)
IF etapes=103 THEN
Qasp:= TRUE;
END_IF;"

a mon avis "etapes" n'est jamais egal a 103.

Sinon quand tu est bloqué, étape est égal a combien ? Tes positions X, Y et Z sont a combien ?

J'ai pas bien compris ce qui est comparé ici. Je pensais que c'était les positions:
If (* etapes=100 and*) ( ExC>=0 and ExC<=300 and EyC>=0 and EyC<=530 and EzC>=0 and EzC<=20

mais ici il y a pas le "C" dans les variables

IF etape=106 and (Ex>=X-10 and Ex<=X+10 and Ey>=y-10 and Ey<=y+10 and Ez>=zhaut-10 and Ez<=zhaut+10 )

Re: [Unity] Compréhension Scrutation Langage ST

Posté : 15 janv. 2024, 08:55
par chgui
Salut,

cela aurait été un peu plus simple en utilisant l'outil grafcet, idéal pour faire ce genre de choses!
J'aurai aussi regroupé les affectations de sorties, histoire de tout avoir au même endroit, et c'est plus sympa à lire, mais ce n'est que mon avis.
IF Nbr_carton <=Nbr_carton_Consigne and Nbr_carton_Consigne>0 and ( Sp(* palette en position SP*))THEN
Numero:=1;

CASE Numero OF
1: Prise_carton_5 (Xc := Xp(*INT*),
Yc := Yp(*INT*),
Zc := Zp(*INT*),
Zhaut := Z0(*INT*),
ExC := E_RO_X(*INT*),
EyC := E_RO_Y(*INT*),
EzC := E_RO_Z(*INT*),
asp := E_asp(*BOOL*),
etapes := etapes_grafect_robot(*INT*),
QpX => Q_RO_X(*INT*),
QpY => Q_RO_Y(*INT*),
QpZ => Q_RO_Z(*INT*),
Compteur_carton => Nbr_carton(*INT*),

Qasp => Q_RO_ASP(*BOOL*));H1_R:=1;IF Nbr_carton=1 THEN Numero:=2;

END_IF;

2: Depose_Carton_7 (X := 200(*INT*),
Y := 160(*INT*),
Z := 1000(*INT*),
asp := E_asp(*BOOL*),
Zhaut := Z0(*INT*),
EX := E_RO_X(*INT*),
EY := E_RO_Y(*INT*),
EZ := E_RO_Z(*INT*),
etape := etapes_grafect_robot(*INT*),
QdX => Q_RO_X(*INT*),
QdY => Q_RO_Y(*INT*),
QdZ => Q_RO_Z(*INT*),
Qasp => Q_RO_ASP(*BOOL*));

END_CASE;

ELSE
(* Evacué palette *)
Nbr_carton:=0;

END_IF;
J'avoue, que ces appels d'instruction, un CASE OF et un IF d'imbriquer, avec un deuxième conditionnement....?
Ton compteur carton (Nbr_carton) évolue?

Qasp => Q_RO_ASP(*BOOL*));H1_R:=1;IF Nbr_carton=1 THEN Numero:=2;

J’enlèverai le compteur carton et l'évolution (Numero) du case afin que cela soit plus facile à suivre.
Bonjour, c'est assez indigeste a lire, alors ca m'as intéressé :lol:
LOL pareil!!!

Re: [Unity] Compréhension Scrutation Langage ST

Posté : 15 janv. 2024, 09:13
par cojac65
Merci pour le temps que vous consacré à mon problème. Voici les copies d'écran
Bloc ( juste pour vous montrer la structure) et programme Prendre
bloc prendre.jpg
Programme prendre.jpg
Bloc ( juste pour vous montrer la structure) et Programme dépose
Bloc_Depose.jpg
Programme_Depose.jpg
et le programme robot qui appelle ces fonctions
Programme robot.jpg

Le robot passe bien en case 2 mais les sorties restent bloqué aux valeurs X=800, Y=560 et Z=550 correspond au coordonnées pour PRENDRE le carton.
Merci

Re: [Unity] Compréhension Scrutation Langage ST

Posté : 15 janv. 2024, 09:32
par philou77
Salut !

Pour chaque franchissement d’étape il te faut une transition et être sûr de ne pas franchir 2 étapes dans le même cycle automate.
Pas sûr qu’en écrivant :
If etapes=103
Then
Étapes=104
End if

Tu respectes les règles de bases du grafcet.

Re: [Unity] Compréhension Scrutation Langage ST

Posté : 15 janv. 2024, 09:39
par cojac65
Oui. Je suis d'accord avec toi. A la base, j'avais mis une tempo que j'ai enlevé....
Dans le fonctionnement, cela ne pose de problème. La fonction prendre fonctionne correctement. C'est après, lors de l'appel de la fonction dépose

Re: [Unity] Compréhension Scrutation Langage ST

Posté : 15 janv. 2024, 09:52
par itasoft
Suivre le conseil de chgui
sinon si tu veux faire un grafcet programmé il faut d'abord connaitre le principe du grafcet ce qui n'est pas ton cas

Re: [Unity] Compréhension Scrutation Langage ST

Posté : 15 janv. 2024, 09:54
par Cedric39
Vois a quelle valeur est ta variable "etapes_grafect_robot" :shock:
tu peu passer en ligne et voir dans tes fb ou cela bloque.

Re: [Unity] Compréhension Scrutation Langage ST

Posté : 15 janv. 2024, 09:55
par cojac65
MiGaNuTs a écrit : 14 janv. 2024, 19:47 Bonjour,

Pourrait tu, stp, mettre tes extraits de programme entre des balises [_code] et [/_code] ?
Parce que la c'est vraiment très difficile a lire.
voilà c'est fait