機器人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_ActivePart)與當前零件不同時(即另一台機器人拾取時),PF_Robot回呼函數會傳回「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