碳酸饮料灌装整线 — 单 Runtime 全流程控制
一、设备简介
项目位于江苏宿迁某头部饮料集团, 新建一条 24 000 BPH (Bottle Per Hour) 碳酸饮料灌装线, 主产品为 500 mL PET 瓶装汽水、苏打水、果味气泡水。 整线由 吹瓶/来瓶 → 冲瓶 → 等压灌装 (36 头旋转式) → 旋盖 (12 头磁滞) → 液位视觉 → 日期喷码 → 双侧贴标 → 暖瓶干燥 → 装箱 串联组成。
整线机械本体已由设备厂配套供货, 本项目承担:
- 单台研华工控机承载 灌装 36 头 + 旋盖 12 头 + 贴标双侧 + 喷码 + 视觉 全部动作;
- 主轴相位误差 ≤ 0.1°;
- 灌装精度 ± 1.5 mL (重量法, 约 ± 0.3%);
- 整线扫描周期 1 ms 级;
- 为每一瓶记录批次 ID 与过程数据, 经 OPC UA/MQTT 直达上层 MES (追溯查询由 MES 完成);
- 全国产化供应链, 单线控制部分 BOM 控制在 ¥50 万。
产能指标:
| 工位 | 节拍 | 关键约束 |
|---|---|---|
| 灌装 (36 头) | 36 × 40 rpm = 24 000 BPH | 等压灌装, CO₂ 保压 4.2 bar |
| 旋盖 (12 头) | 2.0 ± 0.2 N·m | 旋盖相位 ≤ 0.1° |
| 贴标 (双侧) | 5 m/s 线速 | 追随静差 ≤ 0.8 mm |
| 喷码 | 脉冲 20 kHz | 与主轴编码器相位锁 |
| 液位视觉 | 1000 FPS 触发 | 低液/歪盖 100% 剔除 |
二、项目模块组成
工程以 BEV_LINE 模板组织, 单 Runtime 下划分如下功能模块, 所有模块共享同一 MainAxis 主轴:
| 模块 | 职责 | 关键技术 |
|---|---|---|
| MOD_MAINAXIS | 主轴编码器采集 + 相位参考 | 2500 线编码器 + TSC 时戳 |
| MOD_FILL36 | 36 个灌装头状态机 + 电动阀阵列 | 数组状态机 + 重量反馈 |
| MOD_CAP12 | 12 个旋盖头磁滞扭矩控制 | 扭矩 PID + 旋转相位锁 |
| MOD_LABEL | 双侧热熔贴标电子凸轮 | MC_CamIn |
| MOD_CODER | 激光 / 油墨喷码脉冲 | PWM + 编码器分频 |
| MOD_VISION | 液位 / 歪盖 / 标签视觉 | 海康 120 FPS + AI 分类 |
| MOD_REJECT | 不合格剔除 | 位置滞后队列 + 气缸 |
| MOD_CIP_IF | 与 CIP 站的握手 | 本地/远程模式切换 |
| MOD_MES | 批次追溯 / 速率 / OEE | Modbus TCP + MQTT |
| MOD_RECIPE | 3 产品 + 瓶型配方 | 表格 + 版本 |
| MOD_HMI | 现场 15" HMI + 总控 22" | Darra HMI Designer |
| MOD_ALARM | 三级报警, 按工位分组 | AlarmManager |
| MOD_SAFETY | 急停/门联锁/压力/空瓶联锁 | DI 直连 + STO |
外部接口:
- 上游吹瓶机: Modbus TCP 从站, 握手
PRODUCE_EN / BOTTLE_READY / ALARM; - 下游装箱机: Modbus TCP 从站, 握手
BOX_READY / LOW_SPEED / ESTOP; - 中央 CIP: OPC UA 或硬 DI/DO, 模式切换
PROD/CIP/RINSE; - MES: MQTT 发布
batch.*、kpi.*、alarm.*主题。
三、机械装配架构
┌────────────────────────────────────────────────────────────┐
│ 整线主框 (36 灌 + 12 盖 + 贴标 + 喷码) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 冲瓶 │→ │ 灌装旋转台│→ │ 旋盖旋转台│→ │ 液位视觉 │ │
│ │ 32 头 │ │ 36 头 │ │ 12 头 │ │ 120 fps │ │
│ └──────────┘ └─────┬────┘ └────┬─────┘ └─────┬────┘ │
│ ↓ │ │ ↓ │
│ CO₂ / 糖浆 管路 编码器主轴 (2500 线) 剔除气缸 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 日期喷码 │→ │ 贴标 L │→ │ 贴标 R │→ │ 暖瓶干燥 │ │
│ │ 20 kHz │ │ 伺服 │ │ 伺服 │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
└────────────────────────────────────────────────────────────┘
↓
[ 工控机 + EtherCAT ]
↓
┌──────────────┬──────────────┬──────────────┬──────────────┐
│ SV680N × 6 │ AM600 IO ×3 │ 称重模块 ×4 │ 视觉 ×3 │
│ (主轴/贴标/ │ (32DI/32DO) │ (36 灌头) │ (冲/液位/标) │
│ 喷码同步) │ │ │ │
└──────────────┴──────────────┴──────────────┴──────────────┘
主机械特征:
- 灌装旋转台直径 2.0 m, 36 工位均分, 相邻工位 10°;
- 旋盖旋转台直径 1.2 m, 12 工位均分, 相邻 30°;
- 主轴由 4 kW 伺服电机 + 行星减速机 (i = 25) 驱动, 顶部直连 2500 线编码器;
- 36 个电动灌装阀均为 插接式卫生级快装阀, 更换 1 个耗时 3 分钟;
- 贴标站左右对称, 每侧 1 台 200W 伺服 + 标签盘 + 热熔胶辊, 镜面安装;
- 视觉拱架采用 20×20 铝型材, 相机安装高度固定 450 mm。
四、程序架构
┌────────────────────────────────────────────┐
│ Darra Runtime (单机) │
│ ┌─────────────────────────────────────┐ │
│ │ OB_250us (最高优先级, EtherCAT PDO) │ │
│ │ └─> 主轴编码器采集, 相位更新 │ │
│ │ └─> MC_CamIn (贴标双轴) │ │
│ │ └─> MC_GearIn (旋盖与主轴) │ │
│ └─────────────────────────────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ OB_1ms (PLC 主循环) │ │
│ │ └─> PRG_Fill36 (数组状态机) │ │
│ │ └─> PRG_Cap12 │ │
│ │ └─> PRG_Vision │ │
│ │ └─> PRG_Reject │ │
│ │ └─> PRG_Recipe │ │
│ └─────────────────────────────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ OB_20ms (HMI 刷新/报警扫描) │ │
│ └─────────────────────────────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ OB_100ms (MQTT/MES/Modbus) │ │
│ └─────────────────────────────────────┘ │
└────────────────────────────────────────────┘
任务分工:
- 250 μs 任务: 主轴相位, 所有 MC_* 凸轮/齿轮指令;
- 1 ms 任务: 36/12 个工位循环扫描, 视觉结果解析, 剔除队列;
- 20 ms 任务: HMI 刷新, 报警扫描;
- 100 ms 任务: MES 同步, MQTT 上云。
五、硬件 BOM (国产优先)
5.1 控制层
| 设备 | 型号 | 数量 | 单价 (¥) | 小计 |
|---|---|---|---|---|
| 工控机 | 研华 MIC-770 / i7-12700 / 32 GB | 1 | 12 000 | 12 000 |
| 触摸屏 (工位) | 威纶通 MT8103iE 10.1" | 2 | 3 800 | 7 600 |
| 触摸屏 (总控) | 威纶通 cMT-3162X 22" | 1 | 9 800 | 9 800 |
| EtherCAT 交换机 | 汇川 SW8 非网管 | 2 | 1 200 | 2 400 |
| UPS | APC SUA3000 | 1 | 5 800 | 5 800 |
5.2 伺服与 IO
| 设备 | 型号 | 数量 | 单价 (¥) | 小计 |
|---|---|---|---|---|
| EtherCAT 伺服 主轴 | 汇川 SV660N 4 kW | 1 | 8 800 | 8 800 |
| EtherCAT 伺服 贴标 | 汇川 SV660N 400W | 2 | 2 800 | 5 600 |
| EtherCAT 伺服 冲瓶 | 汇川 SV660N 750W | 1 | 3 600 | 3 600 |
| EtherCAT 伺服 暖瓶 | 汇川 SV660N 200W | 1 | 2 400 | 2 400 |
| AM600 耦合器 | 汇川 AM600-ECAT | 3 | 800 | 2 400 |
| 32DI / 32DO 模块 | 汇川 AM600-32DI/32DO | 8 | 1 600 | 12 800 |
| 8AI / 4AO 模块 | 汇川 AM600 | 4 | 2 200 | 8 800 |
| 称重变送器 (36 灌头) | 海利普 LDW-36 EtherCAT | 4 | 6 500 | 26 000 |
5.3 执行机构与仪表
| 设备 | 型号 | 数量 | 单价 (¥) | 小计 |
|---|---|---|---|---|
| 灌装电动阀 | 卫生级卡箍阀 DN25 | 36 | 680 | 24 480 |
| 旋盖扭矩磁滞头 | 国产 2 N·m 可调 | 12 | 2 800 | 33 600 |
| 激光喷码头 | 国产 30W CO₂ | 1 | 18 000 | 18 000 |
| CO₂ 压力传感器 | WIKA A-10 | 4 | 550 | 2 200 |
| 卫生级流量计 | 上海光华 LDG-DN25 | 4 | 3 500 | 14 000 |
| 光电开关 | 奥托尼克斯 BR100-DDT | 24 | 260 | 6 240 |
| 主轴编码器 | 欧姆龙 E6B2 2500 线 | 1 | 650 | 650 |
| 安全继电器 | 亿高 STO | 1 | 1 800 | 1 800 |
5.4 视觉与机器人 (本项目无机器人)
| 设备 | 型号 | 数量 | 单价 (¥) | 小计 |
|---|---|---|---|---|
| 相机 (冲瓶检测) | 海康 MV-CA013-21GM | 1 | 3 200 | 3 200 |
| 相机 (液位/歪盖) | 海康 MV-CA050-12GM | 1 | 4 500 | 4 500 |
| 相机 (贴标校验) | 海康 MV-CA013-21GM | 2 | 3 200 | 6 400 |
| 光源 | 海康 MV-LRDS 系列 | 4 | 1 200 | 4 800 |
5.5 小计
| 类别 | 金额 (¥) |
|---|---|
| 控制层 | 37 600 |
| 伺服与 IO | 70 400 |
| 执行机构 | 100 970 |
| 视觉 | 18 900 |
| 硬件小计 | 227 870 |
| Darra Runtime 授权 (按核) | 25 000 |
| Darra HMI 授权 | 5 000 |
| 整线投资 | ¥ 257 870 |
六、IO 模块配置
6.1 选型思路
36 个灌装头按 4 组扎堆, 每组 9 头, 每组称重变送器带 9 路 AI → 映射到 PLC 变量数组; 12 个旋盖头扭矩反馈用 12 路 AI; DI/DO 按工位集中布置到 3 个 AM600 机架。
6.2 地址分配
| 模块 | 地址范围 | 用途 |
|---|---|---|
| DI_0 (32DI) | %IX0.0~%IX3.7 | 操作按钮 + 门开关 + 急停 + 上下游握手 |
| DI_1 (32DI) | %IX4.0~%IX7.7 | 36 个工位空瓶光电 (9+9+9+9) |
| DI_2 (32DI) | %IX8.0~%IX11.7 | 旋盖座位检测 (12) + 贴标到位 + 喷码反馈 |
| DO_0 (32DO) | %QX0.0~%QX3.7 | 36 灌装阀 × 位掩码第 0~31 |
| DO_1 (32DO) | %QX4.0~%QX7.7 | 灌装阀 32~35 + 旋盖 12 + 喷码触发 + 剔除 + 安全输出 |
| DO_2 (32DO) | %QX8.0~%QX11.7 | CIP 路由阀 + 冲瓶阀 + 补光 |
| AI_0 (8AI ×4) | %IW0~%IW62 | 36 个灌装称重 |
| AI_1 (8AI ×2) | %IW64~%IW78 | 12 个旋盖扭矩反馈 + 4 个 CO₂ 压力 |
| AQ_0 (4AO) | %QW0~%QW6 | 主糖浆流量阀 + 冲瓶水压 + 热熔胶温 |
6.3 分工表
| 功能 | PDO/IO | 绑定 |
|---|---|---|
| 主轴 | Axis_Main | SV660N 4 kW (站号 1), 编码器高速 PDO |
| 贴标左 | Axis_LabelL | SV660N 400W (站号 2) + MC_CamIn Master=Axis_Main |
| 贴标右 | Axis_LabelR | SV660N 400W (站号 3) + MC_CamIn Master=Axis_Main |
| 冲瓶 | Axis_Rinse | SV660N 750W (站号 4) |
| 暖瓶 | Axis_Warm | SV660N 200W (站号 5) |
| 灌装阀 [1..36] | DO_0/DO_1 | 数组映射 DO_Fill[i] |
| 称重 [1..36] | AI_0 | 数组映射 AI_Weight[i] |
| 旋盖扭矩 [1..12] | AI_1 | 数组映射 AI_Torque[i] |
| 喷码触发 | DO_1.6 + AQ PWM | 与 Axis_Main 相位锁 |
| 视觉触发 | DO_0.(32+1..3) | 硬件触发, 200 μs 脉宽 |
6.4 绑定操作流程
- Studio →
扫描从站→ 识别 5 个 SV660N + 4 个 AM600 耦合器 + 4 个称重变送器 + 2 个视觉接线盒; - 为 Axis_Main 选择
CSP + 编码器反馈PDO 模板, 其余轴CSP; - 新建 4 个
MC_CamTable:Cam_Label500mL、Cam_Label330mL、Cam_Label1L、Cam_Coder; - 打开
MC_CamIn向导, Master 选Axis_Main, Slave 选Axis_LabelL/R, 表选Cam_Label500mL; - 配方变量
Recipe.BottleType切表, Studio 自动在切换时完成CamIn → CamOut → CamIn无缝切; - 36 灌装阀 DO 在
PDO 映射中选32 位打包, 程序直接按位写入 UINT32; - 下载工程, 进入
诊断 → 相位监控, 手动点动主轴, 观察从轴跟随 ≤ 0.1° 即完成绑定。
七、核心数据结构
TYPE TYPE_FILL_HEAD :
STRUCT
Id : INT;
State : INT; (* 0=idle 1=bottle 2=fill 3=done 4=fault *)
TargetVolume_mL : REAL;
ActualGram : REAL;
StartAngle_deg : REAL;
EndAngle_deg : REAL;
ValveOn : BOOL;
LastBottleId : UDINT;
FaultCode : INT;
END_STRUCT
END_TYPE
TYPE TYPE_CAP_HEAD :
STRUCT
Id : INT;
State : INT; (* 0=idle 1=screw 2=torque 3=ok 4=fault *)
TargetTorque_Nm : REAL;
ActualTorque_Nm : REAL;
PhaseLockOK : BOOL;
LastBottleId : UDINT;
END_STRUCT
END_TYPE
TYPE TYPE_BOTTLE_FS :
STRUCT
Id : UDINT;
BornAngle : REAL;
FillHead : INT;
CapHead : INT;
FillOK : BOOL;
CapOK : BOOL;
LevelOK : BOOL;
LabelOK : BOOL;
CodeOK : BOOL;
Rejected : BOOL;
ExitTime : DT;
END_STRUCT
END_TYPE
TYPE TYPE_RECIPE_BEV :
STRUCT
Id : INT;
Name : STRING[24];
BottleType : INT; (* 1=500mL 2=330mL 3=1L *)
TargetVolume_mL : REAL;
FillSpeed_rpm : REAL;
CapTorque_Nm : REAL;
CapTol_Nm : REAL;
CO2_bar : REAL;
LabelCamId : INT;
MainAxisSpeed : REAL;
END_STRUCT
END_TYPE
VAR_GLOBAL
FillHead : ARRAY[1..36] OF TYPE_FILL_HEAD;
CapHead : ARRAY[1..12] OF TYPE_CAP_HEAD;
BottleBuf : ARRAY[0..2047] OF TYPE_BOTTLE_FS; (* 2K 环缓冲 *)
Recipe : TYPE_RECIPE_BEV;
MainAngle : LREAL; (* 0..360 deg, 由主轴编码器更新 *)
MainRev : DINT; (* 累计转数 *)
EStop : BOOL;
DO_Fill : UDINT; (* 32 位灌装阀掩码 *)
DO_Fill_Hi : UDINT; (* 剩余 4 位 + 其他 *)
END_VAR
八、核心程序代码
8.1 主轴相位更新 (250 μs 任务)
PROGRAM PRG_MainAxis
VAR
rawEnc : DINT;
prevEnc : DINT;
delta : DINT;
END_VAR
rawEnc := Axis_Main.ActPos; (* 编码器原始值 *)
delta := rawEnc - prevEnc;
IF delta > 1250 THEN delta := delta - 2500; END_IF; (* 环形修正 *)
IF delta < -1250 THEN delta := delta + 2500; END_IF;
prevEnc := rawEnc;
MainAngle := MainAngle + DINT_TO_LREAL(delta) * 360.0 / 2500.0;
IF MainAngle >= 360.0 THEN
MainAngle := MainAngle - 360.0;
MainRev := MainRev + 1;
END_IF;
8.2 36 灌装头数组状态机 (1 ms 任务)
PROGRAM PRG_Fill36
VAR
i : INT;
valveMask : UDINT := 0;
angle : REAL;
END_VAR
FOR i := 1 TO 36 DO
angle := REAL(i - 1) * 10.0; (* 工位相位 *)
CASE FillHead[i].State OF
0: (* idle: 等瓶到位 *)
IF IsBottleAtAngle(i, angle) THEN
FillHead[i].LastBottleId := NewBottleId(angle);
FillHead[i].StartAngle_deg := MainAngle + 15.0; (* 打开阀相位 *)
FillHead[i].EndAngle_deg := MainAngle + 315.0; (* 关阀相位 *)
FillHead[i].TargetVolume_mL := Recipe.TargetVolume_mL;
FillHead[i].State := 1;
END_IF;
1: (* 等到开阀相位 *)
IF AngleReached(MainAngle, FillHead[i].StartAngle_deg) THEN
FillHead[i].ValveOn := TRUE;
FillHead[i].State := 2;
END_IF;
2: (* 灌装中, 同时看重量 *)
FillHead[i].ActualGram := AI_Weight[i];
IF FillHead[i].ActualGram >= FillHead[i].TargetVolume_mL * 1.0
OR AngleReached(MainAngle, FillHead[i].EndAngle_deg) THEN
FillHead[i].ValveOn := FALSE;
FillHead[i].State := 3;
END_IF;
3: (* 完成, 回 idle *)
IF ABS(FillHead[i].ActualGram - FillHead[i].TargetVolume_mL) <= 1.5 THEN
BottleBuf[FillHead[i].LastBottleId MOD 2048].FillOK := TRUE;
ELSE
FillHead[i].State := 4;
FillHead[i].FaultCode := 11; (* 灌装超差 *)
RaiseAlarm(A_FILL_WEIGHT, 2);
END_IF;
IF FillHead[i].State = 3 THEN FillHead[i].State := 0; END_IF;
4: (* 故障, 旁路该头, HMI 手动复位 *)
FillHead[i].ValveOn := FALSE;
END_CASE;
END_FOR;
(* 按位打包输出到 32DO *)
valveMask := 0;
FOR i := 1 TO 32 DO
IF FillHead[i].ValveOn THEN valveMask := valveMask OR SHL(UDINT#1, i - 1); END_IF;
END_FOR;
DO_Fill := valveMask;
DO_Fill_Hi := 0;
FOR i := 33 TO 36 DO
IF FillHead[i].ValveOn THEN DO_Fill_Hi := DO_Fill_Hi OR SHL(UDINT#1, i - 33); END_IF;
END_FOR;
8.3 旋盖扭矩 PID (12 头, 1 ms)
PROGRAM PRG_Cap12
VAR i : INT; END_VAR
FOR i := 1 TO 12 DO
CapHead[i].ActualTorque_Nm := AI_Torque[i];
CASE CapHead[i].State OF
0: IF IsBottleAtCapHead(i) THEN CapHead[i].State := 1; END_IF;
1: (* 旋入, 磁滞头自由旋 *)
DO_CapScrew[i] := TRUE;
IF CapHead[i].ActualTorque_Nm >= CapHead[i].TargetTorque_Nm * 0.5 THEN
CapHead[i].State := 2;
END_IF;
2: (* 扭矩达标 *)
IF CapHead[i].ActualTorque_Nm >= (Recipe.CapTorque_Nm - Recipe.CapTol_Nm)
AND CapHead[i].ActualTorque_Nm <= (Recipe.CapTorque_Nm + Recipe.CapTol_Nm) THEN
DO_CapScrew[i] := FALSE;
BottleBuf[CapHead[i].LastBottleId MOD 2048].CapOK := TRUE;
CapHead[i].State := 3;
ELSIF CapHead[i].ActualTorque_Nm > (Recipe.CapTorque_Nm + Recipe.CapTol_Nm) THEN
DO_CapScrew[i] := FALSE;
CapHead[i].State := 4;
RaiseAlarm(A_CAP_TORQUE, 2);
END_IF;
3: IF LeaveCapZone(i) THEN CapHead[i].State := 0; END_IF;
4: DO_CapScrew[i] := FALSE; (* 等手动复位 *)
END_CASE;
END_FOR;
8.4 贴标电子凸轮 (双侧)
(* 500 mL 瓶型凸轮表: 一转主轴 → 贴标轴 360° *)
MC_CamIn(
Master := ADR(Axis_Main),
Slave := ADR(Axis_LabelL),
CamTableId := Recipe.LabelCamId,
PhaseShift := 0.0,
RatioNum := 1, RatioDen := 1
);
MC_CamIn(
Master := ADR(Axis_Main),
Slave := ADR(Axis_LabelR),
CamTableId := Recipe.LabelCamId,
PhaseShift := 180.0,
RatioNum := 1, RatioDen := 1
);
8.5 喷码脉冲 (相位锁)
(* 主轴每转 36 瓶, 每瓶到喷码点就输出一脉冲 *)
VAR prevAngle : LREAL; i : INT; END_VAR
FOR i := 0 TO 35 DO
IF (prevAngle < REAL(i) * 10.0 + 50.0)
AND (MainAngle >= REAL(i) * 10.0 + 50.0) THEN
DO_CODER_TRIG := TRUE;
CoderPulse(IN := TRUE, PT := T#50us);
END_IF;
END_FOR;
prevAngle := MainAngle;
CoderPulse(IN := FALSE);
IF CoderPulse.Q THEN DO_CODER_TRIG := FALSE; END_IF;
8.6 视觉 + 剔除队列
(* 视觉在液位拍照点打分, 剔除气缸在 120° 之后 *)
IF VisionTrig THEN
visionResult := AI_ClassifyLevel(cameraFrame);
BottleBuf[curBottleId MOD 2048].LevelOK :=
(visionResult.Confidence > 0.85) AND (visionResult.Class = 0);
END_IF;
FOR i := 0 TO 2047 DO
IF NOT BottleBuf[i].Rejected THEN
IF AngleReached(MainAngle, BottleBuf[i].BornAngle + 120.0) THEN
IF NOT (BottleBuf[i].FillOK AND BottleBuf[i].CapOK
AND BottleBuf[i].LevelOK) THEN
DO_REJECT_PUSH := TRUE;
RejectTimer(IN := TRUE, PT := T#25ms);
BottleBuf[i].Rejected := TRUE;
END_IF;
END_IF;
END_IF;
END_FOR;
RejectTimer(IN := FALSE);
IF RejectTimer.Q THEN DO_REJECT_PUSH := FALSE; END_IF;
8.7 配方切换 (瓶型/产品)
FUNCTION_BLOCK FB_ChangeOver
VAR_INPUT newId : INT; END_VAR
VAR_OUTPUT done : BOOL; END_VAR
(* 1. 降速 → 停机 → 净瓶 → 加载新配方 → 升速 *)
Axis_Main.SetSpeed(0.0);
WAIT UNTIL Axis_Main.Vel = 0.0;
FlushLine();
LoadRecipe(newId);
MC_CamSelect(Recipe.LabelCamId);
Axis_Main.SetSpeed(Recipe.MainAxisSpeed);
done := TRUE;
九、运行与调试
9.1 首次调试
- 主轴单独手盘试转, 确认编码器方向 + 2500 脉冲/转一致;
- 36 个灌装阀单独点动, 核对 DO 掩码位 与 实阀一一对应;
- 注水测试 (不带 CO₂): 36 头分别灌 100 瓶, 检测称重均值与标准差;
- 带 CO₂ 慢速 (6000 BPH) 试产, 观察液位稳定性;
- 全速 24000 BPH 连续 4 小时 稳定性验证;
- 换型演练: 500mL → 330mL ≤ 10 分钟完成。
9.2 调试常见问题
| 现象 | 根因 | 处理 |
|---|---|---|
| 灌装重量偏差周期性 | 单头变送器零点漂移 | HMI 单头零点标定 |
| 旋盖扭矩频繁报警 | 磁滞头磨损 | 按履历更换, 补充备件 |
| 贴标偏移 | 电子凸轮表与主轴反馈不同步 | 重新采样凸轮表 |
| 喷码间距错位 | 主轴编码器丢脉冲 | 检查屏蔽线 + 换高速差分 PDO |
| 视觉漏检 | 触发延迟 > 1 ms | 改用硬件触发线直连 |
| MES 掉线 | MQTT broker 过载 | 本地 SQLite 缓存 + 自动补发 |
9.3 性能实测
| 指标 | 目标 | 实测 |
|---|---|---|
| 产量 | 24 000 BPH | 23 800 BPH |
| 灌装精度 | ± 1.5 mL | ± 1.2 mL |
| 旋盖合格率 | ≥ 99.5% | 99.87% |
| 贴标静差 | ≤ 0.8 mm | 0.5 mm |
| 整线合格率 | ≥ 99.5% | 99.93% |
| 换型时间 | ≤ 10 min | 7 min |
十、Darra 功能对照表
| 业务需求 | Darra 对应功能 | 模块 |
|---|---|---|
| 36 灌装头循环 | 数组状态机 + 按位 DO 打包 | PLC Runtime |
| 主轴编码器同步 | 高速 PDO + TSC 校准 | DarraRT.sys |
| 电子凸轮追随 | 工艺对象 MC_CamIn + 凸轮表 | IDE → 工艺对象 |
| 旋盖扭矩 PID | 工艺对象 FB_PID | IDE → 控制库 |
| 重量闭环 | 称重 AI + 阀闭环 | PLC 代码 |
| 视觉分类 | AI 组件 YOLO/分类 | IDE → AI 助手 |
| 剔除队列 | 环形缓冲 + 滞后触发 | PLC 代码 |
| 配方管理 | 内置配方管理器 (瓶型/扭矩/凸轮) | IDE → 配方 |
| 批次追溯 | 雪花 ID + SQLite + MQTT | Service |
| MES 接口 | MQTT + OPC UA + Modbus | Service |
| HMI | Darra HMI Designer + 威纶通 | IDE → HMI |
| 三级报警 | AlarmManager | IDE → 报警 |
| 急停联锁 | DI 直连 + STO | Safety |
十一、项目总结
11.1 周期
| 阶段 | 工时 |
|---|---|
| 方案设计 | 1 周 |
| 硬件采购 | 3 周 |
| 电气柜组装 | 2 周 |
| PLC/HMI 开发 | 2 周 |
| 调试 | 1 周 |
| 试产 | 1 周 |
| 合计 | 10 周 |
11.2 投产效果
| 维度 | 原进口方案 | Darra 单 Runtime |
|---|---|---|
| 控制柜数量 | 4 台 | 1 台 |
| 控制 BOM | ¥ 86 万 | ¥ 26 万 |
| 主轴相位误差 | ± 0.5° | ± 0.08° |
| 灌装精度 | ± 2.0 mL | ± 1.2 mL |
| 换型时间 | 40 min | 7 min |
| 工程师数量 | 3 人 (PLC + CAM + 贴标) | 1 人 |
11.3 可复制性
- 同系列其他瓶型 (330 mL / 1 L / 玻璃瓶) 可 按配方切换, 机械只换星轮/夹具;
- 同车间 CIP 站通过 OPC UA 或硬接点握手, 直接进入本工程的 CIP 模式, 共用数据;
- 其他饮料客户 (果汁 / 茶饮料 / 能量饮料) 可基于本
BEV_LINE模板派生, 3 周完成二次部署; - AI 视觉模型在云端统一训练, Darra Cloud 自动下发模型。
核心价值: 一台研华工控机 = 一套 Darra Runtime = 36 头灌装 + 12 头旋盖 + 双侧贴标 + 喷码 + 视觉 + 剔除, 并通过 OPC UA/MQTT 向上层 MES 暴露数据, 相位锁到 0.1°, 取代 4 套专用控制器, 整线控制 BOM 降 70%, 工程周期从 20 周压到 10 周。