每個送料器對應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的多重搜尋範例
- 創建用於搜尋多個零件的物件,如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台 - 多種零件 →