Skip to content

BGA球共面度检测

项目简介

项目背景

焊锡球的共面度不良可能导致焊接不良、短路等问题,严重影响产品的性能和寿命,将测量得到的数据进行统计分析,包括最大值、最小值和均值等,以评估焊锡球的共面度是否满足产品要求。

本地图片

相机选型

LMI激光线扫相机 Gocator2520

检测要求

测量精度 ≤ 0.03mm
测量重复性 ≤ 0.02mm
测量周期 ≤ 2s

解决方案

AI-Vision采用集成工具的方法,一个工具直接计算出整体小球的共面度,在大大提升速度的同时简化了工程逻辑。

设计思路

本地图片

执行效果展示

  • 工程结果展示:

    本地图片

  • HMI结果展示:

    本地图片

操作流程

一、初始化

  1. 选择Lua脚本语言工具,创建待接收数据的csv文件。
  • 拼接表头字符串,保存到csv文件

经验

.. 用于string类型字符串拼接

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

,作为分隔符,分割每个数据项

lua
-- 生成用于拼接的字符串
write = ""

--判断该文件是否存在,若不存在生成该文件,若存在跳过生成
if FileExists("./BGA.csv") == false then
    -- “,”表示下一列,“\n”表示换行
   write = write .. "Time," .. "Degree of coexistence" .. "," .. "OK/NG" .. "\n"
end

-- 拼接入当前时间
write = write .. os.date("%Y_%m_%d %H:%M:%S") .. ","

-- 字符串写入csv文件中
-- 当无该文件时,系统会自动生成该文件,同时该工具会WARN提示系统内无该文件
PrintToFile("./BGA.csv" , write)
  1. 选择加载点云工具,获取点云。

二、预处理

本地图片

位置调整

在实际项目运行过程中,工件摆放位置可能有偏差,因此可以通过查找单个点或线来调整点云3D位置,确保不同图像原点在同一位置。

  1. 使用3D方形探针工具,得到工件的左侧与上侧两条边。

  2. 使用3D几何交点工具,绑定上一步算子变量输出的两条边作为输入几何,输出两直线交点。

  3. 使用3D位置调整工具,绑定上一步算子输出输出的直线交点作为新原点调整点云XY方向位置。

平面拟合

在实际项目运行过程中,工件摆放z轴方向也就是上下位置可能会有偏差,需要确立z轴零平面作为基准面,确保点云同一平面高度(z值)相同。

  1. 选择3D区域工具,选取pcb板上面6块突出的柱子为拟合平面的区域。

    本地图片

  2. 选择3D平面工具,绑定上一步获取的区域作为输入区域来拟合平面,并将拟合出来的平面作为零平面。

    本地图片

二次定位

对于该案例,客户要求的xy原点位置在点云中心位置,因此需要进行二次定位来调整基准位置。

  1. 选择3D方形探针工具,在四条边上选取区域box,执行工具找到上下左右4条边。

本地图片

  1. 选择3D几何交点工具,分别绑定上一步找到的四条边中的两条边作为输入,获取左上左下右上右下四个顶点。

  2. 选择多点定位工具工具,绑定上一步获取的四个顶点位置参数作为输入点,执行工具输出上下左右四个顶点的中心点,同时调整点云位置xy到中心点。

裁切出待测区域

该工程针对焊锡球共面度,为了便于直接对焊锡球进行后续测量,可以裁切出焊锡球区域。

  1. 选择3D裁切工具,设置区域box只包含焊锡球点云区域,输出得到只包含焊锡球区域点云到IM1,便于后续处理。

    本地图片

三、共面度测量

选择共面度工具,框选出进行测量的区域,进行共面度检测。

本地图片

四、数据判断及保存

选择lua语言脚本工具,将测量的结果进行判断且显示在图像上,并将判断结果和数据保存在文件中。

  1. 绑定共面度工具输出变量平面度值

  2. 根据平面度值进行结果判断并显示数据

  • 保存判断结果到csv文件。

经验

string.format 用于格式化字符串 %.nf表示将浮点数格式化为保留 n 位小数。

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

lua
-- 设置全局变量
SetFloatVariable('Value',math.floor(1000*Result)/1000)

-- 进行结果判断
if Result<0.065 or Result>0.075 then
    -- 数据显示
    DrawText3D(0,"red",0,0,5,20,"检测结果:" .. "NG")
    write = string.format("%.3f," , Result) .. "NG" .. "\n"

else
    DrawText3D(0,"green",0,0,5,20,"检测结果:" .. "OK")
    write = string.format("%.3f," , Result) .. "OK" .. "\n"
end

-- 将字符串写入文件中
PrintToFile("./BGA.csv" , write)

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