签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
启动信号给出后,每分钟取一个数,求60个数的平均值(求模拟量滑动平均值程序示例)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1686832&b_id=4&s_id=0&num=7
相当于每秒钟,这里暂时用上升沿取一个数据,存放到一个连续的数据区首地址,然后,每一个1秒脉冲上升沿到了就取一个数存放到连续数据区的第2个数据存放区,以此类推,当60个脉冲到达后,将所有的数据累加后再除60,另外清楚所有计算前的数据区。当然,你呀可以不理睬数据寄存器的数据,反正下一个60秒,旧数据会被新数据覆盖掉。
启动信号给出后,每分钟取一个数,求60个数的平均值
是要求每分钟取一个数,60个数的平均值
1 先设置个分钟脉冲,300里就有分钟脉冲,设置下,直接用就行了,
2 设置个计数次数的值
3 触发脉冲一到,就把某个地址存到其他一个DB地址里,下个脉冲来了,再把信号与DB地址值相加后再次
存入这个DB地址,其实就是累加。
4 计算存够60次后,(其实也就是1小时了),把累加的DB地址值除于60就是取平均值,再读出,存入你需
要的地址。
5 完毕后把DB地址值,计数次数值复位0.准备从新开始下一轮累加。
6 从第61次开始,又重复前面的动作就是了。
A M 210.0 //启动条件
JCN A001
OPN DB 4
A M 240.0 //一分钟取数的脉冲
JCN A002
L MB 220
L 16
*D
T MD 226 //地址的数据,DBW0开始
L MW 230
T DBW [MD 226]
INC 1
T MB 220
L 59
>I //取60个数据
JCN A003
L 0
T MD 234
LAR1 P#0.0
L 60
A004: T MB 222
L DBW [AR1,P#0.0]
L MW 234
+D
T MW 234
+AR1 P#2.0
L MB 222
LOOP A004
/D
T MW 236 //最后的平均数
A003: NOP 0
A002: NOP 0
A001: NOP 0
AN M 240.0
L S5T#1M
SD T 100
A T 100
= M 240.0 //一分钟的脉冲
既然是滑动平均值,那么应该是用fifo队列,中断周期为1s的的中断中编程:从后向前,每一个数据都后移一个地址,当前数据放到第一个地址上,然后所有地址的数据求和除以60.0。
https://support.industry.siemens.com/cs/document/39333120/%E5%9C%A8-step-7-(tia-portal)-%E4%B8%AD%EF%BC%8C%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97s7-1200-s7-1500%E7%9A%84%E5%A4%9A%E4%B8%AA%E6%B5%AE%E7%82%B9%E5%9E%8B%E6%95%B0%E6%8D%AE%E7%9A%84%E7%AE%97%E6%9C%AF%E5%B9%B3%E5%9D%87%E5%80%BC?dti=0&lc=zh-CN
功能块 "Floating Average" 将输入的多个浮点型数据计算出算术平均值,提供了一种平滑数据队列的方法。可周期性输入或脉冲触发的方式计算。
刚看到另一边的帖子差不多也是这个问题。你看看这个是不是适合你。
这个不就是最简单的模拟量滤波处理吗?
FIFO队列、求平均值。
一阶滤波了解下。 这种固定数量, 固定权重的加权平均, 理论上就是若干个一阶滤波的组合。
更何况, 求平均值不是目的, 目的是滤除杂波, 找出稳态分量。 这种情况,就用滤波就对了。
y = (1 - a) * x + a * y;
一次不行, 就滤两次; 两次还不行, 就不是干扰的问题了。
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录