程序示例
视觉传送带编程
通常使用两个任务来运行视觉传送带。
一个任务通过视觉系统检测工件,并将其添加到传送带队列中。
另一个任务检查传送带队列的拾取区域中是否存在工件。如果工件位于拾取区域内,则会命令机器人拾取工件,并将其放到指定的位置。
在下面的示例中,使用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