每台送料器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回调函数仅用于将部件的位置(点)放入部件坐标队列中。
在进行机器人的运动任务时,使用部件坐标队列中的这些点。采用该方法构成代码时,请在机器人的运动任务中,确认当前机器人编号与部件选择的机器人编号是否一致。
通过该确认,可防止机器人移动至错误的点或发生碰撞。

样本代码
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对象将部件配置为特定姿势。在[上料]对话框中创建部件1、2与3共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