Skip to content

Type-C聯結器引腳段差測量

專案簡介

專案背景

通過準確測量引腳段差,及時發現並排除不良品,降低不良品率。

本地圖片

相機選型

LMI雷射線掃相機 Gocator2510

檢測要求

測量精度 ≤ 0.02mm
測量重複性 ≤ 0.015mm
測量週期 ≤ 200ms

解決方案

Vision-Studio軟體對3D點雲進行處理,產品定位後擬合基準平面,使用迴圈測量上下兩端高度再取差的方式進行測量。該專案相比於轉2D的方法,流程大大簡化,在處理速度與精度上都有了一定提高。

設計思路

本地圖片

執行效果展示

  • 工程結果展示:

    本地圖片

  • HMI結果展示:

    本地圖片

專案流程

一、初始化

  1. 使用Lua脚本工具
  • 設定currentPin全域性變數用於計數判斷,設定hDiff全域性變數用於拼接高度資訊字串

  • 拼接表頭字串,儲存到csv檔案

經驗

.. 用於string型別字串拼接

part1 = "Hello, "
part2 = "world!"
result = part1 .. part2
print(result) # 輸出: Hello, world!

,作為分隔符,分割每個資料項

lua
-- 变量初始化
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
  1. 使用加载点云工具,載入需要處理的點雲圖。

二、預處理

本地圖片

位置調整

  1. 使用3D方形探针工具,得到工件的兩條邊。

    本地圖片

  2. 使用3D几何交点工具,繫結上一步運算元變數輸出的兩條邊作為輸入幾何,輸出兩直線交點。

  3. 使用3D位置调整工具,繫結上一步運算元輸出輸出的直線交點作為新原點調整點雲XY位置。

擬合平面

  1. 使用3D区域工具,選擇擬合平面的區域。

    本地圖片

  2. 使用3D平面工具,繫結上一步運算元輸出的變數區域作為輸入區域,擬合平面並將其設定為零平面。

裁切待測區域

選擇3D裁切工具,裁切需要測量的部分至IM1中。

本地圖片

影像預處理

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

本地圖片

三、迴圈計算引腳段差

本地圖片

  1. 選擇3D方形探针工具,分別找出上,下部分起始點。

    本地圖片

  2. 使用标记工具,設定startLoop用於迴圈跳轉。

  3. 選擇lua语言脚本工具

  • 繫結3D方形探针工具輸出變數中點作為上下邊測量起始點

  • 計算出下一待測點的位置,將待測點的測量box輸出到運算元輸出變數。

  • 迴圈計數加1

    本地圖片

lua

--取出基准坐标
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)
  1. 選擇3D高度工具,繫結lua语言脚本工具運算元輸出變數(當前待測點測量box),測量得到高度值。

  2. 選擇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

lua
--计算高度差
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
  1. 使用标记工具,設定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

lua
-- 结果判断
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)

Vision Studio