跳到主要内容

碳酸饮料灌装整线 — 单 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_FILL3636 个灌装头状态机 + 电动阀阵列数组状态机 + 重量反馈
MOD_CAP1212 个旋盖头磁滞扭矩控制扭矩 PID + 旋转相位锁
MOD_LABEL双侧热熔贴标电子凸轮MC_CamIn
MOD_CODER激光 / 油墨喷码脉冲PWM + 编码器分频
MOD_VISION液位 / 歪盖 / 标签视觉海康 120 FPS + AI 分类
MOD_REJECT不合格剔除位置滞后队列 + 气缸
MOD_CIP_IF与 CIP 站的握手本地/远程模式切换
MOD_MES批次追溯 / 速率 / OEEModbus TCP + MQTT
MOD_RECIPE3 产品 + 瓶型配方表格 + 版本
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 GB112 00012 000
触摸屏 (工位)威纶通 MT8103iE 10.1"23 8007 600
触摸屏 (总控)威纶通 cMT-3162X 22"19 8009 800
EtherCAT 交换机汇川 SW8 非网管21 2002 400
UPSAPC SUA300015 8005 800

5.2 伺服与 IO

设备型号数量单价 (¥)小计
EtherCAT 伺服 主轴汇川 SV660N 4 kW18 8008 800
EtherCAT 伺服 贴标汇川 SV660N 400W22 8005 600
EtherCAT 伺服 冲瓶汇川 SV660N 750W13 6003 600
EtherCAT 伺服 暖瓶汇川 SV660N 200W12 4002 400
AM600 耦合器汇川 AM600-ECAT38002 400
32DI / 32DO 模块汇川 AM600-32DI/32DO81 60012 800
8AI / 4AO 模块汇川 AM60042 2008 800
称重变送器 (36 灌头)海利普 LDW-36 EtherCAT46 50026 000

5.3 执行机构与仪表

设备型号数量单价 (¥)小计
灌装电动阀卫生级卡箍阀 DN253668024 480
旋盖扭矩磁滞头国产 2 N·m 可调122 80033 600
激光喷码头国产 30W CO₂118 00018 000
CO₂ 压力传感器WIKA A-1045502 200
卫生级流量计上海光华 LDG-DN2543 50014 000
光电开关奥托尼克斯 BR100-DDT242606 240
主轴编码器欧姆龙 E6B2 2500 线1650650
安全继电器亿高 STO11 8001 800

5.4 视觉与机器人 (本项目无机器人)

设备型号数量单价 (¥)小计
相机 (冲瓶检测)海康 MV-CA013-21GM13 2003 200
相机 (液位/歪盖)海康 MV-CA050-12GM14 5004 500
相机 (贴标校验)海康 MV-CA013-21GM23 2006 400
光源海康 MV-LRDS 系列41 2004 800

5.5 小计

类别金额 (¥)
控制层37 600
伺服与 IO70 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.736 个工位空瓶光电 (9+9+9+9)
DI_2 (32DI)%IX8.0~%IX11.7旋盖座位检测 (12) + 贴标到位 + 喷码反馈
DO_0 (32DO)%QX0.0~%QX3.736 灌装阀 × 位掩码第 0~31
DO_1 (32DO)%QX4.0~%QX7.7灌装阀 32~35 + 旋盖 12 + 喷码触发 + 剔除 + 安全输出
DO_2 (32DO)%QX8.0~%QX11.7CIP 路由阀 + 冲瓶阀 + 补光
AI_0 (8AI ×4)%IW0~%IW6236 个灌装称重
AI_1 (8AI ×2)%IW64~%IW7812 个旋盖扭矩反馈 + 4 个 CO₂ 压力
AQ_0 (4AO)%QW0~%QW6主糖浆流量阀 + 冲瓶水压 + 热熔胶温

6.3 分工表

功能PDO/IO绑定
主轴Axis_MainSV660N 4 kW (站号 1), 编码器高速 PDO
贴标左Axis_LabelLSV660N 400W (站号 2) + MC_CamIn Master=Axis_Main
贴标右Axis_LabelRSV660N 400W (站号 3) + MC_CamIn Master=Axis_Main
冲瓶Axis_RinseSV660N 750W (站号 4)
暖瓶Axis_WarmSV660N 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 绑定操作流程

  1. Studio → 扫描从站 → 识别 5 个 SV660N + 4 个 AM600 耦合器 + 4 个称重变送器 + 2 个视觉接线盒;
  2. 为 Axis_Main 选择 CSP + 编码器反馈 PDO 模板, 其余轴 CSP;
  3. 新建 4 个 MC_CamTable: Cam_Label500mLCam_Label330mLCam_Label1LCam_Coder;
  4. 打开 MC_CamIn 向导, Master 选 Axis_Main, Slave 选 Axis_LabelL/R, 表选 Cam_Label500mL;
  5. 配方变量 Recipe.BottleType 切表, Studio 自动在切换时完成 CamIn → CamOut → CamIn 无缝切;
  6. 36 灌装阀 DO 在 PDO 映射 中选 32 位打包, 程序直接按位写入 UINT32;
  7. 下载工程, 进入 诊断 → 相位监控, 手动点动主轴, 观察从轴跟随 ≤ 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 首次调试

  1. 主轴单独手盘试转, 确认编码器方向 + 2500 脉冲/转一致;
  2. 36 个灌装阀单独点动, 核对 DO 掩码位 与 实阀一一对应;
  3. 注水测试 (不带 CO₂): 36 头分别灌 100 瓶, 检测称重均值与标准差;
  4. 带 CO₂ 慢速 (6000 BPH) 试产, 观察液位稳定性;
  5. 全速 24000 BPH 连续 4 小时 稳定性验证;
  6. 换型演练: 500mL → 330mL ≤ 10 分钟完成。

9.2 调试常见问题

现象根因处理
灌装重量偏差周期性单头变送器零点漂移HMI 单头零点标定
旋盖扭矩频繁报警磁滞头磨损按履历更换, 补充备件
贴标偏移电子凸轮表与主轴反馈不同步重新采样凸轮表
喷码间距错位主轴编码器丢脉冲检查屏蔽线 + 换高速差分 PDO
视觉漏检触发延迟 > 1 ms改用硬件触发线直连
MES 掉线MQTT broker 过载本地 SQLite 缓存 + 自动补发

9.3 性能实测

指标目标实测
产量24 000 BPH23 800 BPH
灌装精度± 1.5 mL± 1.2 mL
旋盖合格率≥ 99.5%99.87%
贴标静差≤ 0.8 mm0.5 mm
整线合格率≥ 99.5%99.93%
换型时间≤ 10 min7 min

十、Darra 功能对照表

业务需求Darra 对应功能模块
36 灌装头循环数组状态机 + 按位 DO 打包PLC Runtime
主轴编码器同步高速 PDO + TSC 校准DarraRT.sys
电子凸轮追随工艺对象 MC_CamIn + 凸轮表IDE → 工艺对象
旋盖扭矩 PID工艺对象 FB_PIDIDE → 控制库
重量闭环称重 AI + 阀闭环PLC 代码
视觉分类AI 组件 YOLO/分类IDE → AI 助手
剔除队列环形缓冲 + 滞后触发PLC 代码
配方管理内置配方管理器 (瓶型/扭矩/凸轮)IDE → 配方
批次追溯雪花 ID + SQLite + MQTTService
MES 接口MQTT + OPC UA + ModbusService
HMIDarra HMI Designer + 威纶通IDE → HMI
三级报警AlarmManagerIDE → 报警
急停联锁DI 直连 + STOSafety

十一、项目总结

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 min7 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 周。