跳到主要内容

自动装箱机 (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 msIdle / Homing / Running / Paused / Fault / ProductChange
PRG_FEED进瓶 & 计数1 ms变频输送带 + 瓶光电 + 速度闭环
PRG_DIVERT分道分流500 µs电子凸轮控制 4 列分流门
PRG_OPENER开箱 & 成型10 msSCARA 吸纸箱 → 撑方 → 折盖
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)研华14,5004,500
HMI 触摸屏TK6071iQ 7 寸威纶通11,2801,280
伺服驱动器SV660N-EtherCAT 750 W汇川42,3809,520
伺服电机ISMH1-75C30CB (750 W + 抱闸)汇川41,8507,400
EtherCAT IO 主站AM600-CPU1608TP汇川11,8001,800
DI 模块AM600-1600END汇川25801,160
DO 模块AM600-1600ETN汇川25801,160
AI 模块AM600-4AD汇川1980980
AO 模块AM600-4DA汇川1980980
变频器MS300-2.2 kW台达39802,940
步进驱动器 (开箱)DM556雷赛44201,680
步进电机 (开箱 SCARA)57HS22雷赛42601,040
开关电源S-350-24 24 V 14 A明纬2180360
EtherCAT 电磁阀岛VP3-16FB亚德客12,4002,400
气缸SC ø40×200 / ø63×500亚德客82802,240
光电传感器E3F-DS30 对射 M18欧姆龙国产1265780
色标传感器BC50D奥普1680680
安全光幕SSC-1240 20 光轴舜驰21,2002,400
急停 + 按钮盒XB2 系列施耐德国产1 套420420
电控柜600×800×2000威图国产11,8001,800
走线 / 端子 / 接插件--1 套2,0002,000
合计¥45,520

说明: 所有 EtherCAT 设备均使用标准 CoE / FoE, Darra 一次扫描即识别; 工控机 2 核给 Darra 核隔离, 2 核跑 HMI + 云端 Agent。


6. IO 模块配置

6.1 模块选型 → 地址分配 → 分工 → 绑定

操作顺序 (在 IDE 中):

  1. Darra.PLC.IDE设备视图新建 EtherCAT 从站
  2. 选择 汇川 AM600-CPU1608TP, 设 SlaveIndex=1
  3. 为 CPU 追加 DI/DO/AI/AO 子模块 (2× DI16, 2× DO16, 1× AI4, 1× AO4)
  4. 伺服 4 台依次挂在 CPU 后面 (SlaveIndex=2..5)
  5. 电磁阀岛挂 SlaveIndex=6
  6. HMI (威纶通) 走 Modbus TCP, 旁路不进 EtherCAT 环
  7. 点击 生成 IO 表 → 自动分配 %IX / %QX / %IW / %QW 地址

6.2 数字量输入 (32 点)

地址符号说明
I0.0SEN_BottleIn进瓶位光电
I0.1SEN_BottleCount瓶子计数光电
I0.2SEN_LaneA_FullA 列满料到位
I0.3SEN_LaneB_FullB 列满料到位
I0.4SEN_LaneC_FullC 列满料到位
I0.5SEN_LaneD_FullD 列满料到位
I0.6SEN_CartonIn纸箱进位
I0.7SEN_CartonReady开箱完成
I1.0SEN_PushHome推箱原位
I1.1SEN_PushEnd推箱到位
I1.2SEN_PressHome压箱原位
I1.3SEN_PressEnd压箱到位
I1.4SEN_CartonOut出箱光电
I1.5SEN_TapeUp_Low上封头胶带告急
I1.6SEN_TapeDn_Low下封头胶带告急
I1.7SEN_LightCurtain安全光幕
I2.0SB_Start启动按钮
I2.1SB_Stop停止按钮
I2.2SB_EStop急停按钮
I2.3SB_Reset复位按钮
I2.4SW_Auto自动模式
I2.5SW_Manual手动模式
I2.6..I3.7预留10 点

6.3 数字量输出 (32 点)

地址符号说明
Q0.0MTR_BottleConv进瓶输送带 (变频)
Q0.1MTR_CartonConv纸箱输送带
Q0.2MTR_TapeBelt封箱机皮带
Q0.3SOL_DivertAA 列分道气缸
Q0.4SOL_DivertBB 列分道气缸
Q0.5SOL_DivertCC 列分道气缸
Q0.6SOL_DivertDD 列分道气缸
Q0.7SOL_Push推箱气缸
Q1.0SOL_Press压箱气缸
Q1.1SOL_CartonSuck开箱真空吸盘
Q1.2SOL_CartonFold开箱折盖气缸
Q1.3SOL_Diverter分道挡板
Q1.4LAMP_Red报警灯
Q1.5LAMP_Yellow预警灯
Q1.6LAMP_Green运行灯
Q1.7BUZZER蜂鸣器
Q2.0..Q3.7预留16 点

6.4 伺服绑定

轴别名EtherCAT 位置伺服驱动PDO 映射
Axis_FeedSlave 7变频不走伺服, 编码器单独接 AM600 高速计数-
Axis_DivertSlave 2SV660N 750 W0x6040/0x6041/0x6060/0x6064/0x607A
Axis_PushSlave 3SV660N 750 W (抱闸)同上
Axis_PressSlave 4SV660N 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 端操作)

  1. 确认急停复位, 安全光幕未遮挡
  2. Darra.PLC.Panel诊断页 → 检查 EtherCAT 总站数 = 配置数
  3. 单击 使能伺服, 观察 4 轴状态位 Enabled=TRUE
  4. 手动点动 4 个轴, 行程 10 mm, 观察反馈位置 (IDE 示波器)

9.2 回零流程

回零方式参考点
Axis_Divert反向碰挡块 + Z 脉冲分道门右限位
Axis_Push反向碰挡块推箱气缸伸出位
Axis_Press反向碰挡块Z 轴上限位

9.3 单动 → 联动 → 自动

Panel手动页 中:

  1. 单动: 每个气缸 / 电机单独按点动按钮
  2. 联动: 按工艺顺序串起来, 空跑 3 箱
  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
内核 DbgPrintDbgView.exe
HMI 操作历史%AppData%/DarraPLC/logs/hmi_*.log

10. Darra 功能对照表

工艺需求使用的 Darra 功能说明
4 列瓶子同步分流电子凸轮 MC_CamIn + MC_CamTableSelect500 µs 周期
推箱定长定速MC_MoveAbsolute 串联两段动作
压箱下压MC_MoveAbsolute + 扭矩限幅防顶坏产品
SCARA 开箱Darra 机器人内核 R_SCARA.MoveLin/MoveJointPLC 内置
瓶流计数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 异常预测接入云端实现预测性维护。