✅ 一、什么是流量累加器(Flow Totalizer)
流量累加器就是 对瞬时流量进行积分,计算累计流量(Total Flow)
本质上:
Total = ∫ Q(t) dt
PLC 中没有微积分,所以通过 定时采样 + 乘法(瞬时流量 × 时间)+ 加法累加 来实现。
✅ 二、PLC 计算累计流量的原理
假设瞬时流量为:
- Q:瞬时流量(单位可为 L/s,m³/h 等)
- T:采样周期(秒)
则:
累计流量增量:ΔV = Q × T
总累计:Total = Total + ΔV
如果 Q 的单位为 m³/h,则需要换算成秒:
ΔV = Q × (T / 3600)
✅ 三、典型 PLC 程序结构(通用,不限型号)
1. 获取瞬时流量值
来源通常包括:
- 流量计 4–20mA / 脉冲
- Modbus 通讯(寄存器)
- 流量计算模块等
例:把瞬时流量读入 Flow_Inst(REAL)
2. 定时器采样(T = 1s 或 0.1s)
推荐每秒采样一次:
Timer T1 (周期 = 1s, 自复位)
3. 每周期执行积分计算
伪代码:
IF T1.DN THEN
Flow_Increment = Flow_Inst * (1 / 3600) // m³/h 转 m³
Flow_Total = Flow_Total + Flow_Increment
END_IF
解释:
- 采样周期为 1 秒
- 因为瞬时流量单位为 m³/h
- 所以每秒贡献量 = 流量 / 3600
✅ 四、用梯形图(Ladder)表达
梯形图逻辑:
1️⃣ 定时器周期触发
–| |—————-(TON) Timer_1s
2️⃣ 每秒触发一次加法
–| Timer_1s.DN |——————–[MUL]—> Flow_Increment
| Flow_Inst * 0.0002778
3️⃣ 累加器加法
–| Timer_1s.DN |——————–[ADD]—> Flow_Total
| Flow_Total + Flow_Increment
解释:
0.0002778 = 1s / 3600s
✅ 五、脉冲流量计的流量累加
流量计给脉冲,例如:
- 1 脉冲 = 10L
- PLC 计数器 Count
Total = Count * Pulse_Value
如果要累加:
Total := Total + (Current_Count – Last_Count) * Pulse_Value
Last_Count := Current_Count
适合流量脉冲密度高的场景。
✅ 六、常见补充功能
1. 累积值保留(掉电保持)
使用 Retentive / 保持型寄存器:
- Siemens:DB 中的 retain
- Mitsubishi:D 寄存器设定为保持
- Omron:DM 块
- AB ControlLogix:Controller Tags 默认保持
2. 清零(人工或自动)
IF Reset_Button THEN
Flow_Total := 0
END_IF
注意要加“消抖”或“一次触发”。
3. 上限保护(Overflow 防溢出)
IF Flow_Total > Max_Value THEN
Flow_Total := 0
END_IF
Max_Value 可设 999999 或更大。
4. 零点死区(避免仪表抖动导致累计)
例如小于 0.2 m³/h 认为 0:
IF Flow_Inst < 0.2 THEN
Flow_Inst = 0
END_IF
避免错误积分。
5. 负值保护(信号故障)
IF Flow_Inst < 0 THEN
Flow_Inst = 0
END_IF
避免积成负数。
✅ 七、完整总结版流程图(
读取瞬时流量 Flow_Inst
↓
信号合理化(负值清零、死区滤除)
↓
定时器:每秒触发
↓
Flow_Increment = Flow_Inst / 3600
↓
Flow_Total = Flow_Total + Flow_Increment
↓
写入保持寄存器(掉电保持)
✅ 八、 PLC 伪代码
(* 1. 信号处理 *)
IF Flow_Inst < 0.0 THEN
Flow_Inst := 0.0;
END_IF;
IF Flow_Inst < Flow_Deadband THEN
Flow_Inst := 0.0;
END_IF;
(* 2. 每秒积分 *)
IF T1.DN THEN
Flow_Increment := Flow_Inst / 3600.0; (* m³/h → m³ *)
Flow_Total := Flow_Total + Flow_Increment;
END_IF;
(* 3. 人工清零 *)
IF Reset THEN
Flow_Total := 0.0;
END_IF;
(* 4. 上限保护 *)
IF Flow_Total > 999999 THEN
Flow_Total := 0;
END_IF;
原创文章,作者:梦南圆,如若转载,请注明出处:https://mnyuan.cn/archives/18677

微信扫一扫