【万泉河】S7-200 SMART 浮点数累积通用功能块分享

 

工程中,经常需要遇到一些需要循环累积的物理值,比如水的流量,电能等等。

 

而浮点数的累积是个公认的难题。

 

其中涉及到的最简单的原理是,CPU对浮点数的表达是有精度限制的。通常一个32位的浮点数REAL,只能有7位数的精度。

 

在平常的数学运算中,这样的精度足够了。但在流量、电能等需要数值累加的场合,当累加值达到一定的程度,准确说是累加值和运行值数量级差出来1E7倍的时候,累加计算就会出问题了。

 

比方说需要12345678.0 0.1累加的时候,你以为应该得到12345678.1,但因为表达精度限制,PLCREAL数不能表达,得到的结果仍然是12345678.0 。而且一旦累积值过了这个限制,以后就永远不会增长了,我称之为加不进去了。

 

而其实都不需要到数量级差1E7倍,通常我们的模拟量都是有精度要求的,比如12位精度,累加的数值自己先带了4位数小数,所以当数值差到1E4的时候,运行中已经出现问题了,数据的最低位的精度已经丢失掉了。在使用者看来,累积值精度不准了。

 

 

我们以往遇到有人咨询这样的问题的时候,通常给出的建议是累加的地方用双整数DINT来替换real即在输入的地方累加数和运行值都放大一定的倍数,比如1000并转化为DINT,然后累加,累加完成后,再将得到的结果转换为浮点数,然后除掉系数,得到正确的累加结果。

 

 

因为整数的相加总是准确没有误差的,所以累积过程中不会有错误。比方说上面的累加,虽然一次累加得到的12345678.1不能被正确表达,但10次以后, 数值进位到高位,得到12345679,就可以显示出来了。

 

但转换为整数,有一个问题,就是具体乘多少倍的倍数,又是个难题。针对项目中具体的物理量,还是容易些。比如瞬时流量的标定单位如果是100那倍数30而如果标定上线是10000,那倍数10即可。

 

但如果要做一个通用的标准块,就没那么容易了。总不能所有数值都不管三七二十一加50 ,那样浪费了精度之后最终累加数据的容量还会不够用。况且,你提前不能知道物理量的量纲的话,说不定啥时候出来个需要加100呢?

 

所以,我就一直没能做出个标准的累加块来。一度想把倍数系数作为一个参数,调用时根据实际情况指定,但也感觉实在太low了,还不如不做。

 

几年前,有一次群里的讨论,又有人问及这个问题的时候,有youhm网友提出个想法,他从破解的FB41的源代码中获得的灵感,说可以把每次累加的误差记录下来,最终能加进去的时候补偿进累积值,就可以实现浮点数的大数累加不进的问题。

我没有搞懂咋做的,但记住了这回事。

 

最近,有需求要在1200中做累加,就先问了下youhm,他给我手绘了一下思路。但我后来发现TIA PORTAL 里面已经支持64bitLREAL数据了,其浮点数精度位数大了许多(具体位数我不记得),但通过核算,所有的物理量,所有的系统,累加上几十年没有问题。所以也就没必要做误差补偿了。

 

【万泉河】S7-200 SMART 浮点数累积通用功能块分享

                           

 

但觉得有必要在SMART200先做了,储备好。

 

于是花了一点时间,做了一个标准块。

 

原理就是前面图中YOUHM给我描述的误差补偿方法。

 

通俗说,就是每次加完之后,再来一次回头看,(和纪委回头看一个道理),看看这次累加之后的误差情况,如果不是0,有误差,那就记下来,下个周期补偿给开始的过程值,继续加,直到成功加进去为止。

 

而我在调试的过程中发现,其实即便从一开始时的累加,也有误差,误差也不是0。而且也不仅仅存在加不进,误差不仅仅有负值,有时候也有正值,颠覆了我的认知。

 

搞得我怀疑是不是代码写错了,那可会酿成大问题。最终又花了大半天的时间各种方法来测试。证明代码没错。是自己对浮点数计算的理解不够深刻。

 

(不过即便如此,各位拿到我的分享,也请自己负责调试检测确认计算结果的准确性,本人可不负责。

 

测试程序中,通过累加时间值,和正常的用长整数累加的时间值做对比,观察数据运行差异。可以看到有些时候浮点数部分的数据会跟不上,累加有迟滞,但最终早晚会补偿上来的。

 

同时还增加了手动调整累积值,比如可以一次性的把累积值加上1E7,这样原本数值差距很小,可以瞬间拉大,用于观察误差的情况。

 

玩起来,还是很有意思的。

 

得到这个程序的方法:

 

1,关注“万泉河知识分享”公众号;

2,本文结尾右下角,点在看

3,截屏,把在看的数值发到公众号后台。

4,后台按照在看的编号依次回复程序。

 

如果觉得有用,你还可以对本文进行打赏。不强制,但很欢迎。

打赏者优先得到程序。

 

 


1. 本站所有资源来源于用户上传和网络,仅作为个人学习使用,如有侵权请邮件联系站长!
2. 本站由用户发布的内容版权归文章发布者所有,一旦您发布任何资源就表示您已同意本协议。
3. 侵权删帖/违法举报/投稿等事物联系邮箱:daxue3d@vip.qq.com。

3D大学 » 【万泉河】S7-200 SMART 浮点数累积通用功能块分享

发表评论

不要把时间用来造轮子,这里有的你拿走,保留精力用来创造!