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 :
  1. Créez un objet permettant de détecter plusieurs pièces, comme un Blob.
  2. Créez un autre objet, tel qu’un Polar, qui utilisera le Blob comme CenterPointObject.
  3. Définissez la propriété CenterPntObjResult sur All.
  4. 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 :
  1. Créez un objet permettant de détecter plusieurs pièces, comme un Blob.
  2. Créez un objet Frame et définissez la propriété OriginPoint sur le Blob.
  3. Définissez la propriété OriginPntObjResult sur All.
  4. Créez un autre objet, tel qu’un Polar, qui utilisera le Frame.
  5. Définissez la propriété FrameResult sur All.
  6. 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