签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
我想实现15个采集数值的平均数,采集15次之后,第16次进来,第一次的就没有了,这样的移位计算。如何实现呢?
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1781496&b_id=66&s_id=0&num=5
创建一个0...14数组A,标志位N,总值B,读取值c,采集标志位d
IF d then
B:=B-A[n];
B:=B+c;
A[n]:=c;
n:=n+1;
If n:=15 then
n:=0;
End_if;
平均值直接把B除15就可以了。
在右侧计算里面找下,有现成的块
用一下这个指令
MOVE_BLK:块移动
扩展功能块,需要下载。我记得有个FIFO指令。
FUNCTION_BLOCK "Avg"
VERSION : 0.1
VAR_INPUT
value : Real;
reset : Bool;
END_VAR
VAR_OUTPUT
avgValue : Real;
VAR
statCache : Array[0..#MAX_INDEX] of Real;
statCacheIndex : Int;
statIndex : Int;
statLast : Real;
statSum : Real;
statAvg : Real;
VAR_TEMP
i : Int;
VAR CONSTANT
MAX_INDEX : Int := 14;
BEGIN
IF #reset THEN //初始化
FOR #i := 0 TO #MAX_INDEX DO
#statCache[#i] := 0;
END_FOR;
#statCacheIndex := 0;
#statIndex := 0;
#statLast := 0;
#statSum := 0;
#statAvg := 0;
ELSIF #value <> #statLast THEN //如果值改变
IF #statCacheIndex < #MAX_INDEX THEN //缓存未满
#statCache[#statCacheIndex] := #value;
#statCacheIndex += 1;
ELSE //缓存已满
#statCache[#statIndex] := #value;
#statIndex += 1;
#statIndex := #statIndex MOD #MAX_INDEX;
#statSum += #statCache[#i];
#statAvg := #statSum / #MAX_INDEX;
END_IF;
#statLast := #value;
#avgValue := #statAvg;
END_FUNCTION_BLOCK
Avg.scl.zip
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录