Appearance
Type-C连接器引脚段差测量
项目简介
项目背景
通过准确测量引脚段差,及时发现并排除不良品,降低不良品率。
相机选型
LMI激光线扫相机 Gocator2510
检测要求
测量精度 ≤ 0.02mm
测量重复性 ≤ 0.015mm
测量周期 ≤ 200ms
解决方案
AI-Vision软件对3D点云进行处理,产品定位后拟合基准平面,使用循环测量上下两端高度再取差的方式进行测量。该项目相比于转2D的方法,流程大大简化,在处理速度与精度上都有了一定提高。
设计思路
执行效果展示
工程结果展示:
HMI结果展示:
项目流程
一、初始化
[00] 选择Lua脚本语言
工具,全局变量初始化,创建待接收数据的csv文件。
lua
-- 变量初始化
SetVariable("currentPin", 0)
SetVariable("hDiff", "")
-- csv文件初始化
-- 生成表头
csvHead = "Time,"
for i=1,14,1 do
csvHead = csvHead .. "diff" .. i .. ","
end
-- "\n"表示换行
csvHead = csvHead .. "OK/NG" .. "\n"
-- 创建文件,脚本第一次运行时,没有就创建
if FileSize("./E85hDiff.csv") <= 0 then
fprint("./E85hDiff.csv", csvHead)
end
[01] 选择加载点云
工具,获取点云。
二、预处理
[02-03] 选择3D方形探针
工具,选择底部的底边与右边,并将找出来的线输出到寄存器中。
[04] 选择3D几何交点
工具,找到两条线的交点并输出到寄存器中。
[05] 选择3D位置调整
工具,根据交点坐标调整x,y位置。
[06] 选择3D区域
工具,选择区域用来拟合平面。
[07] 选择3D平面
工具,通过3D区域
工具选择的区域拟合平面并将其作为零平面。
[08] 选择3D裁切
工具,裁切需要测量的部分至IM1中。
[09] 选择3D离群点滤波
工具,将IM1中的点云进行滤波,过滤掉干扰点。
三、确定测量起点
[10-11] 选择3D方形探针
工具,找出上,下部分起始点。
[12] 选择lua语言脚本
工具,记录上下部分的起始点。
lua
--从寄存器中读取上边起始点
x1,y1,z1 = GetPoint(0)
--设置全局点用于后续调用
SetPoint("start1", x1, y1+0.1, z1)
--从寄存器中读取下边起始点
x2,y2,z2 = GetPoint(2)
--设置全局点用于后续调用
SetPoint("start2", x2, y2+0.1, z2)
四、循环测量每个pin
[13] 选择标记
工具,记录每一行的循环标记。
[14] 选择lua语言脚本
工具,记录循环次数并计算出下一待测点的位置。
lua
--取出当前循环的次数
pinCount = GetVariable("currentPin")
--取出基准坐标
cx1,cy1,cz1 = GetPoint("start1")
cx2,cy2,cz2 = GetPoint("start2")
--计算每个针的y值
boxy1 = cy1 + pinCount * 0.5
boxy2 = cy2 + pinCount * 0.5
--向寄存器推送用于测高的盒子
PushBox(cx1-0.5, boxy1-0.1, cz1-0.5, cx1+0.5, boxy1+0.1, cz1+0.5)
PushBox(cx2-0.5, boxy2-0.1, cz2-0.5, cx2+0.5, boxy2+0.1, cz2+0.5)
--在IM上绘制box
DrawBox(1, cx1-0.5, boxy1-0.1, cz1-0.5, cx1+0.5, boxy1+0.1, cz1+0.5)
DrawBox(1, cx2-0.5, boxy2-0.1, cz2-0.5, cx2+0.5, boxy2+0.1, cz2+0.5)
--循环次数加1
SetVariable("currentPin", pinCount + 1)
[15-16] 选择3D高度
工具,根据lua语言脚本
工具计算得出的位置,得到此位置高度。
[17] 选择lua语言脚本
工具,计算得出高度差,并进行判断是否循环。
lua
--计算高度差
height1 = GetMeasure(0)
height2 = GetMeasure(2)
heightdiff = height2 - height1
println(heightdiff)
--保存到全局变量
PIN = tointeger(GetVariable("currentPin") )
hDiff = GetVariable("hDiff")
SetVariable("hDiff", hDiff .. "," .. string.format("%.3f", heightdiff))
SetVariable("hdiff"..PIN, tointeger(1000*heightdiff)/1000 )
--判断循环是否结束
currentPin = GetVariable("currentPin")
if currentPin < 14 then
Jump("startLoop")
else
Jump("stopLoop")
end
[18] 选择标记
工具,作为循环结束的标记。
五、结果保存至数据库与csv文件中
[19] 选择lua语言脚本
工具,判断结果是否满足条件且将结果显示在IM上,并将数据保存至数据库和csv文件中。
lua
x = GetVariable("x")
y = GetVariable("y")
z = GetVariable("z")
-- 结果判断
Judge = true
for i = 1,14,1 do
if GetVariable("hdiff" .. i) < 1.52 or GetVariable("hdiff" .. i) > 1.55 then
Judge = false
break
end
end
-- 显示结果
if Judge == false then
DrawOverlay(1,x,y,z,20,"red","检测结果:" .. "NG")
elseif Judge == true then
DrawOverlay(1,x,y,z,20,"green","检测结果:" .. "OK")
end
-- 保存csv文件
if GetVariable("save") == 1 then
--获取高度差的结果
if Judge == true then
hDiff = os.date("%Y_%m_%d %H:%M:%S") .. GetVariable("hDiff") .. "," .. "OK" .. "\n"
elseif Judge == false then
hDiff = os.date("%Y_%m_%d %H:%M:%S") .. GetVariable("hDiff") .. "," .. "NG" .. "\n"
end
fprint("./E85hDiff.csv", hDiff)
end
-- 保存数据库内容
-- 接收变量的数组
fileds = { }
sqlData = {}
for i = 1, 14, 1 do
table.insert(fileds,"hDiff"..i) -- 将数据保存到数组中
local data= GetVariable("hdiff" .. i)
table.insert(sqlData, data)
end
table.insert(fileds,"OKNG")
if Judge == true then
table.insert(sqlData, 1)
elseif Judge == false then
table.insert(sqlData, 0)
end
a = WriteHmiData("HDIFF", fileds, sqlData) -- 向指定数据表的指定行下插入指定数据
println(sqlData)
println(fileds)
println(a)