Python3 读取Modbus数据 含浮点数处理

本文介绍了使用Python3通过modbus_tk库读取Modbus设备的保持寄存器,将读取的16位整数转换为浮点数的过程。代码示例中展示了读取锅炉蒸发量和转速等模拟量,并提供了浮点数转换函数int2float()。程序测试部分展示如何调用这些功能。
摘要由CSDN通过智能技术生成

1、引入依赖库

#!/usr/bin/python3
import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md
import time
import datetime
import struct

2、Modbus操作类型的说明

# READ_COILS = 1 读线圈
# READ_DISCRETE_INPUTS = 2 读离散输入
# READ_HOLDING_REGISTERS = 3  【读保持寄存器】
# READ_INPUT_REGISTERS = 4  读输入寄存器
# WRITE_SINGLE_COIL = 5  写单一线圈
# WRITE_SINGLE_REGISTER = 6  写单一寄存器
# WRITE_MULTIPLE_COILS = 15 写多个线圈 【强制多点线圈】
# WRITE_MULTIPLE_REGISTERS = 16  写多寄存器 【写乘法寄存器】
# logger.info(master.execute(1, cst.READ_COILS, 0, 10))
# logger.info(master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 8))
# logger.info(master.execute(1, cst.READ_INPUT_REGISTERS, 100, 3))
# logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 100, 12))
# logger.info(master.execute(1, cst.WRITE_SINGLE_COIL, 7, output_value=1))
# logger.info(master.execute(1, cst.WRITE_SINGLE_REGISTER, 100, output_value=54))
# logger.info(master.execute(1, cst.WRITE_MULTIPLE_COILS, 0, output_value=[1, 1, 0, 1, 1, 0, 1, 1]))
# logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 100, output_value=xrange(12)))

3、读取保持寄存器

# 读保持寄存器
def read_AI():
    AI = {}

    master_0 = mt.TcpMaster(
        "192.168.1.111",
        502
    )
    master_0.set_timeout(5.0)


    try:
        a_0 = master_0.execute(1, md.READ_HOLDING_REGISTERS, 512, 3)
        
        #AI[0] = a_0[0]
        #AI[1] = a_0[1]
        #AI[2] = a_0[2]

        
        AI[0] =float('%.2f' % int2float(a_0[0], a_0[1]))# 锅炉蒸发量
        AI[1] =float(a_0[2]/100.0)# 转速
        
    except BaseException as e:
        print(e)
    return (AI)

4、读到的数据转换为浮点型

# 浮点数转换
def int2float(a,b):
    f=0
    try:
        z0=hex(a)[2:].zfill(4) #取0x后边的部分 右对齐 左补零
        z1=hex(b)[2:].zfill(4) #取0x后边的部分 右对齐 左补零
        z=z1+z0 #高字节在前 低字节在后
        #z=z0+z1 #低字节在前 高字节在后 
        #print (z)  
        f=struct.unpack('!f', bytes.fromhex(z))[0] #返回浮点数
    except BaseException as e:
        print(e)     
    return f

5、上完整代码

#!/usr/bin/python3
import modbus_tk.modbus_tcp as mt
import modbus_tk.defines as md
import time
import datetime
import struct

# 读模拟量
def read_AI():
    AI = {}
    master_0 = mt.TcpMaster(
        "192.168.1.111",
        502
    )
    master_0.set_timeout(5.0)
    try:
        a_0 = master_0.execute(1, md.READ_HOLDING_REGISTERS, 512, 3)      
        AI[0] =float('%.2f' % int2float(a_0[0], a_0[1]))# 锅炉蒸发量
        AI[1] =float(a_0[2]/100.0)# 转速        
    except BaseException as e:
        print(e)
    return (AI)

# 读开关量
def read_DI():
    DI = {}
    master_0 = mt.TcpMaster(
        "192.168.1.111",
        502
    )
    master_0.set_timeout(5.0)
    try:
        d_0 = master_0.execute(1, md.READ_DISCRETE_INPUTS, 3072, 4)        
        DI[0] = d_0[0]# 运行
        DI[1] = d_0[1]# 停运
        DI[2] = d_0[2]# 阀门开
        DI[3] = d_0[3]# 阀门关
    except BaseException as e:
        print(e)
    return (DI)

# 浮点数转换
def int2float(a,b):
    f=0
    try:
        z0=hex(a)[2:].zfill(4) #取0x后边的部分
        z1=hex(b)[2:].zfill(4) #取0x后边的部分
        z=z1+z0 #高字节在前 低字节在后
        f=struct.unpack('!f', bytes.fromhex(z))[0] #返回浮点数
        #z=z0+z1 #低字节在前 高字节在后
        #print (z)
    except BaseException as e:
        print(e)     
    return f

# 自我测试
if __name__ == "__main__":
    print(read_AI())
    print(read_DI())

6、程序测试

在这里插入图片描述

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
读取Modbus温湿度传感器的数据,你可以使用Python的一个叫做`pymodbus`的库。具体步骤如下: 1. 安装`pymodbus`库,可以使用`pip`命令进行安装,如下所示: ``` pip install pymodbus ``` 2. 导入`pymodbus`库的相关模块,如下所示: ``` from pymodbus.client.sync import ModbusTcpClient from pymodbus.payload import BinaryPayloadDecoder ``` 3. 创建`ModbusTcpClient`实例,并连接到Modbus设备,如下所示: ``` client = ModbusTcpClient('192.168.1.100', port=502) client.connect() ``` 其中,`192.168.1.100`为Modbus设备的IP地址,`502`为Modbus设备的端口号。 4. 读取Modbus寄存器的值,如下所示: ``` result = client.read_holding_registers(address=0, count=4, unit=1) ``` 其中,`address`为寄存器地址,`count`为要读取的寄存器数量,`unit`为设备ID。 5. 解码读取到的数据,如下所示: ``` decoder = BinaryPayloadDecoder.fromRegisters(result.registers) temperature = decoder.decode_32bit_float() humidity = decoder.decode_32bit_float() ``` 其中,`decode_32bit_float()`方法可以将读取到的数据解码为浮点数。 完整的代码如下所示: ``` from pymodbus.client.sync import ModbusTcpClient from pymodbus.payload import BinaryPayloadDecoder client = ModbusTcpClient('192.168.1.100', port=502) client.connect() result = client.read_holding_registers(address=0, count=4, unit=1) decoder = BinaryPayloadDecoder.fromRegisters(result.registers) temperature = decoder.decode_32bit_float() humidity = decoder.decode_32bit_float() print("Temperature: ", temperature) print("Humidity: ", humidity) client.close() ``` 注意,以上代码只是示例,具体的寄存器地址和寄存器数量需要根据你的设备来确定。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lzl640

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

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

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

打赏作者

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

抵扣说明:

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

余额充值