Python实现MODBUS两个寄存器存浮点数或32位int

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寄存器中写入数据的时候,往往是无符号型。我弄明白之后再更新,如果有大佬知道如何转,可以在下面留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花开明山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值