请教各位大虾,用300的PLC做一个MODBUS通信,已正确数,对方的30001,和30002,两个代表一个32位实数现在读到的30001是-32768,30002是0,实际实数是-0.0,如何在PLC程序中正确转换成实际带小数点的实数呢?
问题补充:
我将30001放入MW2000,30002放入MW2002,也用程序交换过高低位,在状态监视中,监视MD2000,或者DB13.DBD0,读出的实数都不正确。
最佳答案
实数,在PLC内部都是用4个字节(32位)表示的。这32位中最高位(第31位)为尾数符号位(与这个实数的符号位是一致的)然后是指数位(第30位~23位,共8位),最后23位(第22位~0位)是尾数位,表示的是纯小数部分(默认有整数1.0)。
可以参看:双整数转化为实数
http://www.ad.siemens.com.cn/club/bbs//post.aspx?a_id=1405576&b_id=4
对于你收到的两个字的数据,其实只需要在接收的时候,按顺序存储用作实数即可,不需要编程。例如30001(8000H)存储在DB1.DBW0,30001(0H)存储在DB1.DBW2。这样在程序中直接引用DB1.DBD0用作实数即可。PLC理解这个实数是:(-1)*(2的(0-127)次幂)*(1.0(默认)+0(纯小数部分))是负的2的-127次方,是一个很小的数,也就是-0.0
你在状态表需要把显示格式改为:实数才能正确显示为实数。检查错误,要从源头上查看传递的数据(存储的)与接收的数据(存储的)是不是一致的,再谈理解为实数的数的大小。
提问者对于答案的评价:
终于搞清楚了,用的是WINCC的MODBUSTCP驱动读第三方的实数,用MODSCAN一直是正确的,WINCC不正确,现在搞明白了,WINCC对应的地址要减一。
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc346918.html