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