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 块或局部静态变量。需定义三个关键变量用于存储状态。
- 声明输入变量
Raw_Signal(INT),对应模拟量输入通道原始值。 - 声明输出变量
Filtered_Signal(REAL),对应滤波后的工程单位数值。 - 声明常量变量
Alpha_Val(REAL),预设滤波系数。 - 声明中间变量
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
步骤二:线性转换处理
模拟量原始值通常是整数范围,需转换为标准浮点数工程单位(如摄氏度、伏特)。此步骤应在滤波之前完成,避免定点运算误差累积。
- 读取
Raw_Signal通道值。 - 执行除法运算,将其除以量程最大值(如 27648),得到 0.0 到 1.0 之间的归一化数值。
- 乘以量程上限值(如 100.0℃),得到实际物理量。
// 假设量程为 0~100.0
Temp_Floating := REAL(Raw_Signal) / 27648.0 * 100.0;
步骤三:执行滤波公式
根据一阶滞后公式,计算新的滤波结果。确保使用实数运算以避免精度丢失。
- 判断系统是否初始化。若未初始化,直接将
Temp_Floating赋值给Prev_Result。 - 应用公式 $Y_k = \alpha X_k + (1 - \alpha) Y_{k-1}$。
- 更新
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$ 是核心。请按以下步骤进行在线修改。
- 连接 PLC 编程软件至 CPU,开启监控模式。
- 观察
Raw_Signal的真实波动幅度。 - 设置初始 $\alpha$ 值为
0.2。这是一个较安全的起始点。 - 监视
Filtered_Signal的上升沿。当给一个阶跃信号时,观察输出达到目标值的 63.2% 所需的时间。- 若响应过快,数值仍有毛刺:增大延时时间常数,即减小 $\alpha$ 值(如改为
0.05)。 - 若响应过慢,跟不上工艺变化:提高响应速度,即增大 $\alpha$ 值(如改为
0.5)。
- 若响应过快,数值仍有毛刺:增大延时时间常数,即减小 $\alpha$ 值(如改为
- 反复微调,直到数值既无毛刺又能跟上正常工艺趋势。
3. 调试滑动窗口大小 $N$
对于滑动平均滤波,$N$ 决定了平均的范围。
- 估算干扰频率。如果干扰是工频 50Hz,而 PLC 扫描时间为 10ms,则每个周期包含 0.5 个干扰周期。
- 设置 $N$ 值。通常建议设置为扫描周期的奇数倍,以消除对称干扰。
- 小 N 值:如 $N=5$,适合快速变化信号,但残留噪声多。
- 大 N 值:如 $N=20$,曲线非常平滑,但相位滞后严重。
- 验证动态特性。改变输入信号,确认输出没有不可接受的滞后感。
4. 安全边界保护
无论使用何种算法,都必须添加上下限保护,防止计算溢出或异常导致系统失控。
- 设定物理量最小值 Min 和最大值 Max。
- 比较
Filtered_Signal是否在[Min, Max]区间内。 - 强制赋值:若超出范围,则将
Filtered_Signal限制在边界值上。
IF Filtered_Signal > Max_Limit THEN
Filtered_Signal := Max_Limit;
ELSIF Filtered_Signal < Min_Limit THEN
Filtered_Signal := Min_Limit;
END_IF
故障排查与决策流程
在调试过程中,如果遇到滤波无效或系统震荡的情况,请按照以下逻辑流排查。
在上述流程中,优先检查硬件环境。很多时候,软件层面的滤波无法克服严重的硬件接地干扰。务必确保模拟量电缆使用了双绞屏蔽线,且屏蔽层单端可靠接地。如果软滤波已调至极限仍无效,再考虑硬件整改。
常见误区与注意事项
在实际工程中,以下几点容易引发问题,请务必注意。
- 数据类型溢出:在进行累加求和运算时,如果 $N$ 值很大,中间变量可能会超过
INT范围,务必使用LREAL(双精度浮点) 进行中间计算。 - 断电数据丢失:对于一阶滞后滤波,断电重启瞬间 $Y_{k-1}$ 会被清零,导致输出突变为 0。需配置掉电保持区,或者在启动逻辑中将
Prev_Result初始化为当前采集值。 - 循环依赖:确保读取 $Y_{k-1}$ 发生在更新 $Y_{k-1}$ 之前。如果在一个逻辑块内顺序执行,PLC 通常会按行序执行,这符合要求,但需注意不要在同一个扫描周期内多次调用该子程序。
- 工程单位一致性:滤波运算必须在统一的工程单位下进行。切勿混用原始
INT值和转换后的REAL值,否则会引入巨大的比例误差。
遵循上述步骤与规范,即可构建稳定的模拟量采集系统。

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