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))