干了十年SMT工艺,又被叫去解决产线上PCB微码识别的问题。说实话,刚接到这个需求的时候,我第一反应是“扫码嘛,多简单”,真正走进车间蹲了三天才发现,事情远不是拿个扫码枪对着板子扫一下那么轻松。PCB上的微码通常只有两三毫米见方,有的还藏在元器件缝隙里,板面要么是反光的绿油,要么是粗糙的喷锡面,再加上产线传送带一直在动,人工扫码漏读、误读、重复录是家常便饭。后来整套方案落地之后,我把它拆成硬件选型、成像处理、解码算法、数据对接四块,才算是真正跑通了从“看得见”到“扫得准”再到“用得上”的完整链路。
这篇东西适合三类人看:一是产线工程师,正在为追溯漏码、扫不上码头疼,想找一个整体思路;二是做设备集成的朋友,手里有相机、光源,却调不出稳定读取率,需要知道问题出在哪;三是刚接触SMT行业的自动化新人,想搞清楚PCB微码识别这套东西到底由哪些环节构成,为什么不能靠一把扫描枪解决所有问题。我尽量少讲空泛的原理,多讲我在现场实打实验证过的做法和经验。
1. 为什么我会在SMT产线死磕“微码自动识别”:追溯链路的第一块基石
1.1 PCB微码长什么样,为什么它天生就难读
PCB上的微码,主流是DataMatrix ECC200码,少部分用QR码或Code128一维码。载体有三种:激光镭雕、油墨喷码、丝印。
从现场实际遇到的概率来看,镭雕码最常见,因为耐磨、耐高温、过了回流焊还能保持清晰;油墨喷码的问题是容易蹭花,尤其在板子叠放、周转过程中;丝印码便宜,但线条粗、对比度不够,在亚光绿油板面上经常“隐身”。
尺寸也是个坎。常规板子的追溯码多数在3mm到6mm之间,但有些高密度板为了节省空间,会把码做到1.5mm×1.5mm,模块(module)只有0.1mm左右,也就是说每个黑白小格子,只有头发丝那么宽。读出这种码,光靠手机式扫描枪基本是做梦。
更麻烦的是PCB板面本身。绿油是高反光材质,喷锡面是颗粒状漫反射,沉金板在强光下有金属光泽,玻璃纤维织物的纹理又会形成周期性的干扰图案。这些特性决定了:普通照明拍出来的微码图像,对比度低、背景纹理杂乱,解码算法很容易被干扰。
1.2 人工扫码真正的痛点不是慢,而是不可控
很多工厂早期做法是配一把扫码枪,工人把板子从产线上拿起来扫。慢不慢?确实慢,单板扫描加确认大概要两三秒,一天几千片板就是两个小时的纯扫码时间。
但比慢更致命的是不可控。工人疲劳之后,漏扫、重扫、扫错板的情况频繁出现。有些工位为了方便,会把几块板叠在一起扫,条码张冠李戴。等客户投诉追溯信息对不上,再去翻记录,发现整批板子的数据都是乱的,根本无从查起。这时候再去拷问“哪个环节扫错了”,其实已经晚了。我见过最严重的一次,客诉要求提供某批次全部PCB的炉温曲线和AOI结果,结果系统里三分之一板子的条码信息与实物无法对应,最后只能按最严标准重新全检,损失十几万。
所以自动识别真正解决的,不是把人工扫码的“动作”替换掉,而是把人为操作造成的不确定性从产线上拿走。
1.3 部署位置怎么选:我为什么建议优先放在印刷机后和回流焊出口
不是每个工位都需要装读码器。装多了成本高,装少了起不到追溯作用。按照我跑过的产线,优先级最高的是两个位置。
第一个是锡膏印刷机后面、贴片机前面。这时候板子还是裸板,微码完整、无遮挡,是读取成功率最高的时机。读到的板号绑定工单信息,为后面贴片、回流焊、AOI数据回写提供基础ID。
第二个是回流焊出口、AOI前面。板子经过高温后,该掉的油墨、该氧化的表面都会暴露出来,这时候读取通过的板号,用来给AOI结果、炉温曲线做绑定,这直接关系到出货追溯的闭环。
至于在贴片机之后、回流焊之前读取,我一般不建议作为唯一读码点,因为元器件上板后可能遮挡条码,尤其是双面贴装的板子,背面码会被正面元件挡住。如果现场必须在这个工位读码,就得靠镜头角度和打光技巧解决遮挡问题,这个后面会细说。
2. 整套方案的硬件骨架:相机、镜头、光源、触发,一个都不能将就
2.1 固定读码器 vs 工业相机加算法:两条路线的选择逻辑
硬件选型,首先要回答一个路线问题:直接用固定式读码器,还是用工业相机加自研算法?
固定式读码器,市场上比较成熟的有康耐视DataMan系列、基恩士SR系列、海康ID系列,本质上是把相机、光源、解码算法做进了一个盒子,通过网口或串口直接输出条码内容。优点是集成度高、部署快、算法经过大量现场验证,调试门槛低,适合条码位置相对固定、种类不复杂的产线。
工业相机加算法,则需要自己搭配相机、镜头、光源和图像处理程序,灵活性高,遇到古怪的条码、多码同框、特殊反光时,可以针对性地优化,成本也可能更低。但代价是从零开始调通一条产线,工程量往往比预期大得多。
我个人的选择逻辑是:如果微码是标准DataMatrix、位置偏移在镜头视野的50%以内、板面颜色单一,直接用固定读码器,省心。如果微码尺寸极小、位置不固定、PCB颜色五花八门、或者需要在同一视野里读多个码,那就老老实实上工业相机。
我有一条产线,板子有三种基色:绿油、黑油、蓝油,还有沉金板,固定式读码器怎么调都顾此失彼。后来换了500万像素工业相机加自适应算法,把三种板面的预处理分开跑,读取率才稳定下来。
2.2 光源选型:同轴光、低角度环形光、偏振光的实战区别
图像质量七分靠光。PCB读码最容易翻车的就是打光方式不对。
微码如果是镭雕出来的,它本质上是靠激光烧蚀形成的凹凸点和平面之间的灰度差异来表意,这种码适合用低角度环形光打,光线从侧面斜射,凹凸颗粒会产生明显的明暗对比,码像更立体。同轴光的优势在于光线垂直照射并垂直反射,对高反光平面(比如沉金板、镜面基板)最友好,能消除大面积眩光。普通的LED环形光虽然便宜,但用在绿油板上经常会激发出严重的反光斑,把码的边缘冲掉。
还有一种情况必须上偏振片:板面覆膜、油墨喷码的光泽表面,非偏振光打上去会形成镜面反射,拍出来的码像一片白。在镜头前加偏振片,光源前也加偏振片,两个偏振方向正交,可以有效消除镜面反射,只保留漫反射信息。我第一次调喷码板的时候,没加偏振,整张图像都是亮的,加了偏振之后码像立刻清晰,这个技巧在售后现场帮了大忙。
光源颜色方面,我的习惯是优先考虑单色光。绿油板对红光吸收强,对绿光反射强,因此用红光照明可以拉开条码与背景的灰度差。如果码是黑色的,用红光往往能得到比白光更高对比度的图像。
2.3 曝光时间、传送带速度和图像模糊的三角关系
产线读码和实验室拍照最大的区别在于:板子一直在动。
如果传送带速度是0.2m/s,镜头视野宽度是50mm,那么板子完全穿过视野的时间只有0.25秒。在这样的运动状态下,曝光时间太长,图像横向拖影,码就糊了。
要保证清晰,运动模糊量必须小于一个模块尺寸的一半。假设DataMatrix模块尺寸是0.15mm,那么单次曝光内允许的板子移动距离不能超过0.075mm。传送带速度0.2m/s时,允许的最大曝光时间就是0.075mm ÷ 200mm/s = 0.000375s,即0.375ms。
实际调参的时候,我一般会给这个理论上限留50%的余量,曝光时间控制在0.2ms以内。这时候环境光往往不足以照亮画面,必须上频闪光源,在读码触发瞬间用高亮度脉冲补光,拍照瞬间把光打足,平时低亮运行。用频闪的另一个好处是光源寿命更长、产线光污染也小。
2.4 镜头视野和读码精度的估算方法
镜头选型有一个不可忽略的红线:条码的每个模块在图像里至少要占3到5个像素。以2mm见方、模块数16×16的DataMatrix为例,每个模块约0.125mm,想要模块占5像素,那么光学分辨率至少要达到0.025mm/像素。
这时候你会面临一个取舍:视野越大,能容忍的条码位置波动就越大;但视野越大,同样的传感器像素数下,分辨率越差。
举个例子,500万像素相机分辨率2448×2048,如果视野是100mm×84mm,那么每像素对应0.041mm,勉强达到模块占3像素;如果视野收窄到60mm×50mm,每像素0.0245mm,模块能占到5像素,解码余量就充裕了。
所以我的建议很直接:先测量板子在工位的实际偏移范围,再反推视野,然后再选镜头焦距。焦距的计算公式是:焦距 = 工作距离 × 传感器宽度 ÷ 视野宽度。比如说,传感器宽度7.4mm,工作距离200mm,视野宽度60mm,那么焦距 ≈ 200 × 7.4 ÷ 60 ≈ 24.7mm,选个25mm定焦镜头就合适。别图省事直接用手动变焦,工业场景固定工作距离的定焦镜头才是稳定可靠的。
3. 微码成像与解码的核心难点:这才是区分“能用”和“好用”的分水岭
3.1 先搞懂解码器要什么:DataMatrix的“眼睛”在哪
很多人把读码失败归结为“光源不够亮”,其实大部分时候问题出在成像细节不达标。
DataMatrix码的读取依赖两个关键特征:L型实边(两条相邻的实边框)和虚线时钟边(另外两条由交替黑白模块组成的边)。解码算法通过L型实边确定码的位置和尺寸,通过时钟边校正模块的数量和采样位置。如果这两个特征在图像里断裂、粘连或者被高光淹没,再聪明的算法也读不出来。
理解了这一点,你调试的时候就会知道:先别急着改二值化阈值,先看图像里L型实边是否完整清晰,时钟边的黑白交替是否分明。这是我给所有调试新手强调的第一判断标准。
3.2 图像预处理链路:从原始图像到可解码图
工业读码器的内部算法我们改不了,但用工业相机自研方案时,预处理链路是可以自己掌控的。我通常按这个顺序处理:
第一步灰度化,把彩色图转成灰度图,消除颜色差异对二值化的干扰。第二步去噪,中值滤波对消除椒盐噪声和细纹理非常有效,但要注意滤波核不能太大,否则会把码的边缘磨平。第三步提取兴趣区,根据条码的标定位置把图像裁出来,既减少计算量,也排除板外区域干扰。第四步二值化,这是最关键的一步。如果全局光照比较均匀,用OTSU大津法可以自适应地找到分割阈值;如果板面有阴影或光照不均匀,优先用自适应局部阈值法,比如Bernsen算法,它能照顾到局部的明暗变化。第五步形态学处理,用开运算去除微小噪点,闭运算填补条码内部的小空洞,但不能用太多次,否则会改变模块的尺寸比例。最后是条码定位和透视校正,通过找L型实边确定四个顶点,再把条码区域透视变换成正视图,消除镜头倾斜和板面不平带来的梯形畸变。
这套链路听起来不复杂,但每一步的参数都需要针对不同PCB板面单独标定。我一般会在调试初期采集几十张不同板面的图,放到离线脚本里批量跑参数,找到一组对同类型板面都稳定的参数,再固化到产线程序里。
3.3 最难缠的干扰:油墨覆盖、丝印重叠、镜面眩光
现场常见的干扰,按杀伤力排序,我遇到最多的是这三个。
第一个是油墨喷码被手摸花或蹭掉。这种情况图像表现为白点、断线,我除了通过图像处理尽量补全以外,更重要的是从工艺端解决:优化油墨附着力、调整喷码位置避开工人拿板的手持区域、并让周转箱尽量不要在码面上叠加受力。
第二个是丝印重叠。PCB上除了微码,还有一大堆元件位号、生产日期、厂商Logo等丝印字符,如果码位设计不合理,会和位号字符重叠,造成码区大量干扰。图像算法只能保证条码字符和丝印字符灰度相似时尽量不误判,根治方法是和PCB设计沟通,留出禁布区。
第三个是镜面眩光,这个最玄学。强光打在绿油板,特别是经过回流焊后有助焊剂残留的区域,会出现不规则亮斑,正好压在码上。处理办法:一改光源角度,让主光轴不再垂直于板面;二用偏振片;三直接把读码工位挪到回流焊出口之后,用气体吹扫清理表面残留后再拍照。三种手段我都用过,最有效的其实是第三种,物理清理比图像算法补救来得彻底。
3.4 首读率、误读率、解码速度:怎么定性能指标才靠谱
方案能不能验收,要用指标说话。在SMT读码场景,我建议核心盯三个数字。
一是首次读码率FPR,指板子第一次经过读码区时成功识别的比例。这个值我要求不低于99.5%,如果低于99%,产线会因为频繁复读而卡顿。二是误读率,指读到条码内容与实际内容不一致的比例,这个值必须为零,没有任何商量余地,因为误读比漏读危害更大。三是解码速度,在线体节拍低于2秒/板时,单次识别加数据传输要在300ms内完成,否则就追不上产线节拍。
测试方法也有讲究:不能只在实验室用完美样板测,要把产线上实际生产的不同批次、不同板面状态的板子至少各收集50片,在连续运行状态下统计。我踩过最大的坑就是只拿好板测,验收当天100%,第二天量产良率波动、板面颜色变深了一点,读取率直接掉到97%,所以样本里必须包含废板、脏板、和过炉后的板子,才能真实反映量产水平。
4. 数据流与MES对接:识别出来的微码,怎么变成一条可追溯记录
4.1 一条可追溯记录需要什么字段,缺一不可
读到了微码,只是拿到了一串字符。它要真正变成追溯记录,必须和产线的业务数据绑定。
我实际用的字段包括:条码内容、读取工位编号、产线编号、读取时间(精确到秒)、工单号、产品料号(PN)、当前工序、操作结果(OK/NG)、图像快照路径。前五个是基础,后面几个决定追溯是否能闭环。比如工单号不绑定,后续维护的时候只知道板号却不知道它是哪个订单的,追到一半就断了。
这里面,图像快照很多人会忽略。但如果在读取时刻同时保存一张包含微码的现场图像,后续出现争议时就可以调出来人工复核,这是“证据链”很重要的一环。我甚至建议把NG板的那张图单独存到一个异常目录,方便质量部分析。
4.2 读码器和MES之间的通讯链路怎么搭
通讯方案取决于现场已有的自动化层级。
如果产线有PLC,那么读码器先把结果通过串口或TCP/IP发给PLC,PLC再通过Profinet/EtherCAT等总线传给MES,优点是中间多了PLC这一道可以做逻辑判断,比如读到了就放行,读不到就报警停板。缺点是增加了几毫秒到几十毫秒的通讯延迟,以及PLC程序里需要增加对应的处理块。
如果现场没有PLC,读码器也可以直接通过TCP/IP Socket把数据发给上位机或MES中间件。我用得最多的是在工控机上写一个简单的数据转发服务,接收读码器输出的JSON格式结果,解析后拼成MES的API请求上报。上报失败时数据先落在本地队列里,等网络恢复再补传,这个队列机制必须做,否则MES一个抖动,整条线的追溯数据就断了。
读码器输出数据最常见的格式是JSON,比如:
{ "code": "PCB20240615A00123", "result": "OK", "reader_id": "ID-01", "timestamp": "2024-06-15 10:23:45.678" }上位机拿到之后,再去MES查工单、绑定工序,整个过程1秒以内可以完成。
4.3 防重码、防漏扫:逻辑上必须设置的几道防线
追溯系统最怕的不是读不到,而是“读到了不该读的”或者“同一个码被记了两次”。
我在系统里做了三层拦截。第一层,数据库唯一性约束,同一把读码器读取相同条码的时间间隔低于设定值(通常5秒)时,认为是重复读取,直接过滤。第二层,工单核对,读取到的板号必须在当前在制工单的条码段范围内,如果读到一张不属于当前工单的板,立即报警,通常是上批次清线不彻底。第三层,数量闭环,每班记录的板子数量要和计划产量、AOI检测数量交叉比对,数量对不上就说明存在漏扫或重复计数。
这三层做完,追溯数据才谈得上可靠。否则条码系统和实物对不上,追溯系统本身就成了一个数据垃圾场。
4.4 NG品处理流程:不卡产线,但绝不能放走异常
自动识别还有个天然优势:可以在发现异常时自动触发后续动作。
读码器识别失败时,我的处理逻辑是自动重读三次。第三次还失败,板子进入待检缓冲区,同时产线Call灯亮起,让在线QC确认。QC确认结果有几种:直接放行,如果只是脏污但能用人工软件辅助解码;返回重新清洁后再读;或者直接判定不合格,推入维修区。
这里的关键是:NG板一定不能回流到主传送带继续走。否则它可能在下游工位被当成正常板加工,追溯链就彻底断了。物理隔离,永远比系统标记可靠。
5. 现场调试与量产维护:那些让我熬夜的坑
5.1 误码排查:花了两个通宵才找到是反光镜像的祸
有一次客户反馈,MES里出现了几百条“TS”码被读成“5S”的记录。从数据上看,读码器报成功,内容却错了。我当时第一反应是算法解码错误,但概率没那么高,几百条才错几条。
后来把所有误码对应的图片调出来对比,发现它们都有一个共同点:码的L型实边在图像里看起来特别粗,甚至有一条不太自然的亮线。拿放大镜看原图,真相是镭雕码旁边的铜箔边缘产生了镜面反射,在图像里形成了一条和实边平行的亮线,算法把这条亮线当成了L型实边的一部分,导致坐标准位偏移,整个码的模块采样网格错位了。
解决办法是在镜头前加了偏振片,消除铜箔的镜面反射;同时把解码兴趣区往码本身收紧一圈,尽量排除码周围的金属边缘进入算法范围。从那以后,我再也没有在这个工位见到类似误码。
这个案例给我的教训是:误码排查不能只看解码结果,必须结合图像证据。这也是我坚持每台读码器必须存档图像的原因。
5.2 漏扫排查:换线后突然大量失败,问题出在焦距
还有一次,白班产量明明是满的,到了夜班漏扫率突然从0.3%飙升到8%。产线班长怀疑是晚上灯光干扰,连夜叫我过去。
到了现场,我先看图像,发现码整体发虚,边缘不锐利,像对焦不准。但白天明明是好的,晚上怎么会跑焦?后来一问,才知道夜班换线生产了一款更厚的板子,板面高度比白天那款高了大概5mm。而读码器是固定支架,工作距离是按照白天那款板的高度标定的。板子变厚5mm,物距变了,景深不够,图像自然糊了。
这种问题在定焦镜头的工位上非常典型。我的对策分两步:一是把镜头光圈缩小两档,加大景深范围,让115mm到125mm物距范围内的板子都能清晰成像;二是在换线清单里加入“读码焦距确认”这一项,明确规定换新型号板子时必须用测试板验证一次读码器焦距。这种问题看起来是技术问题,本质上是流程漏洞。
5.3 环境光、灰尘、震动:容易被忽视的三个慢性杀手
正常产线的环境比实验室恶劣得多。
环境光:产线上方有照明灯,有些角度正好照在读码工位,会让图像整体灰度偏移。处理方式是给读码区加遮光罩,或者选择在强环境光下依然有效的窄带滤光片配合单色光源,让读码器的曝光只对特定波长敏感。
灰尘:风扇散热会把车间粉尘吹上镜头,一个月不擦,图像就像蒙了一层雾,对比度直线下降。维护制度里必须包含镜头和光源表面的定期清洁,频率根据车间洁净度定,一般至少每周一次。
震动:贴片机和回流焊轨道运转带来的震动,如果读码器支架刚度不足,图像会偶发性发虚。我见过用一根长铝型材横跨轨道装相机的,板子一过相机就跟着晃,读码率上不去还找不出原因。后来换成直接固定在轨道侧面的短支架,问题立刻消失。支架尽量短、粗、稳,这条原则什么时候都适用。
5.4 建立“影码样本库”,让每次调试都有据可依
读码系统维护最怕“记忆丢失”:今天调好了,明天换了个人维护,参数改一通,又回到原点。
我的习惯是建立一套影码样本库:把产线上出现过的每种板面、每种码制、每种“疑难杂症”的原始图像和解码结果存起来,打上标签,比如“绿油+反光”“喷锡+划痕”“黑油+浅雕刻”。以后不管是调试参数还是验证新方案,都拿这套样本库做回归测试,改动之前先跑一遍,确保原有场景没有被新改动“修坏”。
这套样本库也是人员培训的好教材。新人上手很快,因为每个典型问题都有对应的真实图像和解码处理结论,不需要凭感觉瞎试。
6. 从单工位到整线联动:方案扩展与投入产出
6.1 先算账:一套读码工位的成本构成和回报周期
说句实在话,SMT读码方案的成本没有想象中那么高。
固定式读码器方案,一台成熟品牌的智能读码器大约6000到15000元,含光源和支架,加上线缆和PLC通讯模块,单工位预算大概2到3万元。工业相机方案,相机加镜头加光源加工控机,单工位大概1.5到4万元,但需要投入算法开发时间。
收益怎么算?首先是人工替代,一个工位每天减少两个小时扫码工作量,一年下来人工成本节省可观;其次是客诉风险降低,追溯数据完整,万一出质量问题时能快速定位到批号和工艺参数,很多客户审厂也更认可。我接触的案例里,通常一条中型产线做完读码追溯之后,因为追溯不全导致的额外重检和客诉赔偿费用,一年就能覆盖硬件投入。
6.2 往上走:把读码工位串成整线追溯网络
单点读码只是第一步。真正有价值的,是把读码结果作为产品在整个产线流转的“身份证”。
在印刷机后读到板号,再把印刷机参数、贴片机程序号、回流焊炉温曲线、AOI检测结果都通过这个板号关联起来,最后形成一板一档的完整工艺履历。这个过程中,读码工位不再是孤立的识别点,而是整条数据链的起点。
我建议实施时先从最关键的两个工位做起,跑通数据链路,形成样板;然后再横向复制到其他线体和工位。不要一口气全线铺开,否则MES接口调整、工位改造、人员培训的冲击会让项目失控。
6.3 如果再给我一次机会,我会在PCB设计阶段就做这几件事
整个方案跑下来,我最深的体会是:有很多问题,在设计阶段就可以避免,我却在现场花了几倍的时间去补救。
如果重新来过,我会提前推动三件事。第一,和硬件设计团队约定专用的条码禁布区,禁止任何丝印字符、走线或过孔出现在条码周围0.5mm范围内,给读码留出干净的背景。第二,明确统一微码制式和最小尺寸,比如规定所有PCB一律使用DataMatrix ECC200,模块尺寸不低于0.15mm,这样整条线不需要频繁切换读码参数。第三,把条码尽量放在板子的同一固定位置,最好是工艺边或者长边边缘,减少定位偏移带来的视野压力。
这些看起来和读码无关,实际上对整条线的稳定性影响最大。方案做得再花哨,不如把源头标准立起来。
个人经验总结一句:PCB微码自动识别,看着是个读码的活儿,实际干下来,考验的是成像功底、算法认知、通讯逻辑和现场流程的协同。硬件选型再贵,照片拍不清楚,一切都白搭;算法再强,维护流程跟不上,稳定率也撑不住。把这几个环节咬合成一个闭环,才算得上是一套真正能落地、能长跑的SMT微码识别解决方案。