程式範例 5.2
範例類型:
自訂平台(帶孔洞) - 在PF_Feeder回呼中控制振動
配置
- 機器人數量:1
- 送料器數量:1
- 送料器上的零件種類數:1
- 放置位置數量:1
- 平台類型:孔洞
- 拾取區域:全面
- 攝影機的朝向:朝下固定的攝影機
描述
由於是自訂平台,[在PF_Feeder回呼中控制振動]會自動被選擇。
視覺取得影像並載入零件佇列後,會呼叫PF_Feeder回呼函數。使用者的程式碼需要在PF_Feeder回呼函數中判斷如何使送料器振動。正面朝上和背面朝上的零件數量會作為引數提供給PF_Feeder回呼。這些引數是「NumFrontParts」和「NumBackParts」。在此範例中,在NumFrontParts大於「0」時機器人可以取放零件,因此不需要送料器振動。這種情況下,回呼的回傳值為「PF_CALLBACK_SUCCESS」。此回傳值指示系統呼叫PF_Robot回呼函數。
當NumFrontParts為「0」時,範例程式碼會執行VRun以執行零件Blob序列,判斷是否有零件堆積或完全沒有零件。如果零件Blob序列未找到零件,則開啟料斗。如果零件Blob序列找到了一些東西,則送料器會執行翻轉動作、前向位移動作和後向位移動作,使零件落入孔洞中。當零件在送料器上振動後,系統必須重新取得視覺影像。(因為振動會改變零件的位置)這通過設定回傳值為「PF_CALLBACK_RESTART」來實現。這會重新取得新影像,重新載入零件座標佇列,然後再次呼叫PF_Feeder回呼函數,以判斷是否需要進一步動作。
TIP
翻轉、長時間前向位移、短時間後向位移是對各種自訂平台通用的有效動作。
提示
當平台類型為孔洞、溝槽、凹槽時,常數PF_FEEDER_UNKNOWN將會被傳遞至PF_Feeder回呼函數。這是因為在使用自訂平台時,系統無法決定適當的送料器運作所導致。
範例程式碼
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_Feeder(PartID As Integer, NumFrontParts As Integer, NumBackParts As Integer, state As Integer) As Integer
' Example for Structured Platform with holes state = PF_FEEDER_UNKNOWN
Integer PFControlReturnVal
Integer numFound
Select True
' OK to Pick
Case NumFrontParts > 0
' Call PF_Robot because there are parts ready to pick
PF_Feeder = PF_CALLBACK_SUCCESS '
' No Front parts were found but there are Back parts
Case NumFrontParts = 0 And NumBackParts <> 0
' Flip, long Shift Forward and short Shift Backward
PF_Flip PartID, 500
PF_Shift PartID, PF_SHIFT_FORWARD, 1000
PF_Shift PartID, PF_SHIFT_BACKWARD, 300
PF_Feeder = PF_CALLBACK_RESTART ' Restart and re-acquire images
' There are no Front or Back parts found
' Either there is a clump of parts or there are no parts on the tray
' Acquire an image from the Part Blob sequence to make a determination
Case NumFrontParts = 0 And NumBackParts = 0
PF_Backlight 1, On ' Backlight on
VRun PartBlob ' Acquire Image
PF_Backlight 1, Off 'Backlight off
VGet PartBlob.Blob01.NumberFound, numFound ' Were any Blobs found?
If numFound > 0 Then ' Clump of parts found
' Flip, long Shift Forward and short Shift Backward
PF_Flip PartID, 500
PF_Shift PartID, PF_SHIFT_FORWARD, 1000
PF_Shift PartID, PF_SHIFT_BACKWARD, 300
Else ' No parts found
' Call the Control callback to supply more parts
PFControlReturnVal = PF_Control(PartID, PF_CONTROL_SUPPLY_FIRST)
EndIf
PF_Feeder = PF_CALLBACK_RESTART ' Restart and re-acquire images
Send
Fend