Skip to main content

引言

在工业自动化中,数据的稳定性和可靠性至关重要。快速变化的数据可能会导致系统的不稳定性或故障。为了解决这个问题,我们引入了速率限制器,它可以限制输入信号的变化速率,从而使输出更平稳。本文将详细介绍 PLC 功能块FB_RateLimiter,它能够根据设定的上升和下降速率限制输入值的变化,并保持输出的平滑性。


 

1

   

程序代码及介绍

下面是完整的 PLC 程序代码(代码基于 CodeSys 平台的 ST 语言):


FUNCTION_BLOCK FB_RateLimiter
VAR_INPUT
    Input : REAL;          // 输入值
    RiseRate : REAL;       // 上升速率(单位/秒)
    FallRate : REAL;       // 下降速率(单位/秒)
    Reset : BOOL;          // 复位(输出=输入)
END_VAR
VAR_OUTPUT
    Output : REAL;         // 输出值
END_VAR
VAR
    LastTime : ULINT;         // 上次时间
    LastOutput : REAL;     // 上次输出
    CurrentTimeMs : ULINT; // 当前时间(毫秒)
    TimeDiff : REAL;        // 时间差(秒)
    MaxChange : REAL;       // 最大变化量
    Change : REAL;          // 实际变化量
END_VAR
// 复位
IF Reset THEN
    Output := Input;
    LastOutput := Input;
    GetSystemTime(udiTimeMs => CurrentTimeMs, uliTimeUs => , uliTimeNs => );
    LastTime := CurrentTimeMs;
    RETURN;
END_IF
// 计算时间差
GetSystemTime(udiTimeMs => CurrentTimeMs, uliTimeUs => , uliTimeNs => );
TimeDiff := ULINT_TO_REAL(CurrentTimeMs - LastTime) / 1000;
IF TimeDiff > 0 THEN
    // 计算允许的变化量
    IF Input > LastOutput THEN
        MaxChange := RiseRate * TimeDiff; // 计算上升变化量
    ELSE
        MaxChange := FallRate * TimeDiff; // 计算下降变化量
    END_IF
    // 限制变化
    Change := LIMIT(-MaxChange, Input - LastOutput, MaxChange);
    Output := LastOutput + Change; // 更新输出值
    LastOutput := Output;          // 更新上次输出
    LastTime := CurrentTimeMs;     // 更新上次时间
END_IF

 

2

   

功能解析

输入变量

  • Input:需要进行速率限制的输入值,类型为实数(REAL)。

  • RiseRate:允许的上升速率,单位为每秒变化量(单位/秒)。

  • FallRate:允许的下降速率,单位为每秒变化量(单位/秒)。

  • Reset复位信号,当接收到该信号时,输出值将立即设置为输入值。

输出变量

  • Output:经过速率限制后的输出值,类型为实数(REAL)。

内部变量

  • LastTime:记录上一次执行时的系统时间,以毫秒为单位。

  • LastOutput:记录上一次有效的输出值。

  • CurrentTimeMs:当前的系统时间,用于计算时间差。

  • TimeDiff:上一次与当前时间的差值,以秒为单位。

  • MaxChange:允许的最大变化量,根据上升或下降速率计算。

  • Change:实际应用到输出值上的变化量。

代码逻辑详解

  • 复位操作:当接收到复位信号时,功能块将输出值和上次输出值设置为输入值,并记录当前时间。这确保了在新的数据处理周期开始时,状态是干净的。

  • 时间差计算:获取当前系统时间,计算自上次更新以来的时间差,以便根据设定的速率来限制值的变化。

  • 变化量计算:如果输入值大于上次输出值,计算允许的最大上升变化量;反之,计算最大下降变化量。

  • 限制变化:使用LIMIT函数限制实际变化量,确保输出值不会超过允许的变化范围。

  • 输出更新:根据计算的变化量更新输出值,并记录当前输出和时间,准备下一次的计算。


 

3

   

应用场景

FB_RateLimiter功能块可以广泛应用于以下场景:

电机控制:在控制电机速度时,使用速率限制器可以防止电机突然加速或减速,从而减少机械磨损和提高安全性。

液位控制:在液位控制系统中,可以通过限制泵的启动和关闭速率,避免液位剧烈波动,提高系统稳定性。

温度调节:在空调或加热系统中,通过限制温度的变化速率,可以实现更平稳的环境控制,提高舒适度。

信号处理:在数据采集和监控系统中,可以平滑传感器数据,消除瞬时噪声,提高数据质量。


 

4

   

拓展思考

随着智能制造和物联网的发展,速率限制器的需求将越来越广泛。未来,我们可以考虑将FB_RateLimiter与更复杂的算法结合,例如 PID 控制或模糊控制,以实现动态调整速率限制的能力。此外,针对不同的应用场景,可以实现自适应速率限制器,根据实时数据变化情况自动调整上升和下降速率,从而优化系统性能。


 

总结

我们对 PLC 功能块FB_RateLimiter进行了全面解析,包括其代码结构、功能实现、应用场景以及未来的拓展方向。通过限制输入信号的变化速率,该功能块有效提高了系统的稳定性和可靠性。随着自动化技术的不断发展,速率限制器将在更多领域发挥重要作用,成为实现高效和安全控制的重要工具。

图片

你来出题 我来答图片图片图片

欢迎大家在评论区提一些标准功能块的需求,如果合适,我们会在以后的文章中与大家分享。

图片

往期回顾


 

每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比

每周一个编程小例子:记录设备运行时间

每周一个编程小例子:基于长按检测的启动控制系统

每周一个编程小例子:探秘 PLC 数据记录功能块

每周一个编程小例子:心跳检测与 PLC 应用

每周一个编程小例子:斜坡发生器

每周一个编程小例子:旋转速度计算

每周一个编程小例子:计算 PLC 循环周期|例程需求征集!

每周一个编程小例子:如何优雅的分割字符串

每周一个编程小例子:带反馈的阀门控制程序

每周一个编程小例子:西门子 LGF 库中的脉冲继电器功能块

每周一个编程小例子:曲线加减速的控制应用

每周一个编程小例子:轻松去除字符串前导字符

每周一个编程小例子:根据阈值更新输入

每周一个编程小例子:官方模拟量输入处理模块

每周一个编程小例子:主从电机的时序控制

每周一个编程小例子:基于一阶滞后滤波的优化方案

每周一个编程小例子:16 进制到浮点数的神奇转换

每周一个编程小例子:PLC 长按控制程序

每周一个编程小例子:PLC 程序实现多位整数拆分

每周一个编程小例子:流量累积计算器

每周一个编程小例子:用于连锁的电机标准控制模块

每周一个编程小例子:PID 控制算法在 PLC 系统中的实现与应用

每周一个编程小例子:自定义种子生成随机数

每周一个编程小例子:可调时间的脉冲生成器

每周一个编程小例子:带滤波的标准模拟量输入功能块

每周一个编程小例子:使用 PLC 将字符串转换为日期格式

每周一个编程小例子:PLC 配方管理

每周一个编程小例子:比较两个 DB 块(STL)

每周一个编程小例子:如何使用 PLC 实现数组逆序

每周一个编程小例子:流量累计与批次控制

每周一个编程小例子:自定义循环执行控制程序

每周一个编程小例子:步进控制功能块

每周一个编程小例子:PLC 权重比例分配器

每周一个编程小例子:数字量输入组监控

每周一个编程小例子:实时数据分析

每周一个编程小例子:PLC 多轴同步控制的理解与应用

每周一个编程小例子:PLC 波形生成器 (正弦 方波 三角波)

每周一个编程小例子:模拟量信号报警

每周一个编程小例子:组合数概率的实现

每周一个编程小例子:多传感器信号融合与优化方案

每周一个编程小例子:监控模拟信号的健康状态

每周一个编程小例子:PLC 程序实现模拟信号的线性校准

每周一个编程小例子:智能报警过滤器:优化报警系统的 PLC 程序

每周一个编程小例子:使用 PLC 程序让灯光呼吸

每周一个编程小例子:自适应性滤波器:动态调整以平衡响应与稳定性

每周一个编程小例子:卡尔曼滤波器在自动化中的简单应用

每周一个编程小例子:多模式定时器

每周一个编程小例子:基于 PLC 的编码器速度计算器

每周一个编程小例子:电机顺序启动与停止程序

每周一个编程小例子:电梯控制程序

每周一个编程小例子:自动门控制系统

每周一个编程小例子:智能停车场计数系统

每周一个编程小例子:智能照明控制系统

每周一个编程小例子:变频器控制

每周一个编程小例子:比例阀控制

每周一个编程小例子:脉冲输出的灵活控制

每周一个编程小例子:计算移动平均值

图片

2026年7月