西门子PROFIBUS网络数据传输接头 西门子PROFIBUS网络数据传输接头
湖南洪武自动化设备有限公司是西门子一级代理商,是西门子自动化与驱动集团认证的西门子数控系统、伺服驱动的第三方合作伙伴。
公司代理全系列西门子数控系统,伺服驱动电机,变频器,直流调速装置,软启动器、触摸屏,可编程控制器等产品的销售,同时提供零部件维修、电柜设计、PLC编程调试及普通机床和加工中心的数控改造等服务。产品广泛适用于车、铣、磨、刨、钻等金属切削机床和各类机床设备及钢铁、重工、机械 造船、电子、电机、制药 纺织、印刷、轻工、包装、媒体等领域,同时配备完善的售xx服务及过程.为各行业用户提供 的 服务,为用户带更多效益是我们的目标
工程中,经常需要遇到一些需要循环累积的物理值,比如水的流量,电能等等。
而浮点数的累积是个公认的难题。
其中涉及到的简单的原理是,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了,还不如不做。
西门子PROFIBUS网络数据传输接头 西门子PROFIBUS网络数据传输接头