プログラム例 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を実行してパーツブローブシーケンスを実行し、パーツのかたまりがあるか、パーツが全くないかを判断します。パーツブローブシーケンスでパーツが見つからなければ、ホッパーをオンにします。パーツブローブシーケンスが何かを見つけた場合は、フィーダーが反転動作、前シフト動作、および後シフト動作を行い、パーツを穴に落下させます。 パーツがフィーダー上で振動した場合は、システムはビジョン画像を再取得しなければなりません。(振動により部品の位置が変化するためです。)これは、戻り値を“PF_CALLBACK_RESTART”に設定することで達成されます。これは、新しい画像を再取得し、パーツ座標キューを再ロードした後、再びPF_Feederコールバック関数を呼び出して、さらなる動作が必要かどうかを判断します。

ヒント


フリップ、長時間の前シフト、短時間の後シフトは、さまざまなカスタムプラットフォームに共通して有効な動作です。

キーポイント


プラットフォームタイプが、穴, 溝, ポケットである場合、PF_Feederコールバック関数には定数PF_FEEDER_UNKNOWNが渡されます。これは、カスタムプラットフォームの場合、システムは適切なフィーダー動作を決定できないためです。

サンプルコード
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