每台送料器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进行多搜索的示例
- 创建用于搜索多个部件的Blob等对象。
- 使用Blob的CenterPointObject,创建Polar等其他对象。
- 将CenterPntObjResult属性设为ALL。
- 执行序列。按找到的Blob结果,显示Polar对象的实例。
- 使用Frame进行多搜索的示例
- 创建用于搜索多个部件的Blob等对象。
- 创建Frame对象,将OriginPoint属性设为Blob。
- 将OriginPntObjResult属性设为All。
- 使用Frame创建Polar等其他对象。
- 将FrameResult属性设为All。
- 执行序列。按找到的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
← 应用程序示例 1台机器人 - 多部件 →