1. 首页
  2. 测量

了解流量累加器的PLC程序

✅ 一、什么是流量累加器(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

发表评论

登录后才能评论

联系我们

邮箱:service.mnyuan@gmail.com

工作时间:周一至周五,9:30-17:00,节假日休息

QR code