1. 项目概述:基于欧姆龙NJ系列PLC的电池生产线控制系统
凌晨三点,当最后一台IS620N伺服电机终于按照预设轨迹平稳运转时,我靠在配电柜旁长舒一口气。这套采用欧姆龙NJ-1400 PLC搭建的电池生产线控制系统,通过EtherCAT总线同时调度24个伺服轴、6台工业扫码枪和近百个远程IO终端,最终实现了每小时1200支锂电池的稳定产出。作为工业自动化从业者,我想分享这个典型的多轴运动控制项目中的实战经验。
这套系统的核心挑战在于大规模实时设备协同控制。与传统离散IO控制不同,我们需要处理:
- 24个伺服轴的同步运动控制(定位精度±0.1mm)
- 6台扫码枪的毫秒级响应数据采集
- 产线各工段超过200个IO信号的实时监控
- 所有设备状态在威纶通HMI上的可视化呈现
2. 硬件架构设计
2.1 控制系统拓扑
系统采用典型的"PLC+远程IO"架构:
code复制NJ-1400 PLC(主站)
├─ EtherCAT主干网
├─ 1#伺服驱动器(IS620N-1)
├─ 2#伺服驱动器(IS620N-2)
├─ ...
├─ 24#伺服驱动器(IS620N-24)
├─ 扫码枪网关(Profinet转EtherCAT)
│ ├─ 扫码枪1
│ ├─ ...
│ └─ 扫码枪6
└─ 远程IO终端(EL1809/EL2809)
├─ 上料段IO组
├─ 注液段IO组
└─ ...
2.2 关键设备选型
| 设备类型 | 型号 | 关键参数 | 选型理由 |
|---|---|---|---|
| PLC主站 | NJ-1400 | 4核CPU/2GB内存 | 满足多轴复杂算法需求 |
| 伺服驱动器 | IS620N | 400W/23bit绝对值编码器 | 欧姆龙生态兼容性最佳 |
| 远程IO模块 | EL1809/EL2809 | 16DI/8DO | 支持热插拔维护 |
| 工业扫码枪 | Keyence SR-1000 | 0.3ms解码速度 | 适应高速流水线环境 |
特别注意:EtherCAT从站设备的排列顺序必须与实际物理拓扑完全一致,否则会导致网络初始化失败。我们曾因实习生调换了两台伺服驱动器的接线顺序,导致整个网络瘫痪。
3. 软件架构设计
3.1 ST语言编程框架
采用结构化文本(ST)语言开发,相比梯形图更适合复杂算法实现。程序架构分为三个层级:
- 设备层:封装伺服控制、扫码枪通讯等基础功能块
- 工艺层:实现上料、注液等生产工序逻辑
- 调度层:协调各工序节拍与异常处理
structuredtext复制// 典型伺服控制FB块结构示例
FUNCTION_BLOCK AxisControl
VAR_INPUT
bEnable: BOOL; // 使能信号
fTargetPos: LREAL; // 目标位置(mm)
END_VAR
VAR_OUTPUT
bInPosition: BOOL; // 到位信号
fActualPos: LREAL; // 实际位置
END_VAR
VAR
tState: INT := 0; // 状态机
END_VAR
// 状态机实现
CASE tState OF
0: // 初始化
MC_Power(Axis:=axis1, Enable:=TRUE);
tState := 10;
10: // 定位
IF bEnable THEN
MC_MoveAbsolute(axis1, fTargetPos, 200.0, 1000.0);
tState := 20;
END_IF
20: // 等待到位
bInPosition := MC_ReadStatus(axis1).InPosition;
fActualPos := MC_ReadActualPosition(axis1);
IF NOT bEnable THEN tState := 0; END_IF
END_CASE
3.2 多轴同步控制策略
24个伺服轴采用"虚拟主轴+电子齿轮"的同步方案:
- 将1#轴设为主轴,其余轴通过MC_GearIn指令同步
- 同步误差控制在±3个编码器脉冲内
- 采用"预压紧→同步启动"策略避免启动冲击
structuredtext复制// 电子齿轮同步示例
MC_GearIn(
Master:=axis1, // 主轴
Slave:=axis2, // 从轴
RatioNumerator:=1, // 分子
RatioDenominator:=1, // 分母
StartMode:=Absolute, // 绝对位置同步
BufferMode:=Aborting // 中断模式
);
4. EtherCAT网络优化
4.1 PDO映射配置
每个伺服驱动器的过程数据对象(PDO)需要精确配置:
| 索引 | 子索引 | 参数名称 | 数据类型 | 备注 |
|---|---|---|---|---|
| 0x6060 | 0x00 | 控制字 | UINT16 | 启停/复位控制 |
| 0x6064 | 0x00 | 位置给定值 | INT32 | 单位:脉冲 |
| 0x606C | 0x00 | 速度给定值 | INT32 | 单位:rpm |
| 0x607A | 0x00 | 实际位置 | INT32 | 反馈值 |
血泪教训:PDO映射必须按照设备物理顺序配置。某次调试中将17#轴的0x6064映射到18#轴,导致两轴相互干扰引发剧烈振荡。
4.2 网络性能调优
-
分布式时钟同步:
- 启用DC(Distributed Clock)功能
- 同步周期设置为1ms
- 时钟偏移控制在±100ns内
-
通讯周期设置:
- 伺服控制周期:500μs
- IO刷新周期:2ms
- 扫码枪数据周期:10ms
-
带宽占用监控:
structuredtext复制// 网络负载检测逻辑 IF EtherCAT_Master.NetworkLoad > 0.7 THEN AlarmLog(ERR_NET_OVERLOAD); EmergencyStop(); END_IF
5. 扫码枪数据采集
5.1 通讯协议处理
6台扫码枪通过Profinet网关接入,数据采集采用轮询方式:
structuredtext复制WHILE TRUE DO
FOR i:=1 TO 6 DO
IF scanGun[i].bNewData THEN
sBarcode := BYTE_TO_STRING(scanGun[i].Data);
// 条码有效性校验
IF STRLEN(sBarcode) = 20 THEN
arrBarcodeQueue[i] := sBarcode;
scanGun[i].bAck := TRUE;
ELSE
AlarmLog(ERR_INVALID_BARCODE);
END_IF
END_IF
END_FOR
DELAY 50; // 关键参数!低于30ms会导致通讯异常
END_WHILE
5.2 异常处理机制
-
电磁干扰对策:
- 在网关输入端加装磁环
- 通讯电缆采用双层屏蔽线
- 数据帧增加CRC16校验
-
超时重试策略:
structuredtext复制// 扫码超时处理 tTimeout(IN:=NOT scanGun[1].bNewData, PT:=T#2s); IF tTimeout.Q THEN scanGun[1].bReset := TRUE; AlarmLog(WARN_SCAN_TIMEOUT); END_IF
6. IO信号处理
6.1 结构化IO管理
将200+个IO信号按工艺段分组管理:
structuredtext复制TYPE IO_Group :
STRUCT
// 上料段
bConveyorRun : BOOL; // 输送带运行
bSafetyDoor : BOOL; // 安全门状态
// 注液段
fElectrolytePressure : REAL; // 电解液压力(MPa)
bHeaterStatus : ARRAY[1..4] OF BOOL; // 加热管状态
END_STRUCT
END_TYPE
VAR
stLoadingIO : IO_Group; // 上料段IO组
stInjectionIO : IO_Group; // 注液段IO组
END_VAR
6.2 信号滤波处理
针对机械触点抖动问题,实现数字滤波功能块:
structuredtext复制FUNCTION DigitalFilter : BOOL
VAR_INPUT
bRawSignal : BOOL;
tDebounceTime : TIME := T#200ms;
END_VAR
VAR
tTimer : TON;
END_VAR
tTimer(IN:=bRawSignal, PT:=tDebounceTime);
DigitalFilter := tTimer.Q;
7. HMI交互设计
威纶通触摸屏实现以下功能界面:
- 总览页面:产线节拍、良率、设备状态监控
- 轴控页面:各伺服轴的位置/速度实时显示
- 配方管理:不同电池型号的生产参数预设
- 报警历史:按优先级分类的报警记录
structuredtext复制// HMI数据刷新逻辑
IF tHMI_Refresh.Q THEN
// 伺服状态更新
FOR i:=1 TO 24 DO
HMI_WriteTag("Axis" + INT_TO_STRING(i) + ".Pos",
MC_ReadActualPosition(axis[i]));
END_FOR
// 生产计数更新
HMI_WriteTag("Production.Count", iTotalCount);
END_IF
8. 调试经验总结
8.1 典型问题排查
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| EtherCAT网络频繁断线 | 终端电阻未启用 | 检查末端设备的电阻开关 |
| 伺服轴跟随误差过大 | 刚性参数设置不当 | 重新进行伺服自动调谐 |
| 扫码枪数据丢帧 | 电磁干扰 | 加装磁环并检查接地 |
| IO信号随机抖动 | 接线端子松动 | 使用压接端子并做防振处理 |
8.2 性能优化建议
-
运动控制优化:
- 使用S型速度曲线减少机械冲击
- 提前计算路径避免急停
- 启用伺服的自适应滤波功能
-
程序结构优化:
structuredtext复制// 使用FB实例化提高代码复用 FOR i:=1 TO 24 DO fbAxisControl[i]( bEnable := bAxisEnable[i], fTargetPos := rTargetPos[i] ); END_FOR -
维护性设计:
- 所有关键参数做成HMI可调
- 重要变量添加中文注释
- 版本变更记录嵌入程序头
这套系统最终实现了99.2%的设备综合效率(OEE),但最让我自豪的是在程序注释里写下的那句话:"当第24个轴终于动起来时,窗外已是黎明——献给所有与机器搏斗到天明的工程师们。"