[Unity] Compréhension Scrutation Langage ST
Posté : 14 janv. 2024, 19:31
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
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