工业自动化实战:基于 VisionPro 与 C# 的呆板视觉 PLC 集成方案

[复制链接]
发表于 2025-7-7 16:37:50 | 显示全部楼层 |阅读模式
一、背景介绍

在智能制造范畴,呆板视觉检测与 PLC 控制的无缝集成是实现自动化生产线闭环控制的关键。本文将详细介绍如何使用 C# 开发上位机系统,实现 Cognex VisionPro 视觉系统与西门子 S7 PLC 的数据交互,打造高效、稳定的工业检测方案。
二、系统架构计划

1. 硬件组成



  • 工业相机:Cognex DM 系列智能相机(分辨率 1280×1024,帧率 30FPS)
  • 光源系统:环形 LED 光源(可调亮度,消除反光)
  • PLC 控制器:西门子 S7-1200(CPU 1214C DC/DC/DC)
  • 工控:研华 IPC-610L(i7 处理器,8GB RAM,Windows 10 系统)
2. 软件架构

  1. ┌───────────────────────────────────────────┐
  2. │              上位机应用 (C#)               │
  3. │  ┌───────────────┐  ┌───────────────────┐ │
  4. │  │ VisionPro接口 │  │  PLC通信模块      │ │
  5. │  │ (Cognex DLL)  │  │ (S7.NET库)        │ │
  6. │  └───────────────┘  └───────────────────┘ │
  7. └───────────────────┬───────────────────────┘
  8.                     │
  9. ┌───────────────────┼───────────────────────┐
  10. │                   ▼                       │
  11. │  ┌─────────────────────┐  ┌──────────────┐ │
  12. │  │    VisionPro软件    │  │  PLC编程软件 │ │
  13. │  │ (Cognex Designer)   │  │ (TIA Portal) │ │
  14. │  └─────────────────────┘  └──────────────┘ │
  15. └───────────────────┬───────────────────────┘
  16.                     │
  17. ┌───────────────────┼───────────────────────┐
  18. │                   ▼                       │
  19. │  ┌─────────────────────┐  ┌──────────────┐ │
  20. │  │      工业相机       │  │    PLC硬件   │ │
  21. │  └─────────────────────┘  └──────────────┘ │
  22. └───────────────────────────────────────────┘
复制代码
三、VisionPro 项目开发

1. 创建检测使命

在 VisionPro Designer 中完成以下操作:


  • 设置相机参数(曝光时间、增益、触发模式)
  • 计划定位工具(PatMax 模式匹配)
  • 添加测量工具(卡尺、边缘检测)
  • 设置缺陷检测算法(Blob 分析、灰度对比)
  • 导出 C# 代码模板
2. 关键代码分析

以下是 VisionPro C# 接口的焦点代码:
  1. // 初始化VisionPro应用
  2. private CogApplication cogApp;
  3. private CogAcqFifoTool acqFifoTool;
  4. private CogPMAlignTool pmAlignTool;
  5. private CogBlobTool blobTool;
  6. // 加载VPP项目文件
  7. private void LoadVisionProProject(string projectPath)
  8. {
  9.     cogApp = new CogApplication();
  10.     cogApp.LoadFromFile(projectPath);
  11.    
  12.     // 获取各工具引用
  13.     acqFifoTool = cogApp.Tools["AcqFifoTool"] as CogAcqFifoTool;
  14.     pmAlignTool = cogApp.Tools["PMAlignTool"] as CogPMAlignTool;
  15.     blobTool = cogApp.Tools["BlobTool"] as CogBlobTool;
  16. }
  17. // 执行视觉检测
  18. public VisionResult RunInspection()
  19. {
  20.     // 触发图像采集
  21.     acqFifoTool.Run();
  22.     CogImage8Grey image = acqFifoTool.OutputImage as CogImage8Grey;
  23.    
  24.     // 执行定位
  25.     pmAlignTool.InputImage = image;
  26.     pmAlignTool.Run();
  27.    
  28.     // 执行缺陷检测
  29.     blobTool.InputImage = image;
  30.     blobTool.Offset = pmAlignTool.Results.GetPose(0);
  31.     blobTool.Run();
  32.    
  33.     // 返回检测结果
  34.     return new VisionResult
  35.     {
  36.         IsPass = blobTool.Results.GetBlobs().Count == 0,
  37.         DefectCount = blobTool.Results.GetBlobs().Count,
  38.         InspectionTime = DateTime.Now
  39.     };
  40. }
复制代码
四、PLC 通信实现

1. 通信协议选择

接纳S7.NET库实现 C# 与 Siemens S7 PLC 的通信,支持以下协议:



  • S7-200 SMART:S7.NET的 S7200SmartPlc 类
  • S7-1200/1500:S7.NET的 S71200Plc 类
  • 通信方式:TCP/IP(默认端口 102)
2. 焦点通信代码

  1. using S7.Net;
  2. public class PlcController : IDisposable
  3. {
  4.     private Plc plc;
  5.    
  6.     // 初始化PLC连接
  7.     public bool Connect(string ipAddress, CpuType cpuType = CpuType.S71200)
  8.     {
  9.         try
  10.         {
  11.             plc = new Plc(cpuType, ipAddress, 0, 1);
  12.             plc.Open();
  13.             return plc.IsConnected;
  14.         }
  15.         catch (Exception ex)
  16.         {
  17.             Console.WriteLine($"PLC连接失败: {ex.Message}");
  18.             return false;
  19.         }
  20.     }
  21.    
  22.     // 读取PLC数据
  23.     public bool[] ReadInputBits(int startAddress, int count)
  24.     {
  25.         if (!plc.IsConnected) return null;
  26.         
  27.         try
  28.         {
  29.             var data = plc.DBRead(1, startAddress, VarType.Bit, count);
  30.             return data.Cast<bool>().ToArray();
  31.         }
  32.         catch (Exception ex)
  33.         {
  34.             Console.WriteLine($"读取PLC数据失败: {ex.Message}");
  35.             return null;
  36.         }
  37.     }
  38.    
  39.     // 写入PLC数据
  40.     public bool WriteOutputBits(int startAddress, bool[] values)
  41.     {
  42.         if (!plc.IsConnected) return false;
  43.         
  44.         try
  45.         {
  46.             plc.DBWrite(1, startAddress, values);
  47.             return true;
  48.         }
  49.         catch (Exception ex)
  50.         {
  51.             Console.WriteLine($"写入PLC数据失败: {ex.Message}");
  52.             return false;
  53.         }
  54.     }
  55.    
  56.     // 释放资源
  57.     public void Dispose()
  58.     {
  59.         plc?.Close();
  60.         plc?.Dispose();
  61.     }
  62. }
复制代码
五、集成控制流程

1. 数据交互流程计划



  
  1. sequenceDiagram
  2.     participant C#上位机
  3.     participant VisionPro
  4.     participant PLC
  5.    
  6.     C#上位机->>PLC: 读取触发信号(DB1.DBX0.0)
  7.     alt 触发信号为ON
  8.         C#上位机->>VisionPro: 调用RunInspection()
  9.         VisionPro->>VisionPro: 图像采集与处理
  10.         VisionPro-->>C#上位机: 返回检测结果(OK/NG)
  11.         C#上位机->>PLC: 写入结果数据(DB1.DBW2:OK数量, DB1.DBW4:NG数量)
  12.         C#上位机->>PLC: 写入状态位(DB1.DBX0.1:处理完成)
  13.     else 触发信号为OFF
  14.         C#上位机->>C#上位机: 等待触发
  15.     end
复制代码
2. 主控制逻辑


  1. public class VisionSystem
  2. {
  3.     private readonly PlcController plcController;
  4.     private readonly VisionProController visionProController;
  5.     private Timer inspectionTimer;
  6.    
  7.     // 系统初始化
  8.     public void Initialize(string plcIp, string visionProProjectPath)
  9.     {
  10.         // 初始化PLC控制器
  11.         plcController = new PlcController();
  12.         plcController.Connect(plcIp);
  13.         
  14.         // 初始化VisionPro控制器
  15.         visionProController = new VisionProController();
  16.         visionProController.LoadVisionProProject(visionProProjectPath);
  17.         
  18.         // 设置定时检查PLC触发信号
  19.         inspectionTimer = new Timer(CheckTriggerSignal, null, 0, 100); // 每100ms检查一次
  20.     }
  21.    
  22.     // 检查PLC触发信号
  23.     private void CheckTriggerSignal(object state)
  24.     {
  25.         if (!plcController.IsConnected) return;
  26.         
  27.         // 读取PLC触发位(DB1.DBX0.0)
  28.         var triggerBits = plcController.ReadInputBits(0, 1);
  29.         if (triggerBits != null && triggerBits[0])
  30.         {
  31.             // 执行视觉检测
  32.             var result = visionProController.RunInspection();
  33.             
  34.             // 写入检测结果到PLC
  35.             plcController.WriteOutputBits(2, new bool[] { result.IsPass });  // DB1.DBX2.0:检测结果
  36.             plcController.WriteOutputBits(3, new bool[] { false });         // DB1.DBX3.0:重置触发信号
  37.         }
  38.     }
  39. }
复制代码
六、实战案例:电子元件外观检测

1. 项目需求



  • 检测 PCB 板上的 IC 芯片是否存在引脚变形、缺件等缺陷
  • 检测速度:≥10 件 / 秒
  • 缺陷精度:≥0.1mm
2. 解决方案



  • 硬件设置:Basler ace 相机 + 环形光源,Siemens S7-1200 PLC 控制流水线
  • 软件实现

    • VisionPro:使用 PatMax 定位芯片,Blob 分析检测引脚缺陷
    • C# 上位机:通过S7.NET与 PLC 通信,实现触发控制与结果反馈

  • 性能指标:检测精确率 99.8%,单帧处理时间≤80ms
3. 界面计划

csharp
  1. // 创建WPF界面显示检测结果
  2. public partial class MainWindow : Window
  3. {
  4.     private VisionSystem visionSystem;
  5.    
  6.     public MainWindow()
  7.     {
  8.         InitializeComponent();
  9.         visionSystem = new VisionSystem();
  10.     }
  11.    
  12.     private void btnStart_Click(object sender, RoutedEventArgs e)
  13.     {
  14.         // 启动系统
  15.         visionSystem.Initialize(txtPlcIp.Text, txtVisionProPath.Text);
  16.         lblStatus.Content = "系统运行中...";
  17.     }
  18.    
  19.     // 实时更新检测结果显示
  20.     private void UpdateResultDisplay(VisionResult result)
  21.     {
  22.         Dispatcher.Invoke(() =>
  23.         {
  24.             imgResult.Source = result.Image;
  25.             lblResult.Content = result.IsPass ? "合格" : "不合格";
  26.             lblDefectCount.Content = result.DefectCount.ToString();
  27.         });
  28.     }
  29. }
复制代码
七、常见题目与解决方案


  • 通信不稳定

    • 缘故原由:网络波动、PLC 程序辩说
    • 解决方案:增长心跳包机制,设置超时重连,优化 PLC 程序中的通信处理。

  • 视觉检测误判

    • 缘故原由:光照变化、相机抖动
    • 解决方案:添加动态阈值算法,使用机械臂固定相机位置,增长光源稳定性。

  • 系统相应耽误

    • 缘故原由:上位机性能不足、算法复杂度高
    • 解决方案:升级硬件设置,优化 VisionPro 算法(减少不必要的工具),接纳多线程处理。

八、总结与展望

本文详细介绍了基于 VisionPro 和 C# 实现呆板视觉与 PLC 集成的完备方案,包括系统架构计划、VisionPro 项目开发、PLC 通信实现及实际案例应用。通过这种集成方式,可明显进步工业生产线的自动化水平和检测精度。

将来趋势方面,结合深度学习的缺陷检测(如使用 YOLO 模子)和基于 OPC UA 的跨平台通信将成为主流,进一步提升智能制造的柔性化和智能化程度。

参考文献

  • Cognex VisionPro 官方文档
  • S7.NET开源库文档(GitHub - S7NetPlus/s7netplus: S7.NET+ -- A .NET library to connect to Siemens Step7 devices)
  • 西门子 S7 PLC 通信协议规范

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

快速回复 返回顶部 返回列表