视觉传感器与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 以太网连接实操(推荐方案)
执行 以下物理连接步骤:
- 查看 视觉传感器铭牌或手册,记录默认IP地址(常见如
192.168.0.1或192.168.1.10)。 - 配置 电脑网卡IP为同网段(如传感器为
192.168.0.1,则电脑设为192.168.0.100,子网掩码255.255.255.0)。 - 连接 网线:一端插入传感器网口,另一端接入PLC的以太网模块,或经交换机中转。
- 验证 连通性:在电脑命令行输入
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端工具或网页界面),按序执行:
- 进入 "通信设置" → "以太网" 菜单。
- 选择 协议类型:
Ethernet (TCP/IP Server)或Modbus TCP Server。- 若选TCP/IP:设定端口号(默认
2000或5000,记牢此数字)。 - 若选Modbus TCP:设定单元ID(通常
1),确认支持的功能码(03读保持寄存器、16写多寄存器)。
- 若选TCP/IP:设定端口号(默认
- 定义 输出数据格式:
- 格式模板示例:
OK,123,456,0(逗号分隔,依次为判定结果、X坐标、Y坐标、旋转角度) - 或二进制格式:4字节整数+4字节浮点数(PLC解析更快,但调试较麻烦)。
- 格式模板示例:
- 保存 配置并重启 传感器生效。
关键设置:开启 "触发模式" 中的外部触发或连续触发,确保 PLC发出拍照指令后传感器才执行检测并回传数据。
2.3 PLC端网络配置(以西门子S7-1200/1500为例)
打开 TIA Portal软件,执行:
- 添加 硬件:在设备组态中,拖拽 对应的以太网模块(如CM1241或集成PN口)至机架。
- 双击 PLC以太网接口,设置 IP地址
192.168.0.20,子网掩码255.255.255.0。 - 创建 新连接:
- 项目树 → "设备和网络" → 双击 "连接"
- 选择 连接类型:
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_REAL、RAW_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无法连接传感器
- 检查 物理层:网线指示灯是否闪烁?更换 网线交叉测试。
- 验证 IP地址:在电脑端
ping传感器IP,不通则检查传感器网络配置。 - 确认 端口号:传感器作为Server时,PLC需作为Client连接;检查 传感器是否已启动Server模式。
- 查看 PLC诊断缓冲区:TCON的STATUS输出非
0时,对照手册查询错误码(如80C4表示连接建立失败)。
现象:数据接收不完整或乱码
- 核对 字节序:传感器发送大端序(高位在前),西门子PLC通常小端序,必要时 交换高低字节。
- 增加 接收延迟:传感器处理图像需时间,设置 PLC接收超时
1000ms以上。 - 监控 实际接收长度:
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 内),必要时优化图像处理参数或升级网络带宽。

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