合并零零碎碎的楼层。
-----------------------------------------------------------------
流量累积涉及到浮点数问题,浮点数累积如果不采取措施会出现所谓的大数吃小数的情况,就是如果累积值相较于加数来说太大,加数会被忽略掉。这个主要是浮点数在计算机里面的表示决定的,具体可以百度。
一直以来我有几次机会使用流量累积功能,采取的措施是Kahan算法,倒也没有多少悬念。不过最近看网帖讨论流量累积就静下心来好好思考这个功能,这些是探讨,并没有付诸实际应用。
其实Kahan算法已经足够好了,不过在实际应用中还是需要做些辅助措施的,主要是有几个原因:
1、如果累积值已经比较大了,而瞬时值加数比较小,那么外在的累积值表现还是可能不会及时更新,这种更新不是说数据层面的更新,而是显示上的更新,就是给操作员看的可视更新。
从产品角度看这是不完美的,有可能让用户觉得你的设计有问题。
2、。。。
(原以为可以总结出几个原因,写出来发现都可以归为原因1。)
为了解决这个问题,我在设计了几个实验在PLC1200上验证。如果瞬时值为一个很小的数,比如0.000123456,而累积值初始化一个比较大的值,比如260000.0,就会看到在某个时段内累积值长期不变,只有积累足够的数量时才会更新累积值。
想到这些,问题就成了如何让显示的数据有变化,而不是显得一成不变。
解决的方案自然是把小数部分单独提出来显示了。
不能直接把Kahan算法的结果值的小数部分单独显示,这样没什么用,可以简单实验证明。这里就不写了。
要把过程中的数据变成显得是变化的,也就是需要像放大镜一样看到累积值细节。
我的实验经历了两个版本,分别对应不同阶段出现的新问题。
1/瞬时值累积多次(1w次)后进行暂存,然后让累积值从头开始累积。
大小数是倍率问题,一般来说当大数超过小数的10^7倍后会导致加法出现问题。当然这个倍率其实不是定数,那么就取1万倍好了,这个总不会有问题吧。
2/同理,还可以拓展:暂存值如果暂存1w次后也进行同样的暂存。
3/这是第一个版本,如果瞬时值是个比较小的值,比如纯小数或带整数的小数,这个整数比较小,那么可以正常显示累积值变化。
如果瞬时值比较大,可能1w次累积就出现大小数了。所以有了第二个版本。
---------------------------------
直接上结果吧,懒得细说了。
我先用PC仿真,因为上亿次的累积PLC太慢了,等不起。

用了其他几种累积方法做比较:
一般的Kahan算法、采用双精度浮点数做累积的方法、以及采用单精度浮点数简单累加方法。
可以看出,实验的方法除了精度达到要求外,分开来的数据均可以反映累积变化。
采用double双精度浮点数不失为一种可靠的累积方法,当然,前提是PLC支持这种数据类型。
但是,也要看到double也不是没有误差。
PLC的程序简单变换一下就可以了,关键是有些类型需要适配。
----------------------------------------------------
上传1200的实验程序,有兴趣的朋友欢迎指正。
FB_FlowAcc (FB1).pdf
200Smart的程序也出来了,就是梯形图导出比较麻烦,需要大尺寸纸面。
流量累积实验V20_基于TIA的移植.smart.pdf