在工业自动化现场,PLC通过CAN总线采集传感器数据时出现丢包问题,是困扰不少工程师的典型故障。我最近参与的一个食品包装产线改造项目就遇到了类似情况——S7-1200 PLC通过CANopen网关采集6个扭矩传感器的数据时,平均每2小时就会出现1-2次数据丢失,导致包装机械臂误动作。
经过现场抓包分析,发现丢包集中在以下三种场景:
关键现象提示:当CAN总线负载率超过60%时,丢包概率呈指数级上升。通过CANalyzer抓包发现,问题时段总线负载峰值达到78%。
多数现场采用的典型方案是:
code复制传感器 → CAN收发器 → 隔离模块 → MCU协议栈 → PLC背板总线
这种架构存在三个致命缺陷:
缓冲区溢出
低端网关的CAN缓冲区通常只有4-8个报文深度,当遇到突发流量时(如设备群启),报文会被直接丢弃。某国产网关在测试中,连续发送20条报文就会丢3-5条。
定时器不同步
普通MCU的软件CAN协议栈处理时延波动大。实测STM32F103的CANopen堆栈,在PDO传输时段会出现15-20ms的抖动,导致PLC侧采样超时。
无优先级管理
紧急事件(如Emergency报文)与普通数据混传时,缺乏硬件级优先级仲裁。某次电机过载报警就因为被扭矩数据阻塞,延迟了800ms才送达。
我们拆解故障网关发现:
这导致在变频器工作时,CAN总线误码率从10^-6恶化到10^-4。
新方案采用三层隔离设计:
code复制传感器 → 带隔离的CAN FD收发器(ISO1042)
→ 专用CAN控制器(MCP2517FD)
→ 光耦隔离 → FPGA协议处理 → 工业交换机
关键改进点:
双缓冲机制
MCP2517FD提供32报文深度的FIFO,配合FPGA的DMA传输,实测可承受500条/秒的突发流量零丢包。
硬件时间戳
内置高精度时钟(±50ppm),为每个报文打标纳秒级时间戳,解决PLC采样抖动问题。
流量整形
FPGA实现令牌桶算法,对非关键报文进行带宽限制,确保Emergency报文永远有20%的保留带宽。
根据ISO11898-2标准重新设计:
实测显示,新方案的电磁抗扰度通过:
以下为关键参数示例(DS402协议):
ini复制[对象字典]
# 接收PDO映射
1800h = 0x80000200 # 禁止预定义映射
1A00h = 0x60640020@32 # 映射位置实际值(0x6064)到PDO1
1A01h = 0x60770010@16 # 映射扭矩实际值(0x6077)到PDO1
# 发送PDO配置
1400h = 0xFE0000C8 # 事件定时器200ms
1800h = 0xC00000FA # 同步窗口时间250ms
在TIA Portal中需要设置:
使用CANstress注入工具模拟以下场景:
监测指标包括:
案例1:同步帧后首个PDO丢失
解决方法:修改对象字典1B00h子索引3(同步计数器溢出值)从240改为120。
案例2:PLC收不到心跳包
排查步骤:
| 指标 | 传统方案 | 本方案 |
|---|---|---|
| 最大吞吐量 | 800帧/秒 | 2000帧/秒 |
| 延迟标准差 | ±18ms | ±1.2ms |
| 抗干扰能力 | 通过Level 2 | 通过Level 4 |
| 紧急事件响应 | 300-800ms | <50ms |
| 典型成本 | ¥800-1500 | ¥2500-4000 |
对于连续生产的关键设备,建议选择本方案。如果是非关键监测点,可保留传统方案但需增加以下补偿措施:
定期检查
每季度用CAN总线分析仪检查:
固件升级
关注网关厂商发布的EMC优化补丁,例如:
备件管理
建议储备:
这套方案在食品包装线上稳定运行9个月后,丢包率从原来的0.8%降至0.0001%,设备综合效率(OEE)提升11%。对于更高要求的场景,下一步可考虑改用TSN网络替代传统CAN总线。