CIP/SIP 多回路在线清洗系统
一句话: 用一台 Darra 工控机同时驱动 8 条清洗回路 + 4 罐介质(酸/碱/热水/回收水) + 蒸汽换热 + 32 个卫生阀 的集中式 CIP 站, PLC / HMI / 配方 / 批记录 / AI / 云端运维全部内置。
1. 设备简介
CIP (Clean-In-Place) 是乳品、饮料、啤酒、制药行业不可拆卸管路系统的在线清洗工艺。典型 CIP 站由 一组介质罐(酸/碱/热水/回收水) + 供液回液泵 + 蒸汽换热器 + 一组选路阀组 组成, 通过"预冲 → 碱洗 → 中间冲 → 酸洗 → 终冲"五步标准工艺把管壁、罐壁上的有机物(蛋白/脂肪)和无机物(结石)洗掉。
本案例目标是 年产 30 万吨 UHT 奶无菌灌装车间 的集中式 CIP 站:
- 服务对象: 6 条管线 + 4 个储罐 + 2 台 UHT 板换 + 3 台灌装机, 合计 8 条清洗回路;
- 同时叠加 SIP (Steam-In-Place) 蒸汽灭菌, 对无菌段 121 ℃ 保温 30 分钟;
- 出口工艺指标要求: 电导率 ±0.2 mS/cm、温度 ±0.5 ℃、清洗合格率 ≥99.5%(ATP + 菌落双检)、报警响应 < 500 ms;
- 合规要求: FDA 21 CFR Part 11 电子签名 + GMP Annex 11 审计追踪。
1.1 清洗回路规划
| 回路 | 清洗对象 | 管径/容积 | 典型 CIP 周期 | SIP |
|---|---|---|---|---|
| L1 | UHT 板换 A | DN80 / 0.8 m³ | 90 min | 是(135 ℃ 30 min) |
| L2 | UHT 板换 B | DN80 / 0.8 m³ | 90 min | 是 |
| L3 | 灭菌后罐 ×2 | 15 m³/台 | 60 min | 是(121 ℃ 30 min) |
| L4 | 无菌缓冲罐 | 5 m³ | 45 min | 是 |
| L5 | 灌装机 A 线 | — | 60 min | 是 |
| L6 | 灌装机 B 线 | — | 60 min | 是 |
| L7 | 奶仓(原料) | 50 m³/台 | 120 min | 否 |
| L8 | 管线 / 阀门矩阵 | — | 30 min | 否 |
最多同时并行 2 条回路(大罐 + 管线), 调度器按优先级和介质就绪状态抢占。
2. 项目模块组成
CIP 站在 Darra 软件中按 "工艺对象 + 功能模块 + 数据模块" 三层组织:
| 层 | 模块 | 功能 | 对应 Darra 组件 |
|---|---|---|---|
| 工艺对象 | 调度器 | 多回路排队/并行/抢占 | PRG_LoopDispatcher |
| 工艺对象 | 单回路 7 步时序 | 预冲 → 碱洗 → 中冲 → 酸洗 → 终冲 → SIP → 吹干 | PRG_CipSequence |
| 工艺对象 | 温度串级 PID | 蒸汽阀外环 + 温度内环 + 流量前馈 | FB_PID_Cascade |
| 工艺对象 | 电导率滑动平均 | 3 点平均滤波 | FB_MovingAvg |
| 工艺对象 | 浓度闭环 | 计量泵按电导率反馈 | FB_PID |
| 功能模块 | 阀组路由 | 先关互斥阀 → 开目标阀 → MPV 校验 | FB_RouteSwitch |
| 功能模块 | 介质准备 | 液位判定 / 升温 / 补水 / 回收 | FB_MediaPrepare |
| 功能模块 | 电子签名 | 登录/修改/审计三件套 | FB_RecipeWrite + AuditLog |
| 功能模块 | 批记录 | PDF / CSV / DB 三格式 | Darra Service |
| 数据模块 | 回路 UDT | 8 条回路共用结构 | TYPE_LOOP |
| 数据模块 | 配方 UDT | 浓度/温度/时长/阈值 | TYPE_RECIPE |
| 数据模块 | 液位 / 报警 UDT | 罐液位 + 三级报警 | TYPE_TANK + TYPE_ALARM |
2.1 程序入口与扫描周期
| 程序 | 类型 | 周期 | 说明 |
|---|---|---|---|
| PRG_Main | Cyclic | 10 ms | 安全联锁 + 全局状态 |
| PRG_LoopDispatcher | Cyclic | 100 ms | 8 条回路调度 |
| PRG_CipSequence | Cyclic | 10 ms | 单回路状态机 |
| PRG_PidLoop | Cyclic | 10 ms | 温度串级 PID + 蒸汽前馈 |
| PRG_Dosing | Cyclic | 50 ms | 酸/碱浓度闭环 |
| PRG_Alarm | Cyclic | 20 ms | 三级报警 + 声光 + 短信 |
| PRG_BatchLog | Event | — | 步骤变化 / 配方修改 |
3. 机械装配架构
CIP 站典型 "四罐 + 一换热 + 一阀阵 + 一工控柜" 六大区布置:
工控柜(PLC + HMI + 云网关)
│
┌─────────────┬───────────┼───────────┬─────────────┐
│ │ │ │ │
热水罐 酸罐 碱罐 回收水罐 阀阵(32 卫生蝶阀)
5 m³+200kW 3 m³ 3 m³ 5 m³ ├─ 混合证明阀 MPV ×8
蒸汽换热 ├─ 回液阀 ×8
│ │ │ │ └─ 各回路切换阀
└────┬────────┴────┬──────┴──────┬────┘
│ │ │
供液泵 回液泵 排液泵
15 kW 15 kW 3.7 kW
│ │ │
└──────┬──────┴──────┬──────┘
│ │
各回路就地柜 污液排放
(IO + 阀反馈)
3.1 阀组分区(苏州纽威)
- 介质选择阀: 4 路(酸/碱/热水/回收水), DN50 卫生级气动蝶阀;
- 回路选择阀: 8 路(L1~L8), DN50 卫生级;
- 混合证明阀 (MPV, Mixproof Valve): 8 套 DN80, 防止酸/碱与成品物料串通, 必须同时满足"上下阀座反馈"才允许 CIP 启动;
- 回液阀: 8 路, DN50 卫生级;
- 蒸汽调节阀: DN50 气动定位器(IP 转换), 0~100% 开度;
- 排液阀: 单路 DN80, 气动开关。
3.2 换热器配置
- 5 m³ 热水罐 + 200 kW 蒸汽板换, 进水温度 20 ℃ 时 10 min 升到 85 ℃;
- 蒸汽进气压力 0.4~0.6 MPa, 调节阀前装 Y 型疏水器 + 过滤器;
- SIP 时绕过热水罐, 蒸汽直接进 CIP 供液管, 到达目标温度后保温 30 min;
- 温度传感: 5 路 Pt100(供液/回液/罐内/板换出口/SIP 末端), 4 线制降低线损。
3.3 仪表配置
- 电导率仪: 卫生级 CLS54D × 2, 0~100 mS/cm, 用于判定"水冲干净" 和"碱/酸浓度达标";
- 电磁流量计: DN80 卫生级 × 2(供液/回液), 0~50 m³/h, 用于配比和流量前馈;
- 压力变送器: 供液 / 回液 / 蒸汽 3 路, 用于泵空转和蒸汽低压保护;
- 液位计: 压力式卫生型 × 4 罐。
4. 程序架构
┌──────────────────────────────────────────────────────────┐
│ PRG_Main (10 ms) │
│ - 急停 / 门 / 光栅 / 公用介质联锁 │
│ - 全局状态机 (IDLE / RUN / FAULT / MAINT) │
└────┬─────────────────────────────────────────────────────┘
│
├──► PRG_LoopDispatcher (100 ms)
│ - 扫描 8 条 Loop[].Request
│ - 按 Priority 排序
│ - 调用 StartLoop(i) / PauseLoop(j)
│ - 并行策略: 串行/并行(≤2)/分时抢占
│
├──► PRG_CipSequence × N (10 ms, N = activeLoops)
│ ┌─ 预冲 ─ 碱洗 ─ 中冲 ─ 酸洗 ─ 终冲 ─ SIP ─ 吹干 ─┐
│ └──────────────────────────────────────────────┘
│ ↑ 每步驱动 FB_RouteSwitch 切换阀阵
│ ↑ 每步检查 TempOK / CondOK / MpvOK
│
├──► PRG_PidLoop (10 ms)
│ ┌─ FB_PID_Cascade (温度外环)
│ ├─ FB_FeedForward (流量前馈)
│ └─ FB_PID (蒸汽阀内环)
│
├──► PRG_Dosing (50 ms)
│ - 酸/碱泵 PID 按电导率反馈调频率
│
├──► PRG_Alarm (20 ms)
│ - 三级报警 (蓝 / 黄 / 红)
│ - 声光 / 弹窗 / 短信
│
└──► PRG_BatchLog (事件驱动)
- 步骤变化 → 写批记录
- 配方修改 → 审计日志 (操作人/时间/旧值/新值/原因)
- 步骤完成 → 自动生成 PDF + CSV + DB 三格式
5. 硬件 BOM
5.1 控制系统与执行机构(国产优先)
| 设备 | 型号/规格 | 数量 | 单价(¥) | 小计(¥) |
|---|---|---|---|---|
| 工控机 | 研华 IPC-610L + i5-12500 / 16 GB / 512 GB SSD | 1 | 9 500 | 9 500 |
| 威纶通 HMI | cMT3152X 15" IP65 | 1 | 5 800 | 5 800 |
| 工业交换机 | 汇川 EtherCAT 非网管 8 口 | 2 | 1 200 | 2 400 |
| UPS | APC SUA1500 | 1 | 3 200 | 3 200 |
| 供/回液泵变频器 | 汇川 MD520-4T15 15 kW EtherCAT | 2 | 4 500 | 9 000 |
| 酸/碱计量泵变频器 | 汇川 MD520-4T5R5 5.5 kW | 2 | 2 400 | 4 800 |
| 排液泵变频器 | 汇川 MD520-4T3R7 3.7 kW | 1 | 1 800 | 1 800 |
5.2 远程 IO 与仪表
| 设备 | 型号 | 数量 | 单价(¥) | 小计(¥) |
|---|---|---|---|---|
| 汇川 AM600-ECAT 耦合器 | 主柜 + 就地柜 | 2 | 800 | 1 600 |
| 8CH Pt100 / 8AI / 4AO / 32DI / 32DO | 汇川 AM600 模块组合 | 1 组 | — | 31 300 |
| IP67 现场 IO | 汇川 AM600-IP67-16DI/16DO | 4 | 2 000 | 8 000 |
| 卫生级电导率仪 | 端子科技 CLS54D | 2 | 6 800 | 13 600 |
| 电磁流量计 | 上海光华 LDG-DN80 卫生级 | 2 | 12 000 | 24 000 |
| Pt100 温度变送器 | 重庆横河 4 线制 | 20 | 400 | 8 000 |
| 液位计 | 古大压力式卫生型 | 4 | 2 500 | 10 000 |
| 调节阀 + 定位器(蒸汽 / 流量) | 苏州纽威气动 DN50 | 2 | 10 250 | 20 500 |
| 卫生级蝶阀(气动双作用) | 苏州纽威 DN50 | 32 | 2 200 | 70 400 |
| 混合证明阀组(MPV) | 苏州纽威 DN80 | 8 | 15 000 | 120 000 |
| 电磁阀 | 费斯通 5/2 方向阀 | 40 | 280 | 11 200 |
5.3 介质与换热
| 设备 | 规格 | 数量 | 单价(¥) | 小计(¥) |
|---|---|---|---|---|
| 热水罐 + 蒸汽换热器 | SUS316L 5 m³ + 200 kW | 1 | 35 000 | 35 000 |
| 酸/碱/回收水罐 | SUS316L 3 m³ × 2 + SUS304 5 m³ | 3 | — | 50 000 |
| 酸碱计量泵 | 柱塞式 500 L/h | 2 | 18 000 | 36 000 |
| 无菌空气过滤器 + 安全阀组 | PALL 0.2 µm + 防溅射阀 | — | — | 21 800 |
5.4 合计
| 类别 | 金额(¥) |
|---|---|
| 控制系统 + 执行机构 | 36 500 |
| 远程 IO + 仪表阀门 | 318 600 |
| 介质 + 换热 | 142 800 |
| Darra 软 PLC 永久授权 | 80 000 |
| 总计 | 577 900 |
6. IO 模块配置
6.1 选模块
以汇川 AM600-ECAT 耦合器为例, 主柜配置如下:
| 槽位 | 模块型号 | 功能 | 通道数 |
|---|---|---|---|
| 0 | AM600-ECAT | 耦合器 | — |
| 1 | AM600-32DX | 32 点 DI 24 V | 32 |
| 2 | AM600-32DX | 32 点 DI 24 V | 32 |
| 3 | AM600-32DYT | 32 点 DO 晶体管 | 32 |
| 4 | AM600-32DYT | 32 点 DO 晶体管 | 32 |
| 5 | AM600-8PT | 8 路 Pt100 | 8 |
| 6 | AM600-8AI-I | 8 路 4~20 mA | 8 |
| 7 | AM600-4AO-V | 4 路 0~10 V | 4 |
就地柜(酸碱区 IP67): 4 个 AM600-IP67-16DIO, 每个 16DI+16DO。
6.2 地址映射(在 Darra IDE IO 设备向导中自动生成)
| 地址区段 | 描述 |
|---|---|
%IX0.0 ~ %IX3.7 | DI 主柜第 1/2 槽 32+32=64 点 |
%QX0.0 ~ %QX3.7 | DO 主柜第 3/4 槽 32+32=64 点 |
%IW8 ~ %IW22 | Pt100 × 8(Int16, °C × 10) |
%IW24 ~ %IW38 | AI × 8(Int16, 0 |
%QW40 ~ %QW46 | AO × 4(Int16, 0 |
6.3 分工
- 主柜: 集中控制介质泵、蒸汽阀、阀阵公用部分、报警输出;
- 就地柜: 靠近酸/碱罐, 用 IP67 防酸雾腐蚀, 上 32 点 DI 做各气缸反馈 + 32 点 DO 驱动阀电磁阀;
- 现场总线: EtherCAT 双环网(主环+备用环), 单线断切换 < 100 ms。
6.4 绑定(IO 设备向导 → 配方变量)
在 Darra IDE 的 IO 设备向导 中, 按如下操作:
- 新建 EtherCAT 主站, 扫描从站(自动识别 AM600 耦合器 × 2);
- 每个模块按槽位拖入, 输入起始地址(IDE 自动对齐字节);
- 每通道命名为业务变量(如
L1_MPV_OK,SUPPLY_HZ), 命名自动同步到全局变量表; - Pt100 通道选择"°C × 10" 或"浮点 °C" 工程量, 避免在 SCL 里手写线性换算;
- 变频器频率通过 EtherCAT 0x6060 控制字 + 0x6042 目标速度 直接对接, 不走 AO。
7. 核心数据结构
(* 回路描述 —— 每条 CIP 回路共用该类型 *)
TYPE TYPE_LOOP :
STRUCT
Id : INT; (* 回路编号 1..8 *)
Name : STRING[16]; (* 中文名称 *)
RecipeId : INT; (* 关联配方 ID *)
Priority : INT; (* 优先级 1=最高 *)
Request : BOOL; (* 清洗请求 *)
Busy : BOOL; (* 正在清洗 *)
Passed : BOOL; (* 合格 *)
Step : INT; (* 当前步骤 1..7 *)
StartTime : DT; (* 开始时间 *)
EndTime : DT; (* 结束时间 *)
BatchId : STRING[32]; (* 批号 *)
CondOK : BOOL; (* 电导率合格 *)
TempOK : BOOL; (* 温度达标 *)
WaterConsum : REAL; (* 本次水耗 m³ *)
SteamConsum : REAL; (* 本次蒸汽 kg *)
ElecConsum : REAL; (* 本次电耗 kWh *)
END_STRUCT
END_TYPE
(* 清洗配方 *)
TYPE TYPE_RECIPE :
STRUCT
Id : INT;
Name : STRING[32];
Prewash_s : TIME; (* 预冲时长 *)
AlkConc : REAL; (* 碱浓度 % *)
AlkTemp : REAL; (* 碱洗温度 *)
AlkTime : TIME; (* 碱洗时长 *)
Midwash : TIME; (* 中间水冲 *)
AcidConc : REAL; (* 酸浓度 *)
AcidTemp : REAL; (* 酸洗温度 *)
AcidTime : TIME; (* 酸洗时长 *)
Finalrinse : TIME; (* 终冲时长 *)
FinalCondLimit : REAL; (* 终冲电导率阈值 µS/cm *)
NeedSIP : BOOL; (* 是否需要 SIP *)
SipTemp : REAL; (* SIP 温度 *)
SipHoldTime : TIME; (* SIP 保温 *)
AirBlow : TIME; (* 吹干时长 *)
END_STRUCT
END_TYPE
(* 罐子描述 *)
TYPE TYPE_TANK :
STRUCT
Id : INT;
Name : STRING[16];
Level_pct : REAL;
Temp_C : REAL;
Cond_mS : REAL;
HeatOn : BOOL;
PumpOn : BOOL;
RefillNeed : BOOL;
MinLevel_pct : REAL := 15.0;
MaxLevel_pct : REAL := 92.0;
END_STRUCT
END_TYPE
(* 报警记录 *)
TYPE TYPE_ALARM :
STRUCT
Code : INT;
Message : STRING[80];
Level : INT; (* 1=蓝 2=黄 3=红 *)
TriggerTime : DT;
AckTime : DT;
AckUser : STRING[16];
Cleared : BOOL;
END_STRUCT
END_TYPE
(* 全局数组 *)
VAR_GLOBAL
Loop : ARRAY[1..8] OF TYPE_LOOP;
Recipe : ARRAY[1..16] OF TYPE_RECIPE;
Tank : ARRAY[1..4] OF TYPE_TANK;
Alarms : ARRAY[1..64] OF TYPE_ALARM;
END_VAR
8. 核心程序代码
8.1 多回路调度器
PROGRAM PRG_LoopDispatcher
VAR
i, j : INT;
activeCount : INT;
MaxConcurrent : INT := 2;
ParallelPolicy : INT := 1; (* 0=串 1=并 2=抢占 *)
END_VAR
activeCount := 0;
FOR i := 1 TO 8 DO
IF Loop[i].Busy THEN activeCount := activeCount + 1; END_IF;
END_FOR;
CASE ParallelPolicy OF
0:
IF activeCount = 0 THEN
FOR i := 1 TO 8 DO
IF Loop[i].Request AND (NOT Loop[i].Busy) THEN
StartLoop(i); EXIT;
END_IF;
END_FOR;
END_IF;
1:
FOR i := 1 TO 8 DO
IF Loop[i].Request AND (NOT Loop[i].Busy)
AND (activeCount < MaxConcurrent)
AND CheckMediaReady(i) THEN
StartLoop(i);
activeCount := activeCount + 1;
END_IF;
END_FOR;
2:
FOR i := 1 TO 8 DO
IF Loop[i].Request AND Loop[i].Priority = 1 THEN
FOR j := 1 TO 8 DO
IF Loop[j].Busy AND Loop[j].Priority >= 2 THEN
PauseLoop(j);
END_IF;
END_FOR;
StartLoop(i); EXIT;
END_IF;
END_FOR;
END_CASE;
8.2 单回路 7 步状态机
PROGRAM PRG_CipSequence
VAR_INPUT loopRef : INT; END_VAR
VAR
cfg : TYPE_RECIPE;
condAvg : REAL;
condBuf : ARRAY[1..3] OF REAL;
condPtr : INT := 1;
effTimer : TON;
stepTimer : TON;
END_VAR
condBuf[condPtr] := LOOP_COND;
condPtr := (condPtr MOD 3) + 1;
condAvg := (condBuf[1] + condBuf[2] + condBuf[3]) / 3.0;
cfg := Recipe[Loop[loopRef].RecipeId];
CASE Loop[loopRef].Step OF
1: (* 预冲 —— 回收水 *)
SetRoute(RT_RECOVERY, loopRef);
Supply.SP := 30.0; Supply.Run := TRUE;
stepTimer(IN := TRUE, PT := cfg.Prewash_s);
IF stepTimer.Q THEN
stepTimer(IN := FALSE);
Loop[loopRef].Step := 2;
END_IF;
2: (* 碱洗 *)
SetRoute(RT_ALKALI, loopRef);
HeatSP := cfg.AlkTemp;
DoseAlkTo(cfg.AlkConc);
IF (LOOP_TEMP >= cfg.AlkTemp - 2.0) AND (condAvg >= COND_ALK_MIN) THEN
effTimer(IN := TRUE, PT := cfg.AlkTime);
ELSE
effTimer(IN := FALSE);
END_IF;
IF effTimer.Q THEN
Loop[loopRef].Step := 3; effTimer(IN := FALSE);
END_IF;
3: (* 中间水冲 *)
SetRoute(RT_FRESH, loopRef); DoseAlkTo(0);
stepTimer(IN := TRUE, PT := cfg.Midwash);
IF stepTimer.Q AND condAvg < COND_MID_MAX THEN
stepTimer(IN := FALSE); Loop[loopRef].Step := 4;
END_IF;
4: (* 酸洗 *)
SetRoute(RT_ACID, loopRef);
HeatSP := cfg.AcidTemp;
DoseAcidTo(cfg.AcidConc);
IF (LOOP_TEMP >= cfg.AcidTemp - 2.0) AND (condAvg >= COND_ACID_MIN) THEN
effTimer(IN := TRUE, PT := cfg.AcidTime);
ELSE
effTimer(IN := FALSE);
END_IF;
IF effTimer.Q THEN
Loop[loopRef].Step := 5; effTimer(IN := FALSE);
END_IF;
5: (* 终冲 *)
SetRoute(RT_FRESH, loopRef); DoseAcidTo(0);
stepTimer(IN := TRUE, PT := cfg.Finalrinse);
IF condAvg <= cfg.FinalCondLimit THEN
Loop[loopRef].CondOK := TRUE;
END_IF;
IF stepTimer.Q THEN
stepTimer(IN := FALSE);
Loop[loopRef].Step := 6;
END_IF;
6: (* SIP 可选 *)
IF cfg.NeedSIP THEN
SipRoutine(loopRef, cfg.SipTemp, cfg.SipHoldTime);
END_IF;
Loop[loopRef].Step := 7;
7: (* 吹干 + 写批记录 *)
SetRoute(RT_AIR, loopRef);
stepTimer(IN := TRUE, PT := cfg.AirBlow);
IF stepTimer.Q THEN
stepTimer(IN := FALSE);
Loop[loopRef].Passed := Loop[loopRef].CondOK AND Loop[loopRef].TempOK;
Loop[loopRef].EndTime := NOW();
WriteBatchRecord(loopRef);
Loop[loopRef].Busy := FALSE;
Loop[loopRef].Step := 0;
END_IF;
END_CASE;
8.3 温度串级 PID + 流量前馈(Darra 工艺对象)
PROGRAM PRG_PidLoop
VAR
pidOuter : FB_PID_Cascade; (* 外环: 温度 *)
pidInner : FB_PID_Cascade; (* 内环: 蒸汽阀开度 *)
feedFwd : REAL;
END_VAR
feedFwd := LOOP_FLOW * 2.0; (* 经验系数: 流量越大, 阀预开越多 *)
pidOuter(
SP := HeatSP,
PV := LOOP_TEMP,
Kp := 2.5, Ti := T#45s, Td := T#8s,
OutMax := 100.0, OutMin := 0.0
);
pidInner(
SP := pidOuter.Out + feedFwd,
PV := STEAM_PRESS * 100.0,
Kp := 4.0, Ti := T#8s, Td := T#1s,
OutMax := 100.0, OutMin := 0.0
);
STEAM_VALVE := pidInner.Out;
8.4 浓度闭环(酸/碱计量泵)
PROGRAM PRG_Dosing
VAR
pidDose : FB_PID;
condTarget : REAL;
END_VAR
(* 浓度与电导率有经验映射 ConcToConductivity *)
condTarget := ConcToConductivity(cfg.AlkConc, LOOP_TEMP);
pidDose(
SP := condTarget,
PV := LOOP_COND,
Kp := 0.5, Ti := T#30s, Td := T#5s,
OutMax := 50.0, OutMin := 0.0
);
ALK_DOSE_HZ := pidDose.Out;
8.5 阀组路由(FB_RouteSwitch)
FUNCTION_BLOCK FB_RouteSwitch
VAR_INPUT
loopId : INT;
targetRoute : INT; (* RT_ACID/RT_ALKALI/RT_FRESH/RT_RECOVERY/RT_AIR *)
Execute : BOOL;
END_VAR
VAR_OUTPUT
Done : BOOL;
Busy : BOOL;
Error : BOOL;
END_VAR
VAR
step : INT;
timeout : TON;
END_VAR
IF Execute AND (NOT Busy) THEN step := 0; Busy := TRUE; Done := FALSE; END_IF;
CASE step OF
0: CloseAllMediaValves(); step := 1; timeout(IN := TRUE, PT := T#5s);
1: IF AllValvesClosed() THEN step := 2; ELSIF timeout.Q THEN step := 99; END_IF;
2: OpenLoopValve(loopId); OpenMediaValve(targetRoute); step := 3;
3: IF LoopValveOpen(loopId) AND MediaValveOpen(targetRoute) AND MpvOK(loopId) THEN
Done := TRUE; Busy := FALSE; step := 0; timeout(IN := FALSE);
ELSIF timeout.Q THEN step := 99;
END_IF;
99: CloseAllMediaValves(); Error := TRUE; Busy := FALSE;
END_CASE;
8.6 配方修改 + 电子签名
FUNCTION_BLOCK FB_RecipeWrite
VAR_INPUT
recipeId : INT;
fieldName : STRING[32];
newValue : REAL;
operator : STRING[16];
password : STRING[32];
reason : STRING[80];
END_VAR
VAR_OUTPUT
ok : BOOL;
error : STRING[80];
END_VAR
VAR
oldValue : REAL;
END_VAR
IF NOT VerifyPassword(operator, password) THEN
ok := FALSE; error := '密码错误';
LogAudit('AUTH_FAIL', operator, fieldName, '', reason);
RETURN;
END_IF;
IF NOT HasPermission(operator, 'RECIPE_EDIT') THEN
ok := FALSE; error := '权限不足'; RETURN;
END_IF;
oldValue := GetRecipeField(recipeId, fieldName);
SetRecipeField(recipeId, fieldName, newValue);
LogAudit('RECIPE_MOD', operator, fieldName,
CONCAT(REAL_TO_STR(oldValue), '→', REAL_TO_STR(newValue)), reason);
ok := TRUE;
9. 运行与调试
9.1 上电流程
- 工控机上电, Darra Service 自启;
- EtherCAT 主站扫描从站, 期望从站数量 = 2 耦合器 + 4 变频器 = 6, 不符立即报
A_NET_TOPOLOGY; - 各罐液位、电导率、温度变送器读值稳定(连续 10 次采样方差 < 0.5%), 否则报
A_INST_WARM; - 公用介质检查: 蒸汽压力 0.2~0.6 MPa、压缩空气 0.5 MPa、新鲜水到位;
- 进入 IDLE, HMI 显示绿色就绪。
9.2 手动调试
- 阀门点动: IDE 里每个 DO 都挂有
Debug属性, HMI 手动页面可单独点动, 验证气动反馈; - 泵频率手动: HMI 给 SUPPLY_HZ 写 10 Hz 观察流量和压力;
- PID 整定: 先在开环下给 STEAM_VALVE 阶跃 30%, 记录 LOOP_TEMP 响应曲线, Darra AI 助手自动建议 Kp/Ti/Td, 再闭环验证;
- MPV 强制测试: 模拟某路 MPV_OK 断开, 确认对应回路立即停。
9.3 首次清洗
- 首选低风险回路 L7 奶仓(周期 120 min), 配方里把电导率阈值放宽 20%;
- 观察 HMI 7 步进度条, 每步进入/退出时记录 温度 / 电导率 / 流量 三条曲线;
- 终冲阶段关注 condAvg 下降曲线, 必须连续 60 秒低于
FinalCondLimit; - 结束后在 HMI 批记录页面查看自动生成的 PDF, 确认操作人、配方版本号、起止时间、三条曲线齐全。
9.4 常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 蒸汽阀全开温度仍不上去 | 蒸汽进气压力低 / 疏水器堵 | 看 STEAM_PRESS 曲线,低于 0.2 MPa 报警 |
| 终冲电导率始终下不来 | 上游阀串通 / 回收水污染 | 检查 MPV_OK 反馈 + 换新水冲 |
| 某回路不启动 | Priority / Request 冲突 | 调 ParallelPolicy=0 单跑 |
| 酸碱罐液位异常 | 液位计漂移 / 加药失败 | 按 HMI 重新定义 4 mA / 20 mA 零点 |
| 批记录缺曲线 | Service 未启动 / 时间不同步 | 重启 Darra Service + NTP 校时 |
9.5 三级报警动作
| 级别 | 颜色 | 动作 | 示例 |
|---|---|---|---|
| 提示 | 蓝 | HMI 条目 + 日志 | 液位接近低位 |
| 警告 | 黄 | HMI 弹窗 + 蜂鸣 | 温度偏差 >3 ℃ |
| 故障 | 红 | 停泵 + 排放 + 短信 | MPV 异常 / 急停 / 蒸汽超压 |
关键联锁(强制硬断):
IF NOT ESTOP THEN
Supply.Run := FALSE; Return.Run := FALSE;
Steam.On := FALSE; Drain.Open := TRUE;
RaiseAlarm(A_ESTOP, 3);
END_IF;
FOR i := 1 TO 8 DO
IF Loop[i].Busy AND NOT MPV_OK[i] THEN
RaiseAlarm(A_MPV_FAULT, 3);
EmergencyStop(i);
END_IF;
END_FOR;
10. Darra 功能对照表
| 业务需求 | Darra 对应功能 | 所在模块 |
|---|---|---|
| 多回路调度 | PRG_LoopDispatcher + Priority/Policy | IDE → 程序工程 |
| 多 PID 串级 | 工艺对象 FB_PID / FB_PID_Cascade | IDE → 工艺对象库 |
| 电导率滑动平均 | 工艺对象 FB_MovingAvg | IDE → 信号处理 |
| 前馈控制 | 工艺对象 FB_FeedForward | IDE → 控制库 |
| 阀组路由 + MPV 校验 | FB_RouteSwitch | IDE → 工艺对象 |
| 浓度闭环 | FB_PID + 电导率 | IDE → 工艺对象 |
| 配方管理 | 内置配方管理器(表格 + 版本 + 签名) | IDE → 配方 |
| 三级报警 | 内置报警系统(蓝/黄/红 + 声光 + 短信) | IDE → 报警 |
| 批记录 | 电子批记录引擎(PDF/CSV/DB) | Darra Service |
| 电子签名 | 用户权限 + 审计日志 | IDE → 用户管理 |
| 曲线历史 | 时序数据库(SQLite + 云端 InfluxDB) | Darra Service |
| HMI | HMI Designer(所见即所得) | IDE → HMI |
| 远程运维 | Darra Cloud 加密隧道 | Cloud |
| 合规模板 | 21 CFR Part 11 / GMP Annex 11 | Service + Cloud |
| 授权 | 按 CPU 核数, 无 IO 点数限制 | 授权管理 |
11. 项目总结
11.1 实施周期
| 阶段 | 工时 | 备注 |
|---|---|---|
| 方案设计 | 2 周 | Darra 工程师远程支持 |
| 硬件采购 | 4 周 | 汇川 / 纽威国产有库存 |
| 控制柜组装 | 3 周 | 集成商完成 |
| PLC 程序开发 | 2 周 | Darra 工艺对象 + 配方模板 |
| HMI 开发 | 1 周 | Darra HMI Designer |
| IQ / OQ | 2 周 | 按 GAMP 5 模板 |
| PQ + 三批验证 | 3 周 | ATP + 菌落双检 |
| 总计 | 17 周 | — |
11.2 投产效果
| 指标 | 设计值 | 实测值 |
|---|---|---|
| 清洗合格率 | ≥99.5% | 99.9% |
| 单次 CIP 水耗 | 4.5 m³ | 3.8 m³ |
| 单次蒸汽耗量 | 120 kg | 98 kg |
| CIP 周期 | 90 min | 82 min |
| 报警响应 | <500 ms | <200 ms |
| 批报告生成 | <2 min | <30 s |
| 全年合规审计 | 0 次失败 | 0 次 |
11.3 推广价值
- 本方案已在饮料、乳品、啤酒、制药四个行业 累计落地 48 套;
- 工艺对象 + 配方的组合可直接复制到 发酵 / 配液 / 喷雾干燥 相邻工艺;
- 持续扩展的工艺对象库让客户免费享受新功能(无菌过滤 CIP、啤酒糖化 CIP 等);
- Darra Cloud 把现场数据变成企业数据资产, 沉淀配方、工艺曲线、故障库。
一套 Darra 软 PLC, 把 CIP 工艺从"控制系统"升级为"数据资产"。