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