首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Modbus Python中读写浮点数

在Modbus Python中读写浮点数
EN

Stack Overflow用户
提问于 2020-12-29 22:05:54
回答 1查看 350关注 0票数 1

对不起,我的英语不好。我尝试使用pyModbusTCP库通过Modbus在python中的plc寄存器中写入和读取浮点数。这是我的代码,不幸的是没有...

代码语言:javascript
复制
from pyModbusTCP.client import ModbusClient
from pyModbusTCP import utils

class FloatModbusClient(ModbusClient):
    def read_float(self, address, number=1):
        reg_l = self.read_holding_registers(address, number * 2)
        if reg_l:
            return [utils.decode_ieee(f) for f in utils.word_list_to_long(reg_l)]
        else:
            return None

    def write_float(self, address, floats_list):
        b32_l = [utils.encode_ieee(f) for f in floats_list]
        b16_l = utils.long_list_to_word(b32_l)
        return self.write_multiple_registers(address, b16_l)


c = FloatModbusClient(host=ip, port=porta, auto_open=True)
# write 10.0 at @0
c.write_float(registrow, [var]) 
print("write ok")

# read @0 to 9
float_l = c.read_float(registror)
print(float_l)
c.close()

有人能帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2021-01-20 19:31:23

这有点棘手,因为所有的Modbus寄存器都只是16-bit unsigned data (那些旨在发送numbers的寄存器):

代码语言:javascript
复制
Object type      | Access     | Size    | Address Space
Coil             | Read-write | 1 bit   | 00001 - 09999
Discrete input   | Read-only  | 1 bit   | 10001 - 19999
Input register   | Read-only  | 16 bits | 30001 - 39999
Holding register | Read-write | 16 bits | 40001 - 49999

对于您发送的所有数据,

  • 都需要无符号的16位(在我们的示例中,Python必须在服务器端和客户端处理从FloatInt以及从IntFloat的数据转换。
  • 下面的代码是为了让Python程序以Modbus命令运行以便通过Modbus发送Float数据,您需要通过简单的乘法或除法对它们进行转换。<代码>H218<代码>F219

这段代码将允许您作为Client从Python向Modbus服务器发送正的Float数字:

代码语言:javascript
复制
from pyModbusTCP.client import ModbusClient

def send_single_float(client, reg_addr, reg_value, setting, by):
    if setting == "multiply":
        client.write_single_register(reg_addr = reg_addr, reg_value = int(reg_value*by))
    elif setting == "divide":
        if reg_value == 0:
            client.write_single_register(reg_addr = reg_addr, reg_value = int(reg_value))
        else:
            client.write_single_register(reg_addr = reg_addr, reg_value = int(reg_value/by))
    else:
        raise TypeError("Only string with following values can be set for 'Setting' attribute: ('multiply', 'divide')")

c = ModbusClient("localhost")
c.open()

my_float = 10.05

while True:
    send_single_float(c, 0, my_float, "multiply", 100)

您还可以使用此函数从Modbus读取Float编号:

代码语言:javascript
复制
def read_single_float(client, reg_addr, setting, by):
    if setting == "multiply":
        return client.read_holding_registers(reg_addr = reg_addr, reg_nb = 1)[0] * by
    elif setting == "divide":
        data = client.read_holding_registers(reg_addr = reg_addr, reg_nb = 1)[0]
        if data == 0:
            return data
        else:
            return data / by
    else:
        raise TypeError("Only string with following values can be set for 'Setting' attribute: ('multiply', 'divide')")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65493419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档