机器人上下料数据采集方案
汇川Easy320 PLC + 新松多可协作机器人,Modbus TCP通讯,10x12料盘管理,首件/周期抽检逻辑,C# WPF上位机实时监控
01 项目背景与需求
场景描述
某机加工车间,1台CNC加工中心配1台新松多可协作机器人做上下料。工件放在10×12的料盘上(共120个位置),机器人从料盘取毛坯放到CNC加工,加工完成后取成品放回料盘。需要监控整个生产过程,统计产量,管理料盘状态,实现首件和周期抽检。
核心需求
02 系统架构
PLC主控 + 机器人执行 + 上位机监控,三层架构,Modbus TCP统一通讯
- PLC做主控,机器人做执行:所有逻辑判断(料盘管理/抽检/报警)都在PLC里,机器人只执行PLC的指令(取料/放料/移动)。这样换机器人不用改逻辑,换PLC程序结构也清晰
- 握手信号用三段式:置位请求→等待应答→复位请求,不用脉冲信号(容易丢)。每个信号加超时检测,超时报警停机
- 寄存器映射提前规划:料盘状态/设备状态/产量/报警/参数,每类一段连续地址,写在Excel里PLC和上位机共用。避免后期加点位地址乱掉
- 上位机不做实时控制:上位机只做数据采集和显示,不参与控制逻辑。上位机挂了不影响生产,重启后自动重连恢复数据
03 部署要点(关键配置)
PLC寄存器规划
提前规划好Modbus寄存器映射表:40001-40120料盘状态、40121-40150设备状态、40151-40180产量计数、40181-40200报警代码、40201-40250参数配置。写在Excel里,PLC和上位机共用同一份表,避免地址不一致
PLC握手程序
实现"置位-等待-复位"三段式握手,每个握手信号加超时检测(5秒),超时触发报警并停机。用状态机组织主逻辑:待机/运行/首检/周检/异常,状态转移条件写在单独的转移表中,便于维护
机器人程序
机器人程序用模块化:取料子程序(参数:料盘行列号)、放料子程序(参数:工位号)、移动子程序(参数:目标坐标)。主程序只做状态判断和子程序调用。坐标用相对坐标系(基于料盘原点),换型时只改原点坐标
上位机架构
WPF + MVVM架构:Model层(数据模型+Modbus通讯)、ViewModel层(业务逻辑+数据转换)、View层(界面展示)。Modbus通讯用第三方库(NModbus4或EasyModbus),封装成独立的通讯服务类,支持断线自动重连
料盘可视化
用ItemsControl+DataTemplate渲染10x12料盘格子,每个格子绑定状态(空/有料/已加工/异常),用颜色区分。支持点击格子查看详情(该位置产品信息/加工时间/操作员)。用Canvas做绝对定位可以更精确控制格子间距和大小
数据存储与报表
生产数据(产量/节拍/报警)通过MQTT或REST API写入TDengine,上位机本地也存一份SQLite做离线缓存。报表用EPPlus生成Excel,支持日报/周报/月报,包含产量统计、OEE计算、报警汇总、节拍分析。每天8点自动生成前一天报表并邮件发送
04 踩过的坑(真实问题与解决方案)
机器人上下料项目最容易出问题的就是通讯握手和料盘管理,这里是真实踩过的5个坑
05 关键代码片段
三段式握手(PLC结构化文本示例)
// 请求机器人取料
IF 取料请求 = FALSE AND 取料应答 = FALSE AND 需要取料 THEN
取料请求 := TRUE; // 1. 置位请求
取料超时计时 := 0;
END_IF;
// 等待应答
IF 取料请求 = TRUE AND 取料应答 = FALSE THEN
取料超时计时 := 取料超时计时 + 1;
IF 取料超时计时 > 500 THEN // 5秒超时(10ms扫描)
报警_机器人取料超时 := TRUE;
系统状态 := 异常;
END_IF;
END_IF;
// 收到应答,复位请求
IF 取料请求 = TRUE AND 取料应答 = TRUE THEN
取料请求 := FALSE; // 3. 复位请求
END_IF;
// 机器人复位应答后,完成一次取料
IF 取料请求 = FALSE AND 取料应答 = TRUE THEN
取料应答 := FALSE;
当前料位 := 当前料位 + 1;
产量计数 := 产量计数 + 1;
END_IF; Modbus批量读取(C# WPF示例)
// 一次性读取120个料盘状态寄存器(40001-40120)
// 保证数据一致性,不会出现前后批次时间差
public async Task<ushort[]> ReadTrayStatusAsync()
{
if (_client == null || !_client.Connected)
{
await ReconnectAsync();
}
try
{
// Modbus TCP单次最多读125个寄存器,120个刚好一次读完
var result = await _client.ReadHoldingRegistersAsync(
slaveAddress: 1,
startAddress: 0, // 40001对应地址0
numberOfPoints: 120); // 一次读120个
return result;
}
catch (Exception ex)
{
_logger.LogError(ex, "读取料盘状态失败");
await ReconnectAsync();
throw;
}
} 06 相关软件与工具
需要机器人上下料或PLC通讯方案?
丁丁做过汇川PLC+新松机器人的真实项目,熟悉Modbus TCP通讯、料盘管理、抽检逻辑、WPF上位机开发。可以帮你做方案设计、PLC程序、上位机开发、现场调试。