文章目录

PLC模拟量滤波算法的实现与参数调整

发布于 2026-03-29 05:24:36 · 浏览 9 次 · 评论 0 条

PLC 模拟量滤波算法的实现与参数调整

工业现场环境复杂,电机启停、变频器运行、长导线传输都会引入电磁干扰。这些干扰会导致 PLC 采集的模拟量数值剧烈跳动,直接影响闭环控制的稳定性。读取原始数据后不能直接使用,必须经过滤波处理。本指南将详细说明四种主流滤波算法的原理、代码实现逻辑及参数整定方法。


核心滤波算法原理

在编写程序前,理解不同算法的适用场景至关重要。没有一种万能的滤波器,只有最适合当前信号的方案。

1. 算术平均滤波法

该方法对连续采样 N 次数据求平均值。适用于脉冲干扰较小、需要平滑数据的场合。

公式如下:

$$ Y = \frac{1}{N} \sum_{i=1}^{N} X_i $$

其中 $X_i$ 为第 $i$ 次采样值,$N$ 为采样次数。

  • 优点消除随机噪声能力强。
  • 缺点:延迟大,无法反映快速变化的信号。

2. 滑动窗口平均滤波法

该方法不保存所有历史数据,只保留最近 N 个数据。新数据进入,旧数据移出队列。

适用场景:内存有限但需要连续处理的系统。计算公式与算术平均类似,只是分母始终固定为窗口大小 $N$。

3. 一阶滞后滤波法 (低通滤波)

该方法模仿物理 RC 电路的特性,让输出值缓慢跟随输入值变化。通过调节系数 $\alpha$ 控制反应速度。

公式如下:

$$ Y_k = \alpha X_k + (1 - \alpha) Y_{k-1} $$

其中:

  • $Y_k$ 为本次滤波结果。

  • $X_k$ 为本次采样值。

  • $Y_{k-1}$ 为上次滤波结果。

  • $\alpha$ 为滤波系数,取值范围 $0 < \alpha \le 1$。

  • 关键点:$\alpha$ 越大,响应越快,抗干扰越差;$\alpha$ 越小,响应越慢,滤波越强。

4. 限幅消抖滤波法

该方法结合了限幅和去抖动功能。先判断当前值与上一次的差值,如果超过设定阈值则视为干扰并丢弃。

适用场景:传感器信号存在明显跳变尖峰的场合。


算法名称 适用对象 内存占用 实时性 编程难度
算术平均滤波 流量、液位
滑动平均滤波 温度、压力
一阶滞后滤波 转速、张力 极低
限幅消抖滤波 限位开关、脉冲

程序实现步骤

以下以结构化文本 (ST) 语言为例,演示一阶滞后滤波算法的具体编写过程。该方式逻辑清晰,便于移植到三菱、西门子等主流品牌 PLC 中。

步骤一:定义变量

创建全局 DB 块或局部静态变量。需定义三个关键变量用于存储状态。

  1. 声明输入变量 Raw_Signal (INT),对应模拟量输入通道原始值。
  2. 声明输出变量 Filtered_Signal (REAL),对应滤波后的工程单位数值。
  3. 声明常量变量 Alpha_Val (REAL),预设滤波系数。
  4. 声明中间变量 Prev_Result (REAL),记录上一次计算结果。
VAR_GLOBAL
    Raw_Signal : INT;      // 原始采集值,例如 0-27648
    Filtered_Signal : REAL; // 最终输出值
    Alpha_Val : REAL := 0.1; // 滤波系数,默认 0.1
    Prev_Result : REAL := 0.0; // 上一周期结果
END_VAR

步骤二:线性转换处理

模拟量原始值通常是整数范围,需转换为标准浮点数工程单位(如摄氏度、伏特)。此步骤应在滤波之前完成,避免定点运算误差累积。

  1. 读取 Raw_Signal 通道值。
  2. 执行除法运算,将其除以量程最大值(如 27648),得到 0.0 到 1.0 之间的归一化数值。
  3. 乘以量程上限值(如 100.0℃),得到实际物理量。
// 假设量程为 0~100.0
Temp_Floating := REAL(Raw_Signal) / 27648.0 * 100.0;

步骤三:执行滤波公式

根据一阶滞后公式,计算新的滤波结果。确保使用实数运算以避免精度丢失。

  1. 判断系统是否初始化。若未初始化,直接将 Temp_Floating 赋值给 Prev_Result
  2. 应用公式 $Y_k = \alpha X_k + (1 - \alpha) Y_{k-1}$。
  3. 更新 Prev_Result 变量,以便下一周期调用。
IF Init_Flag THEN
    Filtered_Signal := Temp_Floating;
    Prev_Result := Filtered_Signal;
    Init_Flag := FALSE;
ELSE
    // 核心滤波计算
    Filtered_Signal := Alpha_Val * Temp_Floating + (1.0 - Alpha_Val) * Prev_Result;
    // 更新历史值
    Prev_Result := Filtered_Signal;
END_IF

步骤四:写入 HMI 或控制器

映射 Filtered_Signal 到触摸屏显示区域或 PID 控制器的给定端。不要直接连接原始信号,否则会出现肉眼可见的锯齿状波动。


参数调整实战指南

算法写好后,配置参数是决定效果的关键。错误的参数会导致系统响应迟钝或过滤无效。以下提供具体的调试步骤。

1. 确定滤波强度需求

观察现场信号波形,分析主要问题类型。

  • 情况 A:数值偶尔出现大幅跳变,但大部分时间平稳。
    • 对策:采用限幅滤波,设置最大允许变化步长。
  • 情况 B:数值持续高频微小振荡。
    • 对策:采用滑动平均一阶滞后,增加平滑度。
  • 情况 C:需要快速响应当令指令变化。
    • 对策:减少滤波系数,降低延时。

2. 调试一阶滞后系数 $\alpha$

在一阶滞后滤波中,$\alpha$ 是核心。请按以下步骤进行在线修改。

  1. 连接 PLC 编程软件至 CPU,开启监控模式。
  2. 观察 Raw_Signal 的真实波动幅度。
  3. 设置初始 $\alpha$ 值为 0.2。这是一个较安全的起始点。
  4. 监视 Filtered_Signal 的上升沿。当给一个阶跃信号时,观察输出达到目标值的 63.2% 所需的时间。
    • 若响应过快,数值仍有毛刺:增大延时时间常数,即减小 $\alpha$ 值(如改为 0.05)。
    • 若响应过慢,跟不上工艺变化:提高响应速度,即增大 $\alpha$ 值(如改为 0.5)。
  5. 反复微调,直到数值既无毛刺又能跟上正常工艺趋势。

3. 调试滑动窗口大小 $N$

对于滑动平均滤波,$N$ 决定了平均的范围。

  1. 估算干扰频率。如果干扰是工频 50Hz,而 PLC 扫描时间为 10ms,则每个周期包含 0.5 个干扰周期。
  2. 设置 $N$ 值。通常建议设置为扫描周期的奇数倍,以消除对称干扰。
    • 小 N 值:如 $N=5$,适合快速变化信号,但残留噪声多。
    • 大 N 值:如 $N=20$,曲线非常平滑,但相位滞后严重。
  3. 验证动态特性。改变输入信号,确认输出没有不可接受的滞后感。

4. 安全边界保护

无论使用何种算法,都必须添加上下限保护,防止计算溢出或异常导致系统失控。

  1. 设定物理量最小值 Min 和最大值 Max。
  2. 比较 Filtered_Signal 是否在 [Min, Max] 区间内。
  3. 强制赋值:若超出范围,则将 Filtered_Signal 限制在边界值上。
IF Filtered_Signal > Max_Limit THEN
    Filtered_Signal := Max_Limit;
ELSIF Filtered_Signal < Min_Limit THEN
    Filtered_Signal := Min_Limit;
END_IF

故障排查与决策流程

在调试过程中,如果遇到滤波无效或系统震荡的情况,请按照以下逻辑流排查

graph TD Start["开始:模拟量不稳定"] --> CheckNoise["检查硬件接线"] CheckNoise -->|接地不良 | GroundFix["重新接地屏蔽层"] CheckNoise -->|接线良好 | CheckFilter["检查滤波算法"] CheckFilter -->|系数太小 | AdjustAlpha["增大 α 或 N 值"] CheckFilter -->|系数太大 | AdjustSlow["减小 α 或 N 值"] AdjustAlpha --> Verify["验证效果"] AdjustSlow --> Verify GroundFix --> Verify Verify -->|仍无效 | CheckInterference["检查变频器干扰源"] CheckInterference --> InstallReactor["加装输出电抗器"] Verify -->|已解决 | EndState["结束:系统稳定"]

在上述流程中,优先检查硬件环境。很多时候,软件层面的滤波无法克服严重的硬件接地干扰。务必确保模拟量电缆使用了双绞屏蔽线,且屏蔽层单端可靠接地。如果软滤波已调至极限仍无效,再考虑硬件整改。

常见误区与注意事项

在实际工程中,以下几点容易引发问题,请务必注意

  1. 数据类型溢出:在进行累加求和运算时,如果 $N$ 值很大,中间变量可能会超过 INT 范围,务必使用 LREAL (双精度浮点) 进行中间计算。
  2. 断电数据丢失:对于一阶滞后滤波,断电重启瞬间 $Y_{k-1}$ 会被清零,导致输出突变为 0。需配置掉电保持区,或者在启动逻辑中将 Prev_Result 初始化为当前采集值。
  3. 循环依赖:确保读取 $Y_{k-1}$ 发生在更新 $Y_{k-1}$ 之前。如果在一个逻辑块内顺序执行,PLC 通常会按行序执行,这符合要求,但需注意不要在同一个扫描周期内多次调用该子程序。
  4. 工程单位一致性:滤波运算必须在统一的工程单位下进行。切勿混用原始 INT 值和转换后的 REAL 值,否则会引入巨大的比例误差。

遵循上述步骤与规范,即可构建稳定的模拟量采集系统。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文