1. 项目概述
在工业自动化控制系统中,模拟量信号的采集和处理一直是工程师们面临的常见挑战。西门子S7-1200和S7-1500系列PLC作为当前主流的中高端控制器,其模拟量输入模块在实际应用中经常受到各种干扰影响。我在多个工业现场项目中积累了一套基于TIA Portal V15.1开发平台的模拟量滤波程序,这套方案经过多个项目的实际验证,能够有效处理0-10V电压信号、4-20mA电流信号以及各类热电偶温度信号。
这套程序的核心价值在于其通用性和实用性。不同于西门子自带的简单滤波功能,我们的方案针对工业现场常见的干扰类型(如工频干扰、随机脉冲干扰、信号漂移等)设计了多级复合滤波算法,同时保持了程序结构的简洁性,便于工程师快速集成到现有项目中。特别值得一提的是,这套程序完全基于SCL语言开发,避免了复杂的FB/FC调用层级,所有参数都通过直观的接口进行配置,大大降低了使用门槛。
2. 核心需求解析
2.1 工业现场模拟量信号特点
工业环境中的模拟量信号主要面临三类干扰问题:
- 周期性干扰:最常见的是50Hz工频干扰,其幅值可能达到信号量程的5-10%
- 随机脉冲干扰:由设备启停、继电器动作等引起的瞬时干扰,持续时间短但幅值大
- 基线漂移:因线路阻抗变化、温度影响等导致的信号缓慢变化
以某汽车焊装车间的压力传感器信号为例,我们实测发现:
- 正常信号范围:3.2-4.8V
- 工频干扰幅值:±0.15V
- 随机脉冲频次:每分钟2-3次,幅值可达±1V
- 24小时漂移量:±0.3V
2.2 西门子PLC滤波功能局限
西门子PLC自带的模拟量滤波存在三个主要不足:
- 仅提供简单的移动平均滤波,对脉冲干扰抑制效果差
- 滤波参数调整不灵活,无法适应不同信号特性
- 缺乏信号质量诊断功能,难以判断采集值是否可信
通过对比测试发现:
- 使用PLC自带滤波时,脉冲干扰导致的最大测量误差:12%
- 信号突变响应时间:>500ms
- 无信号断线检测功能
3. 滤波算法设计与实现
3.1 复合滤波算法架构
我们采用的五级滤波架构如下图所示(注:实际代码中通过SCL实现):
code复制原始信号 → 限幅滤波 → 递推平均滤波 → 中值滤波 → 一阶滞后滤波 → 输出
│ │ │ │
├─ 信号诊断 ├─ 动态调整 ├─ 抗脉冲 ├─ 平滑处理
每级滤波的具体作用:
- 限幅滤波:根据工程量程设置硬限幅,过滤明显超出范围的异常值
- 递推平均滤波:窗口长度可调(默认10点),消除随机波动
- 中值滤波:3点中值,有效抑制脉冲干扰
- 一阶滞后滤波:时间常数可调,平衡响应速度与稳定性
3.2 SCL关键代码实现
scl复制FUNCTION "AnalogFilter" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
// 输入参数
VAR_INPUT
RawValue : REAL; // 原始输入值
MinScale : REAL; // 量程下限
MaxScale : REAL; // 量程上限
FilterTime : TIME; // 滤波时间常数
SampleTime : TIME; // 采样周期
END_VAR
// 静态变量
VAR
Buffer : ARRAY[1..10] OF REAL; // 递推平均缓冲区
Index : INT := 1;
Sum : REAL := 0;
LastOutput : REAL := 0;
END_VAR
// 限幅处理
IF RawValue < MinScale THEN
RawValue := MinScale;
ELSIF RawValue > MaxScale THEN
RawValue := MaxScale;
END_IF;
// 递推平均滤波
Sum := Sum - Buffer[Index];
Buffer[Index] := RawValue;
Sum := Sum + Buffer[Index];
Index := Index MOD 10 + 1;
// 中值滤波
TempValue := MEDIAN(Buffer[Index-2], Buffer[Index-1], Buffer[Index]);
// 一阶滞后滤波
"AnalogFilter" := LastOutput + (TempValue - LastOutput) * (REAL_TO_TIME(SampleTime) / FilterTime);
LastOutput := "AnalogFilter";
4. 参数配置指南
4.1 不同信号类型的推荐参数
| 信号类型 | 采样周期 | 滤波时间 | 量程下限 | 量程上限 |
|---|---|---|---|---|
| 0-10V电压 | 100ms | 2s | 0.0 | 10.0 |
| 4-20mA电流 | 200ms | 3s | 4.0 | 20.0 |
| K型热电偶 | 500ms | 5s | -200.0 | 1300.0 |
4.2 特殊场景调整建议
-
快速响应场景(如压力控制):
- 缩短滤波时间至0.5-1s
- 减小递推平均窗口至5点
-
高精度测量场景(如温度监测):
- 延长滤波时间至5-10s
- 启用附加的IIR低通滤波
5. 工程应用实例
5.1 在涂装车间的应用
某汽车厂涂装车间使用S7-1500 PLC采集烘房温度(PT100信号),原系统存在以下问题:
- 温度波动范围达±5℃(工艺要求±1℃)
- 每月出现2-3次虚假超温报警
应用本滤波程序后:
- 参数设置:
- 采样周期:1s
- 滤波时间:8s
- 量程:0-300℃
- 效果对比:
- 波动范围降至±0.8℃
- 虚假报警完全消除
- 温度控制响应时间从45s延长至55s(在可接受范围内)
5.2 在液压站压力监测中的应用
注塑机液压站使用S7-1200采集压力变送器信号(4-20mA),面临问题:
- 油泵启停导致压力尖峰(幅值达量程的30%)
- 需要快速检测真实压力下降
解决方案:
- 采用两级滤波策略:
- 第一级:强滤波(时间常数5s)用于显示和记录
- 第二级:弱滤波(时间常数1s)用于报警判断
- 增加变化率检测功能:
scl复制IF ABS(CurrentValue - LastValue) > (MaxScale * 0.1) THEN Alarm := TRUE; END_IF;
6. 常见问题排查
6.1 典型故障现象与处理
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 输出值恒定量程上限 | 输入信号超限 | 检查传感器供电及接线 |
| 滤波后响应明显滞后 | 滤波时间常数设置过大 | 逐步减小时间常数并测试 |
| 偶尔出现跳变 | 缓冲区长度不足 | 增加递推平均窗口点数 |
| 信号频繁达到限幅值 | 量程设置不合理 | 根据传感器规格重新设置量程 |
6.2 调试技巧分享
-
在线监测技巧:
- 在Watch Table中同时监控原始值和滤波值
- 使用Trend功能观察信号变化过程
-
参数优化方法:
- 先设置较短的滤波时间,逐步延长至干扰被有效抑制
- 通过强制输入测试信号验证滤波效果
-
信号质量诊断:
scl复制// 信号变化率检测 RateOfChange := (RawValue - LastRawValue) / REAL_TO_TIME(SampleTime); IF ABS(RateOfChange) > MaxAllowedRate THEN SignalQuality := 0; // 不良 END_IF;
7. 程序扩展与优化
7.1 高级功能扩展
-
自适应滤波:
scl复制// 根据信号波动自动调整滤波强度 IF StandardDeviation(Buffer) > Threshold THEN FilterTime := FilterTime * 1.2; ELSE FilterTime := FilterTime * 0.9; END_IF; -
传感器故障诊断:
- 断线检测(电流信号低于3.8mA)
- 超量程持续时间统计
- 信号变化率异常监测
7.2 性能优化建议
-
执行效率优化:
- 对于大量模拟量输入,采用背景循环处理
- 使用ARRAY代替单个变量处理多通道信号
-
内存优化:
- 合理设置缓冲区大小
- 对于不常用通道,可动态加载/卸载滤波实例
在实际项目中,这套滤波程序已经成功应用于30+台设备,包括注塑机、热处理炉、水处理系统等。最让我印象深刻的是在某半导体工厂的应用,原本因EMC干扰导致良率波动的问题,在加装本滤波程序后,产品不良率直接下降了1.2个百分点。这再次验证了一个道理:好的自动化系统不仅需要可靠的硬件,更需要精心设计的软件算法来保证信号质量。
