プログラム例 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
← プログラム例 5.1 エラー処理 →