python处理modbus tcp中的32位浮点数

import struct
import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md

#将32位的二进制数转换成10进制的浮点数
#bin:01000100001101011001001100110011

def get_float(bin):
	#取得32位二进制数中的指数部分:bin[1:9]:10001000
	#计算出10进制的值(位数)
    val_exp = eval('0b' + bin[1:9])
	#小数点移位位数-127 + 1 ,+1这里还不知道是为什么,但是是正确的
    exp = (val_exp - 127)+1
	#在实际数字的二进制前面增加一个1
    val_bin = '1' + bin[9:]
    #取得浮点数的整数部分的二进制
    val_int = val_bin[0 : exp]
    #取得浮点数的小数部分的二进制
    val_flo = val_bin[exp:]
    #把浮点数整数部分换算成10进制
    val10int = int(val_int,2)
    #把浮点数的小数部分换算成10进制
    val10flo = bin2float(val_flo)
    #返回两数相加的结果
    return val10int + val10flo

#计算二进制的小数部分

def bin2float(bin):
    val = 0    
    for i in range(0, len(bin)):
        val = val + int(bin[i]) * (2 ** -(i+1))
    return val

远程连接到服务器端

master = mt.TcpMaster("127.0.0.1", 502)
master.set_timeout(5.0)
Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=0, quantity_of_x=4, output_value=4)
#对应寄存器40001,把读取到的以10进制表达的数转换成16位的二进制数
a = '{:0>16b}'.format((Hold_value[0]))
#对应寄存器40002
b = '{:0>16b}'.format((Hold_value[1]))
#对应寄存器40003
c = '{:0>16b}'.format((Hold_value[2]))
#对应寄存器40004
d = '{:0>16b}'.format((Hold_value[3]))
#以高位在前的形式把两个16位二进制数连接为一个32位的二进制数
ab = b + a
cd = d + c


print(get_float(cd))

你可能感兴趣的:(python3,modbus,浮点数,python)