自动装箱机 (Case Packer)
面向饮料、乳品、日化、食品流通末端的高速装箱工程案例。依托 Darra RT 实时内核 + EtherCAT + 电子凸轮 + 飞剪工艺对象, 一台 "一拖四" 工控机即可驱动整台装箱机的进瓶、分道、开箱、推箱、封箱全流程。
1. 设备简介
自动装箱机位于灌装线末端, 负责把单瓶产品按既定阵型装入纸箱并封箱。典型指标:
| 项目 | 参数 |
|---|---|
| 产能 | 25 箱 / 分钟 (6×4 装 500 mL PET 瓶) |
| 瓶型适配 | 330 mL / 500 mL / 1.25 L 三种瓶径 |
| 装箱阵型 | 4×6 / 3×4 / 2×6 可切换 |
| 换型时间 | < 3 分钟 (HMI 配方切换 + 机械手动调) |
| 胶带封箱 | 上下双封头 (3M 自动封箱头) |
| 箱型 | 纸箱 (吸取 → 撑方 → 折盖 → 上胶) |
| EtherCAT 周期 | 500 µs, 抖动 < 5 µs |
| 可靠性 | MTBF ≥ 2000 h, 连续运行 24×7 |
| 远程运维 | 云端状态回传 + 历史趋势 + 告警 |
整机依据灌装线末端的"瓶流 → 列队 → 成组 → 推入 → 封箱 → 出箱"流程展开, 工艺节拍由 PLC 周期任务驱动, 机械运动由 4 轴伺服 + 气动联合完成。
2. 项目模块组成
装箱机软件按 Darra 的三层架构划分:
| 层 | 项目 | 职责 |
|---|---|---|
| 实时驱动层 | DarraRT.sys + DarraRT_Eth.sys + DarraRT_PLC.sys | 核心隔离 / EtherCAT 帧收发 / PLC VM |
| 运行时服务层 | Darra.PLC.Service | 永驻服务, 管理 PLC 运行时, 接 EtherCAT SDK |
| 用户层 | Darra.PLC.Panel + Darra.PLC.IDE (开发期) | 运行时可视化 + 开发环境 |
装箱机项目本身拆分为 6 个 PLC 程序单元:
| 单元 | 名称 | 触发周期 | 说明 |
|---|---|---|---|
| PRG_MAIN | 主状态机 | 10 ms | Idle / Homing / Running / Paused / Fault / ProductChange |
| PRG_FEED | 进瓶 & 计数 | 1 ms | 变频输送带 + 瓶光电 + 速度闭环 |
| PRG_DIVERT | 分道分流 | 500 µs | 电子凸轮控制 4 列分流门 |
| PRG_OPENER | 开箱 & 成型 | 10 ms | SCARA 吸纸箱 → 撑方 → 折盖 |
| PRG_PUSH | 推箱 & 压箱 | 1 ms | 伺服定长定速推入 + 压实 |
| PRG_SEAL | 封箱 & 出箱 | 10 ms | 上下封头联动 + 胶带监视 |
每个程序单元独立编译为 SCL/LD, 由 Service 层调度到 DarraRT_PLC.sys 执行, 共享 GlobalIO 数据区 (零拷贝)。
3. 机械装配架构
+----------------------------------------------------------------+
| 灌装下来的瓶流 |
| ↓ |
| [进瓶输送带 (变频)] |
| ↓ |
| [列队光电 × 4] → [分流门伺服 × 1] |
| ↓ |
| [4 列并排等待区 (光电满料)] |
| ↓ [纸箱仓 (摞平放)] |
| ↓ ↓ |
| ↓ [SCARA 吸取 + 撑方] |
| ↓ ↓ |
| [推箱伺服 (X 轴定长)] ← 联动 → [成型纸箱等待工位] |
| ↓ |
| [压箱伺服 (Z 轴下压)] |
| ↓ |
| [3M 上下封箱头] ← [胶带卷 × 2, 胶带低量传感器 × 2] |
| ↓ |
| [出箱输送带 + 喷码接口] |
+----------------------------------------------------------------+
4 轴伺服命名:
| 轴 | 名称 | 功能 | 规格 |
|---|---|---|---|
| Axis_Feed | 进瓶带 | 变频 + 编码器 (虚拟主轴参考) | 2.2 kW 变频 |
| Axis_Divert | 分道门 | 电子凸轮分 4 列 | 750 W 伺服 |
| Axis_Push | 推箱 | 定长定速推箱入纸箱 | 750 W 伺服 + 抱闸 |
| Axis_Press | 压箱 | Z 轴下压实 | 750 W 伺服 + 抱闸 |
SCARA 开箱机器人由 Darra 机器人内核驱动, 使用 4 个 400 W 伺服 (不计入 4 轴主伺服)。
4. 程序架构
+-----------------------------+
| Darra.PLC.IDE (开发) |
| - SCL 编辑器 |
| - CamDesigner (凸轮表) |
| - HMI 画面编辑 |
+--------------+--------------+
| 下装 / 调试
v
+-----------------------------+ +---------------------+
| Darra.PLC.Service | TCP | Darra.PLC.Panel |
| - 永驻 | <----> | - 运行时可视化 |
| - 运行时管理 | | - HMI 操作面板 |
+--------------+--------------+ +---------------------+
|
| IOCTL
v
+-----------------------------+
| DarraRT_PLC.sys (内核) |
| - 周期任务调度 |
| - SCL VM 执行 |
| - 机器人 CyclicUpdate |
+--------------+--------------+
| GlobalIO Section (零拷贝)
v
+-----------------------------+
| DarraRT_Eth.sys (内核) |
| - NDIS 直通 |
| - EtherCAT 帧 + TSC 校准 |
+--------------+--------------+
| EtherCAT (LAN2)
v
[汇川 AM600 CPU] → [DI/DO] → [SV660N × 4] → [电磁阀岛] → ...
任务调度策略:
- 500 µs 任务:
PRG_DIVERT(电子凸轮必须跟随主轴编码器) - 1 ms 任务:
PRG_FEED/PRG_PUSH - 10 ms 任务:
PRG_MAIN/PRG_OPENER/PRG_SEAL/ HMI 刷新
5. 硬件 BOM (国产化)
| 类别 | 型号 | 品牌 | 数量 | 单价 (¥) | 小计 |
|---|---|---|---|---|---|
| 工控机 | ARK-1124H (i3-5010U / 8G / 128G SSD) | 研华 | 1 | 4,500 | 4,500 |
| HMI 触摸屏 | TK6071iQ 7 寸 | 威纶通 | 1 | 1,280 | 1,280 |
| 伺服驱动器 | SV660N-EtherCAT 750 W | 汇川 | 4 | 2,380 | 9,520 |
| 伺服电机 | ISMH1-75C30CB (750 W + 抱闸) | 汇川 | 4 | 1,850 | 7,400 |
| EtherCAT IO 主站 | AM600-CPU1608TP | 汇川 | 1 | 1,800 | 1,800 |
| DI 模块 | AM600-1600END | 汇川 | 2 | 580 | 1,160 |
| DO 模块 | AM600-1600ETN | 汇川 | 2 | 580 | 1,160 |
| AI 模块 | AM600-4AD | 汇川 | 1 | 980 | 980 |
| AO 模块 | AM600-4DA | 汇川 | 1 | 980 | 980 |
| 变频器 | MS300-2.2 kW | 台达 | 3 | 980 | 2,940 |
| 步进驱动器 (开箱) | DM556 | 雷赛 | 4 | 420 | 1,680 |
| 步进电机 (开箱 SCARA) | 57HS22 | 雷赛 | 4 | 260 | 1,040 |
| 开关电源 | S-350-24 24 V 14 A | 明纬 | 2 | 180 | 360 |
| EtherCAT 电磁阀岛 | VP3-16FB | 亚德客 | 1 | 2,400 | 2,400 |
| 气缸 | SC ø40×200 / ø63×500 | 亚德客 | 8 | 280 | 2,240 |
| 光电传感器 | E3F-DS30 对射 M18 | 欧姆龙国产 | 12 | 65 | 780 |
| 色标传感器 | BC50D | 奥普 | 1 | 680 | 680 |
| 安全光幕 | SSC-1240 20 光轴 | 舜驰 | 2 | 1,200 | 2,400 |
| 急停 + 按钮盒 | XB2 系列 | 施耐德国产 | 1 套 | 420 | 420 |
| 电控柜 | 600×800×2000 | 威图国产 | 1 | 1,800 | 1,800 |
| 走线 / 端子 / 接插件 | - | - | 1 套 | 2,000 | 2,000 |
| 合计 | ¥45,520 |
说明: 所有 EtherCAT 设备均使用标准 CoE / FoE, Darra 一次扫描即识别; 工控机 2 核给 Darra 核隔离, 2 核跑 HMI + 云端 Agent。
6. IO 模块配置
6.1 模块选型 → 地址分配 → 分工 → 绑定
操作顺序 (在 IDE 中):
Darra.PLC.IDE→设备视图→新建 EtherCAT 从站- 选择
汇川 AM600-CPU1608TP, 设SlaveIndex=1 - 为 CPU 追加 DI/DO/AI/AO 子模块 (2× DI16, 2× DO16, 1× AI4, 1× AO4)
- 伺服 4 台依次挂在 CPU 后面 (
SlaveIndex=2..5) - 电磁阀岛挂
SlaveIndex=6 - HMI (威纶通) 走 Modbus TCP, 旁路不进 EtherCAT 环
- 点击
生成 IO 表→ 自动分配%IX / %QX / %IW / %QW地址
6.2 数字量输入 (32 点)
| 地址 | 符号 | 说明 |
|---|---|---|
| I0.0 | SEN_BottleIn | 进瓶位光电 |
| I0.1 | SEN_BottleCount | 瓶子计数光电 |
| I0.2 | SEN_LaneA_Full | A 列满料到位 |
| I0.3 | SEN_LaneB_Full | B 列满料到位 |
| I0.4 | SEN_LaneC_Full | C 列满料到位 |
| I0.5 | SEN_LaneD_Full | D 列满料到位 |
| I0.6 | SEN_CartonIn | 纸箱进位 |
| I0.7 | SEN_CartonReady | 开箱完成 |
| I1.0 | SEN_PushHome | 推箱原位 |
| I1.1 | SEN_PushEnd | 推箱到位 |
| I1.2 | SEN_PressHome | 压箱原位 |
| I1.3 | SEN_PressEnd | 压箱到位 |
| I1.4 | SEN_CartonOut | 出箱光电 |
| I1.5 | SEN_TapeUp_Low | 上封头胶带告急 |
| I1.6 | SEN_TapeDn_Low | 下封头胶带告急 |
| I1.7 | SEN_LightCurtain | 安全光幕 |
| I2.0 | SB_Start | 启动按钮 |
| I2.1 | SB_Stop | 停止按钮 |
| I2.2 | SB_EStop | 急停按钮 |
| I2.3 | SB_Reset | 复位按钮 |
| I2.4 | SW_Auto | 自动模式 |
| I2.5 | SW_Manual | 手动模式 |
| I2.6..I3.7 | 预留 | 10 点 |
6.3 数字量输出 (32 点)
| 地址 | 符号 | 说明 |
|---|---|---|
| Q0.0 | MTR_BottleConv | 进瓶输送带 (变频) |
| Q0.1 | MTR_CartonConv | 纸箱输送带 |
| Q0.2 | MTR_TapeBelt | 封箱机皮带 |
| Q0.3 | SOL_DivertA | A 列分道气缸 |
| Q0.4 | SOL_DivertB | B 列分道气缸 |
| Q0.5 | SOL_DivertC | C 列分道气缸 |
| Q0.6 | SOL_DivertD | D 列分道气缸 |
| Q0.7 | SOL_Push | 推箱气缸 |
| Q1.0 | SOL_Press | 压箱气缸 |
| Q1.1 | SOL_CartonSuck | 开箱真空吸盘 |
| Q1.2 | SOL_CartonFold | 开箱折盖气缸 |
| Q1.3 | SOL_Diverter | 分道挡板 |
| Q1.4 | LAMP_Red | 报警灯 |
| Q1.5 | LAMP_Yellow | 预警灯 |
| Q1.6 | LAMP_Green | 运行灯 |
| Q1.7 | BUZZER | 蜂鸣器 |
| Q2.0..Q3.7 | 预留 | 16 点 |
6.4 伺服绑定
| 轴别名 | EtherCAT 位置 | 伺服驱动 | PDO 映射 |
|---|---|---|---|
| Axis_Feed | Slave 7 | 变频不走伺服, 编码器单独接 AM600 高速计数 | - |
| Axis_Divert | Slave 2 | SV660N 750 W | 0x6040/0x6041/0x6060/0x6064/0x607A |
| Axis_Push | Slave 3 | SV660N 750 W (抱闸) | 同上 |
| Axis_Press | Slave 4 | SV660N 750 W (抱闸) | 同上 |
SCARA 机器人 4 轴由 Darra 机器人内核驱动, 在 IDE 的 机器人导入向导 中导入 URDF, 自动绑定到步进驱动器 (Slave 8..11)。
7. 核心数据结构
TYPE MACHINE_STATE :
(
Idle,
Homing,
Running,
Paused,
ProductChange,
Fault
);
END_TYPE
TYPE RECIPE_CASE :
STRUCT
Name : STRING(32); // "500mL-24支"
BottleDiameter : LREAL; // 瓶径 mm
BottleHeight : LREAL; // 瓶高 mm
PackRows : INT; // 4
PackCols : INT; // 6
CartonLen : LREAL; // 箱长 mm
CartonWid : LREAL; // 箱宽 mm
CartonHgt : LREAL; // 箱高 mm
DivertCamId : INT; // 分流凸轮表 ID
PushDistance : LREAL; // 推箱行程 mm
PushVelocity : LREAL; // 推箱速度 mm/s
TargetSpeed : LREAL; // 目标产能 箱/min
END_STRUCT
END_TYPE
TYPE AXIS_REF :
STRUCT
Enabled : BOOL;
Homed : BOOL;
ActualPos : LREAL;
ActualVel : LREAL;
TargetPos : LREAL;
Fault : BOOL;
FaultCode : DWORD;
END_STRUCT
END_TYPE
TYPE COUNTERS :
STRUCT
BoxTotal : UDINT; // 累计装箱
BoxShift : UDINT; // 当班装箱
RejectTotal : UDINT; // 总剔除
UptimeSec : UDINT; // 运行秒数
CycleMs : UDINT; // 最近周期耗时
END_STRUCT
END_TYPE
VAR_GLOBAL
gState : MACHINE_STATE := MACHINE_STATE#Idle;
gRecipe : RECIPE_CASE;
gCounters : COUNTERS;
Axis_Feed : AXIS_REF;
Axis_Divert: AXIS_REF;
Axis_Push : AXIS_REF;
Axis_Press : AXIS_REF;
END_VAR
8. 核心程序代码
8.1 主状态机
PROGRAM PRG_MAIN
VAR
tStart : TIME;
END_VAR
CASE gState OF
MACHINE_STATE#Idle:
IF SB_Start AND NOT SB_EStop AND SEN_LightCurtain THEN
gState := MACHINE_STATE#Homing;
END_IF
MACHINE_STATE#Homing:
HomeAllAxes();
IF AllAxesHomed() THEN
gState := MACHINE_STATE#Running;
tStart := NOW();
END_IF
MACHINE_STATE#Running:
FeedBottles();
DivertLanes();
OpenCarton();
PushIntoCarton();
SealCarton();
IF SEN_CartonOut THEN
gCounters.BoxTotal := gCounters.BoxTotal + 1;
gCounters.BoxShift := gCounters.BoxShift + 1;
gCounters.CycleMs := TIME_TO_UDINT(NOW() - tStart);
tStart := NOW();
END_IF
IF SB_Stop OR SB_EStop THEN gState := MACHINE_STATE#Paused; END_IF
IF AnyAxisFault() THEN gState := MACHINE_STATE#Fault; END_IF
MACHINE_STATE#Paused:
StopAllAxesSmoothly();
IF SB_Reset THEN gState := MACHINE_STATE#Idle; END_IF
MACHINE_STATE#ProductChange:
DisableAllOutputs();
IF RecipeLoaded() THEN gState := MACHINE_STATE#Idle; END_IF
MACHINE_STATE#Fault:
EmergencyStop();
LAMP_Red := TRUE;
BUZZER := TRUE;
IF SB_Reset AND NoActiveFault() THEN
LAMP_Red := FALSE; BUZZER := FALSE;
gState := MACHINE_STATE#Idle;
END_IF
END_CASE
END_PROGRAM
8.2 工艺对象 — 电子凸轮分流 (飞剪形)
装箱机的核心难点是"4 列瓶子要与进瓶主轴保持相位关系", 用 Darra 电子凸轮即可:
FUNCTION_BLOCK FB_DivertByCam
VAR_INPUT
Execute : BOOL;
MasterAxis : REFERENCE TO AXIS_REF; // Axis_Feed
SlaveAxis : REFERENCE TO AXIS_REF; // Axis_Divert
CamTableId : INT; // 配方 DivertCamId
END_VAR
VAR
camSel : MC_CamTableSelect;
camIn : MC_CamIn;
END_VAR
camSel(
CamTable := CAM_TABLES[CamTableId],
Master := MasterAxis,
Slave := SlaveAxis,
Periodic := TRUE,
MasterScaling := 1.0,
SlaveScaling := 1.0
);
camIn(
Master := MasterAxis,
Slave := SlaveAxis,
MasterOffset := 0,
SlaveOffset := 0,
StartMode := MC_STARTMODE#Absolute,
Execute := Execute AND camSel.Done
);
END_FUNCTION_BLOCK
凸轮表用 IDE 的 CamDesigner 可视化编辑, 5 段多项式 (4 个停顿位 + 1 个空程), 也可用 CSV 导入。
8.3 工艺对象 — 推箱 (定长定速)
FUNCTION_BLOCK FB_PushIntoCarton
VAR_INPUT
Trigger : BOOL;
Distance : LREAL;
Velocity : LREAL;
END_VAR
VAR_IN_OUT
PushAxis : AXIS_REF;
END_VAR
VAR
step : INT := 0;
mvOut : MC_MoveAbsolute;
mvBack : MC_MoveAbsolute;
END_VAR
CASE step OF
0:
IF Trigger THEN step := 10; END_IF
10:
mvOut(Axis := PushAxis, Position := Distance,
Velocity := Velocity, Acceleration := 2000,
Deceleration := 2000, Execute := TRUE);
IF mvOut.Done THEN step := 20; END_IF
20:
mvBack(Axis := PushAxis, Position := 0,
Velocity := Velocity, Acceleration := 2000,
Deceleration := 2000, Execute := TRUE);
IF mvBack.Done THEN step := 0; END_IF
END_CASE
END_FUNCTION_BLOCK
8.4 工艺对象 — 开箱机器人调用
PROGRAM PRG_OPENER
VAR
robot : R_SCARA;
pPick : POSE := (X:=300, Y:=0, Z:=100, Rz:=0);
pLift : POSE := (X:=300, Y:=0, Z:=300, Rz:=0);
pFold : POSE := (X:=500, Y:=200, Z:=250, Rz:=90);
pPlace : POSE := (X:=500, Y:=200, Z:=150, Rz:=90);
END_VAR
IF SEN_CartonIn AND NOT SEN_CartonReady THEN
robot.MoveLin (pPick, vel := 800);
robot.Suck (ON);
robot.MoveLin (pLift, vel := 1200);
robot.MoveJoint(pFold, vel := 1500);
robot.MoveLin (pPlace, vel := 600);
robot.Suck (OFF);
END_IF
END_PROGRAM
8.5 工艺对象 — 封箱节拍
PROGRAM PRG_SEAL
VAR
stage : INT := 0;
END_VAR
CASE stage OF
0: IF SEN_PressEnd THEN
MTR_TapeBelt := TRUE;
stage := 10;
END_IF
10: IF SEN_CartonOut THEN
MTR_TapeBelt := FALSE;
IF SEN_TapeUp_Low OR SEN_TapeDn_Low THEN
LAMP_Yellow := TRUE; // 胶带告急仅预警
END_IF
stage := 0;
END_IF
END_CASE
END_PROGRAM
9. 运行与调试
9.1 上电首检 (Panel 端操作)
- 确认急停复位, 安全光幕未遮挡
Darra.PLC.Panel→诊断页→ 检查 EtherCAT 总站数 = 配置数- 单击
使能伺服, 观察 4 轴状态位Enabled=TRUE - 手动点动 4 个轴, 行程 10 mm, 观察反馈位置 (IDE 示波器)
9.2 回零流程
| 轴 | 回零方式 | 参考点 |
|---|---|---|
| Axis_Divert | 反向碰挡块 + Z 脉冲 | 分道门右限位 |
| Axis_Push | 反向碰挡块 | 推箱气缸伸出位 |
| Axis_Press | 反向碰挡块 | Z 轴上限位 |
9.3 单动 → 联动 → 自动
在 Panel → 手动页 中:
- 单动: 每个气缸 / 电机单独按点动按钮
- 联动: 按工艺顺序串起来, 空跑 3 箱
- 自动: 切换
SW_Auto, 接通瓶流, 观察首 10 箱
9.4 凸轮标定
IDE → 工艺对象 → 电子凸轮 → 导入 CSV 或在 CamDesigner 中可视化拖拽 5 个关键点, 保存为 Cam_DivertV1..V4 对应 4 种瓶型。
9.5 关键日志
| 日志 | 路径 |
|---|---|
| PLC 周期 / 抖动 | %AppData%/DarraPLC/logs/runtime_*.log |
| EtherCAT 帧错 | Darra_EtherCAT_Master/debug_info.txt |
| 内核 DbgPrint | DbgView.exe |
| HMI 操作历史 | %AppData%/DarraPLC/logs/hmi_*.log |
10. Darra 功能对照表
| 工艺需求 | 使用的 Darra 功能 | 说明 |
|---|---|---|
| 4 列瓶子同步分流 | 电子凸轮 MC_CamIn + MC_CamTableSelect | 500 µs 周期 |
| 推箱定长定速 | MC_MoveAbsolute 串联 | 两段动作 |
| 压箱下压 | MC_MoveAbsolute + 扭矩限幅 | 防顶坏产品 |
| SCARA 开箱 | Darra 机器人内核 R_SCARA.MoveLin/MoveJoint | PLC 内置 |
| 瓶流计数 | AM600 高速计数模块 + SCL 计数器 | 50 kHz |
| 胶带告急预警 | 光电 DI + 预警灯输出 | 剩余不停机 |
| 急停 & 安全光幕 | 安全输入直入 DI + 状态机强制 Fault | 安全链在 PLC + 硬接线双保险 |
| 配方切换 | RECIPE_CASE + HMI 配方页 | 无需重编译 |
| 远程运维 | 云端 Agent (Service 内置) | MQTT 上报 |
| 状态监视 | HMI + IDE 示波器 | 实时曲线 |
11. 项目总结
这套装箱机方案已在某饮料厂区连续投运, 关键结论:
- 硬件国产化: 整机控制系统 BOM ¥4.5 万, 4 轴伺服 + IO + 工控机 + HMI 一次到位
- 工艺对象简洁: 电子凸轮 + 定长推箱两块积木, 主代码不到 200 行
- 实时性充裕: 500 µs 电子凸轮任务抖动 < 5 µs, 位置跟随误差 < 0.5 mm
- 换型友好: 配方表 + 凸轮表 + SCARA 姿态一起切换, 换型 < 3 分钟
- 可靠性: MTBF ≥ 2000 h, 故障均有明确 FaultCode, Panel 端一键定位
- 可扩展: 预留 16 DI / 16 DO + 4 AI / 4 AO, 后期加视觉 / 剔除不改硬件
- 机器人内置: 开箱 SCARA 与 PLC 共享 GlobalIO, 无跨系统通讯延迟
下一步方向: 接入视觉做空瓶 / 倒瓶检测, 并把 AI 异常预测接入云端实现预测性维护。