技术论坛

 S7-1200的流量累积(有功功率累积)SCL编程代码

返回主题列表
作者 主题
Chen_TS


经验值:300
发帖数:18
精华帖:2
楼主    2020-12-01 16:36:39
主题:S7-1200的流量累积(有功功率累积)SCL编程代码 精华帖 

流量累计或者有功功率累积功能在很多地方都会用到。比如流量计的瞬时值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块是系统功能块,无法获取内部的源代码,因此我也没做测试。希望有源代码的小伙伴可以分享一下。



No Pains,No Gains
yming
至圣

经验值:91149
发帖数:18651
精华帖:665
7楼    2020-12-05 18:36:49
精华帖  主题:回复:S7-1200的流量累积(有功功率累积)SCL编程代码

也用过系统时间,计算不同的扫描周期;毕竟精度就是那样,没感觉有什么问题。

至于累积方法我倒是有些想法,不知是否认同。

首先,我们大多的物理量转成测量信号的数字量,ADC都是有精度的。10位的或12位的。这些是绝对的精度。通过算法,可以提高相对精度;但那是估读,置信度有待考虑。

10位ADC是多少?是1024。通过算法,做成了模拟量27468。所以,手册上指明,这个27468的精度只有满量程的3%-3.5%(1024:27468即1: 27);而ADC的原始精度则是 1:1024大约是0.1%。

以上是针对ADC转换而言。

那么对于累积该数值,又要保持最好的精度,当然是直接使用UINT或者INT;将它们累积到UDINT (32位)中。

假如1毫秒采样累积,那么一个UDINT可以连续采样130秒。而不丢失原始精度。

反过来,我们看看实数Real(32位)。它的有效位数只有6位。这意味着,同样的值,每累积10倍(次)就丢失最后一位有效数字,积累1000倍最后3位已经是无效数字了。当十万倍时,这后面5位都是无效的数字。置信度为零。如果同样1毫秒采样积累,那么十万次就是100秒。

看了这个比较,有啥想法?

这就是为什么不用实数来做累积的原因之一。

第二个原因,有些人喜欢将ADC采样的整数转换到实际物理量(实数)再累积。这样做不但再一次增大了误差(转换误差),而且程序通用性不好(把一个无量纲的信号,变成有物理量纲的专用信号)。

基于以上两点原因。我认为只需做个FC,将采样值UINT;一个量纲单位 传入(Input); UDINT+UINT(InOut)累积值(全局变量);实时输出(Output)个计算位物理量的实数。至少它的置信度比较高。

这样的FC就可以通用了。

或FB(累积在背景数据),也可以。





学而时习之,不亦说乎?温故而知新,不亦乐乎?
Chen_TS


经验值:300
发帖数:18
精华帖:2
24楼    2020-12-14 15:20:12
精华帖  主题:回复:S7-1200的流基本参数.JPG量累积(有功功率累积)SCL编程代码

以下是中控DCS中中控自己做的一个积分功能块,参数很完善。

基本参数中“当量系数”=1为1小时,”时间系数“=3600是1小时转化为秒之后的单位。








No Pains,No Gains
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。