流量累计或者有功功率累积功能在很多地方都会用到。比如流量计的瞬时值F(m3/s)不断地实时累加,在画面上显示,供用户查看。或者电厂行业的有功功率的瞬时值P(KW),用户也需要实时看到有功电度的实时累加值。看了很多楼主分享的代码,包括西门子(LGF)官方的扩展库中Intergration功能。
还有哪种累积程序比较好的,大家可以分享分享,互相学习一下。
1、在STEP 7 V5.x 如何计算物理流量测量值(如质量流量)的总和,这是官方在S7-300/400中采用ST语言编写的一种计算带有物理量单位的实时累积量的方法。功能块如下:
Value为流量或者有功功率等的瞬时值,intervall为该瞬时值的时间单位。例如:
1):米/秒: T#1s
2):立方米/分钟: T#1M
3):公里/小时: T#1h
Cycle为循环中断的循环时间,可自定义设置为100ms,注意该功能块在循环中断中调用。total为累积值。
该功能块的思想是通过中断时间100ms采集一次Value值,进行累加。属于矩形分割法。运行结果如下:
我测试了Value=1在10分钟的累加值,即10*60*1=600,测试结果Total显示正好是600,比较准确。
功能块下载链接:https://support.industry.siemens.com/cs/document/23061633/在step-7-v5-x-如何计算物理流量测量值(如质量流量)的总和??dti=0&lc=zh-CN
2、在官方扩展库中(LGF)介绍了一种通过读取DTL数据类型做分割的思想。该方法是属于梯形分割法,误差较小,?t=t1-t0,如下图所示:
瞬时值在时间轴上实时变化的曲线和时间轴围成面积正好是该段时间内的累加值。取t0,t1,t2,,,tn时刻的瞬时值为f(t0),f(t1),f(t2),,,f(tn),那么t0到tn时刻围成的面积值为上述A,各个分割的直角梯形实时累加。但是通过我自己的验证,该功能误差比上面的第一种更大,造成误差的原因是程序在做时间分割时,是通过扫描上下相邻语句的时间间隔造成的。验证如下:
很容易计算,数值Value=1在1分10s(70s)钟内的累积值,即就是一个长为70,宽为1的矩形的面积(70)。但实际运行值为63.9539999,这个误差就非常明显了。随着时间的推移,误差会越来越大。
感兴趣的小伙伴可以下载西门子官方扩展库进行验证,各个块的源码都是开放的,最新的版本为V16版本。
3、该方法为论坛帖中“宁超”分享的使用S7-300/400中的FB41功能块里面积分的那部分。摘取了积分部分输出就做成了流量累计块,FB41用的是梯形积分法,还有抗积分饱和和浮点误差处理,积分初始化和暂停处理,已经很完善了。运行结果如下:
但是因为FB41块是系统功能块,无法获取内部的源代码,因此我也没做测试。希望有源代码的小伙伴可以分享一下。