程序示例

视觉传送带编程

通常使用两个任务来运行视觉传送带。

一个任务通过视觉系统检测工件,并将其添加到传送带队列中。

另一个任务检查传送带队列的拾取区域中是否存在工件。如果工件位于拾取区域内,则会命令机器人拾取工件,并将其放到指定的位置。

在下面的示例中,使用Xqt从“main”函数开始执行了两个任务。

  • 第一个任务: “ScanConveyorStrobed” 函数
  • 第二个任务: “PickParts” 函数

是与如下所述对应的程序。

视觉传送带跟踪系统的布线示例

示例程序是一个硬件触发设备,使用控制器I/O来触发相机并闩锁编码器。

以下为传动带编号为“1”的示例程序。

当机器人跟踪超出拾取区域的工件时,此程序示例会自动恢复。

Function main
  Motor On
  Power High

  Speed 30
  Accel 30, 30

  Xqt ScanConveyorStrobed  '注册队列的任务
  Xqt PickParts            '跟踪工件(队列)的任务
Fend

Function ScanConveyorStrobed
  Integer i, numFound, state, trigger
  Real x, y, u
  Boolean found
  trigger = 10             '分配控制器I/O的pin10
  Off trigger              '关闭相机快门和编码器闩锁的I/O
  Do
    VRun FindParts         '拍摄传送带上的工件
    On trigger             '打开相机快门和编码器闩锁的I/O
    Do
      VGet FindParts.AcquireState, state
    Loop Until state = 3
    VGet FindParts.Parts.NumberFound, numFound
    '将拍摄的工件注册到队列
    For i = 1 to numFound
      VGet FindParts.Parts.CameraXYU(i), found, x, y, u
      Cnv_QueAdd 1, Cnv_Point(1, x, y)
    Next i
    Off trigger            '关闭相机快门和编码器闩锁的I/O
    Wait 0.1
  Loop
Fend

Function PickParts
  OnErr GoTo ErrHandler
  Integer ErrNum
  Cnv_Mode 1,1             '选择跟踪模式
  WaitParts:
  Do
    '拾取区域内无工件(队列)时移动到备用位置
    Wait Cnv_QueLen(1, CNV_QUELEN_PICKUPAREA) > 0
    '开始跟踪
    '使用SCARA机器人时
    Jump Cnv_QueGet(1)
    Wait 0.1               '仅Wait时间,机器人以与传送带相同的速度移动
    Jump P1                '移动到指定的位置
    Cnv_QueRemove 1, 0     '清除选择的工件 (队列)
  Loop
  '在拾取区域的下游侧清除工件(队列)
  '自动从“指定队列数据超出设置范围”错误中恢复
  ErrHandler:
    ErrNum = Err
    If ErrNum = 4406 Then
      Cnv_QueRemove 1, 0
      EResume WaitParts
'显示“指定队列数据超出设置范围”以外的错误
    Else
      Print "Error!"
      Print "No.", Err, ":", ErrMsg$(Err, 1)
      Print "Line :", Erl(0)
      '发生用户错误
      Error 8000
    EndIf
Fend

要点


若您使用软件触发,请使用如下所示的“ScanConveyorStrobed”函数。

Function ScanConveyorNonStrobed
  Integer i, numFound
  Real x, y, u
  Boolean found
  Do
    '拍摄传送带上的工件
    VRun FindParts
    Cnv_Trigger 1          '用软件触发闩锁编码器
    VGet FindParts.Parts.NumberFound, numFound
    '将工件注册到队列
    For i = 1 to numFound
      VGet FindParts.Parts.CameraXYU(i), found, x, y, u
      Cnv_QueAdd 1, Cnv_Point(1, x, y)
    Next i
    Wait 0.1
  Loop
Fend

传感器传送带编程

通常,会使用两个任务来运行传感器传送带。一个任务等待工件触发传感器,并将其添加到传送带队列中。另一个任务检查传送带队列的拾取区域中是否存在工件。如果工件位于拾取区域内,则会命令机器人拾取工件,并将其放到指定的位置。

当机器人跟踪超出拾取区域的工件时,此程序示例会自动恢复。

Function main
  Motor On
  Power High

  Speed 30
  Accel 30, 30

  Xqt ScanConveyor               '注册队列的任务
  Xqt PickParts                  '跟踪工件(队列)的任务
Fend

Function ScanConveyor
  Double lpulse1                 上一个闩锁脉冲
    lpulse1 = Cnv_LPulse(1)      '将闩锁脉冲注册为lpulse1
    Do
      '仅当工件通过传感器时,注册队列
      If lpulse1 <> Cnv_LPulse(1) Then
        Cnv_QueAdd 1, Cnv_Point(1, 0, 0)
        lpulse1 = Cnv_LPulse(1)  '更新lpulse1
      EndIf
    Loop
Fend

Function PickParts
  OnErr GoTo ErrHandler
  Integer ErrNum
  Cnv_Mode 1,1                   '选择跟踪模式
  WaitParts:
  Do
    '等待直到工件 (队列)进入拾取区域内
    Wait Cnv_QueLen(1, CNV_QUELEN_PICKUPAREA) > 0
    '开始跟踪
    '使用SCARA机器人时
    Jump Cnv_QueGet(1)
    Wait 0.1                     '仅Wait时间,机器人以与传送带相同的速度移动
    Jump P1                      '移动到指定的位置
    Cnv_QueRemove 1, 0           '清除选择的工件 (队列)
  Loop
  '在拾取区域的下游侧清除工件(队列)
  '自动从“指定队列数据超出设置范围”错误中恢复
  ErrHandler:
    ErrNum = Err
    If ErrNum = 4406 Then
      Cnv_QueRemove 1, 0
      EResume WaitParts
'显示“指定队列数据超出设置范围”以外的错误
    Else
      Print "Error!"
      Print "No.", Err, ":", ErrMsg$(Err, 1)
      Print "Line :", Erl(0)
      '发生用户错误
      Error 8000
    EndIf
Fend