Une pièce pour deux robots
Exemple de programme 3.1
Type d’exemple :
Robots et 1 type de pièce physique - Mouvement dans la fonction de rappel PF_Robot - Prélèvement dans un ordre précis
Configuration
- Nombre de robots : 2
- Nombre de distributeurs : 1
- Nombre de types de pièces sur le distributeur : 1
- Nombre de positionnements : 2
- Orientation de la caméra : caméra fixe et orientée vers le bas
Description
Il y a deux robots et un distributeur. Il n’existe qu’un seul type de pièce physique. Chaque robot disposant de son propre étalonnage de caméra, il existe deux pièces logiques : la pièce n° 1 pour le robot n° 1 et la pièce n° 2 pour le robot n° 2.
Les robots prélèveront à tour de rôle des pièces dans le distributeur. L’ordre de prélèvement est important pour cette application. L’ordre de prélèvement alterné est géré par « PF_ActivePart ».
Le mouvement du robot s’effectue au sein de la fonction de rappel PF_Robot.
Dans cet exemple, les mouvements du distributeur et du robot ne sont pas traités en parallèle. Le code est simple, mais pas efficace. Chaque robot dispose d’un point de « stationnement » et d’un point de « positionnement ». Le concept clé de cet exemple est la valeur de retour de la fonction de rappel PF_Robot « PF_CALLBACKRESTARTACTIVEPART ».
Cette valeur de retour permet à plusieurs robots d’utiliser le même distributeur sans risque de conflit des coordonnées des pièces dans les files d’attente des deux pièces. La valeur de retour force l’acquisition d’une nouvelle image uniquement pour PF_ActivePart, et seule la file d’attente PF_ActivePart est chargée.
Exemple de code
Main.prg
Function Main
Robot 1
Motor On
Power High
Speed 50
Accel 50, 50
Jump Park
Robot 2
Motor On
Power High
Speed 50
Accel 50, 50
Jump Park
PF_Start 1, 2
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
If PF_QueLen(PartID) > 0 Then
Select PartID
Case 1
Robot 1
P0 = PF_QueGet(1)
PF_QueRemove (1)
Jump P0 /R
On rbt1Gripper
Wait 0.25
Jump Place
Off rbt1Gripper
Wait 0.25
PF_ActivePart 2
Case 2
Robot 2
P0 = PF_QueGet(2)
PF_QueRemove (2)
Jump P0 /L
On rbt2Gripper
Wait 0.25
Jump Place
Off rbt2Gripper
Wait 0.25
PF_ActivePart 1
Send
EndIf
PF_Robot = PF_CALLBACK_RESTART_ACTIVEPART
Fend
Exemple de programme 3.2
Type d’exemple :
2 robots et 1 type de pièce physique - Mouvements dans des tâches séparées - L’ordre de prélèvement n’a pas d’importance - Prélèvement dans un ordre spécifique
Configuration
- Nombre de robots : 2
- Nombre de distributeurs : 1
- Nombre de types de pièces sur le distributeur : 1
- Nombre de positionnements : 2
- Orientation de la caméra : caméra fixe et orientée vers le bas
Description
Il y a deux robots et un distributeur. Il n’existe qu’un seul type de pièce physique. Chaque robot disposant de son propre étalonnage de caméra, il existe deux pièces logiques : la pièce n° 1 pour le robot n° 1 et la pièce n° 2 pour le robot n° 2. L’ordre de prélèvement n’a pas d’importance - Premier arrivé, premier servi.
Ce qui distingue cet exemple, c’est que la vision est acquise pour chaque pièce à chaque cycle. Cela peut être utile si vous craignez que les pièces environnantes ne soient perturbées lors du prélèvement.
La valeur de retour de la fonction de rappel PF_Robot « PF_CALLBACK_RESTART » forcera la relance de vision pour toutes les pièces, et toutes les files d’attente de pièces seront rechargées.
Cette méthode n’est pas efficace, mais « PF_CALLBACKRESTART » peut être utile dans certaines circonstances.
Exemple de code
Main.prg
Function Main
Robot 1
Motor On
Power High
Speed 50
Accel 50, 50
Jump Park
Robot 2
Motor On
Power High
Speed 50
Accel 50, 50
Jump Park
MemOff PartsToPick
PF_Start 1, 2
Xqt Robot1PickPlace
Xqt Robot2PickPlace
Fend
Function Robot1PickPlace
Robot 1
Do
PF_AccessFeeder (1)
Wait MemSw(PartsToPick) = On
If PF_QueLen(1) > 0 Then
P0 = PF_QueGet(1)
PF_QueRemove (1)
Jump P0 /R
On 5
Wait 0.5
Jump Place ! D30; MemOff PartsToPick; PF_ReleaseFeeder 1 !
Off 5
Wait 0.25
Else
MemOff PartsToPick; PF_ReleaseFeeder 1
EndIf
Loop
Fend
Function Robot2PickPlace
Robot 2
Do
PF_AccessFeeder (1)
Wait MemSw(PartsToPick) = On
If PF_QueLen(2) > 0 Then
P0 = PF_QueGet(2)
PF_QueRemove (2)
Jump P0 /L
On 2
Wait 0.5
Jump Place ! D30; MemOff PartsToPick; PF_ReleaseFeeder 1 !
Off 2
Wait 0.25
Else
MemOff PartsToPick; PF_ReleaseFeeder 1
EndIf
Loop
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
MemOn PartsToPick
Wait MemSw(PartsToPick) = Off
PF_Robot = PF_CALLBACK_RESTART ’Force vision and vibration to refresh
Fend
Exemple de programme 3.3
Type d’exemple :
2 robots et 1 type de pièce physique - Mouvements dans des tâches séparées - Premier arrivé, premier servi - Retard simulé du processus
Configuration
- Nombre de robots : 2
- Nombre de distributeurs : 1
- Nombre de types de pièces sur le distributeur : 1
- Nombre de positionnements : 2
- Orientation de la caméra : caméra fixe et orientée vers le bas
Description
Il y a deux robots et un distributeur. Il n’existe qu’un seul type de pièce physique. Chaque robot disposant de son propre étalonnage de caméra, il existe deux pièces logiques : la pièce n° 1 pour le robot n° 1 et la pièce n° 2 pour le robot n° 2. Dans cet exemple, chaque robot a un temps de traitement variable (simulé par un temps d’attente aléatoire).
Une fois qu’il a prélevé une pièce du distributeur, chaque robot est occupé à effectuer une autre opération.
Les bits de mémoire « Rbt1Complete » et « Rbt2Complete » permettent de signaler que le robot a terminé de prélever une pièce du distributeur et qu’il est prêt à en prélever une autre. La fonction de rappel PF_Robot renverra la valeur « PF_CALLBACK_RESTART_ACTIVEPART » si la pièce souhaitée (PF_ActivePart) n’est pas la même que la pièce actuelle (c’est-à-dire que l’autre robot souhaite prélever une pièce). Cela permettra d’éviter la duplication des points dans les files d’attente des robots.
Une nouvelle image sera acquise pour la fonction PF_ActivePart et seule la file d’attente de PF_ActivePart sera chargée. Cependant, si la pièce suivante est identique à la pièce actuelle (c’est-à-dire, le même robot prélève une pièce dans le distributeur), la valeur de retour de la fonction de rappel PF_Robot sera « PF_CALLBACK_SUCCESS ». Les fonctions PF_AccessFeeder et PF_ReleaseFeeder permettent d’éviter toute collision entre les robots lors de l’accès au distributeur.
Exemple de code
Main.prg
Function Main
Robot 1
Motor On
Power High
Speed 50
Accel 50, 50
Jump Place
Robot 2
Motor On
Power High
Speed 50
Accel 50, 50
Jump Place
MemOff PartsToPick1
MemOff PartsToPick2
PF_Start 1, 2
Xqt Robot1PickPlace
Xqt Robot2PickPlace
Fend
Function Robot1PickPlace
Integer randomTime
Robot 1
MemOn Rbt1Complete
Do
Wait MemSw(PartsToPick1) = On
PF_AccessFeeder (1)
MemOff Rbt1Complete
P0 = PF_QueGet(1)
PF_QueRemove (1)
Jump P0 /R
On rbt1Gripper
Wait 0.25
Jump Place ! D30; MemOff PartsToPick1; PF_ReleaseFeeder 1 !
Off rbt1Gripper
Wait 0.25
’Test long process time - robot is doing something else
Randomize
randomTime = Int(Rnd(9)) + 1
Wait randomTime
MemOn Rbt1Complete
Loop
Fend
Function Robot2PickPlace
Integer randomTime
Robot 2
MemOn Rbt2Complete
Do
Wait MemSw(PartsToPick2) = On
PF_AccessFeeder (1)
MemOff Rbt2Complete
P0 = PF_QueGet(2)
PF_QueRemove (2)
Jump P0 /L
On rbt2Gripper
Wait 0.25
Jump Place ! D30; MemOff PartsToPick2; PF_ReleaseFeeder 1 !
Off rbt2Gripper
Wait 0.25
’Test long process time - robot is doing something else
Randomize
randomTime = Int(Rnd(9)) + 1
Wait randomTime
MemOn Rbt2Complete
Loop
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Integer nextPart
Select PartID
Case 1
MemOn PartsToPick1
Wait MemSw(PartsToPick1) = Off
Case 2
MemOn PartsToPick2
Wait MemSw(PartsToPick2) = Off
Send
Wait MemSw(Rbt1Complete) = On Or MemSw(Rbt2Complete) = On
If MemSw(Rbt1Complete) = On Then
nextPart = 1
ElseIf MemSw(Rbt2Complete) = On Then
nextPart = 2
EndIf
PF_ActivePart nextPart
If nextPart = PartID Then
’Same part so no need to re-acquire an image and reload the queue
PF_Robot = PF_CALLBACK_SUCCESS
Else
’Restart from vision-
’Acquire image and load queue for only the Active Part
PF_Robot = PF_CALLBACK_RESTART_ACTIVEPART
EndIf
Fend