Skip to main content


 

引言

在工业自动化项目落地过程中,绝大多数工程师都遇到过这类困扰: 历史数据库存储成本居高不下、偏远地区设备远程监控带宽不足导致数据上传延迟、边缘网关存储空间很快被海量重复采样数据占满。这些问题的核心根源是:工业现场大量慢变化工艺参数(温度、压力、液位、流量等)存在极高的数据冗余性——平稳期内连续多个采样点的数值几乎无差异,却仍占用相同的存储和传输资源。

今天给大家介绍的FB_DataCompressor功能块,就是专门解决这类问题的轻量级 PLC 侧数据压缩工具,采用标准 IEC 61131-3 结构化文本(ST)编写,无需依赖品牌私有库,可在西门子、三菱、汇川等所有支持 ST 编程的 PLC 平台直接移植,直接在控制层完成数据“瘦身”,兼顾实时性和数据保真度,无需上位机参与即可落地。


1

   

程序代码及核心逻辑介绍

1.1

   

完整功能块代码

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

FUNCTION_BLOCK FB_DataCompressor
VAR_INPUT
    dataIn : REAL;          // 待处理的实时采样数据(如温度、压力等模拟量)
    threshold : REAL;       // 压缩阈值:变化小于该值则视为无效冗余
    enable : BOOL;          // 功能块使能信号
    reset : BOOL;           // 复位信号:触发后所有状态清零
END_VAR
VAR_OUTPUT
    dataOut : REAL;         // 压缩后的输出数据
    compressed : BOOL;      // 压缩标记:为TRUE表示本次输出复用了上一次的有效值
    compressionRatio : REAL;// 压缩率:已压缩采样点占总采样点的百分比
    sampleCount : INT;      // 累计处理的采样点总数
END_VAR
VAR
    lastValue : REAL;       // 上一次的有效采样值
    unchangedCount : INT;   // 连续未发生有效变化的次数(当前版本暂未启用,可后续拓展)
    totalCount : INT;       // 总采样计数
    savedCount : INT;       // 累计被压缩(跳过)的采样点数量
END_VAR
// 复位逻辑:重置所有状态变量
IF reset THEN
    lastValue := 0.0;
    unchangedCount := 0;
    totalCount := 0;
    savedCount := 0;
    dataOut := 0.0;
    compressed := FALSE;
    compressionRatio := 0.0;
    sampleCount := 0;
    RETURN;
END_IF;
// 核心压缩逻辑:仅使能时运行
IF enable THEN
    totalCount := totalCount + 1;
    // 死区判断:变化小于阈值且不是首个采样点,则复用旧值
    IF ABS(dataIn - lastValue) <= threshold AND totalCount > 1 THEN
        dataOut := lastValue;
        compressed := TRUE;
        unchangedCount := unchangedCount + 1;
        savedCount := savedCount + 1;
    ELSE
        // 变化超过阈值,输出新有效值,更新历史值
        dataOut := dataIn;
        lastValue := dataIn;
        compressed := FALSE;
        unchangedCount := 0;
    END_IF;
    // 计算实时压缩率
    IF totalCount > 0 THEN
        compressionRatio := INT_TO_REAL(savedCount) / INT_TO_REAL(totalCount) * 100.0;
    END_IF;
    sampleCount := totalCount;
END_IF;

 

1.2

   

逻辑详解

核心算法逻辑

该功能块采用死区压缩算法,完全匹配工业场景的数据特性:

  1. 首个采样点无历史参考值,直接输出原始数据并更新lastValue,避免无效压缩;

  2. 后续采样点只要与上一次有效值的差值在阈值范围内,就判定为“无意义波动”,直接复用上一次的有效值,跳过本次采样点的存储/传输,仅当变化超过阈值时才更新有效值;

  3. 实时统计压缩率,方便工程师根据实际场景调整阈值,平衡数据压缩率和信息保真度。

算法优势

整个逻辑每次扫描仅需执行 1 次减法、1 次绝对值计算、2 次比较判断,CPU 占用极低,哪怕在 100 点/秒的高速采样场景下也能稳定运行,完全不会影响 PLC 的正常控制逻辑,非常适合工业现场的实时性要求。

2

   

典型应用场景

该功能块尤其适合慢变化模拟量参数的预处理,落地价值极高:

2.1

   

历史数据存储优化

化工、食品、制药等行业的 系统授权成本通常与存储容量直接挂钩。某食品厂拥有 200 个温度采集点,原来 1 秒采样一次,每月存储量约 1.2G;接入该功能块后,平稳期压缩率可达 75%,每月存储量降至 300M,每年直接节省授权成本上万元,且不会丢失温度突变的关键工艺数据。

2.2

   

远程监控与边缘网关数据传输

偏远地区的矿山、农场、管网监测设备通常通过 4G/5G 联网,带宽有限且流量成本高。某矿山项目将 30 个设备的压力、温度数据通过该功能块压缩后,单设备日上传数据量从 50M 降至 12M,每月节省流量费超千元,同时上传延迟从 2s 降至 500ms 以内,彻底解决了网络拥堵导致的数据丢包问题。

2.3

   

预测性维护数据预处理

做设备振动、电流趋势分析时,平稳期的重复数据会干扰算法训练效率。先在 PLC 端用该功能块过滤冗余数据,再传到云端做分析,模型训练效率提升 40%,且不会丢失异常变化的关键特征,大幅降低云端算力成本。

2.4

   

低带宽场景下的实时监控

跨地域的油气管网、供水管网监测点分布广,骨干网带宽不足,压缩后的数据体积仅为原始的 1/4~1/10,可保证关键参数的上传实时性,避免网络拥堵导致的关键报警延迟。


3

   

拓展思考与进阶优化方向

该功能块基础逻辑已经能覆盖 80%的工业场景需求,若有更高要求可基于现有逻辑做拓展:

  1. 动态阈值适配:当前阈值为固定值,可根据需求升级为自适应阈值:取最近 10 个有效采样点的标准差作为动态阈值,平稳时自动缩小阈值提升压缩率,波动大时自动放大阈值避免丢失关键变化,进一步平衡压缩率和数据保真度。

  2. 抗干扰优化:可在压缩逻辑前增加“连续 3 次超阈值才更新有效值”的判断,避免传感器毛刺、电磁干扰导致的单次异常波动被当成有效数据,进一步提升数据可靠性。

  3. 多路复用设计:可将单路压缩逻辑扩展为 4/8 路并行处理,减少 PLC 的功能块调用数量,适合点数较多的大型项目,降低 CPU 负载。

  4. 异常联动:可将compressed信号和compressionRatio输出给报警功能块,当压缩率突然下降(说明数据波动变大)时自动触发异常预警,提前发现设备异常。

  5. 适用边界说明:该功能块最适合慢变化的模拟量参数,不适合高速脉冲、快变信号(如高速计数、伺服位置反馈)的压缩,使用时需根据信号特性选择。


 

总结

FB_DataCompressor功能块代码量小、逻辑清晰、易集成,哪怕是没有丰富算法经验的初级工程师也能快速上手。在工业物联网快速普及的当下,边缘侧的轻量数据处理能力越来越重要,这类“小而美”的功能块能够在不增加硬件成本的前提下,大幅提升系统的存储、传输效率,是 PLC 工程师工具箱里非常实用的“利器”。如果你的项目也有数据冗余、存储/传输成本高的痛点,不妨直接复制代码测试,几分钟就能落地见效。

图片

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

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

图片

往期回顾


 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

每周一个编程小例子:速率限制器

每周一个编程小例子:线性插值法线性化感器

每周一个编程小例子:循环队列FIFO

每周一个编程小例子:温度均匀性控制

每周一个编程小例子:设备安全计时功能

每周一个编程小例子:流量分配控制

每周一个编程小例子:数据转换的魔力

每周一个编程小例子:PLC 安全监控功能块

每周一个编程小例子:PLC 消抖功能块

2026年10月