2台机器人 - 1种部件
程序示例 3.1
示例类型:
2台机器人与1种物理部件- PF_Robot回调函数的运动-按特定顺序拾取
构成
- 机器人数量:2
- 送料器数量:1
- 送料器上的部件类型数量:1
- 配置位置数量:2
- 相机的方向:固定向下相机
描述
包括2台机器人与1台送料器。物理部件仅为1种。各机器人都有独自的相机校准,因此包括2种(机器人1的部件1与机器人2的部件2)逻辑部件。
机器人从送料器中依次进行拾取运作。在该应用中,拾取顺序非常重要。由“PF_ActivePart”执行交互拾取顺序。
在PF_Robot回调函数内执行机器人的运作。
在本例中没有送料器与机器人运作的并行处理。代码虽然单纯,但没有效率。各机器人包括带有“park”标签的点与带有“place”标签的点。本例的重要概念为PF_Robot回调函数的返回值“PF_CALLBACK_RESTART_ACTIVEPART”。
不可能利用该返回值在双方的部件队列中调整部件,但可确保多台机器人使用同一送料器。利用返回值强制获取PF_ActivePart的新图像,并且加载PF_ActivePart的队列。
样本代码
Main.prg
Function Main
Robot 1
Motor On
Power High
Speed 50
Accel 50, 50
Jump Park
Robot 2
Motor On
Power High
Speed 50
Accel 50, 50
Jump Park
PF_Start 1, 2
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
If PF_QueLen(PartID) > 0 Then
Select PartID
Case 1
Robot 1
P0 = PF_QueGet(1)
PF_QueRemove (1)
Jump P0 /R
On rbt1Gripper
Wait 0.25
Jump Place
Off rbt1Gripper
Wait 0.25
PF_ActivePart 2
Case 2
Robot 2
P0 = PF_QueGet(2)
PF_QueRemove (2)
Jump P0 /L
On rbt2Gripper
Wait 0.25
Jump Place
Off rbt2Gripper
Wait 0.25
PF_ActivePart 1
Send
EndIf
PF_Robot = PF_CALLBACK_RESTART_ACTIVEPART
Fend
程序示例 3.2
示例类型:
2台机器人与1种物理部件 - 其他任务的运动- 拾取顺序没有关系 - 按特定的顺序拾取
构成
- 机器人数量:2
- 送料器数量:1
- 送料器上的部件类型数量:1
- 配置位置数量:2
- 相机的方向:固定向下相机
描述
包括2台机器人与1台送料器。物理部件仅为1种。各机器人都有独自的相机校准,因此包括2种(机器人1的部件1与机器人2的部件2)逻辑部件。拾取顺序没有关系-先到顺序。
本例中的差异在于按循环获取各部件的视觉。这对拾取期间周围的部件可能移动的情况有用。
PF_Robot回调函数的返回值“PF_CALLBACK_RESTART”用于对所有部件重新强制执行视觉处理,并重新加载所有的部件队列。
这种方法没有效率可言,但“PF_CALLBACK_RESTART”在特定状况下有用。
样本代码
Main.prg
Function Main
Robot 1
Motor On
Power High
Speed 50
Accel 50, 50
Jump Park
Robot 2
Motor On
Power High
Speed 50
Accel 50, 50
Jump Park
MemOff PartsToPick
PF_Start 1, 2
Xqt Robot1PickPlace
Xqt Robot2PickPlace
Fend
Function Robot1PickPlace
Robot 1
Do
PF_AccessFeeder (1)
Wait MemSw(PartsToPick) = On
If PF_QueLen(1) > 0 Then
P0 = PF_QueGet(1)
PF_QueRemove (1)
Jump P0 /R
On 5
Wait 0.5
Jump Place ! D30; MemOff PartsToPick; PF_ReleaseFeeder 1 !
Off 5
Wait 0.25
Else
MemOff PartsToPick; PF_ReleaseFeeder 1
EndIf
Loop
Fend
Function Robot2PickPlace
Robot 2
Do
PF_AccessFeeder (1)
Wait MemSw(PartsToPick) = On
If PF_QueLen(2) > 0 Then
P0 = PF_QueGet(2)
PF_QueRemove (2)
Jump P0 /L
On 2
Wait 0.5
Jump Place ! D30; MemOff PartsToPick; PF_ReleaseFeeder 1 !
Off 2
Wait 0.25
Else
MemOff PartsToPick; PF_ReleaseFeeder 1
EndIf
Loop
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
MemOn PartsToPick
Wait MemSw(PartsToPick) = Off
PF_Robot = PF_CALLBACK_RESTART 'Force vision and vibration to refresh
Fend
程序示例 3.3
示例类型:
2台机器人与1种物理部件 - 其他任务的运动 -先到顺序-被模拟进程的延迟
构成
- 机器人数量:2
- 送料器数量:1
- 送料器上的部件类型数量:1
- 配置位置数量:2
- 相机的方向:固定向下相机
描述
包括2台机器人与1台送料器。物理部件仅为1种。各机器人都有独自的相机校准,因此包括2种(机器人1的部件1与机器人2的部件2)逻辑部件。在本例中,可调整各机器人的进程时间(按随机待机时间被模拟)。
各机器人从送料机中拾取部件后,因执行其他操作 而进入忙碌状态。
机器人从送料器中拾取部件后,结束其他操作,并在完成从送料器中拾取其他部件的准备时,使用存储器位“Rbt1Complete”与“Rbt2Complete”发送信号。PF_Robot回调函数用于在预期部件 (PF_ActivePart) 与当前部件不同时(也就是其他机器人拾取部件的情况下),返回“PF_CALLBACK_RESTART_ACTIVEPART”的值。这样可防止机器人队列内的点重复。
获取PF_ActivePart的新图像,并且加载PF_ActivePart的队列。但下一部件与当前部件相同时(也就是同一机器人从送料器中拾取的情况下),PF_Robot回调函数的返回值为“PF_CALLBACK_SUCCESS”。PF_AccessFeeder与PF_ReleaseFeeder用于避免机器人访问送料器时发生碰撞。
样本代码
Main.prg
Function Main
Robot 1
Motor On
Power High
Speed 50
Accel 50, 50
Jump Place
Robot 2
Motor On
Power High
Speed 50
Accel 50, 50
Jump Place
MemOff PartsToPick1
MemOff PartsToPick2
PF_Start 1, 2
Xqt Robot1PickPlace
Xqt Robot2PickPlace
Fend
Function Robot1PickPlace
Integer randomTime
Robot 1
MemOn Rbt1Complete
Do
Wait MemSw(PartsToPick1) = On
PF_AccessFeeder (1)
MemOff Rbt1Complete
P0 = PF_QueGet(1)
PF_QueRemove (1)
Jump P0 /R
On rbt1Gripper
Wait 0.25
Jump Place ! D30; MemOff PartsToPick1; PF_ReleaseFeeder 1 !
Off rbt1Gripper
Wait 0.25
'Test long process time - robot is doing something else
Randomize
randomTime = Int(Rnd(9)) + 1
Wait randomTime
MemOn Rbt1Complete
Loop
Fend
Function Robot2PickPlace
Integer randomTime
Robot 2
MemOn Rbt2Complete
Do
Wait MemSw(PartsToPick2) = On
PF_AccessFeeder (1)
MemOff Rbt2Complete
P0 = PF_QueGet(2)
PF_QueRemove (2)
Jump P0 /L
On rbt2Gripper
Wait 0.25
Jump Place ! D30; MemOff PartsToPick2; PF_ReleaseFeeder 1 !
Off rbt2Gripper
Wait 0.25
'Test long process time - robot is doing something else
Randomize
randomTime = Int(Rnd(9)) + 1
Wait randomTime
MemOn Rbt2Complete
Loop
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Integer nextPart
Select PartID
Case 1
MemOn PartsToPick1
Wait MemSw(PartsToPick1) = Off
Case 2
MemOn PartsToPick2
Wait MemSw(PartsToPick2) = Off
Send
Wait MemSw(Rbt1Complete) = On Or MemSw(Rbt2Complete) = On
If MemSw(Rbt1Complete) = On Then
nextPart = 1
ElseIf MemSw(Rbt2Complete) = On Then
nextPart = 2
EndIf
PF_ActivePart nextPart
If nextPart = PartID Then
'Same part so no need to re-acquire an image and reload the queue
PF_Robot = PF_CALLBACK_SUCCESS
Else
'Restart from vision -
'Acquire image and load queue for only the Active Part
PF_Robot = PF_CALLBACK_RESTART_ACTIVEPART
EndIf
Fend