每個送料器對應1台機器人&每個送料器對應1種零件

程式範例 1.1

範例類型:
在動作中使用PF_Robot回呼

配置

  • 機器人數量:1
  • 送料器數量:1
  • 送料器上的零件種類數:1
  • 放置位置數量:1
    攝影機的朝向:送料器#1上的朝下固定的攝影機

描述
零件從送料器移動到箱子。當所有零件移動完畢時,Control回呼會請求零件。由操作員或料斗向送料器補充零件後,繼續移動循環。執行PF_Stop命令時,目前的循環停止,應用程式結束。(但在以下範例程式碼中未使用PF_Stop命令。)

範例程式碼
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

程式範例 1.2

範例類型:
多重機器人系統 - 每個送料器對應1台機器人&每個送料器對應1種零件

配置

  • 機器人數量:2
    將機器人1連接至控制裝置。機器人2則連接到驅動裝置。
  • 送料器數量:2
  • 送料器上的零件種類數:1
  • 放置位置數量:每台機器人1個
  • 攝影機的朝向:每個送料器配置朝下固定的攝影機

描述
各機器人分別進行零件取放。每台機器人都有專用的送料器和放置位置。此外,機器人1和機器人2的動作範圍不重疊。每台機器人在各自的點檔案中都有教導的「Park」、「Pick」、「Place」點位。

範例程式碼
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

程式範例 1.3

範例類型:
機器人動作的視覺與振動平行處理

配置

  • 機器人數量:1
  • 送料器數量:1
  • 零件種類數:1
  • 放置位置數量:1
  • 攝影機的朝向:朝下固定的攝影機

描述
機器人從零件送料器取出零件#1,並放置到固定治具中。此動作持續進行,直到所有「正面」零件從送料器移除為止。放置最後一個零件時(送料器運作的90%),送料器開始振動,並視需要由料斗向送料器補充零件。
此範例說明為了優化處理能力,送料器運作如何與機器人動作同時進行。

範例程式碼
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

程式範例 1.4

範例類型:
每個送料器對應機器人1台、送料器2個、零件1種類的配置

配置

  • 機器人數量:1
  • 送料器數量:2
  • 各送料器上的零件種類數:1
  • 放置位置數量:1
  • 攝影機的朝向:各送料器配置朝下固定的攝影機

描述
機器人從送料器#1取出零件#1,並放置到箱子中。此動作持續進行,直到所有「正面」零件從送料器#1移除為止。之後,機器人從送料器#2取出「正面」零件,並移動到箱子。攝影機和送料器同時運作。

範例程式碼
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

程式範例 1.5

範例類型:
每個送料器對應機器人1台、送料器2個、零件1種類 - 移動式安裝攝影機

配置

  • 機器人數量:1
  • 送料器數量:2
  • 送料器上的零件種類數:1
  • 放置位置數量:1
  • 攝影機的朝向:各送料器使用機器人的移動式安裝攝影機。
    (此範例不使用朝下固定的攝影機。)

描述
機器人將移動式安裝攝影機移至送料器#1上方並拍攝影像。機器人從送料器#1取出各零件,並放置到箱子中。此動作持續進行,直到所有「正面」零件從送料器移除為止。機器人將移動式安裝攝影機移至送料器#2上方並拍攝影像。機器人從送料器#2取出正確方向的零件,並放置到箱子中。

提示


使用配備背光的多個送料器的移動式攝影機時,請為每個送料器所綁定的每個零件使用不同的視覺序列。

範例程式碼
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 As 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

程式範例 1.6

範例類型:
指定拾取零件的數量

配置

  • 機器人數量:1
  • 送料器數量:2
  • 各送料器上的零件種類數:1
  • 放置位置數量:1
  • 攝影機的朝向:每個送料器配置朝下固定的攝影機

描述
機器人從送料器#1取出4個零件#1,並分別放置。之後,機器人從送料器#2取出5個零件#2,並放置。攝影機和送料器同時運作。
此範例說明機器人如何從各送料器取出特定數量的零件。在範例程式碼中,透過將numToPick參數設為「ALL_AVAILABLE」,可取出所有零件。
在取出所需數量的零件後,如果任一送料器上仍有「正面」零件,送料器不會振動。

範例程式碼
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

程式範例 1.7

範例類型:
確認機器人與零件使用的機器人的編號為一致

配置

  • 送料器數量:1以上
  • 各送料器上的零件種類數:1
  • 攝影機的朝向:每個送料器配置朝下固定的攝影機

描述
使用多個送料器時,通常會在PF_Robot回呼外的別的任務中描述機器人動作,而非在PF_Robot回呼內部。也就是說,PF_Robot回呼只負責將零件位置(點位)放入零件座標佇列中。
機器人動作任務中,會在零件座標佇列中使用這些點位。以這種方式配置程式碼時,請在機器人動作任務中確認目前的機器人編號與零件選擇的機器人編號是否一致。
此確認可防止機器人移動到錯誤的點位或發生碰撞。

範例程式碼
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

程式範例 1.8

範例類型:
拾取後取得新影像並重新載入佇列

配置

  • 機器人數量:1
  • 送料器數量:1
  • 零件種類數:1
  • 放置位置數量:1
  • 攝影機的朝向:朝下固定的攝影機

描述
機器人從零件送料器取出零件#1,並放置到固定治具中。取放操作後,取得新影像並重新載入佇列。
此範例中,關注的是在拾取過程中周圍零件可能移動的問題。PF_Robot回呼函數的回傳值「PF_CALLBACK_RESTART」會強制對所有零件重新執行視覺,並重新載入所有零件佇列。
雖然這種方法效率不高,但在對每個循環取得影像,可提高性能精度這種特定情況下,「PF_CALLBACK_RESTART」很有用。視覺和送料器振動與機器人動作同時進行。

範例程式碼
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

程式範例 1.9

範例類型:
按零件正反面分類

配置

  • 機器人數量:1

  • 送料器數量:1

  • 送料器上的零件種類數:1

  • 放置位置數量:2(1個用於「正面」朝向,另1個用於「背面」朝向)

  • 攝影機的朝向:送料器#1上的朝下固定的攝影機

  • 零件1一般:

  • 零件1視覺:

描述
在此應用中,機器人根據零件的「正面」和「背面」朝向來分類零件。正面朝上的零件被放置在標有「PlaceFront」標籤的點位,背面朝上的零件被放置在標有「PlaceBack」標籤的另一個點位。
在此應用中,拾取順序不重要。機器人會盡可能取放更多的正面朝上零件,然後盡可能取放更多的背面朝上零件。
當「需要翻轉」核取方塊未勾選,並且選擇了「檢測正面零件的物件」和「檢測背面零件的物件」的視覺物件時,系統會將正面和背面朝上的零件都載入到座標佇列中,從而設定Part Orientation的值。
「需要翻轉」設定告訴系統您想要將零件置於特定朝向。不勾選「需要翻轉」核取方塊,告訴系統您想要將零件置於正面和背面兩種朝向。

在此情況下,正面朝上零件的朝向資料(零件座標佇列內)會自動設定為常數「PF_PARTORIENT_FRONT」。
背面朝上零件的資料會自動設定為常數「PF_PARTORIENT_BACK」

範例程式碼
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

程式範例 1.10

範例類型:
使用PF_Vision回呼函數

配置

  • 機器人數量:1
  • 送料器數量:1
  • 送料器上的零件種類數:1
  • 放置位置數量:1
  • 攝影機的朝向:送料器#1上的朝下固定的攝影機

描述
此範例說明如何使用PF_Vision回呼來取得影像並載入包含視覺結果的零件座標佇列。若要使用此功能,請在Epson RC+ 8.0功能表 - [工具] - [料件送料] - [視覺]中選擇[由PF_Vision callback進行視覺處理]。

範例程式碼
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

程式範例 1.11

範例類型:
多重面向零件的選擇

配置

  • 機器人數量:1
  • 送料器數量:1
  • 送料器上的零件種類數:1
  • 零件姿態數量:3
  • 放置位置數量:3(零件各方向各1個放置位置)
  • 攝影機的朝向:送料器#1上的朝下固定的攝影機

描述
此範例中,送料器上有1種實體零件。零件有3種姿態(右、左、上)。機器人可以以3種姿態中的任一種拾取零件。
雖然實際上是同1個零件,但從視覺系統的角度來看,每種姿態都是不同的零件。零件送料支援在同一送料器上同時執行4個零件。因此,為每種姿態創建單獨的零件。創建3個零件視覺序列,命名為「Left」、「Right」、「Top」。
每個視覺序列使用Geometric物件將零件放置在特定姿態。在[料件送料]對話方塊中,創建3個零件:零件1、2、3。
零件1將零件放置在「左側」姿態。
零件2將零件放置在「右側」姿態。
零件3將零件放置在「上側」姿態。
3個零件全部都未勾選「需要翻轉」核取方塊。3個零件全部都使用名為「PartBlob」的相同零件Blob視覺序列。



教導每個零件的拾取Z(拾取高度可能因零件各姿態而異)。左側零件放置在標有「PlaceLeft」標籤的點位。右側零件放置在標有「PlaceRight」標籤的點位。上側零件放置在標有「PlaceTop」標籤的點位。機器人先取放所有左方向零件,然後取放所有右方向零件,最後取放所有上方向零件。

範例程式碼
Main.prg

Function main
    If Motor = Off Then
        Motor On
    EndIf
    Power Low
    Jump Park
    PF_Start 1, 2, 3
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

提示


此範例展示了使用多種零件功能處理多重面向零件的簡單方法。另1種方法是通過PF_Vision回呼進行「User to Process Vision」(由使用者處理視覺)。使用PF_QueAdd可以在零件座標中包含使用者資料。使用者資料可以是表示零件姿態的數值(1=左、2=右、3=上)。可以使用PF_QueUserData函數取得方向值,以便將零件放置在正確位置。此程式碼還需要考慮零件各側面高度的差異。

程式範例 1.12

範例類型:
使用PF_Vision回呼和多重搜尋的零件檢測視覺序列

配置

  • 機器人數量:1
  • 送料器數量:1
  • 送料器上的零件種類數:1
  • 放置位置數量:1
  • 攝影機朝向:送料器#1上的朝下固定的攝影機

描述
PF_Vision回呼用於零件檢測視覺序列難以處理的情況(例如,需要多個視覺序列檢測零件,或需要特殊外部照明控制的情況)。

此範例展示如何使用PF_Vision回呼取得影像並將視覺結果載入零件座標佇列。若要使用此功能,請在Epson RC+ 8.0功能表 - [工具] - [料件送料] - [視覺]中選擇「由PF_Vision callback進行視覺處理」。

此範例使用視覺的多重搜尋。多重搜尋是搜尋物件的CenterPointObject屬性或Frame物件各結果的功能。在多重搜尋中,找到的結果可能不會按預期順序排列。PF_Vision展示了先通過迭代所有結果,並對找到的結果進行處理的方法。

  • 使用CenterPointObject的多重搜尋範例
  1. 創建用於搜尋多個零件的物件,如Blob。
  2. 創建使用Blob的CenterPointObject的另一個物件,如Polar。
  3. 將CenterPntObjResult屬性設為ALL。
  4. 執行序列。對於每個找到的Blob結果,會顯示Polar物件的實例。
  • 使用Frame的多重搜尋範例
  1. 創建用於搜尋多個零件的物件,如Blob。
  2. 創建Frame物件,並將OriginPoint屬性設為Blob。
  3. 將OriginPntObjResult屬性設為All。
  4. 創建使用Frame的另一個物件,如Polar。
  5. 將FrameResult屬性設為All。
  6. 執行序列。對於每個找到的Blob結果,顯示Frame物件的實例,對於每個Frame結果,顯示Polar物件的實例。

範例程式碼
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