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