登录
首页 PLC论坛 PLC论坛
回帖 发帖
正文

主题:S7-200计秒时钟脉冲的个数,累计到9321小时为什么就不再累计了?

点击:1880 回复:7


天际5824请教个问题:S7-200程序中,我用一个sm0.5(1秒时钟脉冲)的脉冲上升沿对VD1000进行浮点数加1.0循环累积,然后再对VD1000除以3600.0,即可得出设备运行的小时数时间。现在的问题是当设备运行时间累积到9321时就不再累积了,程序中发现VD1000的数据不再增加了。3600*9321=33555600,浮点数范围为+1.175495E-38至+3.402823E+38,说明没有超过此范围,这是什么原因呢?
当对VD1000加100.0循环累积时,VD1000的数据又会增加了!
下面是我的回帖:
这个问题可以给出精确的数学解释。
浮点数的精度与它的尾数有关,其尾数为二进制小数1.m,m为23位的小数。所以浮点数的精度为24位二进制有效位数。2的24次方为16777216。
楼主用浮点数能计的最大的数是3600*9321=33555600,该数除以2为16777800,与2的24次方16777216非常接近。在33555600附近加1.0加不上去,不是因为浮点数不能表示更大的数,而是在做加法的时候,两个数的指数应该相同,1.0和33555600.0相比太小了,比33555600.0的尾数最低位(也是浮点数的最低位)的值的一半还小,所以相加的时候1.0的值被四舍五入忽略掉了,以后的累加值都不会增大。
解决的方法:
改为双整数的加法,双整数的有效位数为32位,计小时数够用了。
15-08-24 08:43
表情 精彩......
想起前几年给一公司的烤炉做的电费统计,用的是信捷PLC,含分时计价,也没联系过,不知是否也存在这样的问题...
15-08-24 10:21
good
15-09-16 00:14
LZ的研究很深入,支持!
以工控为载体,以朋友为根本,以网络为纽带,以互助为目标
工控面对面 技术研讨交流圈 476638160,欢迎你的加入
15-09-17 16:45
廖老师 高人呀
15-09-17 19:30

引用 liaosun 在 2015/8/24 8:43:05 发言【内容省略】

廖老师,遇到一个和你本贴类似的问题困扰我很久了,非常希望你在百忙中抽空给点拨一二,十分感谢!
西门子S7-300程序采用单精度浮点数对一水泵的运行时间进行累计,但偶然发现原程序有问题,当运行时间累计到2^23(16777216秒剱合计约4660.338小时)便不再增加了,很奇怪,就有了如下疑问。
[size=4]1、看到这个贴子中可以累计到33555600,而本例却只能累计到16777216就停止了,为什么呢?
2、另外贴中提到的“1.0和33555600.0相比太小了,比33555600.0的尾数最低位(也是浮点数的最低位)的值的一半还小,所以相加的时候1.0的值被四舍五入忽略掉了”是否可以解释得再详细一点呢?[/size]

附件 微信截图_20190718061715.jpg
最后修改:2019/7/27 21:27:00
19-07-27 20:25
对上一贴中提到的问题:西门子S7-300程序采用单精度浮点数对一水泵的运行时间进行累计,但偶然发现原程序有问题,当运行时间累计到2^23(16777216秒剱合计约4660.338小时)便不再增加了。
发现这个问题后,对原程序稍加改动,结果不再只停留在16777216,而是继续累加了。但不知这样设计 ,将来还会不会出现上述问题,如果想事先验证一下的话,应该怎样进行验证呢?
附件 2C24046FBF594CEC9FF7B492D431DDCB.jpg
19-07-27 21:32
楼主基础实在太扎实了!佩服佩服。
19-07-28 10:12

工控新闻

更多新闻资讯