Skip to content

PCB板检测电阻有无

工程背景

测量背景

随着电子制造业的发展,电子产品趋于多功能化、智能化和小型化。而PCB板上元器件作为电子产品中的重要精密部件,其质量直接影响了产品的性能。因此,质量的把控变得尤为重要。

本地图片

相机选型

Hypersen-DBL

测量项

检测PCB板上贴片是否安装到位,同时检测指定区域电阻是否存在漏焊。

检测要求

测量精度 ≤ 0.01mm 测量重复性 ≤ 0.01mm 测量周期 ≤ 1s

解决方案

使用AI-Vision软件,首先拟合基准平面并调整将其作为零平面,然后通过贴片与电池表面的平面度检测是否装贴完毕,然后通过斑点工具,查找指定区域的电阻个数,通过检测到的实际个数与标准个数进行对比判断。运行速度快,精度高,同时流程简单,模块化,方便搭建。

设计思路

本地图片

执行效果展示

  • 工程结果展示

    • 高度结果:

      本地图片

    • 直径结果:

      本地图片

项目流程

一、初始化

本地图片

  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)

AI-Vision,让3D测量更简单