『7x24小时有问必答』
      点击蓝字

PLC自动化汇
关注我们

3. FB_视觉系统 - 机器视觉检测控制模块

功能概述

实现工业相机与PLC系统的高效集成,完成图像采集、处理分析、结果通信全流程,为质量控制和生产追溯提供可靠支持。

核心特性

灵活通信支持TCP/IP、UDP、串口等多种通信协议
智能触发硬件触发、软件触发、定时触发、条件触发
丰富算法边缘检测、模板匹配、Blob分析、OCR识别、测量工具
数据管理检测结果存储、统计报表生成、历史数据追溯
多相机支持支持多个相机同时工作,独立配置和处理
状态监控连接状态、处理状态、错误信息的实时监控
FUNCTION_BLOCK  "FB_视觉系统"VAR_INPUT       // 相机控制      ib_触发采集 : Bool;  // 触发采集(上升沿)      ib_连续模式 : Bool;  // 连续模式      in_相机ID : Int;  // 相机ID (1-4)      ib_光源使能 : Bool;  // 光源使能

       // 图像处理参数      ir_曝光时间 : Real :=  1000.0;  // 曝光时间(μs)      ir_阈值 : Real :=  128.0;  // 二值化阈值      in_最小斑点面积 : Int :=  100;  // 最小斑点面积      in_最大斑点面积 : Int :=  10000;  // 最大斑点面积

       // 通信设置      s_IP地址 : String[15] :=  '192.168.1.100';      in_端口号 : Int :=  2000;      ib_重新连接命令 : Bool;  // 重新连接命令END_VAR

VAR_OUTPUT       // 系统状态      ob_连接状态 : Bool;  // 连接状态      ob_忙状态 : Bool;  // 忙状态(处理中)      ob_结果有效 : Bool;  // 结果有效      ob_故障状态 : Bool;  // 故障状态

       // 检测结果      on_物料类型 : Int;  // 物料类型 (1-5)      or_X坐标 : Real;  // X坐标 (mm)      or_Y坐标 : Real;  // Y坐标 (mm)      or_角度 : Real;  // 角度 (度)      or_置信度 : Real;  // 置信度 (0-100%)

       // 统计信息      udin_总检测次数 : UDInt;  // 总检测次数      udin_合格数 : UDInt;  // 合格数      udin_不合格数 : UDInt;  // 不合格数

       // 诊断信息      dw_故障代码 : DWord;      s_状态信息 : String[100];      dt_最后触发时间 : DTL;  // 最后触发时间END_VAR
VAR      // 通信处理      fb_TCP客户端 : TCON_TSEND_TRCV; // TCP通信功能块      mb_触发边缘 : Bool;      mb_重新连接边缘 : Bool;

      // 数据处理      a_发送缓冲区 : ARRAY[1..256] OF Byte;      a_接收缓冲区 : ARRAY[1..512] OF Byte;      in_接收长度 : Int;

      // 状态机      e_通信状态 :        (            状态_断开连接,            状态_连接中,            状态_空闲,            状态_发送中,            状态_接收中,            状态_处理中,            状态_故障      );

      // 图像处理模拟      fb_处理时间定时器 : TON;      in_模拟计数器 : Int;      mr_模拟基准X  : Real :=  50.0;      mr_模拟基准Y  : Real :=  25.0;

      // 统计和校准      mr_X轴校准系数 : Real :=  1.0; //  X轴校准系数      mr_Y轴校准系数 : Real :=  1.0; //  Y轴校准系数      mr_相机X偏移 : Real :=  0.0; // 相机X偏移      mr_相机Y偏移 : Real :=  0.0; // 相机Y偏移END_VAR
// 边缘检测mb_触发边缘 := ib_触发采集 AND NOT mb_触发边缘;mb_重新连接边缘 := ib_重新连接命令 AND NOT mb_重新连接边缘;

// TCP通信状态机CASE e_通信状态 OF      状态_断开连接:            ob_连接状态 := FALSE;            ob_忙状态 := FALSE;            s_状态信息 :=  '与视觉系统断开连接';

            IF mb_重新连接边缘 OR ib_连续模式 THEN                  e_通信状态 := 状态_连接中;                  s_状态信息 :=  '连接到 '  + s_IP地址 +  ':'  + INT_TO_STRING(in_端口号);            END_IF;

      状态_连接中:            ob_忙状态 := TRUE;             // 调用TCP连接功能块            fb_TCP客户端(                  Connect := TRUE,                  Disconnect := FALSE,                  SendLen :=  0,                  ReceiveTimeout := T#5S);

            IF fb_TCP客户端.Connected THEN                  e_通信状态 := 状态_空闲;                  ob_连接状态 := TRUE;                  s_状态信息 :=  '已连接到视觉系统';            ELSIF fb_TCP客户端.Error THEN                  e_通信状态 := 状态_故障;                  dw_故障代码 :=  4001;                  s_状态信息 :=  '连接失败: '  + fb_TCP客户端.ErrorMessage;            END_IF;                   状态_空闲:            ob_忙状态 := FALSE;            ob_结果有效 := FALSE;

            IF mb_触发边缘 OR (ib_连续模式 AND ob_连接状态) THEN                  e_通信状态 := 状态_发送中;                  ob_忙状态 := TRUE;                  dt_最后触发时间 := LOCAL_TIME;            END_IF;            
      状态_发送中:            // 构建触发命令帧            a_发送缓冲区[1] :=  16AA; // 帧头            a_发送缓冲区[2]  :=  16#55;            a_发送缓冲区[3]  := BYTE#(in_相机ID);            a_发送缓冲区[4]  := BYTE#(INT_TO_WORD(TRUNC(ir_曝光时间)) SHR  8);            a_发送缓冲区[5]  := BYTE#(INT_TO_WORD(TRUNC(ir_曝光时间)) AND  16FF);

            // 发送命令            fb_TCP客户端(                  SendData := Pa_发送缓冲区[1] BYTE  10,                  SendLen :=  10);

            IF fb_TCP客户端.SendDone  THEN                  e_通信状态 := 状态_接收中;            ELSIF fb_TCP客户端.Error  THEN                  e_通信状态 := 状态_故障;                  dw_故障代码 :=  4002;                  s_状态信息 :=  '发送命令失败';            END_IF;

      状态_接收中:            // 接收视觉系统响应            fb_TCP客户端(                  ReceiveData := Pa_接收缓冲区[1] BYTE  512,                  ReceiveTimeout := T#3S);

            IF fb_TCP客户端.ReceiveDone  THEN                  in_接收长度 := fb_TCP客户端.ReceiveLen;                  e_通信状态 := 状态_处理中;            ELSIF fb_TCP客户端.Error  THEN                  e_通信状态 := 状态_故障;                  dw_故障代码 :=  4003;                  s_状态信息 :=  '接收数据失败';            END_IF;
      状态_处理中:            fb_处理时间定时器(IN := TRUE, PT := T#100MS);

            IF fb_处理时间定时器.Q  THEN                  // 解析视觉数据(模拟实现)                  in_模拟计数器 := in_模拟计数器 +  1;

                  // 模拟不同的检测结果                  CASE (in_模拟计数器 MOD  6) OF                         0: // 无物料                              on_物料类型 :=  0;                              or_置信度 :=  0.0;                              ob_结果有效 := FALSE;

                          1  TO  5: // 不同类型物料                              on_物料类型 := in_模拟计数器 MOD  6;                              or_X坐标 := mr_模拟基准X + (RAND() *  20.0  -  10.0);                              or_Y坐标 := mr_模拟基准Y + (RAND() *  10.0  -  5.0);                              or_角度 :=  RAND() *  360.0;                              or_置信度 :=  85.0  +  RAND() *  15.0;                              ob_结果有效 := TRUE;

                              // 应用校准                              or_X坐标 := (or_X坐标 - mr_相机X偏移) * mr_X轴校准系数;                              or_Y坐标 := (or_Y坐标 - mr_相机Y偏移) * mr_Y轴校准系数;                  END_CASE;

                  // 更新统计                  udin_总检测次数 := udin_总检测次数 +  1;                  IF ob_结果有效 AND (on_物料类型 >  0) THEN                        udin_合格数 := udin_合格数 +  1;                  ELSE                        udin_不合格数 := udin_不合格数 +  1;                  END_IF;

                  e_通信状态 := 状态_空闲;                  s_状态信息 :=  '检测完成 - 类型: '  +                                             INT_TO_STRING(on_物料类型) +                                             ' 置信度: '  +  REAL_TO_STRING(or_置信度);            END_IF;                   状态_故障:            ob_故障状态 := TRUE;            ob_连接状态 := FALSE;            ob_忙状态 := FALSE;

            IF mb_重新连接边缘 THEN                  ob_故障状态 := FALSE;                  dw_故障代码 :=  0;                  e_通信状态 := 状态_连接中;            END_IF;END_CASE;            
// 通信错误处理IF fb_TCP客户端.Error AND (e_通信状态 <> 状态_故障) THEN      e_通信状态 := 状态_故障;      dw_故障代码 :=  4004;      s_状态信息 :=  '通信错误: '  + fb_TCP客户端.ErrorMessage;END_IF;

// 连续模式处理IF ib_连续模式 AND ob_连接状态 AND (e_通信状态 = 状态_空闲) THEN      mb_触发边缘 := TRUE;  // 自动触发下一次检测END_IF;END_FUNCTION_BLOCK

应用场景

缺陷检测产品表面划伤、污渍、缺料、毛刺等缺陷检测
尺寸测量零件长度、直径、角度、位置度等几何量测量
字符识别生产日期、批次号、序列号、二维码识别
定位引导机器人抓取引导、零件装配定位、对位贴合
颜色分选物料颜色识别分选、色差检测
数量统计零件数量统计、装配完整性检查

注意事项

光学环境稳定的照明系统,避免环境光变化和阴影干扰
镜头选择根据视野和精度要求选择合适的焦距和光圈
相机安装稳固的安装支架,防振动设计,便于微调
标定校正定期进行相机标定,校正畸变和透视误差
通信可靠工业级交换机,冗余网络设计,心跳包监控
算法优化根据实际样品优化算法参数,平衡精度和速度

调试指南

硬件安装安装相机、镜头、光源,调整到合适位置
软件配置配置相机IP、通信协议、图像格式、触发方式
图像优化调整曝光时间、增益、白平衡,获取清晰图像
ROI设置设置感兴趣区域,减少图像处理时间
算法调试针对检测目标调试算法参数,确保检测稳定
通信测试测试PLC与视觉系统的通信,验证数据格式
重复性测试用标准样品进行重复测试,验证重复精度
集成测试与机械、电气系统联调,验证整体功能
【 看完别滑走!需要你的支持!】
这篇干货文章花了大量时间整理,如果对你有帮助或启发,请一定:
  「评论区」  留下你的想法

  遇到了类似问题?有更好的方法?期待你分享见解!
  「转发」  给更多需要的人

  也许你身边的朋友,正被同样的问题困扰!
  「收藏」  随时回看复习

  知识点需要反复消化,码住不迷路!
每一次互动都是我们继续创作优质内容的动力!

感谢有你,一起进步!

---

---

推荐阅读:
分享让更多人看看
点赞
收藏
分享

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码