您现在所在的是:

PLC论坛

回帖:7个,阅读:1789 [上一页] [1] [下一页]
5997
liaosun
文章数:1398
年度积分:53
历史总积分:5997
注册时间:2003/5/4
发站内信
2015论坛贡献奖
2014论坛贡献奖
2013论坛贡献奖
2012论坛贡献奖
2011博客贡献奖
2010博客杰出贡献奖
发表于:2015/8/24 8:43:05
#0楼

天际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位,计小时数够用了。
此帖来自中华工控网工控博客
原文件地址:http://blog.gkong.com/more.asp?id=221699&Name=liaochangchu
我是廖常初,是一个高校的老师,曾在企业从事机械、电气技术工作,长期从事工业控制和PLC应用的教学、科研和工程应用工作。博客中的日志除注明外均为原创。愿意在此与大家探讨工控的问题!
廖常初工控博客地址:http://blog.gkong.com/blog.asp?name=liaochangchu
我曾写过几本小书: 《PLC编程及应用》第3版(S7-200)、《S7-300/400 PLC应用技术》第3版、《FX系列PLC编程及应用》第2版、《S7-200 PLC编程及应用》、《PLC基础及应用》第2版(FX系列大专教材)、《西门子人机界面(触摸屏)组态与应用技术》、《西门子工业通信网络组态编程与故障诊断》、《S7-1200 PLC编程及应用》第2版、《跟我动手学S7-300/400 PLC》、《跟我动手学FX系列PLC》
机械工业出版社廖常初图书专题:http://www.gkong.com/zt/liaochangchu/
13947
lvjun7258
文章数:1634
年度积分:84
历史总积分:13947
注册时间:2009/12/4
发站内信
发表于:2015/8/24 10:21:06
#1楼
表情 精彩......



想起前几年给一公司的烤炉做的电费统计,用的是信捷PLC,含分时计价,也没联系过,不知是否也存在这样的问题...
com
678
549849442
文章数:15
年度积分:50
历史总积分:678
注册时间:2013/1/19
发站内信
发表于:2015/9/16 0:14:04
#2楼
good
此帖发自论坛手机版
910
yokosohu
文章数:4
年度积分:50
历史总积分:910
注册时间:2009/7/3
发站内信
发表于:2015/9/17 16:45:58
#3楼
LZ的研究很深入,支持!

以工控为载体,以朋友为根本,以网络为纽带,以互助为目标

工控面对面 技术研讨交流圈 476638160,欢迎你的加入
6486
wuyang750
文章数:2637
年度积分:50
历史总积分:6486
注册时间:2014/5/6
发站内信
发表于:2015/9/17 19:30:41
#4楼
廖老师 高人呀
此帖发自手机工控论坛
22417
liuxd6909
文章数:11935
年度积分:394
历史总积分:22417
注册时间:2008/7/19
发站内信
2017国庆活动(三)
2015Indusoft体验
LOGO!体验一等奖
发表于:2019/7/27 20:25:34
#5楼
以下是引用liaosun2015/8/24 8:43:05的发言:

天际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位,计小时数够用了。

廖老师,遇到一个和你本贴类似的问题困扰我很久了,非常希望你在百忙中抽空给点拨一二,十分感谢!


西门子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编辑过]
思想决定高度
22417
liuxd6909
文章数:11935
年度积分:394
历史总积分:22417
注册时间:2008/7/19
发站内信
2017国庆活动(三)
2015Indusoft体验
LOGO!体验一等奖
发表于:2019/7/27 21:32:12
#6楼
对上一贴中提到的问题:西门子S7-300程序采用单精度浮点数对一水泵的运行时间进行累计,但偶然发现原程序有问题,当运行时间累计到2^23(16777216秒剱合计约4660.338小时)便不再增加了。


发现这个问题后,对原程序稍加改动,结果不再只停留在16777216,而是继续累加了。但不知这样设计 ,将来还会不会出现上述问题,如果想事先验证一下的话,应该怎样进行验证呢?

附件 2C24046FBF594CEC9FF7B492D431DDCB.jpg
思想决定高度
10912
yanli7234 版主
文章数:3035
年度积分:49
历史总积分:10912
注册时间:2002/11/8
发站内信
2011论坛贡献奖
发表于:2019/7/28 10:12:50
#7楼
楼主基础实在太扎实了!佩服佩服。
国人当自强,共同努力,抵制日货。

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

93.6006