2台机器人 - 1种部件

程序示例 3.1

示例类型:
2台机器人与1种物理部件- PF_Robot回调函数的运动-按特定顺序拾取

构成

  • 机器人数量:2
  • 送料器数量:1
  • 送料器上的部件类型数量:1
  • 配置位置数量:2
  • 相机的方向:固定向下相机

描述
包括2台机器人与1台送料器。物理部件仅为1种。各机器人都有独自的相机校准,因此包括2种(机器人1的部件1与机器人2的部件2)逻辑部件。
机器人从送料器中依次进行拾取运作。在该应用中,拾取顺序非常重要。由“PF_ActivePart”执行交互拾取顺序。
在PF_Robot回调函数内执行机器人的运作。
在本例中没有送料器与机器人运作的并行处理。代码虽然单纯,但没有效率。各机器人包括带有“park”标签的点与带有“place”标签的点。本例的重要概念为PF_Robot回调函数的返回值“PF_CALLBACK_RESTART_ACTIVEPART”。
不可能利用该返回值在双方的部件队列中调整部件,但可确保多台机器人使用同一送料器。利用返回值强制获取PF_ActivePart的新图像,并且加载PF_ActivePart的队列。

样本代码
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

程序示例 3.2

示例类型:
2台机器人与1种物理部件 - 其他任务的运动- 拾取顺序没有关系 - 按特定的顺序拾取

构成

  • 机器人数量:2
  • 送料器数量:1
  • 送料器上的部件类型数量:1
  • 配置位置数量:2
  • 相机的方向:固定向下相机

描述
包括2台机器人与1台送料器。物理部件仅为1种。各机器人都有独自的相机校准,因此包括2种(机器人1的部件1与机器人2的部件2)逻辑部件。拾取顺序没有关系-先到顺序。
本例中的差异在于按循环获取各部件的视觉。这对拾取期间周围的部件可能移动的情况有用。
PF_Robot回调函数的返回值“PF_CALLBACK_RESTART”用于对所有部件重新强制执行视觉处理,并重新加载所有的部件队列。
这种方法没有效率可言,但“PF_CALLBACK_RESTART”在特定状况下有用。

样本代码
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

程序示例 3.3

示例类型:
2台机器人与1种物理部件 - 其他任务的运动 -先到顺序-被模拟进程的延迟

构成

  • 机器人数量:2
  • 送料器数量:1
  • 送料器上的部件类型数量:1
  • 配置位置数量:2
  • 相机的方向:固定向下相机

描述
包括2台机器人与1台送料器。物理部件仅为1种。各机器人都有独自的相机校准,因此包括2种(机器人1的部件1与机器人2的部件2)逻辑部件。在本例中,可调整各机器人的进程时间(按随机待机时间被模拟)。
各机器人从送料机中拾取部件后,因执行其他操作 而进入忙碌状态。
机器人从送料器中拾取部件后,结束其他操作,并在完成从送料器中拾取其他部件的准备时,使用存储器位“Rbt1Complete”与“Rbt2Complete”发送信号。PF_Robot回调函数用于在预期部件 (PF_ActivePart) 与当前部件不同时(也就是其他机器人拾取部件的情况下),返回“PF_CALLBACK_RESTART_ACTIVEPART”的值。这样可防止机器人队列内的点重复。
获取PF_ActivePart的新图像,并且加载PF_ActivePart的队列。但下一部件与当前部件相同时(也就是同一机器人从送料器中拾取的情况下),PF_Robot回调函数的返回值为“PF_CALLBACK_SUCCESS”。PF_AccessFeeder与PF_ReleaseFeeder用于避免机器人访问送料器时发生碰撞。

样本代码
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