Un robot par distributeur et une pièce par distributeur
Exemple de programme 1.1
Type d’exemple :
Utilisation de la fonction de rappel PF_Robot pour le mouvement
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 1
- Nombre de types de pièces sur le distributeur : 1
- Nombre de positionnements : 1
Orientation de la caméra : caméra fixe et orientée vers le bas au-dessus du distributeur n° 1
Description
Les pièces sont retirées du distributeur et placées dans une boîte. Une fois toutes les pièces retirées, la fonction de rappel Control demandera d’autres pièces. Lorsque l’opérateur ou la trémie réapprovisionne le distributeur, le cycle se poursuit. Si la commande PF_Stop est exécutée, le cycle en cours se termine, puis l’application s’arrête. (La commande PF_Stop n’est pas utilisée dans l’exemple de code suivant.)
Exemple de code
Main.prg
Function main
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start 1
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Do While PF_QueLen(PartID) > 0
P0 = PF_QueGet(PartID)
Jump P0
On Gripper; Wait 0.2
Jump Place
Off Gripper; Wait 0.2
PF_QueRemove PartID
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
PF_Robot = PF_CALLBACK_SUCCESS
Fend
Exemple de programme 1.2
Type d’exemple :
Système à plusieurs robots - 1 robot par distributeur et 1 pièce par distributeur
Configuration
- Nombre de robots : 2
Le robot n° 1 est connecté à l’unité de commande. Le robot n° 2 est connecté à l’unité d’entraînement. - Nombre de distributeurs : 2
- Nombre de types de pièces sur chaque distributeur : 1
- Nombre de positionnements : 1 par robot
- Orientation de la caméra : chaque distributeur est équipé de sa propre caméra fixe orientée vers le bas
Description
Les deux robots prélèvent et positionnent des pièces de manière autonome. Les robots ne partagent ni les distributeurs ni le positionnement. Les enveloppes de travail des robots ne se chevauchent pas. Les deux robots possèdent des points intitulés « Park » (Stationner), « Pick » (Prélèvement) et « Place » (Positionner) dans leurs fichiers de points respectifs.
Exemple de code
Main.prg
Function main
Robot 1
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
Robot 2
If Motor = Off Then Motor On
Power Low
Jump Park
PF_Start 1
PF_Start 2
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Integer gripperOutput
Select PartID
Case 1
Robot 1
gripperOutput = 1
Case 2
Robot 2
gripperOutput = 2
Send
Do While PF_QueLen(PartID) > 0
Pick = PF_QueGet(PartID)
Jump pick
On gripperOutput; Wait 0.2
Jump Place
Off gripperOutput; Wait 0.2
PF_QueRemove PartID
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
PF_Robot = PF_CALLBACK_SUCCESS
Fend
Exemple de programme 1.3
Type d’exemple :
Traitement parallèle de vision et des vibrations avec des mouvements du robot
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 1
- Nombre de types de pièces : 1
- Nombre de positionnements : 1
- Orientation de la caméra : caméra fixe et orientée vers le bas
Description
Le robot prélève une pièce n° 1 dans le distributeur de pièces et la positionne dans un dispositif de fixation. Ce processus se poursuit jusqu’à ce que toutes les pièces « avant » aient été retirées du distributeur. Lorsque la dernière pièce disponible est en cours de positionnement (à 90 % du mouvement), le distributeur vibre, la trémie réapprovisionne le distributeur si nécessaire, etc.
Cet exemple montre comment le fonctionnement du distributeur peut s’effectuer en parallèle avec le mouvement du robot afin d’optimiser le débit.
Exemple de code
Main.prg
Function main
MemOff PartsToPick
Off Gripper
Robot 1
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start(1)
Xqt RobotPickPlace
Fend
Function RobotPickPlace
Do
Wait MemSw(PartsToPick) = On
If PF_QueLen(1) > 0 Then
Do
Pick = PF_QueGet(1)
PF_QueRemove 1
Jump pick
On Gripper; Wait 0.2
If PF_QueLen(1) = 0 Then
Jump Place ! D90; MemOff PartsToPick !
Off Gripper; Wait 0.2
Exit Do
Else
Jump Place
Off Gripper; Wait 0.2
EndIf
Loop
Else
MemOff PartsToPick
EndIf
Loop
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
MemOn PartsToPick
Wait MemSw(PartsToPick) = Off
PF_Robot = PF_CALLBACK_SUCCESS
Fend
Exemple de programme 1.4
Type d’exemple :
1 robot, 2 distributeurs et 1 pièce par distributeur
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 2
- Nombre de types de pièces sur chaque distributeur : 1
- Nombre de positionnements : 1
- Orientation de la caméra : chaque distributeur est équipé de sa propre caméra fixe orientée vers le bas
Description
Le robot prélève chaque pièce n° 1 dans le distributeur n° 1 et les positionne dans une boîte. Ce processus se poursuit jusqu’à ce que toutes les pièces « avant » aient été retirées du distributeur n° 1. Puis, le robot prélève chaque pièce « avant » dans le distributeur n° 2 et les positionne dans une boîte. Les caméras et les distributeurs fonctionnent en parallèle.
Exemple de code
Main.prg
Function main
MemOff PartsToPick1; MemOff PartsToPick2
Off Gripper
Robot 1
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start(1)
PF_Start(2)
Xqt rbt1
Fend
Function rbt1
Do
Call RobotPickPlace(1)
Call RobotPickPlace(2)
Loop
Fend
Function RobotPickPlace(PartID As Integer)
Integer partsToPickMembit
Select PartID
Case 1
partsToPickMembit = IONumber("PartsToPick1")
Case 2
partsToPickMembit = IONumber("PartsToPick2")
Send
Wait MemSw(partsToPickMembit) = On
If PF_QueLen(PartID) > 0 Then
Do
Pick = PF_QueGet(PartID)
PF_QueRemove PartID
Jump pick
On Gripper; Wait 0.2
If PF_QueLen(PartID) = 0 Then
Jump Place ! D90; MemOff partsToPickMembit !
Off Gripper; Wait 0.2
Exit Do
Else
Jump Place
Off Gripper; Wait 0.2
EndIf
If PF_IsStopRequested(PartID) = True Then
MemOff partsToPickMembit
Exit Do
EndIf
Loop
Else
MemOff partsToPickMembit
EndIf
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Select PartID
Case 1
MemOn PartsToPick1
Wait MemSw(PartsToPick1) = Off
Case 2
MemOn PartsToPick2
Wait MemSw(PartsToPick2) = Off
Send
PF_Robot = PF_CALLBACK_SUCCESS
Fend
Exemple de programme 1.5
Type d’exemple :
1 robot, 2 distributeurs et 1 pièce par distributeur - Caméra montée sur un support mobile
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 2
- Nombre de types de pièces sur chaque distributeur : 1
- Nombre de positionnements : 1
- Orientation de la caméra : chaque distributeur utilisera la caméra montée sur un support mobile sur le robot.
(Il n’y a pas de caméras fixes orientées vers le bas dans cet exemple.)
Description
Le robot déplace ensuite la caméra montée sur un support mobile au-dessus du distributeur n° 1 et prend une photo. Le robot prélève chaque pièce dans le distributeur n° 1 et les positionne dans une boîte. Ce processus se poursuit jusqu’à ce que toutes les pièces « avant » aient été retirées du distributeur. Le robot déplace ensuite la caméra montée sur un support mobile au-dessus du distributeur n° 2 et prend une photo. Le robot prélève chaque pièce correctement orientée dans le distributeur n° 2 et les positionne dans une boîte.
POINTS CLÉS
Si vous utilisez une caméra mobile équipée de plusieurs distributeurs avec rétroéclairage, une séquence de vision distincte est utilisée pour chaque pièce associée à chaque distributeur.
Exemple de code
Main.prg
Function main
MemOff PartsToPick1; MemOff PartsToPick2
MemOff mobileCamBefore1; MemOff mobileCamAfter1
MemOff mobileCamBefore2; MemOff mobileCamAfter2
MemOff mobileCamInPos1; MemOff mobileCamInPos2
Robot 1
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start(1)
PF_Start(2)
Xqt rbt1
Fend
Function rbt1
Do
Wait MemSw(mobileCamBefore1) = On
Jump MobileCamShotFeeder1; MemOn mobileCamInPos1
Wait MemSw(mobileCamAfter1) = On
MemOff mobileCamInPos1
Call RobotPickPlace(1)
Wait MemSw(mobileCamBefore2) = On
Jump MobileCamShotFeeder2; MemOn mobileCamInPos2
Wait MemSw(mobileCamAfter2) = On
MemOff mobileCamInPos2
Call RobotPickPlace(2)
Loop
Fend
Function RobotPickPlace(PartID As Integer)
Integer partsToPickMembit, partCnt, gripperOutput, toolNum
Select PartID
Case 1
partsToPickMembit = IONumber("PartsToPick1")
Case 2
partsToPickMembit = IONumber("PartsToPick2")
Send
Wait MemSw(partsToPickMembit) = On
Do While PF_QueLen(PartID) > 0
P0 = PF_QueGet(PartID)
Jump P0
On Gripper; Wait 0.2
Jump Place
Off Gripper; Wait 0.2
PF_QueRemove PartID
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
MemOff partsToPickMembit
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Select PartID
Case 1
MemOn PartsToPick1
Wait MemSw(PartsToPick1) = Off
Case 2
MemOn PartsToPick2
Wait MemSw(PartsToPick2) = Off
Send
PF_Robot = PF_CALLBACK_SUCCESS
Fend
Function PF_MobileCam(PartID Integer, Action As Integer) As Integer
Integer mobileCamBeforeMembit, mobileCamAfterMembit, mobileCamInPosMembit
Select PartID
Case 1
mobileCamBeforeMembit = IONumber("mobileCamBefore1")
mobileCamAfterMembit = IONumber("mobileCamAfter1")
mobileCamInPosMembit = IONumber("mobileCamInPos1")
Case 2
mobileCamBeforeMembit = IONumber("mobileCamBefore2")
mobileCamAfterMembit = IONumber("mobileCamAfter2")
mobileCamInPosMembit = IONumber("mobileCamInPos2")
Send
Select Action
Case PF_MOBILECAM_BEFORE
’ Request for robot move to camera position
MemOff mobileCamAfterMembit
MemOn mobileCamBeforeMembit
Wait MemSw(mobileCamInPosMembit) = On
Case PF_MOBILECAM_AFTER
’ Request for robot move after part vision acquisition
MemOff mobileCamBeforeMembit
MemOn mobileCamAfterMembit
Wait MemSw(mobileCamInPosMembit) = Off
Send
PF_MobileCam = PF_CALLBACK_SUCCESS
Fend
Exemple de programme 1.6
Type d’exemple :
Spécification du nombre de pièces à prélever
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 2
- Nombre de types de pièces sur chaque distributeur : 1
- Nombre de positionnements : 1
- Orientation de la caméra : chaque distributeur est équipé de sa propre caméra fixe orientée vers le bas
Description
Le robot prélève quatre pièces n° 1 dans le distributeur n° 1 et les positionne individuellement. Le robot prélèvera ensuite cinq pièces n° 2 dans le distributeur n° 2 et les positionnera. Les caméras et les distributeurs fonctionnent en parallèle.
Cet exemple montre comment le robot peut prélever un nombre précis de pièces dans chaque distributeur. L’exemple de code permet également de prélever toutes les pièces disponibles en définissant le paramètre numToPick sur « ALL_AVAILABLE ».
Si des pièces « avant » restent sur l’un ou l’autre des distributeurs après le prélèvement de la quantité souhaitée, le distributeur ne vibrera pas inutilement.
Exemple de code
Main.prg
#define ALL_AVAILABLE -1
Function main
MemOff PartsToPick1; MemOff PartsToPick2
Off Gripper
Robot 1
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start(1)
PF_Start(2)
Xqt rbt1
Fend
Function rbt1
Do
Call RobotPickPlace(1, 4) ’part 1...pick & place 4 times
Call RobotPickPlace(2, 5) ’part 2...pick & place 5 times
Loop
Fend
Function RobotPickPlace(PartID As Integer, numToPick As Integer)
Integer partsToPickMembit, partCnt
Select PartID
Case 1
partsToPickMembit = IONumber("PartsToPick1")
Case 2
partsToPickMembit = IONumber("PartsToPick2")
Send
partCnt = 0
Do
Wait MemSw(partsToPickMembit) = On
If PF_QueLen(PartID) > 0 Then
Pick = PF_QueGet(PartID)
PF_QueRemove PartID
Jump pick
On Gripper; Wait 0.2
partCnt = partCnt + 1
If PF_QueLen(PartID) = 0 Then
Jump Place ! D90; MemOff partsToPickMembit !
Off Gripper; Wait 0.2
If (partCnt = numToPick) Or (numToPick = ALL_AVAILABLE) Then
Exit Do
EndIf
Else
Jump Place
Off Gripper; Wait 0.2
If (partCnt = numToPick) Then
Exit Do
EndIf
EndIf
Else
MemOff partsToPickMembit
EndIf
If PF_IsStopRequested(PartID) = True Then
MemOff partsToPickMembit
Exit Do
EndIf
Loop
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Select PartID
Case 1
MemOn PartsToPick1
Wait MemSw(PartsToPick1) = Off
Case 2
MemOn PartsToPick2
Wait MemSw(PartsToPick2) = Off
Send
PF_Robot = PF_CALLBACK_SUCCESS
Fend
Exemple de programme 1.7
Type d’exemple :
S’assurer que le robot correspond au numéro de robot utilisé pour la pièce
Configuration
- Nombre de distributeurs : plus d’un
- Nombre de types de pièces sur chaque distributeur : 1
- Orientation de la caméra : chaque distributeur est équipé de sa propre caméra fixe orientée vers le bas
Description
Lors de l’utilisation de plusieurs distributeurs, il est courant que le robot effectue ses mouvements dans une tâche multiple plutôt qu’au sein de la fonction de rappel PF_Robot. En d’autres termes, la fonction de rappel PF_Robot permet simplement de charger les emplacements des pièces (points) dans la file d’attente Part Feeding.
Une tâche de mouvement du robot utilise les points présents dans la file d’attente. Lorsque le code est structuré de cette manière, il est recommandé que la tâche de mouvement du robot vérifie que le numéro actuel du robot correspond bien au numéro de robot sélectionné pour la pièce.
Cette vérification supplémentaire permettra de s’assurer que le robot n’utilise pas les mauvais points et d’éviter qu’il ne se bloque.
Exemple de code
Main.prg
Function RobotPickPlace(PartID As Integer, numToPick As Integer)
If PF_Info(PartID, PF_INFO_ID_ROBOT_NO) <> Robot Then
Print "Robot does not match the robot # for the current part"
Quit All
EndIf
’Robot Motion Code
Fend
Exemple de programme 1.8
Type d’exemple :
Acquérir une nouvelle image et charger la file d’attente après chaque prélèvement
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 1
- Nombre de types de pièces : 1
- Nombre de positionnements : 1
- Orientation de la caméra : caméra fixe et orientée vers le bas
Description
Le robot prélève une pièce n° 1 dans le distributeur de pièces et la positionne dans un dispositif de fixation. Après chaque opération de prélèvement et de positionnement, une nouvelle image sera acquise et la file d’attente sera rechargée.
Dans cet exemple, nous craignons que les pièces environnantes ne soient déplacées lors du prélèvement. La valeur de retour de la fonction de rappel PF_Robot « PF_CALLBACKRESTART » 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 où l’acquisition d’une image à chaque cycle peut améliorer la précision des performances. La vision et la vibration du distributeur se produisent parallèlement au mouvement du robot.
Exemple de code
Main.prg
Function main
MemOff PartsToPick
Off Gripper
Robot 1
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start(1)
Xqt RobotPickPlace
Fend
Function RobotPickPlace
Do
Wait MemSw(PartsToPick) = On
If PF_QueLen(1) > 0 Then
Pick = PF_QueGet(1)
PF_QueRemove 1
Jump pick
On Gripper; Wait 0.2
Jump Place ! D90; MemOff PartsToPick !
Off Gripper; Wait 0.2
Else
MemOff PartsToPick
EndIf
Loop
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
MemOn PartsToPick
Wait MemSw(PartsToPick) = Off
PF_Robot = PF_CALLBACK_RESTART
Fend
Exemple de programme 1.9
Type d’exemple :
Trier une pièce selon son orientation (avant et arrière)
Configuration
Nombre de robots : 1
Nombre de distributeurs : 1
Nombre de types de pièces sur le distributeur : 1
Nombre de positionnements : 2 (une pour le côté avant et un pour le côté arrière)
Orientation de la caméra : caméra fixe et orientée vers le bas au-dessus du distributeur n° 1
Page General (Générale) de la pièce n° 1 :
Page Vision de la pièce n° 1 :
Description
Pour cette application, le robot triera les pièces en fonction de leur orientation (avant ou arrière). Les pièces avant seront positionnées à un emplacement étiqueté « PlaceFront » et celles arrière à un autre emplacement étiqueté « PlaceBack ».
L’ordre de prélèvement n’est pas important pour cette application. Le robot prélèvera et positionnera autant de pièces avant que possible, puis prélèvera et positionnera autant de pièces arrière que possible.
Lorsque l’option « Needs Flip » (A besoin d’être retourné) n’est pas cochée, mais que des objets de vision ont été sélectionnés dans les champs « Vision object for front of part » (Objet de vision pour la face avant de la pièce) et « Vision object for back of part » (Objet de vision pour la face arrière de la pièce), le système charge à la fois la face avant et la face arrière de la pièce dans la file d’attente des coordonnées et définit la valeur d’orientation de la pièce en conséquence.
N’oubliez pas que le paramètre « Needs Flip » (A besoin d’être retourné) indique au système que vous souhaitez que les pièces soient orientées d’une certaine manière. En désactivant ce paramètre, vous indiquez au système que vous souhaitez les deux orientations.
Dans ce cas, les données d’orientation des pièces « avant » (dans la file d’attente des coordonnées des pièces) seront automatiquement définies sur la constante « PF_PARTORIENT_FRONT ».
L’orientation des pièces arrière sera automatiquement définie sur la constante « PF_PARTORIENT_BACK ».
Exemple de code
Main.prg
Function main
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start 1
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Do While PF_QueLen(PartID) > 0
P0 = PF_QueGet(PartID)
Jump P0
On Gripper; Wait 0.2
If PF_QuePartOrient(PartID) = PF_PARTORIENT_FRONT Then
Jump PlaceFront
ElseIf PF_QuePartOrient(PartID) = PF_PARTORIENT_BACK Then
Jump PlaceBack
EndIf
Off Gripper; Wait 0.2
PF_QueRemove PartID
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
PF_Robot = PF_CALLBACK_SUCCESS
Fend
Exemple de programme 1.10
Type d’exemple :
Utiliser la fonction de rappel PF_Vision
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 1
- Nombre de types de pièces sur le distributeur : 1
- Nombre de positionnements : 1
- Orientation de la caméra : caméra fixe et orientée vers le bas au-dessus du distributeur n° 1
Description
Cet exemple montre comment utiliser la fonction de rappel PF_Vision pour acquérir une image et charger la file d’attente des coordonnées des pièces avec les résultats de vision. Pour utiliser cette fonction, sélectionnez « User processes vision for part via PF_Vision callback » (L’utilisateur gère la vision de la pièce via la fonction de rappel PF_Vision) dans le menu Epson RC+ 8.0 - [Tools] (Outils) - [Part Feeding] - [Vision].
Exemple de code
Main.prg
Function main
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start 1
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Do While PF_QueLen(PartID) > 0
P0 = PF_QueGet(PartID)
Jump P0
On Gripper; Wait 0.2
Jump Place
Off Gripper; Wait 0.2
PF_QueRemove PartID
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
PF_Robot = PF_CALLBACK_SUCCESS
Fend
Function PF_Vision(PartID As Integer, ByRef numBack As Integer) As Integer
Boolean found
Integer i, numFront
Real RB_X, RB_Y, RB_U, RB_Z
’ Pick Z coordinate
RB_Z = -132.0
’ Initialize coordinates queue
PF_QueRemove PartID, All
PF_Backlight 1, On
’ Detect the parts
VRun UsrVisionSeq
PF_Backlight 1, Off
VGet UsrVisionSeq.Geom01.NumberFound, numFront ’Front Parts
VGet UsrVisionSeq.Geom02.NumberFound, numBack ’Back Parts
If numFront <> 0 Then
For i = 1 To numFront
VGet UsrVisionSeq.Geom01.RobotXYU(i), found, RB_X, RB_Y, RB_U
If found Then
PF_QueAdd PartID, XY(RB_X, RB_Y, RB_Z, RB_U)
EndIf
Next
EndIf
PF_Vision = PF_CALLBACK_SUCCESS
Fend
Exemple de programme 1.11
Type d’exemple :
Prélever une pièce à plusieurs faces
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 1
- Nombre de types de pièces sur le distributeur : 1
- Nombre de faces distinctes de la pièce : 3
- Nombre de positionnements : 3 (un positionnement pour chaque face de la pièce)
- Orientation de la caméra : caméra fixe et orientée vers le bas au-dessus du distributeur n° 1
Description
Dans cet exemple, le distributeur contient un seul type de pièce physique. La pièce comporte 3 faces distinctes (côté droit, côté gauche et face supérieure). Le robot peut prélever la pièce dans n’importe laquelle des 3 orientations.
Du point de vue du système de vision, chaque côté correspond à une pièce distincte (même s’il s’agit en réalité d’une seule pièce physique). Part Feeding permet de traiter simultanément 4 pièces différentes sur le même distributeur. Par conséquent, nous allons créer une pièce distincte pour chaque côté. Nous allons créer 3 séquences de vision de la pièce et les nommer « Left » (Gauche), « Right » (Droit) et « Top » (Haut).
Chaque séquence de vision utilisera un objet Geometric pour localiser la pièce selon son orientation spécifique. Dans la boîte de dialogue Part Feeding, nous allons créer 3 pièces : la pièce n° 1, la pièce n° 2 et la pièce n° 3.
La pièce n° 1 permettra de positionner la pièce dans l’orientation « Left » (Gauche).
La pièce n° 2 permettra de positionner la pièce dans l’orientation « Right » (Droit).
La pièce n° 3 permettra de positionner la pièce dans l’orientation « Top » (Haut).
L’option « Needs Flip » (A besoin d’être retourné) sera décochée pour les 3 pièces. Les 3 pièces utiliseront toutes la même séquence de vision Blob de la pièce appelée « PartBlob ».
Définissez le prélèvement Z pour chaque pièce (la hauteur de prélèvement peut varier d’un côté à l’autre de la pièce). Les pièces de gauche seront placées à un emplacement étiqueté « PlaceLeft ». Les pièces de droite seront placées à un emplacement étiqueté « PlaceRight ». Les pièces supérieures seront placées à un emplacement étiqueté « PlaceTop ». Le robot prélèvera et positionnera toutes les pièces orientées vers la gauche, puis toutes celles orientées vers la droite, et enfin toutes celles orientées vers le haut.
Exemple de code
Main.prg
Function main
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start 1, 1, 2
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Do While PF_QueLen(PartID) > 0
P10 = PF_QueGet(PartID)
Jump P10
On Vacuum; Wait 0.2
Select PartID
Case 1
Jump PlaceLeft
Case 2
Jump PlaceRight
Case 3
Jump PlaceTop
Send
Off Vacuum; Wait 0.2
PF_QueRemove PartID
Loop
PartID = PartID + 1
If PartID > 3 Then PartID = 1
PF_ActivePart PartID
PF_Robot = PF_CALLBACK_SUCCESS
Fend
POINTS CLÉS
Cet exemple illustre une méthode simple pour traiter une pièce à plusieurs faces à l’aide de la fonctionnalité Multi-Part (Plusieurs pièces). Une autre méthode consiste à utiliser l’option « User to Process Vision » (Utilisateur pour traiter la vision) via la fonction de rappel PF_Vision. Lors de l’utilisation de PF_QueAdd, il est possible d’inclure des données utilisateur avec les coordonnées de la pièce. Les données utilisateur peuvent correspondre à une valeur numérique représentant l’orientation de la pièce (c’est-à-dire, 1 = Left [Gauche], 2 = Right [Droit], 3 = Top [Haut]). La fonction PF_QueUserData permettrait de récupérer la valeur d’orientation afin que la pièce puisse être placée au bon endroit. Le code devrait également tenir compte des différences de hauteur entre les côtés de la pièce.
Exemple de programme 1.12
Type d’exemple :
Utiliser la fonction de rappel PF_Vision et la séquence de pièces utilise la recherche multiple
Configuration
- Nombre de robots : 1
- Nombre de distributeurs : 1
- Nombre de types de pièces sur chaque distributeur : 1
- Nombre de positionnements : 1
- Orientation de la caméra : caméra fixe et orientée vers le bas au-dessus du distributeur n° 1
Description
La fonction de rappel PF_Vision est utilisée lorsque le traitement de vision de la séquence de pièces est difficile (c’est-à-dire, lorsque l’application nécessite plusieurs séquences de vision pour détecter la pièce ou lorsque plusieurs réglages d’éclairage différents sont requis, etc.).
Cet exemple montre comment utiliser la fonction de rappel PF_Vision pour acquérir une image et charger la file d’attente des coordonnées des pièces avec les résultats de vision. Pour utiliser cette fonction, sélectionnez « User processes vision for part via PF_Vision callback » (L’utilisateur gère la vision de la pièce via la fonction de rappel PF_Vision) dans le menu Epson RC+ 8.0 - [Tools] (Outils) - [Part Feeding] - [Vision].
Cet exemple utilise la recherche multiple pour la séquence de pièces. La recherche multiple est une fonctionnalité qui permet à un objet de rechercher chaque résultat de la propriété CenterPointObject ou d’un objet Frame. Dans une recherche multiple, les résultats trouvés ne sont pas nécessairement présentés de manière séquentielle. PF_Vision explique comment parcourir tous les résultats pour trouver ceux qui correspondent.
- Exemple de recherche multiple avec CenterPointObject :
- Créez un objet permettant de détecter plusieurs pièces, comme un Blob.
- Créez un autre objet, tel qu’un Polar, qui utilisera le Blob comme CenterPointObject.
- Définissez la propriété CenterPntObjResult sur All.
- Lancez la séquence. Vous verrez apparaître une instance de l’objet Polar pour chaque résultat Blob trouvé.
- Exemple de recherche multiple avec Frame :
- Créez un objet permettant de détecter plusieurs pièces, comme un Blob.
- Créez un objet Frame et définissez la propriété OriginPoint sur le Blob.
- Définissez la propriété OriginPntObjResult sur All.
- Créez un autre objet, tel qu’un Polar, qui utilisera le Frame.
- Définissez la propriété FrameResult sur All.
- Lancez la séquence. Vous verrez une instance de l’objet Frame pour chaque résultat Blob trouvé, et une instance de l’objet Polar pour chaque résultat Frame.
Exemple de code
Main.prg
Function main
If Motor = Off Then
Motor On
EndIf
Power Low
Jump Park
PF_Start 1
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Do While PF_QueLen(PartID) > 0
P10 = PF_QueGet(PartID)
Select PF_QuePartOrient(PartID)
Case PF_PARTORIENT_FRONT ’ Front
Tool 1 ’ Tool to pick Front
’ Pick
Jump P10 ! D90; On Vacuum !
Wait 0.1
’ Place
Jump FrontPlace
Off Vacuum
Wait 0.1
Case PF_PARTORIENT_BACK ’ Back
Tool 2 ’ Tool to pick Back
’ Pick
Jump P10 ! D90; On Vacuum !
Wait 0.1
’ Place
Jump BackPlace
Off Vacuum
Wait 0.1
Send
PF_QueRemove PartID
If PF_IsStopRequested(PartID) = True Then
Exit Do
EndIf
Loop
PF_Robot = PF_CALLBACK_SUCCESS
Fend
Function PF_Vision(PartID As Integer, ByRef numBack As Integer) As Integer
Integer i, numFront, numBack, numResults, count
Boolean found
Real x, y, z, u
z = -170 ’ Set the pick Z coordinate to the desired height for your application
PF_QueRemove 1, All
PF_Backlight 1, On
VRun FindPart
VGet FindPart.Front.NumberFound, numFront
VGet FindPart.Front.NumberOfResults, numResults
count = 0
For i = 1 To numResults
VGet FindPart.Front.RobotXYU(i), found, x, y, u
If found Then
count = count + 1
P999 = XY(x, y, z, u) /R
PF_QueAdd 1, P999, PF_PARTORIENT_FRONT
EndIf
If count = numFront Then
Exit For
EndIf
Next
VGet FindPart.Back.NumberFound, numBack
VGet FindPart.Back.NumberOfResults, numResults
count = 0
For i = 1 To numResults
VGet FindPart.Back.RobotXYU(i), found, x, y, u
If found Then
count = count + 1
P999 = XY(x, y, z, u) /R
PF_QueAdd 1, P999, PF_PARTORIENT_BACK
EndIf
If count = numBack Then
Exit For
EndIf
Next
PF_Backlight 1, Off
PF_Vision = PF_CALLBACK_SUCCESS
Fend