Type-C聯結器引腳段差測量
專案簡介
專案背景
通過準確測量引腳段差,及時發現並排除不良品,降低不良品率。

相機選型
LMI雷射線掃相機 Gocator2510
檢測要求
測量精度 ≤ 0.02mm
測量重複性 ≤ 0.015mm
測量週期 ≤ 200ms
解決方案
Vision-Studio軟體對3D點雲進行處理,產品定位後擬合基準平面,使用迴圈測量上下兩端高度再取差的方式進行測量。該專案相比於轉2D的方法,流程大大簡化,在處理速度與精度上都有了一定提高。
設計思路

執行效果展示
工程結果展示:

HMI結果展示:

專案流程
一、初始化
- 使用
Lua脚本工具
設定currentPin全域性變數用於計數判斷,設定hDiff全域性變數用於拼接高度資訊字串
拼接表頭字串,儲存到csv檔案
經驗
.. 用於string型別字串拼接
part1 = "Hello, "
part2 = "world!"
result = part1 .. part2
print(result) # 輸出: Hello, world!
,作為分隔符,分割每個資料項
-- 变量初始化
SetIntVariable("currentPin", 0)
SetStringVariable("hDiff", "")
-- csv文件初始化
-- 生成表头
csvHead = "Time,"
for i=1,14,1 do
csvHead = csvHead .. "diff" .. i .. ","
end
-- "\n"换行
csvHead = csvHead .. "OK/NG" .. "\n"
-- 创建文件,脚本第一次运行时,没有就创建
if FileExists("./E85hDiff.csv") == false then
PrintToFile("./E85hDiff.csv", csvHead)
end- 使用
加载点云工具,載入需要處理的點雲圖。
二、預處理

位置調整
使用
3D方形探针工具,得到工件的兩條邊。
使用
3D几何交点工具,繫結上一步運算元變數輸出的兩條邊作為輸入幾何,輸出兩直線交點。使用
3D位置调整工具,繫結上一步運算元輸出輸出的直線交點作為新原點調整點雲XY位置。
擬合平面
使用
3D区域工具,選擇擬合平面的區域。
使用
3D平面工具,繫結上一步運算元輸出的變數區域作為輸入區域,擬合平面並將其設定為零平面。
裁切待測區域
選擇3D裁切工具,裁切需要測量的部分至IM1中。

影像預處理
選擇3D离群点滤波工具,將IM1中的點雲進行濾波,過濾掉干擾點。

三、迴圈計算引腳段差

選擇
3D方形探针工具,分別找出上,下部分起始點。
使用
标记工具,設定startLoop用於迴圈跳轉。選擇
lua语言脚本工具
繫結
3D方形探针工具輸出變數中點作為上下邊測量起始點計算出下一待測點的位置,將待測點的測量box輸出到運算元輸出變數。
迴圈計數加1

--取出基准坐标
cx1 = start1.X
cy1 = start1.Y
cz1 = start1.Z
cx2 = start2.X
cy2 = start2.Y
cz2 = start2.Z
--计算每个针的y值
boxy1 = cy1 + pinCount * 0.5
boxy2 = cy2 + pinCount * 0.5
--向寄存器推送用于测高的盒子
SetBox("box1",cx1-0.5, boxy1-0.1, cz1-0.5, cx1+0.5, boxy1+0.1, cz1+0.5)
SetBox("box2",cx2-0.5, boxy2-0.1, cz2-0.5, cx2+0.5, boxy2+0.1, cz2+0.5)
--在IM上绘制box
DrawBox(1, "green",cx1-0.5, boxy1-0.1, cz1-0.5, cx1+0.5, boxy1+0.1, cz1+0.5)
DrawBox(1, "green",cx2-0.5, boxy2-0.1, cz2-0.5, cx2+0.5, boxy2+0.1, cz2+0.5)
--循环次数加1
SetIntVariable("currentPin", pinCount + 1)選擇
3D高度工具,繫結lua语言脚本工具運算元輸出變數(當前待測點測量box),測量得到高度值。選擇
lua语言脚本工具
繫結兩個
3D高度工具輸出的高度值編輯指令碼計算得出高度
儲存pin高度資料到陣列全域性變數,拼接pin高度資料到字串
並進行判斷是否迴圈。
經驗
string.format 用於格式化字串 %.nf表示將浮點數格式化為保留 n 位小數。
pi = 3.14159 str = string.format("Pi is approximately %.3f", pi) print(str) -- 輸出: Pi is approximately 3.141
--计算高度差
heightdiff = height2 - height1
--保存到字符串中,后面直接写csv文件
SetStringVariable("hDiff", hDiff .. "," .. string.format("%.3f", heightdiff))
--保存到数组中,后面使用
table.insert(hdiff, heightdiff)
SetFloatArrayVariable("hdiff", hdiff)
if currentPin < 14 then
Jump("startLoop")
else
Jump("stopLoop")
end- 使用
标记工具,設定stopLoop用於結束跳轉。
四、結果儲存至資料庫與csv檔案中
選擇lua语言脚本工具
繫結全域性變數(是否儲存csv檔案),儲存pin高度資料的陣列全域性變數,儲存pin高度資料的字串全域性變數。
編輯指令碼根據pin高度陣列判斷結果是否滿足條件且將結果顯示在IM上,將判斷結果拼接到字串全域性變數
將資料儲存至資料庫和csv檔案中。
經驗
table.insert 是 Lua 中用於向表中插入元素的函式 table.insert(table1, [pos,] value) table1:需要插入元素的表。 pos(可選):插入位置。如果不提供,預設將值追加到表的末尾。 value:要插入的值。
local table1 = {"w", "b"} table.insert(table1, "v") -- 在末尾插入 "v" print(table1) -- 輸出: ["w","b","v",] print(table1[1]) -- 輸出: w
-- 结果判断
Judge = true
for i = 1,14,1 do
if hdiff[i] < 1.52 or hdiff[i] > 1.55 then
Judge = false
break
end
end
-- 显示结果
if Judge == false then
DrawText3D(1,"red",1, 8, 1.5, 32,"检测结果:" .. "NG")
elseif Judge == true then
DrawText3D(1,"green",1, 8, 1.5, 32,"检测结果:" .. "OK")
end
-- 保存csv文件
if save == 1 then
--获取高度差的结果
if Judge == true then
hDiff = os.date("%Y_%m_%d %H:%M:%S") .. hDiff .. "," .. "OK"
elseif Judge == false then
hDiff = os.date("%Y_%m_%d %H:%M:%S") .. hDiff .. "," .. "NG"
end
WriteLineToFile("./E85hDiff.csv", hDiff)
end
-- 保存数据库
-- 接收变量的数组
fileds = {}
sqlData = {}
-- 向表中插入数据
for i = 1, 14, 1 do
table.insert(fileds,"hDiff"..i)
table.insert(sqlData, hdiff[i])
--保留3位小数
variable = "hdiff" .. tostring(i)
SetStringVariable(variable, string.format("%.3f", hdiff[i]))
end
table.insert(fileds,"OKNG")
if Judge == true then
table.insert(sqlData, 1)
elseif Judge == false then
table.insert(sqlData, 0)
end
-- 将数据写入数据库中
WriteHmiData("HDIFF", fileds, sqlData)