工业AI质检系统:YOLOv5与PLC的实时集成实践

📅 2026/7/25 15:30:54 👁️ 阅读次数 📝 编程学习
工业AI质检系统:YOLOv5与PLC的实时集成实践

1. 项目背景与核心挑战

去年接手某汽车零部件产线智能化改造项目时,客户提出一个看似简单实则复杂的需求:"用摄像头替代质检员的眼睛,用算法代替质检员的大脑,用PLC控制替代质检员的手"。这个需求背后,实际上是要构建一套从视觉识别到执行控制的完整工业AI闭环系统。

在真实产线环境中,我们面临三大核心挑战:

  • 视觉检测需要在200ms内完成单件产品的缺陷判断(包括划痕、凹陷、污渍等6类缺陷)
  • 检测结果需要实时同步到西门子S7-1200 PLC控制系统
  • 整套系统必须满足99.9%的在线可用率要求

2. 技术架构设计与选型

2.1 视觉检测模块方案对比

我们测试了三种主流方案:

  1. OpenCV传统算法:开发快但泛化性差,新缺陷类型需重新编码
  2. 商业视觉软件(如Halcon):成本高且扩展性受限
  3. YOLOv5:在测试集上达到98.7%的mAP,推理速度满足150ms/帧

最终选择YOLOv5s(小型网络)的原因:

  • 模型体积仅14MB,适合边缘设备部署
  • 支持ONNX格式导出,便于多平台移植
  • 社区活跃,遇到问题容易找到解决方案

2.2 边缘计算硬件选型

考虑产线环境特殊性(高温、震动、粉尘),测试了三种硬件:

硬件配置对比表: | 型号 | 推理速度 | 工作温度 | 防护等级 | 单价 | |-----------------|----------|------------|----------|--------| | Jetson Xavier NX| 120ms | -20~70℃ | IP40 | ¥3999 | | 研华工控机 | 90ms | 0~55℃ | IP65 | ¥8500 | | 自组Intel方案 | 80ms | 10~35℃ | 无防护 | ¥6200 |

选择研华工控机虽然成本较高,但其IP65防护和宽温设计更适合恶劣环境。

3. 核心实现细节

3.1 数据采集与标注的坑

初期用手机拍摄的2000张样本训练后,实际产线测试准确率仅65%。后来发现:

  • 产线照明存在频闪(100Hz工频干扰)
  • 传送带振动导致图像模糊
  • 产品反光材质造成过曝

解决方案:

  1. 使用全局快门相机+偏振滤镜
  2. 在传送带增加缓冲垫减少振动
  3. 采用多角度环形光源消除阴影
  4. 最终采集5000张真实产线图像,用LabelImg标注时特别注意:
    • 划痕类缺陷需标注完整长度
    • 对于模糊图像直接弃用
    • 保持各类缺陷样本数量均衡

3.2 模型训练技巧

YOLOv5训练关键参数配置:

# data.yaml train: ../train/images val: ../valid/images nc: 6 # 缺陷类别数 names: ['scratch', 'dent', 'stain', 'crack', 'burr', 'miss'] # hyp.scratch-low.yaml lr0: 0.01 # 初始学习率 lrf: 0.2 # 最终学习率 momentum: 0.937 weight_decay: 0.0005 fl_gamma: 0.5 # 聚焦损失参数 hsv_h: 0.015 # 色调增强 hsv_s: 0.7 # 饱和度增强 hsv_v: 0.4 # 明度增强

关键发现:

  • 使用--evolve参数进行超参数进化
  • 添加CutMix数据增强提升小目标检测
  • 对难样本(如透明划痕)进行过采样

3.3 PLC通信协议适配

西门子S7-1200 PLC支持三种通信方式:

  1. OPC UA:延迟高(约300ms)
  2. Modbus TCP:需要额外配置
  3. 直接S7协议:延迟最低(<50ms)

最终采用python-snap7库实现直接通信:

import snap7 from snap7.util import * plc = snap7.client.Client() plc.connect('192.168.1.10', 0, 1) # IP地址, 机架号, 槽号 # 写入DB块数据 def write_bool(db_number, start_offset, bit_offset, value): data = plc.db_read(db_number, start_offset, 1) set_bool(data, 0, bit_offset, value) plc.db_write(db_number, start_offset, data) # 触发剔除气缸 write_bool(1, 0, 3, True) # DB1.DBX0.3

4. 系统集成与调试

4.1 时间同步关键点

发现视觉检测与PLC执行存在约80ms的时间差,导致剔除位置偏移。解决方案:

  1. 在工控机与PLC间部署PTPv2协议
  2. 通过硬件触发信号同步采集与PLC周期
  3. 加入传送带编码器反馈进行位置补偿

4.2 异常处理机制

设计三级容错机制:

  1. 视觉检测超时:自动重试3次
  2. PLC无响应:切换备用PLC
  3. 连续5次失败:触发声光报警并暂停产线

对应的状态机实现:

stateDiagram [*] --> Idle Idle --> Detecting: 产品到位信号 Detecting --> Success: 检测OK Detecting --> Failure: 检测NG Success --> Controlling: 发送PLC指令 Failure --> Controlling: 发送剔除指令 Controlling --> Idle: 完成信号 Controlling --> Error: 超时未响应 Error --> Idle: 人工复位

5. 性能优化实录

5.1 推理加速实践

初始方案:

  • 原始YOLOv5s模型:150ms
  • TensorRT优化后:110ms
  • 开启FP16模式:95ms

进一步优化:

  1. 使用多进程并行处理:
from multiprocessing import Process, Queue def detector(input_q, output_q): while True: img = input_q.get() results = model(img) output_q.put(results) input_queue = Queue(maxsize=3) output_queue = Queue(maxsize=3) detect_process = Process(target=detector, args=(input_queue, output_queue)) detect_process.daemon = True detect_process.start()
  1. 采用帧缓存机制预加载图像
  2. 最终平均处理时间降至65ms

5.2 内存泄漏排查

系统连续运行48小时后出现内存溢出,经排查发现:

  • OpenCV的imdecode()未释放内存
  • PLC连接未及时关闭
  • 日志文件未轮转

解决方案:

# 使用with管理资源 with PLCConnection() as plc: plc.write_data(...) # 强制释放图像内存 def safe_imdecode(data): img = cv2.imdecode(data, cv2.IMREAD_COLOR) del data # 显式释放 gc.collect() return img

6. 部署实施要点

6.1 产线适配改造

  1. 安装支架设计:

    • 相机距传送带高度800mm
    • 30度倾斜安装避免反光
    • 使用减震橡胶垫
  2. 照明方案:

    • 4组60W白色LED条形灯
    • 亮度可调(3000-6000lux)
    • 扩散板柔化光线

6.2 防干扰措施

  1. 信号线:采用双绞屏蔽线(AWG22)
  2. 电源:单独回路+在线式UPS
  3. 接地:设备统一接至工厂接地极
  4. 电磁屏蔽:控制柜内加装金属隔板

7. 效果验证与持续改进

7.1 测试数据对比

指标改造前(人工)改造后(AI)
检测速度3秒/件0.8秒/件
漏检率2.1%0.3%
误检率1.8%0.7%
日均故障次数4.2次0.2次

7.2 模型迭代策略

建立持续优化机制:

  1. 每日自动收集100张困难样本
  2. 每周人工复核标注新增数据
  3. 每月重新训练模型版本
  4. 关键指标监控:
    • 类别平衡度
    • 特征分布偏移
    • 边缘case比例

8. 经验总结与避坑指南

  1. 硬件选型容易忽略的点:

    • 工业相机的触发延迟(某些型号可达50ms)
    • PLC的通信负载能力(同时连接设备数)
    • 工控机的散热设计(实测机箱温度可达60℃)
  2. 算法开发中的教训:

    • 不要过度依赖公开数据集
    • 数据增强要符合物理实际(如不应出现倒置的工件)
    • 评估指标要包含时间维度(如99%分位延迟)
  3. 工程化建议:

    • 提前规划好日志系统(我们后来加了ELK)
    • 预留10%的性能余量应对产线变动
    • 做好所有接口的版本兼容设计

这套系统最终实现的关键突破:

  • 端到端延迟控制在200ms内
  • 日均处理量提升至2.1万件
  • 客户年节省质检成本约180万元

实际部署时的一个小��巧:在PLC程序中加入手动测试模式,通过强制IO信号可以快速验证机械执行机构,这比通过视觉系统触发要高效得多。我们后来把这个功能做成了标准调试接口。