热门搜索:

上海朕锌电气设备有限公司是一家从事:西门子变频器维修、西门子触摸屏、西门子工业电脑的西门子一级代理商,西门子中国总代理商,西门子楼宇代理商。上海朕锌电气设备有限公司凭借雄厚的技术实力及多年从事 SIEMENS 产品的销售经验,本着树立公司形象和对用户认真负责的精神开展业务,赢得了 SIEMENS 公司与广大用户的好评及大力支持,欢迎来电咨询!

    西门子 1FL6022-2AF21-1AA1
    • 西门子 1FL6022-2AF21-1AA1
    • 西门子 1FL6022-2AF21-1AA1
    • 西门子 1FL6022-2AF21-1AA1

    西门子 1FL6022-2AF21-1AA1

    更新时间:2024-05-19   浏览数:43
    所属行业:IT 电脑装机配件 网卡
    发货地址:上海市松江区  
    产品数量:500.00台
    价格:¥88.00 元/台 起
    型号哪里卖西门子罗宾康变频器 品牌西门子

    西门子 1FL6022-2AF21-1AA1

    上海朕锌电气电气设备有限公司

    SIEMENS西门子


    技术论坛 WinCC Panel 及 IPC/PG版区版主

    工作职责:自由职业人,从事自动化系统PLC与SCADA系统以及IT系统的设计开发,项目咨询...

    技术背景:上海大学机械系本科毕业,上海大学固体力学专业硕士研究生,*工程师。工...

    项目经验:参与多条国外进口生产线引进消化吸收工作, 培养了严谨务实的工程经验和工作...

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

     

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

     

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

     

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

     

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

     

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

     

     

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

     

     

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

     

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

     

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

     

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

     

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

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

     

    此文剩余全文以及配套例子程序




    http://zx2013.cn.b2b168.com