EPSON简单视觉编程
需要设备
1.EPSON机械手一台。
2.工业相机一个。
3.通讯设备。
以固定向下相机为例
1.首先准备一个类似针尖工具,装到法兰盘上。
2.准备一张九个MARK点,尽可能遍布整个拍照区域。
3.建立一个camera_down_camera.pts点文件。将示教好的mark点和视觉像素点分别写入P1-P9 P11-P19中。
4.新建一个cal.prg程序。
5.编辑cal.prg程序。
Function cal_camera_down
String toks$(0), data$ '定义字符串数组
Integer i, ccd_ngok,x_vision, y_vision, u_vision, z_vision '定义变量
Motor On '打开电机
Power Low
Speed 50
Accel 80, 80
SpeedS 200
AccelS 200, 200
LoadPoints "cal_down_camera.pts" '加载点文件
Print "加载当前文件"
SetNet #201, "192.168.0.100", 2000, CRLF, NONE, 0 '设置端口通讯格式
OpenNet #201 As Client '打开端口
WaitNet #201
Print "TCP connected"
For i = 11 To 19
Line Input #201, data$ '接收缓冲区字符
Print #201, "m" '将m发送回去--上位机要求的情况
Print data$
ParseStr data$, toks$(), "," '将data$赋值给toks$数组
x_vision = Val(toks$(1)) '将数组里1号元素赋值给x_vision
y_vision = Val(toks$(2)) '同上面
u_vision = Val(toks$(3))
z_vision = Val(toks$(4))
ccd_ngok = Val(toks$(5))
If x_vision <> 0 And y_vision <> 0 Then '如果x,y不为空 打印P(i)的坐标
P(i - 10) = XY(Val(toke$(1)), Val(toke$(2)), Val(toks$(3)), Val(toks$(4)))
Print "p", (i - 10), "=", P(i - 1)
Else
Print "拍照失败"
Pause
EndIf
Next
SavePoints "cal_down_camers.pts" '保存视觉校准点文件
VxCalib 1, 2, P(1:9), P(11:19) '生成校准文件
If VxCalInfo(1, 1) = True Then
Print "向上固定相机校准成功,结果如下:"
Print " X方向的平均偏差[mm]:", VxCalInfo(1, 2)
Print " X方向的最大偏差[mm]:", VxCalInfo(1, 3)
Print " X方向の1ピクセル当たりの長さ ( mm ):", VxCalInfo(1, 4)
Print " X方向的傾角 ( deg ):", VxCalInfo(1, 5)
Print " Y方向的平均偏差[mm]:", VxCalInfo(1, 6)
Print " Y方向的最大偏差[mm]:", VxCalInfo(1, 7)
Print " Y方向の1ピクセル当たりの長さ ( mm ):", VxCalInfo(1, 8)
Print " Y方向的傾角 ( deg ):", VxCalInfo(1, 9)
Else
Print "向上相机校准失败,请重新示教点校准相机!"
EndIf
If VxCalInfo(1, 1) = True Then VxCalSave "calibcamera.caa" '保存文件
Fend
6.运行程序
7.main程序
Global Preserve Integer OKNG, charnum, c, j, k, row1,row2,range1, range2
Function main
Call init
Call product_check
Do
Call vision
Tool 1
Call QuLiao
Call FangLiao
Loop
Fend
Function init
Reset
Motor On
Power Low
Speed 50
Accel 80, 80
SpeedS 200
AccelS 200, 200
OKNG = 0 '正确错误
c = 0 '步进量
i = 1 'OK计数
j = 1 'NG计数
Tool 0
LoadPoints "robot1.pts" '加载点文件
VxCalLoad "calibcamera.caa" '加载视觉校准文件
Pallet 1, P20, P21, P22, row1, range1
Pallet 2, P25, P26, P27, row2, range2
Go Here :Z(20)
Jump pos_daiji :Z(25)
Fend
Function NetOpen
charnum = ChkNet(201)
If (charnum < 0) Then
CloseNet #201
SetNet #201, "192.168.0.100", 5000, CRLF, NONE, 0
OpenNet #201 As Client
WaitNet #201
Print "TCP connercted..."
EndIf
Fend
Function vision
Tool 0
LoadPoints "robot1.pts"
String toks$(0), data$
Real x_vision, y_vision, u_vision, z_vision, ccd_ngok
vrun10:
Call NetOpen
If charnum > 0 Then
Line Input #201, data$
Print #201, data$
Else
Print "通讯断开 ....", charnum
CloseNet #201
GoTo vrun10
EndIf
ParseStr data$, toks$(), ","
x_vision = Val(toks$(1))
y_vision = Val(toks$(2))
u_vision = Val(toks$(3))
z_vision = Val(toks$(4))
ccd_ngok = Val(toks$(5))
If x_vision <> 0 And y_vision <> 0 Then
Print "拍照有数据"
Print "x=", x_vision, "y=", y_vision, "u=", u_vision, "z=", z_vision, "ccd_ngok=", ccd_ngok
pos_zhuaqu = XY(Val(toke$(1)), Val(toke$(2)), Val(toks$(3)), Val(toks$(4)))
If ccd_ngok = 0.0 Then
Print 'ok'
OKNG = 0
Else
Print "ng"
OKNG = 1
EndIf
Else
Print "拍照失败"
EndIf
c = 1
Fend
Function product_check
Fend
Function QuLiao
If c = 1 And x_vision <> 0 And y_vision <> 0 Then
Print "拍照成功"
'if pos_quliao.x<185.5 and
' pos_quliao.x>-21.2 and
' pos_quliao.y<-416.9 and
' pos_quliao.y>-569.3 then
Go XY(x_vision, y_vision, z_vision + 50, u_vision) '抓取点
Move XY(x_vision, y_vision, z_vision, u_vision)
Wait 0.1
On 0
Wait 0.1
Move XY(x_vision, y_vision, z_vision + 50, u_vision)
c = 2
'else
'print"超出范围"
EndIf
Fend
Function FangLiao
Print "等待旋转到位"
If Sw(5) = On And c = 2 Then
If OKNG = 0 Then
Print "ok"
Call fang1
Else
Print "NG"
Call fang2
EndIf
c = 0
EndIf
Fend
Function fang1
Go pos_guodu1
Print "第", j, "个"
Go Pallet(1, j) +Z(50)
Move Pallet(1, j)
Off 0
Wait 0.1
Move Pallet(1, j) +Z(50)
Go pos_daiji
j = j + 1
If j = row1 * range1 Then
j = 1
On 7, 1, 1
EndIf
Fend
Function fang2
Go pos_guodu2
Print "第", k, "个"
Go Pallet(1, k) +Z(50)
Move Pallet(1, k)
Off 0
Wait 0.1
Move Pallet(1, k) +Z(50)
Go pos_daiji
k = k + 1
If k = row1 * range1 Then
k = 1
On 8, 1, 1
EndIf
Fend
over