文章目录

视觉传感器与PLC的数据交互编程

发布于 2026-03-23 21:16:07 · 浏览 3 次 · 评论 0 条

视觉传感器与PLC的数据交互编程

工业现场中,视觉传感器负责"看懂"产品,PLC负责"指挥"设备,二者之间的数据交互是自动化产线稳定运行的核心环节。本文从硬件连接、通信配置到程序编写,提供一套完整可落地的操作指南。


第一阶段:硬件连接与网络架构

1.1 确认通信接口类型

视觉传感器与PLC常见的物理连接方式有三种,根据现场条件选择

连接方式 适用场景 传输距离 特点
以太网 (Ethernet) 大数据量、高速检测 100米内 支持TCP/IP、UDP,可传图像
RS-485 / RS-232 简单指令、成本敏感 RS-485可达1200米 Modbus RTU协议为主
数字I/O 极简单场景(有无判断) 短距离 仅传输开关信号,无协议开销

检查 视觉传感器背面或侧面的接口标识:选择 与PLC匹配的端口。准备 对应线缆:超五类屏蔽网线(以太网)、双绞屏蔽线(RS-485)、或普通信号线(I/O)。

1.2 以太网连接实操(推荐方案)

执行 以下物理连接步骤:

  1. 查看 视觉传感器铭牌或手册,记录默认IP地址(常见如 192.168.0.1192.168.1.10)。
  2. 配置 电脑网卡IP为同网段(如传感器为 192.168.0.1,则电脑设为 192.168.0.100,子网掩码 255.255.255.0)。
  3. 连接 网线:一端插入传感器网口,另一端接入PLC的以太网模块,或经交换机中转。
  4. 验证 连通性:在电脑命令行输入 ping 192.168.0.1,收到回复即为物理连接正常。

配置 PLC端IP地址时,确保 与视觉传感器处于同一网段但末位不同。示例:

  • 视觉传感器:192.168.0.10
  • PLC:192.168.0.20
  • 子网掩码统一:255.255.255.0

第二阶段:通信协议配置

2.1 协议选择:TCP/IP vs Modbus TCP

协议 数据格式 编程复杂度 典型应用
TCP/IP 自由协议 自定义字符串/二进制 发送坐标、缺陷代码等变长数据
Modbus TCP 固定寄存器地址 读取检测数量、状态字等固定数据

2.2 视觉传感器端配置(以某主流品牌为例)

打开 视觉传感器的配置软件(通常为PC端工具或网页界面),按序执行

  1. 进入 "通信设置" → "以太网" 菜单。
  2. 选择 协议类型:Ethernet (TCP/IP Server)Modbus TCP Server
    • 若选TCP/IP:设定端口号(默认 20005000,记牢此数字)。
    • 若选Modbus TCP:设定单元ID(通常 1),确认支持的功能码(03读保持寄存器、16写多寄存器)。
  3. 定义 输出数据格式:
    • 格式模板示例OK,123,456,0(逗号分隔,依次为判定结果、X坐标、Y坐标、旋转角度)
    • 或二进制格式:4字节整数+4字节浮点数(PLC解析更快,但调试较麻烦)。
  4. 保存 配置并重启 传感器生效。

关键设置开启 "触发模式" 中的外部触发或连续触发,确保 PLC发出拍照指令后传感器才执行检测并回传数据。

2.3 PLC端网络配置(以西门子S7-1200/1500为例)

打开 TIA Portal软件,执行

  1. 添加 硬件:在设备组态中,拖拽 对应的以太网模块(如CM1241或集成PN口)至机架。
  2. 双击 PLC以太网接口,设置 IP地址 192.168.0.20,子网掩码 255.255.255.0
  3. 创建 新连接:
    • 项目树 → "设备和网络" → 双击 "连接"
    • 选择 连接类型:TCP连接ISO-on-TCP(西门子推荐)
    • 指定 伙伴为"未指定",手动输入视觉传感器IP 192.168.0.10 和端口号 2000

第三阶段:PLC程序编写

3.1 通信功能块调用

西门子PLC使用 TCON(建立连接)、TSEND(发送)、TRCV(接收)指令。编写 程序结构如下:

建立连接(TCON)

参数配置:
- REQ:上升沿触发连接(建议用首次扫描位M1.0)
- ID:连接标识号(如 W#16#0001)
- CONNECT:指向TCON_IP_V4数据结构的指针

CONNECT数据结构定义(数据块中创建):

参数名 数据类型 说明
interface_id HW_IO 64 硬件标识符(自动分配)
id CONN_OUC W#16#0001 连接ID,与TCON一致
connection_type Byte B#16#0B TCP协议
active_est Bool true 主动建立连接
remote_address IP_V4 192.168.0.10 视觉传感器IP
remote_port UInt 2000 传感器端口号
local_port UInt 0 本地端口自动分配

发送触发指令(TSEND)

- REQ:拍照触发信号(如传感器到位光电M10.0)
- ID:W#16#0001(与TCON一致)
- DATA:指向发送缓冲区(如 "CameraDB".SendBuffer)
- LEN:发送字节数(如 4,发送字符串"TRIG")

接收检测数据(TRCV)

- EN_R:允许接收,常TRUE或条件触发
- ID:W#16#0001
- DATA:指向接收缓冲区(如 "CameraDB".RecvBuffer,定义为Array[0..99] of Byte)
- LEN:最大接收长度(如 100)
- RCVD_LEN:实际接收字节数(输出参数)

3.2 数据解析程序

接收到的原始字节需转换为可用数据。假设 传感器发送ASCII字符串 OK,123,456,0

编写 解析逻辑(SCL语言示例):

// 将接收字节数组转换为字符串
#TempString := BYTE_TO_CHAR("CameraDB".RecvBuffer[0]);
FOR #i := 1 TO "CameraDB".RCVD_LEN - 1 DO
    #TempString := CONCAT(#TempString, BYTE_TO_CHAR("CameraDB".RecvBuffer[#i]));
END_FOR;

// 查找逗号位置分割字段
#Pos1 := FIND(IN1:=#TempString, IN2:=",");  // 第一个逗号位置
#ResultStr := LEFT(IN:=#TempString, L:=#Pos1-1);  // "OK" 或 "NG"

#RemainStr := RIGHT(IN:=#TempString, L:=LEN(#TempString)-#Pos1);
#Pos2 := FIND(IN1:=#RemainStr, IN2:=",");
#X_Str := LEFT(IN:=#RemainStr, L:=#Pos2-1);
#X_Coord := STRING_TO_INT(#X_Str);  // 转换为整数:123

优化方案:若传感器支持二进制输出,直接 使用 S7.Converting 库中的 RAW_TO_REALRAW_TO_DINT 指令,跳过字符串转换,提升效率。

3.3 关键数据映射建议

PLC变量地址 数据类型 内容说明 来源
DB_Camera.ResultOK Bool 检测合格标志 解析结果= "OK"
DB_Camera.PosX Real/DInt X方向位置 解析第2字段
DB_Camera.PosY Real/DInt Y方向位置 解析第3字段
DB_Camera.Angle Real 旋转角度 解析第4字段
DB_Camera.DataValid Bool 数据已更新 接收完成脉冲
DB_Camera.CommError Bool 通信超时/故障 TRCV的ERROR输出

第四阶段:异常处理与调试技巧

4.1 通信故障排查清单

现象:PLC无法连接传感器

  1. 检查 物理层:网线指示灯是否闪烁?更换 网线交叉测试。
  2. 验证 IP地址:在电脑端 ping 传感器IP,不通则检查传感器网络配置。
  3. 确认 端口号:传感器作为Server时,PLC需作为Client连接;检查 传感器是否已启动Server模式。
  4. 查看 PLC诊断缓冲区:TCON的STATUS输出非 0 时,对照手册查询错误码(如 80C4 表示连接建立失败)。

现象:数据接收不完整或乱码

  1. 核对 字节序:传感器发送大端序(高位在前),西门子PLC通常小端序,必要时 交换高低字节。
  2. 增加 接收延迟:传感器处理图像需时间,设置 PLC接收超时 1000ms 以上。
  3. 监控 实际接收长度:RCVD_LEN 与预期不符时,检查 传感器输出格式设置。

4.2 稳定性增强措施

编写 通信 watchdog 机制:

// 每秒递增计数器
IF NOT "Clock_1Hz" THEN
    #WatchDogCnt := #WatchDogCnt + 1;
    IF #WatchDogCnt > 5 THEN  // 5秒未收到数据
        "DB_Camera.CommError" := TRUE;
        // 执行重连:断开TCON,延迟500ms,重新触发TCON
        "TCON_REQ" := FALSE;
        #ReconnectTimer(IN:=TRUE, PT:=T#500ms);
        IF #ReconnectTimer.Q THEN
            "TCON_REQ" := TRUE;
            #WatchDogCnt := 0;
        END_IF;
    END_IF;
ELSE
    #WatchDogCnt := 0;  // 收到数据复位
    "DB_Camera.CommError" := FALSE;
END_IF;

第五阶段:实战场景与代码模板

5.1 场景:视觉引导机械手抓取

需求:传感器检测工件中心坐标,PLC换算为机械手目标位置。

坐标转换公式(如需相机标定):

$$ X_{robot} = (X_{pixel} - X_{center}) \times K_x + X_{offset} $$

$$ Y_{robot} = (Y_{pixel} - Y_{center}) \times K_y + Y_{offset} $$

其中 $K_x$、$K_y$ 为像素-毫米转换系数,通过标定板测定。

PLC实现

// 从视觉数据提取像素坐标
#PixelX := "DB_Camera.PosX";
#PixelY := "DB_Camera.PosY";

// 应用标定参数(参数存储于DB_Calibration)
#RobotX := (#PixelX - "DB_Calibration.CenterX") * "DB_Calibration.ScaleX" 
           + "DB_Calibration.OffsetX";
#RobotY := (#PixelY - "DB_Calibration.CenterY") * "DB_Calibration.ScaleY" 
           + "DB_Calibration.OffsetY";

// 输出到机械手
"DB_Robot.TargetX" := REAL_TO_DINT(#RobotX * 1000);  // 放大1000倍转为整数发送
"DB_Robot.TargetY" := REAL_TO_DINT(#RobotY * 1000);
"DB_Robot.StartMove" := "DB_Camera.ResultOK" AND "DB_Camera.DataValid";

5.2 场景:多产品切换参数

实现:PLC通过发送产品型号代码,切换视觉传感器的检测程序。

传感器端配置创建 多个检测程序(Job0、Job1、Job2...),设置 外部切换命令。

PLC发送格式JOB,1(切换至Job1)

程序逻辑

// HMI选择产品型号 0-9
CASE "HMI.SelectedProduct" OF
    0: #JobCmd := 'JOB,0';
    1: #JobCmd := 'JOB,1';
    2: #JobCmd := 'JOB,2';
    ...
END_CASE;

// 型号变更时触发发送
IF "HMI.SelectedProduct" <> #LastProduct THEN
    #SendBuffer := STRING_TO_BYTES(#JobCmd);
    "TSEND_REQ" := TRUE;
    #LastProduct := "HMI.SelectedProduct";
END_IF;

第六阶段:Modbus TCP简化方案

若视觉传感器和PLC均支持Modbus TCP,可大幅简化编程

6.1 传感器寄存器映射(示例)

Modbus地址 数据类型 内容
40001 UInt16 检测结果代码(0=NG, 1=OK, 2=未触发)
40002 Int16 X坐标高位
40003 Int16 X坐标低位
40004 Int16 Y坐标高位
40005 Int16 Y坐标低位

6.2 PLC端使用MB_CLIENT

参数:
- REQ:读取触发
- DISCONNECT:FALSE(保持连接)
- MB_MODE:0(读)
- MB_DATA_ADDR:40001(起始地址)
- MB_DATA_LEN:5(读取5个寄存器)
- MB_DATA_PTR:指向 "CameraDB".ModbusData[0..4]

解析32位坐标(高低字组合):

// X坐标:40002为高16位,40003为低16位
"DB_Camera.PosX" := "CameraDB".ModbusData[1] * 65536 + "CameraDB".ModbusData[2];
// 或有符号转换
"DB_Camera.PosX_DINT" := (DINT_TO_DWORD("CameraDB".ModbusData[1]) * 65536) 
                         + UINT_TO_UDINT("CameraDB".ModbusData[2]);

完成以上配置后,执行 全功能测试:触发拍照 → 验证数据解析 → 检查异常处理 → 24小时稳定性跑机。记录 通信周期时间(建议控制在 50-200ms 内),必要时优化图像处理参数或升级网络带宽。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文