一、问题定义
在装盘机进瓶段,瓶子经传送带高速通过。倒瓶(瓶身倾斜超过15°或完全倒下)若未被检出并剔除,将导致:
推瓶机构卡死,触发伺服过载报警;
爆瓶风险增加,碎玻璃污染托盘;
整线停机,影响OEE。
因此,倒瓶检测算法需要满足:
实时性:检测周期 ≤ 10ms(传送带线速度0.5m/s,瓶间距80ms);
准确性:漏检率 < 0.1%,误检率 < 0.05%;
鲁棒性:抗环境光、粉尘、瓶身标签反光干扰。
二、传统光电方案的缺陷
典型的双光电对射方案:上下两组对射传感器,瓶身直立时上下同时被遮挡,时间差ΔT稳定在较小范围;倒瓶时上下遮挡时间差ΔT显著增大。
实际测试数据(某药企2ml西林瓶,速度500瓶/分钟):
| 瓶型 | 直立瓶ΔT均值(ms) | 倒瓶ΔT均值(ms) | 误判率 | 漏判率 |
|---|---|---|---|---|
| 透明西林瓶 | 3.2 | 9.5 | 4.7% | 6.2% |
| 棕色口服液瓶 | 4.1 | 12.3 | 2.1% | 3.5% |
| 塑料瓶(带标签) | 5.0 | 8.2 | 11.3% | 9.8% |
问题根源:
透明瓶透光率波动,导致传感器触发电平不稳定;
标签反光造成误触发;
不同瓶型高度差异需人工重新校准传感器位置。
三、改进方案:单点激光测距+滑动中值滤波
3.1 硬件选型
将两组对射改为单只激光测距传感器(基恩士LR-Z系列或欧姆龙B5WC),水平安装于传送带一侧,高度为瓶身中位线。测量原理:激光三角法,输出模拟量4-20mA对应距离35-250mm。
直立瓶通过时,传感器测得的距离稳定在D_bottle(标定值);倒瓶时瓶身倾斜,测量点偏移,距离值跳变为D_bottle ± ΔD,ΔD通常 > 10mm。
3.2 信号预处理:滑动中值滤波
原始AD值存在±1~2mm的白噪声。采用滑动中值滤波(窗口长度N=5)效果优于均值滤波,能保留边缘跳变。
伪代码(SCL):
text
FUNCTION MedianFilter : REAL VAR_INPUT raw : REAL; END_VAR VAR_STATIC buf : ARRAY[0..4] OF REAL; idx : INT := 0; i,j : INT; tmp : REAL; END_VAR buf[idx] := raw; idx := (idx + 1) MOD 5; // 冒泡排序 FOR i := 0 TO 3 DO FOR j := i+1 TO 4 DO IF buf[i] > buf[j] THEN tmp := buf[i]; buf[i] := buf[j]; buf[j] := tmp; END_IF; END_FOR; END_FOR; MedianFilter := buf[2]; // 中值 END_FUNCTION
3.3 状态机设计
定义了三个状态:S_IDLE(等待瓶子)、S_BOTTLE_DETECT(瓶子进入检测区)、S_REJECT(剔除动作)。
状态转换逻辑:
text
S_IDLE: IF distance < threshold_near THEN start_timer(T_detect) 进入 S_BOTTLE_DETECT S_BOTTLE_DETECT: IF distance stable in [D_bottle - 2, D_bottle + 2] for 10ms THEN upright_count++; 回到 S_IDLE ELSE IF distance > (D_bottle + 8) OR distance < (D_bottle - 8) THEN 进入 S_REJECT ELSE IF T_detect > 50ms THEN // 超时无瓶子 回到 S_IDLE S_REJECT: // 计算剔除延时:传感器到气吹口距离L / 传送带速度v - 阀门响应时间 delay_time = L / v - 20ms; 延时后置位气阀,持续30ms 回到 S_IDLE
3.4 自适应基准学习
为解决不同瓶型的适配,程序中加入一键标定功能:按住HMI上的“学习”按钮,连续通过20个已知直立瓶,系统自动计算平均距离并更新D_bottle,同时设置阈值TH_H = D_bottle + 8,TH_L = D_bottle - 8。
四、性能对比测试
在某自动装盘机试验台上,使用2ml西林瓶,线速度0.5m/s,分别运行光电方案与激光方案各2小时(约6万瓶),结果如下:
| 方案 | 实际倒瓶数 | 正确剔除数 | 漏剔 | 误剔 | 准确率 |
|---|---|---|---|---|---|
| 光电对射(两组) | 127 | 98 | 29 | 41 | 77.2% |
| 激光测距+中值滤波 | 131 | 130 | 1 | 2 | 99.2% |
激光方案的漏剔主要发生在瓶身倾斜临界值(ΔD ≈ 6mm),通过将阈值收紧到6mm并增加迟滞区间后,漏剔降至0。
五、向机器视觉的扩展思考
对于更复杂的场景(如瓶子带有反光标签、异形瓶、瓶口破损检测),激光测距可能不够用。可升级为工业相机+OpenCV方案:
相机俯拍进瓶段,每帧图像用YOLOv8或传统轮廓分析判断瓶身姿态;
通过串口或以太网将结果传给PLC(Modbus TCP);
帧率需达到100fps以上,对应600瓶/分钟即10瓶/秒,每瓶至少10帧才能稳定检测。
以下是一个简化的Python轮廓检测逻辑:
python
import cv2 import numpy as np def is_bottle_upright(contour): # 计算最小外接矩形 rect = cv2.minAreaRect(contour) angle = rect[2] # 瓶身倾斜角度超过15°视为倒瓶 return abs(angle) < 15 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: if is_bottle_upright(cnt): # 直立瓶,计数 pass else: # 倒瓶,触发剔除信号(通过I/O或串口) pass
该方案已在实验室环境验证,实际产线应用需解决光照、灰尘、帧率延迟等问题。
六、工程经验总结
传感器选型:透明瓶必须用CMOS激光传感器,红外对射不可靠。
安装位置:传感器应安装在传送带直段,距离瓶口至少30mm,且避开前道灯检强光。
延时计算:剔除延时需精确标定,误差控制在±5ms内,否则会误剔或漏剔。
PLC扫描周期:高速场景建议使用中断或高速计数器模块,不要依赖普通循环扫描。
数据记录:建议记录每次剔除时的距离值和瓶型信息,便于质量回溯和参数调优。
七、结语
本文从工程角度详细介绍了自动装盘机倒瓶检测算法的演进与优化,给出了光电方案的局限、激光测距方案的实现细节以及机器视觉的扩展思路。所阐述的信号处理方法和状态机设计具有普适性,可供从事包装自动化、PLC编程、视觉检测的工程师参考。