教程
本部分具体说明安装多部件应用/多部件与多机器人应用这两种应用的方法。多数案例只简单说明步骤,而不说明详细的执行内容。本节以用户理解新部件的创建方法、部件校准的执行方法、1台机器人1种部件应用的程序记述方法为前提。
有关详细信息,请参阅以下内容。
试着使用
教程1:1台机器人、1台送料器、2种部件
在本教程中,2种部件被同时送至同一送料器上。部件存在物理方面的差异。使用部件#1与部件#2。送料器上带有向下固定相机。机器人拾取&放置2个部件#1,然后拾取&放置1个部件#2。循环执行该操作。
使用不同的末端夹具(输出位)拾取各部件。在该组装应用中,部件数与拾取顺序非常重要。使用PF_ActivePart进行部件#1与部件#2的切换处理。记述旨在确保最先在PF_Robot回调函数内执行机器人运作的代码。接下来通过单独的多任务执行运作,对送料器的振动看下并行处理,以提高机器人单位时间的处理能力。
创建Epson RC+的新项目。
对向下固定相机进行校准。
通过Vision Guide创建Part Blob序列。
部件校准期间或执行时的反馈会使用“Part Blob序列”,以决定部件的最佳投放方法。Part Blob序列用于在执行时检测各自的部件或部件群。通常,Part Blob序列中包含有单一的Blob视觉对象。Part Blob序列中需要分配给Calibration属性的相机校准。
将Blob对象的NumberToFind属性设为“All”。将Blob的ThresholdAuto属性设为“False”(默认值)。
在平台中配置部件,然后打开[直方图]窗口,调整ThresholdHigh与ThresholdLow,直至检测到部件。将Blob的MinArea设为部件区域MinArea的约0.9倍。部件有表里时,设定确保不论哪个方向都会检测到部件的MinArea。可分别对(送料器上的)2种部件设定单独的Part Blob序列,但通常可对所有部件,使用同一Part Blob序列。
确认可利用Part Blob序列检测送入该送料器上的各部件。Blob对象的搜索窗口需要覆盖尽可能广范围的平台区域。但Blob对象仅限于检测部件,不检测送料器托盘自身,这点至关重要。如果利用Part Blob序列检测到部分托盘,系统则无法正确运作。通过Vision Guide创建在该送料器中运作的2种部件各自的部件序列。
确认已针对各序列设定Calibration属性。一般来说,Geometric对象用于确定表面(第2个Geometric对象用于在需要翻转时确定部件的背面)。将视觉对象的NumberToFind属性设为“All”。显示[工具] - [上料],然后根据“部件向导”添加新部件。
有关部件向导的详细信息,请参阅以下内容。
试着使用单击新部件的[校准] - [校准]按钮,开始“校准向导”。
有关校准向导的详细使用方法,请参阅以下内容。
校准&测试单击部件#1の[拾取] - [示教]按钮。
通过步进运作将机器人移动至部件拾取高度,然后进行“Pick Z”示教。单击[上料] - [添加]按钮,添加部件#2。
使用“部件向导”设定部件。单击[校准] - [校准]按钮,开始校准向导。
单击部件#2の[拾取] - [示教]按钮。
通过步进运作将机器人移动至部件拾取高度,然后进行“Pick Z”示教。关闭[上料]对话框。
会自动创建上料模板代码(上料回调函数)。对机器人进行停止 (park) 与放置 (place) 示教,并分别命名为“park”与“place”。
按如下所述修正模板代码。
Main.prg
Function Main
Robot 1
Motor On
Power High
Speed 50
Accel 50, 50
Jump Park
PF_Start 1, 2
Fend
PartFeeding.prg
Global Integer numPicked ' number of parts that have been picked
Function PF_Robot(PartID As Integer) As Integer
Integer numRequired, gripperOutput
Select PartID
Case 1
numRequired = 2 ' number of parts required
gripperOutput = 1
Case 2
numRequired = 1
gripperOutput = 2
Send
Do
If PF_QueLen(PartID) > 0 Then
P0 = PF_QueGet(PartID)
PF_QueRemove (PartID)
Jump P0
On gripperOutput
Wait 0.1
Jump Place
Off gripperOutput
Wait 0.1
numPicked = numPicked + 1
Else
' Not enough parts were picked
PF_ActivePart PartID ' No change in Active Part
PF_Robot = PF_CALLBACK_SUCCESS
Exit Function
EndIf
Loop Until numPicked = numRequired
numPicked = 0
' select the next Active Part
If PartID = 1 Then
PF_ActivePart 2
Else
PF_ActivePart 1
EndIf
PF_Robot = PF_CALLBACK_SUCCESS
Fend
在上述样本代码中,如果机器人完成“放置”运作并且PF_Robot函数结束,送料器则会根据需要进行振动。可重构该代码,以确保与机器人的运作并行让送料器进行振动。
要将可拾取部件事宜通知给运动任务时,使用PF_Robot回调函数(例:Function Main)。
如果可使用部件,则使用远程IO(命名为“PartsToPick1”、“PartsToPick2”)发送信号。
如果已放置好可使用的最后一个部件(本例的运作完成80%的状态),运动任务则会向PF_Robot函数发送信号并结束,然后返回一个值。根据该返回值,系统会掌握可获取新图像、振动以及通过料斗供给部件等事宜。在这里,修正教程代码,以确保可并行执行送料器运作与机器人运作。
Main.prg
Function Main
Integer numToPick1, numToPick2, numPicked
Motor On
Power High
Speed 50
Accel 50, 50
Jump Park
MemOff PartsToPick1
MemOff PartsToPick2
numToPick1 = 2
numToPick2 = 1
PF_Start 1, 2
Do
numPicked = 0
Do
Wait MemSw(PartsToPick1) = On
pick = PF_QueGet(1)
PF_QueRemove (1)
Jump pick
On gripper1
Wait 0.1
numPicked = numPicked + 1
If numPicked < numToPick1 And PF_QueLen(1) > 0 Then
Jump Place
Else
' Last part or no more parts available to pick
If numPicked = numToPick1 Then
' Select the next part
PF_ActivePart 2
EndIf
Jump Place ! D80; MemOff PartsToPick1 !
EndIf
Off gripper1
Wait 0.1
Loop Until numPicked = numToPick1
numPicked = 0
Do
Wait MemSw(PartsToPick2) = On
pick = PF_QueGet(2)
PF_QueRemove (2)
Jump pick
On gripper2
Wait 0.1
numPicked = numPicked + 1
If numPicked < numToPick2 And PF_QueLen(2) > 0 Then
Jump Place
Else
' Last part or no more parts available to pick
If numPicked = numToPick2 Then
' Select the next part
PF_ActivePart 1
EndIf
Jump Place ! D80; MemOff PartsToPick2 !
EndIf
Off gripper2
Wait 0.1
Loop Until numPicked = numToPick2
Loop
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Select PartID
Case 1
MemOn PartsToPick1
Wait MemSw(PartsToPick1) = Off
Case 2
MemOn PartsToPick2
Wait MemSw(PartsToPick2) = Off
Send
PF_Robot = PF_CALLBACK_SUCCESS
Fend
教程2:2台机器人、1台送料器、2种部件
在本教程中,2种部件被同时送至同一送料器上。部件存在物理方面的差异。使用部件#1与部件#2。送料器上带有向下固定相机。2台机器人共享同一送料器。2台机器人交互从送料器中进行拾取运作。各机器人拾取&放置各部件。机器人#1拾取1个部件#1,然后机器人#2拾取1个部件#2。
在该应用中,拾取顺序非常重要。可利用“PF_ActivePart”调换拾取顺序。记述旨在确保最先在PF_Robot回调函数内执行机器人运作的代码。在本案例中,依次进行机器人运作。一次仅1台机器人进行运作。
接下来通过单独的多任务执行运作,以提高机器人单位时间的处理能力。已修正的教程中也包含有PF_AccessFeeder / PF_ReleaseFeeder。PF_AccessFeeder / PF_ReleaseFeeder用于防止从送料器中拾取时,机器人发生碰撞。
- 创建Epson RC+的新项目。
- 对机器人#1用向下固定相机进行校准。
- 对机器人#2用向下固定相机进行校准。
- 通过Vision Guide创建部件#1的Part Blob序列。通常,Part Blob序列中包含有单一的Blob视觉对象。序列中需要针对分配给Calibration属性的机器人#1执行的相机校准。将Blob对象的NumberToFind属性设为“All”。
将Blob的ThresholdAuto属性设为“False”(默认值)。在平台中配置部件,然后打开[直方图]窗口,调整ThresholdHigh与ThresholdLow,直至检测到部件。将Blob的MinArea设为部件区域MinArea的约0.9倍。
部件有表里时,设定确保不论哪个方向都会检测到部件的MinArea。确认Part Blob序列可检测到部件#1。
Blob对象的搜索窗口需要覆盖尽可能广范围的平台区域。但Blob对象仅限于检测部件,不检测送料器托盘自身,这点至关重要。 - 通过Vision Guide创建部件#2的Part Blob序列。通常,Part Blob序列中包含有单一的Blob视觉对象。序列中需要针对分配给Calibration属性的机器人#2执行的相机校准。将Blob对象的NumberToFind属性设为“All”。
将Blob的ThresholdAuto属性设为“False”(默认值)。
在平台中配置部件,然后打开[直方图]窗口,调整ThresholdHigh与ThresholdLow,直至检测到部件。
将Blob的MinArea设为部件区域MinArea的约0.9倍。
部件有表里时,设定确保不论哪个方向都会检测到部件的MinArea。确认Part Blob序列可检测到部件#2。Blob对象的搜索窗口需要覆盖尽可能广范围的平台区域。
但Blob对象仅限于检测部件,不检测送料器托盘自身,这点至关重要。 - 通过Vision Guide创建用于检测部件#1的部件序列。
请确认Calibration属性已被设为针对机器人#1执行的校准。
一般来说,Geometric对象用于确定表面。(第2个Geometric对象用于在需要翻转时确定部件的背面。)将视觉对象的NumberToFind属性设为“All”。 - 通过Vision Guide创建用于检测部件#2的部件序列。
请确认Calibration属性已被设为针对机器人#2执行的校准。
一般来说,Geometric对象用于确定表面。(第2个Geometric对象用于在需要翻转时确定部件的背面。)将视觉对象的NumberToFind属性设为“All”。 - 显示[工具] - [上料],然后添加部件#1的新部件。根据“部件向导”添加部件。在部件向导的第一页,确认已选择机器人#1。
有关部件向导的详细信息,请参阅以下内容。
试着使用 - 单击新部件#1的[校准] - [校准]按钮,开始“校准向导”。
有关校准向导的详细使用方法,请参阅以下内容。
校准&测试 - 单击部件#1の[拾取] - [示教]按钮。
通过步进运作将机器人#1移动至部件拾取高度,然后进行“Pick Z”示教。 - 单击[上料] - [添加]按钮,添加部件#2。使用“部件向导”设定部件。
在部件向导的第一页,确认已选择机器人#2。 - 单击[校准] - [校准]按钮,开始校准向导。
- 单击部件#2の[拾取] - [示教]按钮。通过步进运作将机器人#2移动至部件拾取高度,然后进行“Pick Z”示教。
- 关闭[上料]对话框。
会自动创建上料模板代码(Part Feeding的回调函数)。 - 按如下所述修正模板代码。
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_SUCCESS
Fend
在这里,修正样本代码,以确保通过其他多任务执行机器人运作。确保1台机器人离开送料器后,其他机器人可开始向送料器移动。通过并行运作,多台机器人共享1台送料器时,必须使用PF_AccessFeeder命令与PF_ReleaseFeeder命令,以免机器人发生碰撞。
此外,已修正的代码用于并行处理送料器的振动与机器人运作。在本教程中,可在各机器人到达各自放置位置的80%地点时,确保机器人可删除相机视野并获取图像。
另外,各机器人到达各自放置位置的80%地点时,即使另一台机器人开始向送料器移动,也可以确保安全。实际运作的百分比取决于特定状况下的机器人速度与相对定位。各机器人带有“park”点与“place”点。在本教程中,机器人#1以右手姿态从送料器中进行拾取动作,机器人#2以左手姿态从送料器中进行拾取动作。
如下所述为已修正的模板代码。
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 PartsToPick1
MemOff PartsToPick2
PF_Start 1, 2
Xqt Robot1PickPlace
Xqt Robot2PickPlace
Fend
Function Robot1PickPlace
Robot 1
Do
Wait MemSw(PartsToPick1) = On
PF_AccessFeeder 1
P0 = PF_QueGet(1)
PF_QueRemove (1)
Jump P0 /R
On rbt1Gripper
Wait 0.25
Jump Place ! D80; MemOff PartsToPick1; PF_ReleaseFeeder 1 !
Off rbt1Gripper
Wait 0.25
Loop
Fend
Function Robot2PickPlace
Robot 2
Do
Wait MemSw(PartsToPick2) = On
PF_AccessFeeder 1
P0 = PF_QueGet(2)
PF_QueRemove (2)
Jump P0 /L
On rbt2Gripper
Wait 0.25
Jump Place ! D80; MemOff PartsToPick2; PF_ReleaseFeeder 1 !
Off rbt2Gripper
Wait 0.25
Loop
Fend
PartFeeding.prg
Function PF_Robot(PartID As Integer) As Integer
Select PartID
Case 1
If PF_QueLen(1) > 0 Then
MemOn PartsToPick1
Wait MemSw(PartsToPick1) = Off
PF_ActivePart 2
Else
PF_ActivePart 1
EndIf
Case 2
If PF_QueLen(2) > 0 Then
MemOn PartsToPick2
Wait MemSw(PartsToPick2) = Off
PF_ActivePart 1
Else
PF_ActivePart 2
EndIf
Send
PF_Robot = PF_CALLBACK_SUCCESS
Fend