news 2026/4/18 9:10:59

模拟量滤波防抖PLC程序实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
模拟量滤波防抖PLC程序实现

模拟量滤波防抖PLC程序 1,能实现电流电压和热电阻模拟量信号的采集,有滤波,原理就是去掉最大值及最小值,在取平均值 2,采用for循环指令和间接寻址,让程序简单好用,可多次代参重复调用 有详细注释

在工业自动化控制领域,对于电流、电压以及热电阻等模拟量信号的准确采集至关重要。然而,实际环境中的干扰往往会导致信号波动,影响采集数据的准确性。今天咱就来聊聊如何通过PLC程序实现模拟量滤波防抖,让采集的数据更靠谱。

1. 基本原理

咱这个滤波算法的核心思想很简单,就是在采集到的一组数据中,去掉最大值和最小值,然后对剩余的数据取平均值。这样一来,那些因为干扰产生的异常大或异常小的值就不会影响最终的结果啦,从而让采集的数据更平滑、准确。

2. 代码实现

下面以常见的西门子S7 - 1200 PLC为例,给大家展示具体的程序代码及分析。

数据结构定义

// 定义一个结构体,用于存储模拟量采集数据及相关参数 STRUCT AnalogData // 模拟量采集值数组 Values : ARRAY[1..10] OF REAL; // 数组中有效数据的个数 Count : INT; // 滤波后的平均值 FilteredValue : REAL; END_STRUCT

这里我们定义了一个结构体AnalogData,它包含一个用于存储模拟量采集值的数组Values,数组大小为10,可根据实际需求调整。Count记录数组中有效数据的个数,FilteredValue则用于保存滤波后的平均值。

主程序实现

PROGRAM FilterAnalogValues VAR Analog1 : AnalogData; i, j : INT; Temp : REAL; BEGIN // 假设这里模拟采集到10个数据 Analog1.Count := 10; Analog1.Values[1] := 4.5; Analog1.Values[2] := 5.2; Analog1.Values[3] := 3.8; Analog1.Values[4] := 6.1; Analog1.Values[5] := 4.9; Analog1.Values[6] := 5.5; Analog1.Values[7] := 4.2; Analog1.Values[8] := 5.9; Analog1.Values[9] := 3.5; Analog1.Values[10] := 5.0; // 使用冒泡排序法对采集值进行排序 FOR i := 1 TO Analog1.Count - 1 DO FOR j := 1 TO Analog1.Count - i DO IF Analog1.Values[j] > Analog1.Values[j + 1] THEN Temp := Analog1.Values[j]; Analog1.Values[j] := Analog1.Values[j + 1]; Analog1.Values[j + 1] := Temp; END_IF; END_FOR; END_FOR; // 去掉最大值和最小值后计算平均值 Analog1.FilteredValue := 0; FOR i := 2 TO Analog1.Count - 1 DO Analog1.FilteredValue := Analog1.FilteredValue + Analog1.Values[i]; END_FOR; Analog1.FilteredValue := Analog1.FilteredValue / (Analog1.Count - 2); END_PROGRAM

代码分析

  • 初始化部分:我们先给结构体Analog1中的Count赋值为10,表示本次采集了10个数据,然后给Values数组填充模拟采集值。实际应用中,这些值应该是从模拟量输入模块获取的。
  • 排序部分:使用经典的冒泡排序法对采集到的数据进行排序。冒泡排序的原理就是通过多次比较相邻的两个元素,如果顺序不对就交换它们的位置,这样一趟下来,最大(或最小)的元素就会“浮”到数组的末尾(或开头)。这里的双重FOR循环,外层循环控制排序的轮数,内层循环用于每一轮比较相邻元素并交换位置。
  • 计算平均值部分:排序完成后,去掉数组开头的最小值和末尾的最大值,然后对中间的数据进行求和并计算平均值。这里再次使用FOR循环遍历数组中从第二个到倒数第二个元素,并累加到FilteredValue中,最后除以有效数据的个数(总个数减去2,因为去掉了最大值和最小值),得到最终的滤波后平均值。

3. 间接寻址与代参重复调用

为了让程序更加通用,我们可以利用间接寻址和代参的方式,使得这个程序可以多次重复调用,处理不同的模拟量信号。不过在S7 - 1200中,间接寻址相对复杂一些,涉及到指针的操作。以下简单示意如何实现间接寻址读取模拟量值并存入数组:

VAR Pointer : POINTER TO REAL; Index : INT; BEGIN // 假设模拟量输入地址为PIW256,转换为REAL类型后存储 Pointer := PWR 'PIW256'; FOR Index := 1 TO Analog1.Count DO Analog1.Values[Index] := *Pointer; Pointer := Pointer + 2; // 假设每个模拟量值占2个字节 END_FOR; END

上述代码通过指针Pointer间接读取模拟量输入地址的值,并依次存入Analog1.Values数组中。这样,我们在采集模拟量数据时就可以通过间接寻址灵活处理不同的输入地址。

通过这种方式,我们实现了一个简单易用且通用的模拟量滤波防抖PLC程序,能有效处理电流、电压和热电阻等模拟量信号的采集与滤波,在实际项目中大大提高数据采集的准确性和稳定性。大家在实际应用中可以根据具体需求和PLC型号对代码进行适当调整和优化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:42:51

LLaMA TensorFlow版本开源项目汇总分析

LLaMA TensorFlow版本开源项目的技术实践洞察 在大语言模型(LLM)从研究走向落地的今天,一个核心问题摆在工程团队面前:如何将像LLaMA这样的先进架构,稳定、高效地部署到生产环境中?尽管PyTorch凭借其动态图…

作者头像 李华
网站建设 2026/4/17 13:00:51

无需后端API:纯前端实现AI功能的技术革命

无需后端API:纯前端实现AI功能的技术革命 在一张照片上传到云端之前,它已经完成了识别——皮肤病变的初步筛查结果出现在屏幕上,毫秒级响应,没有加载动画,也没有网络请求。这并不是某个黑科技演示,而是今天…

作者头像 李华
网站建设 2026/4/18 7:42:00

模型并行实战:TensorFlow Mesh-TensorFlow使用体验

模型并行实战:TensorFlow Mesh-TensorFlow使用体验 在大模型训练逐渐成为AI基础设施的今天,一个现实问题摆在每个工程师面前:当模型参数突破百亿甚至千亿量级时,单张GPU或TPU早已无法容纳整个计算图。显存墙成了横亘在算法创新与…

作者头像 李华
网站建设 2026/4/17 21:43:19

TensorFlow源码编译指南:定制化CUDA版本支持

TensorFlow源码编译指南:定制化CUDA版本支持 在现代AI工程实践中,一个看似简单的 pip install tensorflow 往往掩盖了底层复杂的软硬件适配问题。当你的团队采购了最新的H100 GPU,却发现官方TensorFlow包不支持计算能力9.0;或者你…

作者头像 李华
网站建设 2026/4/18 8:54:48

最近在研究孤岛模式下两台逆变器的下垂控制算法,发现这玩意儿还挺有意思的。今天就来聊聊这个,顺便穿插点代码和分析,希望能给大家带来点启发

孤岛模式下两台逆变器下垂控制算法,采用电压外环和电流内环的双闭环控制,可以提供参考文献。 首先,孤岛模式下的逆变器控制,核心就是让两台逆变器能够协同工作,保持电压和频率的稳定。这里我们采用电压外环和电流内环的…

作者头像 李华
网站建设 2026/4/17 21:39:29

云环境自动化测试的五大核心挑战与创新解决方案

云原生测试的范式变革云计算的弹性扩缩容、微服务架构、容器化部署等特性,使传统自动化测试体系面临重构。据Gartner 2025报告,83%的企业因云环境测试缺陷导致版本延迟发布,凸显问题紧迫性。一、动态环境下的测试稳定性危机挑战表现graph LR …

作者头像 李华