MoDbus两个寄存器存浮点数
import struct
def int2float(a,b):
f=0
try:
z0=hex(a)[2:].zfill(4) #取0x后边的部分 右对齐 左补零
z1=hex(b)[2:].zfill(4) #取0x后边的部分 右对齐 左补零
print(z0)
print(z1)
z=z1+z0 #高字节在前 低字节在后
#z=z0+z1 #低字节在前 高字节在后
print (z)
f=struct.unpack('!f', bytes.fromhex(z))[0] #返回浮点数
except BaseException as e:
print(e)
return f
直接复制代码到VScode中,调用一下这个函数,仔细体会每一句代码的作用。
将浮点数转为两个16位uint
def float_to_int16s(f):
# 将浮点数打包成32位二进制数据
b = struct.pack('f', f)
# 将32位二进制数据拆分成两个16位二进制数据
i1, i2 = struct.unpack('HH', b)
return [i2, i1]
modbus协议将两个寄存器的16位数据变成一个32int
from bitstring import BitArray
def Uint16ToUint32(value):
low = bin(int(hex(value[0] & 0xFFFF),16))[2:].zfill(16)
high = bin(int(hex(value[1] & 0xFFFF),16))[2:].zfill(16)
val_str = high + low
# print(val_str)
value_int= BitArray(bin=val_str).int
print(value_int)
value = [5,-1]
Uint16ToUint32(value)
上面这个函数支持负数转换,但是常常我们从MODBUS一个寄存器中读出来的是一个无符号16位整型。因此我们只要将读出来的两个数,转化为列表形式送进函数即可得到32位有符号int型。
将一个32位int转化为两个16位int
def Uint32ToUint16(value_32):
value_16= bin(int(hex(value_32 & 0xFFFFFFFF),16))[2:].zfill(32)
# print(value_16)
high_int = value_16[0:16]
low_int = value_16[16:]
# print(f"low_int:{low_int}")
# print(f"hogh_int:{high_int}")
# 转化为两位有符号整型
low = BitArray(bin=low_int).int
high = BitArray(bin=high_int).int
print(f"low:{low},{high}")
上面是将一位32位数,转化为两个16位数。
但是我们常常写进使用modbus_tk库往MOBDBUS寄存器中写入数据的时候,往往是无符号型。我弄明白之后再更新,如果有大佬知道如何转,可以在下面留言。