[Unity] Compréhension Scrutation Langage ST
[Unity] Compréhension Scrutation Langage ST
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
prof ....donc euh....sais un peu tout mais ne maitrise pas grand chose
-
MiGaNuTs
- Mi homme - Mi automate

- Messages : 1572
- Enregistré le : 12 nov. 2015, 21:02
- Localisation : 45 - Loiret
- Contact :
Re: [Unity] Compréhension Scrutation Langage ST
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.
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
Bonjour, c'est assez indigeste a lire, alors ca m'as intéressé
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 )
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 )
- chgui
- Générateur de blocs fonctions

- Messages : 126
- Enregistré le : 20 oct. 2015, 08:05
- Localisation : Amiens
Re: [Unity] Compréhension Scrutation Langage ST
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.
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.
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.
J'avoue, que ces appels d'instruction, un CASE OF et un IF d'imbriquer, avec un deuxième conditionnement....?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;
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.
LOL pareil!!!Bonjour, c'est assez indigeste a lire, alors ca m'as intéressé
Re: [Unity] Compréhension Scrutation Langage ST
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 ( juste pour vous montrer la structure) et Programme dépose et le programme robot qui appelle ces fonctions
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
Bloc ( juste pour vous montrer la structure) et programme Prendre Bloc ( juste pour vous montrer la structure) et Programme dépose et le programme robot qui appelle ces fonctions
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
prof ....donc euh....sais un peu tout mais ne maitrise pas grand chose
-
philou77
- Mi homme - Mi automate

- Messages : 2142
- Enregistré le : 21 oct. 2015, 10:00
- Localisation : Ile de France
Re: [Unity] Compréhension Scrutation Langage ST
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.
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.
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! 
Re: [Unity] Compréhension Scrutation Langage ST
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
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
prof ....donc euh....sais un peu tout mais ne maitrise pas grand chose
- itasoft
- Mi homme - Mi automate

- Messages : 7803
- Enregistré le : 20 oct. 2015, 10:15
- Localisation : Lyon
- Contact :
Re: [Unity] Compréhension Scrutation Langage ST
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
sinon si tu veux faire un grafcet programmé il faut d'abord connaitre le principe du grafcet ce qui n'est pas ton cas
Automaticien privé (de tout)
itasoft@free.fr
itasoft@free.fr
Re: [Unity] Compréhension Scrutation Langage ST
Vois a quelle valeur est ta variable "etapes_grafect_robot"
tu peu passer en ligne et voir dans tes fb ou cela bloque.
tu peu passer en ligne et voir dans tes fb ou cela bloque.
Re: [Unity] Compréhension Scrutation Langage ST
voilà c'est fait
prof ....donc euh....sais un peu tout mais ne maitrise pas grand chose
