教程

本部分具体说明安装多部件应用/多部件与多机器人应用这两种应用的方法。多数案例只简单说明步骤,而不说明详细的执行内容。本节以用户理解新部件的创建方法、部件校准的执行方法、1台机器人1种部件应用的程序记述方法为前提。
有关详细信息,请参阅以下内容。
试着使用

教程1:1台机器人、1台送料器、2种部件

在本教程中,2种部件被同时送至同一送料器上。部件存在物理方面的差异。使用部件#1与部件#2。送料器上带有向下固定相机。机器人拾取&放置2个部件#1,然后拾取&放置1个部件#2。循环执行该操作。

使用不同的末端夹具(输出位)拾取各部件。在该组装应用中,部件数与拾取顺序非常重要。使用PF_ActivePart进行部件#1与部件#2的切换处理。记述旨在确保最先在PF_Robot回调函数内执行机器人运作的代码。接下来通过单独的多任务执行运作,对送料器的振动看下并行处理,以提高机器人单位时间的处理能力。

  1. 创建Epson RC+的新项目。

  2. 对向下固定相机进行校准。

  3. 通过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序列检测到部分托盘,系统则无法正确运作。

  4. 通过Vision Guide创建在该送料器中运作的2种部件各自的部件序列。
    确认已针对各序列设定Calibration属性。一般来说,Geometric对象用于确定表面(第2个Geometric对象用于在需要翻转时确定部件的背面)。将视觉对象的NumberToFind属性设为“All”。

  5. 显示[工具] - [上料],然后根据“部件向导”添加新部件。
    有关部件向导的详细信息,请参阅以下内容。
    试着使用

  6. 单击新部件的[校准] - [校准]按钮,开始“校准向导”。
    有关校准向导的详细使用方法,请参阅以下内容。
    校准&测试

  7. 单击部件#1の[拾取] - [示教]按钮。
    通过步进运作将机器人移动至部件拾取高度,然后进行“Pick Z”示教。

  8. 单击[上料] - [添加]按钮,添加部件#2。
    使用“部件向导”设定部件。

  9. 单击[校准] - [校准]按钮,开始校准向导。

  10. 单击部件#2の[拾取] - [示教]按钮。
    通过步进运作将机器人移动至部件拾取高度,然后进行“Pick Z”示教。

  11. 关闭[上料]对话框。
    会自动创建上料模板代码(上料回调函数)。

  12. 对机器人进行停止 (park) 与放置 (place) 示教,并分别命名为“park”与“place”。

  13. 按如下所述修正模板代码。

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用于防止从送料器中拾取时,机器人发生碰撞。

  1. 创建Epson RC+的新项目。
  2. 对机器人#1用向下固定相机进行校准。
  3. 对机器人#2用向下固定相机进行校准。
  4. 通过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对象仅限于检测部件,不检测送料器托盘自身,这点至关重要。
  5. 通过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对象仅限于检测部件,不检测送料器托盘自身,这点至关重要。
  6. 通过Vision Guide创建用于检测部件#1的部件序列。
    请确认Calibration属性已被设为针对机器人#1执行的校准。
    一般来说,Geometric对象用于确定表面。(第2个Geometric对象用于在需要翻转时确定部件的背面。)将视觉对象的NumberToFind属性设为“All”。
  7. 通过Vision Guide创建用于检测部件#2的部件序列。
    请确认Calibration属性已被设为针对机器人#2执行的校准。
    一般来说,Geometric对象用于确定表面。(第2个Geometric对象用于在需要翻转时确定部件的背面。)将视觉对象的NumberToFind属性设为“All”。
  8. 显示[工具] - [上料],然后添加部件#1的新部件。根据“部件向导”添加部件。在部件向导的第一页,确认已选择机器人#1。
    有关部件向导的详细信息,请参阅以下内容。
    试着使用
  9. 单击新部件#1的[校准] - [校准]按钮,开始“校准向导”。
    有关校准向导的详细使用方法,请参阅以下内容。
    校准&测试
  10. 单击部件#1の[拾取] - [示教]按钮。
    通过步进运作将机器人#1移动至部件拾取高度,然后进行“Pick Z”示教。
  11. 单击[上料] - [添加]按钮,添加部件#2。使用“部件向导”设定部件。
    在部件向导的第一页,确认已选择机器人#2。
  12. 单击[校准] - [校准]按钮,开始校准向导。
  13. 单击部件#2の[拾取] - [示教]按钮。通过步进运作将机器人#2移动至部件拾取高度,然后进行“Pick Z”示教。
  14. 关闭[上料]对话框。
    会自动创建上料模板代码(Part Feeding的回调函数)。
  15. 按如下所述修正模板代码。

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