Skip to content

PCB板檢測電阻有無

工程背景

測量背景

隨著電子製造業的發展,電子產品趨於多功能化、智慧化和小型化。而PCB板上元器件作為電子產品中的重要精密部件,其質量直接影響了產品的效能。因此,質量的把控變得尤為重要。

本地圖片

相機選型

Hypersen-DBL

測量項

檢測PCB板上貼片是否安裝到位,同時檢測指定區域電阻是否存在漏焊。

檢測要求

測量精度 ≤ 0.01mm 測量重複性 ≤ 0.01mm 測量週期 ≤ 1s

解決方案

使用Vision-Studio軟體,首先擬合基準平面並調整將其作為零平面,然後通過貼片與電池表面的平面度檢測是否裝貼完畢,然後通過斑點工具,查詢指定區域的電阻個數,通過檢測到的實際個數與標準個數進行對比判斷。執行速度快,精度高,同時流程簡單,模組化,方便搭建。

設計思路

本地圖片

執行效果展示

  • 工程結果展示

    • 高度結果:

      本地圖片

    • 直徑結果:

      本地圖片

專案流程

一、初始化

本地圖片

  1. 使用Lua脚本工具,生成用於儲存電阻有無判斷結果的全域性變數“ResultPlane1”、“ResultPlane2”;生成儲存資料的csv檔案“Plane.csv”、“Resistance.csv”、“Battery.csv”。

  2. 使用加载点云工具,載入點雲。

二、初定位

位置調整

本地圖片

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

    本地圖片

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

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

平面擬合

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

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

    本地圖片

複製IM用於不同子程式呼叫

分別複製IM1點雲至IM2和IM5用於貼片安裝及電阻有無子程式

提示

使用並行呼叫子程式時,每個子程式需要在不同的IM執行。

三、安裝到位檢測

本地圖片

貼片及電池是否安裝到位

連續六次使用3D平面度工具,分別測量五個貼片及電池的平面度。(3D平面度工具中選擇的區域為客戶要求制定的區域,在實際專案應用中,需要根據實際情況進行修改)

本地圖片

區域1區域2電阻有無

  1. 使用3D裁切工具,將指定檢測電阻有無的區域從IM5裁切至IM3中,便於後續測量。

  2. 使用3D斑点工具,使用box框選中整個待測電阻區域根據點數輸出電阻位置與個數。

區域1區域2步驟相同

四、資料判斷顯示及儲存

資料顯示

使用lua脚本工具

  • 繫結並行子程式運算元變數(3D斑点工具輸出blob資訊,3D平面度工具輸出平面度數值)

  • 編輯指令碼判斷結果是否OK,並將資料顯示在對應IM

  • 儲存電池及貼片安裝資訊

  • 儲存區域1及區域2電阻是否OK資訊到全域性變數

lua
-- 设置Bool类型的变量Judge用于判断结果
Judge1 = true
Judge2 = true
Judge3 = true
Judge4 = true

-- 区域1电阻

count = #blob1
if count ~= 5 then
    Judge1 = false
end

SetBoolVariable("ResultPlane1",Judge1)

x = blob1[1].X
y = blob1[1].Y    
z = blob1[1].Z

-- 进行结果判断后将结果显示在IM上
if Judge1 == true then
    DrawText3D(2,"green",x,y,3,48,"电阻无漏焊")
else
    DrawText3D(2,"red",x,y,3,48,"电阻有漏焊")
end

-- 区域2电阻

count = #blob2
if count ~= 11 then
    Judge2 = false
end

SetBoolVariable("ResultPlane2",Judge2)

x = blob2[1].X
y = blob2[1].Y    
z = blob2[1].Z

-- 进行结果判断后将结果显示在IM上
if Judge2 == true then
    DrawText3D(2,"green",x,y,3,48,"电阻无漏焊")
else
    DrawText3D(2,"red",x,y,3,48,"电阻有漏焊")
end

-- 贴片安装
-- 将变量存储到一个数组中
local flatnessArray = {flatness1, flatness2, flatness3, flatness4, flatness5}

write = ""

-- 循环判断
for i = 1 , 5 , 1 do
    Result = flatnessArray[i]
    if Result > 0.05 then
        write = write .. string.format("%.3f,",Result) .. "NG" .. ","
        -- 当结果不满足条件时,将Judge的值修改为false
        Judge3 = false
    else
        write = write .. string.format("%.3f,",Result) .. "OK" .. ","
    end
end

-- 进行结果判断后将结果显示在IM上
if Judge3 == true then
    write = write .. "OK" .. "\n"
    DrawText3D(2,"green",-33,30,3,48,"贴片贴合完毕")
else
    write = write .. "NG" .. "\n"
    DrawText3D(2,"red",-33,30,3,48,"贴片未贴合完毕")
end

-- 将结果保存在csv文件中
PrintToFile("./Plane.csv",write)

-- 电池安装

write = ""

-- 读取测量的电池平面度的值
Result = flatness

if Result > 0.05 then
    write = write .. string.format("%.3f,",Result) .. "NG" .. "\n"
    Judge4 = false
    -- 进行结果判断后将结果显示在IM上
    DrawText3D(2,"red",-50,20,3,48,"电池未贴合完毕")
else
    write = write .. string.format("%.3f,",Result) .. "OK" .. "\n"
    DrawText3D(2,"green",-50,20,3,48,"电池贴合完毕")
end

-- 将结果保存在csv文件中
PrintToFile("./Battery.csv",write)

電阻有無檔案儲存

  • 繫結上一步lua脚本工具輸出變數的電阻資訊全域性變數

  • lua指令碼判斷並儲存資訊到csv檔案

lua
write = ""

if ResultPlane1 == true then
    if ResultPlane2 == true then
        write = write .. "OK" .. "," .."OK" .."\n"
    else
        write = write .. "OK" .. "," .."NG" .."\n"
    end
elseif ResultPlane1 == false then
    if ResultPlane2 == true then
        write = write .. "NG" .. "," .."OK" .."\n"
    else
        write = write .. "NG" .. "," .."NG" .."\n"
    end
end

PrintToFile("./Resistance.csv",write)

Vision Studio