Skip to content

Pin針高度測量

工程背景

測量背景

鑑於PIN針在PCB板中的關鍵作用及其對精度的嚴格要求,傳統檢測方法存在精度不足、效率低等問題。隨著智慧製造和3D視覺技術的發展,自動化檢測成為趨勢,旨在提高檢測精度與效率,確保產品質量,滿足大規模生產需求。

本地圖片

相機選型

盛相科技 S162170

測量項

Pin針高度

檢測要求

測量精度 ≤ 0.03mm

測量重複性 ≤ 0.05mm

測量週期 ≤ 2000ms

解決方案

Vision-Studio採用區域劃分的方法,將三塊測量區域分割出來,通過Blob找到每塊區域的Pin針,使用多高度測量整合工具一鍵輸出高度。

設計思路

本地圖片

執行效果展示

  • 工程結果展示

    • 區域1測量結果

    本地圖片

    • 區域2測量結果

    本地圖片

    • 區域3測量結果

    本地圖片

專案流程

一、初始化

  1. 使用Lua脚本工具,生成儲存資料的csv檔案。
  • 設定int型別全域性變數用於迴圈計數,設定string型別全域性變數用於拼接高度字串,設定陣列型別全域性變數用於高度顯示

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

經驗

.. 用於string型別字串拼接

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

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

lua
-- count用于区域pin针高度检测循环计数
SetIntVariable("count1", 1)
SetIntVariable("count2", 1)
SetIntVariable("count3", 1)
-- 参数用于拼接高度字符串存入csv
SetStringVariable("Height1","")
SetStringVariable("Height2","")
SetStringVariable("Height3","")
-- 创建数组用于最后显示高度
SetFloatArrayVariable("HeightArray1",{})
SetFloatArrayVariable("HeightArray2",{})
SetFloatArrayVariable("HeightArray3",{})
SetFloatArrayVariable("posX1",{})
SetFloatArrayVariable("posY1",{})
SetFloatArrayVariable("posZ1",{})
SetFloatArrayVariable("posX2",{})
SetFloatArrayVariable("posY2",{})
SetFloatArrayVariable("posZ2",{})
SetFloatArrayVariable("posX3",{})
SetFloatArrayVariable("posY3",{})
SetFloatArrayVariable("posZ3",{})

-- 生成保存检测数据的csv文件
-- 生成用于拼接的字符串
write = ""
-- 判断是否存在该文件,若不存在,生成该文件
if FileExists("./Height1.csv") == false then
  write = write .. "Time,"
  for i= 1,22,1 do
      write = write .. "Height" .. i ..","
  end
  -- "\n"表示换行
  write = write .. "\n"
end
-- 将时间拼接入字符串中
write = write .. os.date("%Y_%m_%d %H:%M:%S") .. ","
-- 将字符串写入文件中
PrintToFile("./Height1.csv", write)


-- 生成保存检测数据的csv文件

write = ""

if FileExists("./Height2.csv") == false then
  write = write .. "Time,"
  for i= 1,8,1 do
      write = write .. "Height" .. i ..","
  end
  write = write .. "\n"
end

write = write .. os.date("%Y_%m_%d %H:%M:%S") .. ","
PrintToFile("./Height2.csv", write)


-- 生成保存检测数据的csv文件

write = ""

if FileExists("./Height3.csv") == false then
  write = write .. "Time,"
  for i= 1,8,1 do
      write = write .. "Height" .. i ..","
  end
  write = write .. "\n"
end

write = write .. os.date("%Y_%m_%d %H:%M:%S") .. ","
PrintToFile("./Height3.csv", write)
  1. 使用加载点云工具,載入需要處理的點雲圖。

二、預處理

本地圖片

位置調整

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

    本地圖片

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

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

擬合平面

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

    本地圖片

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

裁切待測區域

使用3D裁切工具,分別裁切出三個待測Pin針至IM2、IM3、IM4。

三、Pin針高度迴圈測量

本地圖片

  1. 使用3D斑点工具,得到每個焊點的位置資訊。

    本地圖片

  2. 使用3D高度工具,繫結上一步3D斑点工具輸出變數焊點區域資訊作為輸入區域,測量所有Pin針高度。

四、資料儲存

使用lua脚本工具

  • 繫結3D高度工具輸出變數高度陣列

  • 編輯指令碼迴圈拼接高度值到字串

  • 儲存資料到csv檔案。

經驗

string.format 用於格式化字串 %.nf表示將浮點數格式化為保留 n 位小數。

pi = 3.14159 str = string.format("Pi is approximately %.3f", pi) print(str) -- 輸出: Pi is approximately 3.141

lua
-- 用于拼接高度的字符串
writeH1 = ""
writeH2 = ""
writeH3 = ""

writeH1 = writeH1 .. os.date("%Y_%m_%d %H:%M:%S") .. ","
writeH2 = writeH2 .. os.date("%Y_%m_%d %H:%M:%S") .. ","
writeH3 = writeH3 .. os.date("%Y_%m_%d %H:%M:%S") .. ","

-- 循环拼接高度到字符串
for i=1,22,1 do     
    writeH1 = writeH1 .. string.format("%.3f,",Height1[i])

end

for i=1,8,1 do
    writeH2 = writeH2 .. string.format("%.3f,",Height2[i])
end

for i=1,8,1 do
    writeH3 = writeH3 .. string.format("%.3f,",Height3[i])
end

WriteLineToFile("./Height1.csv",writeH1)
WriteLineToFile("./Height2.csv",writeH2)
WriteLineToFile("./Height3.csv",writeH3)

Vision Studio