Python 连接2个modbus从设备pymodbus时出错

Python 连接2个modbus从设备pymodbus时出错,python,python-3.x,modbus,pymodbus,pymodbus3,Python,Python 3.x,Modbus,Pymodbus,Pymodbus3,我正在做pymodbus。 尝试从多个装置(多个从机)读取数据时,会显示数据,但当其中一个从机没有响应或关闭时,其他从机也会在一段时间后显示错误。 请帮忙。 多谢各位 from pymodbus.client.sync import ModbusSerialClient as ModbusClient from pymodbus.constants import Endian from pymodbus.payload import BinaryPayloadDecoder from pymod

我正在做pymodbus。 尝试从多个装置(多个从机)读取数据时,会显示数据,但当其中一个从机没有响应或关闭时,其他从机也会在一段时间后显示错误。 请帮忙。 多谢各位

from pymodbus.client.sync import ModbusSerialClient as ModbusClient
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.exceptions import ModbusIOException
from pymodbus.exceptions import ConnectionException

def length(x):
    client = ModbusClient(method='rtu', port='/dev/ttyUSB0', timeout=2, stopbits = 1, bytesize = 8,  parity='N', baudrate = 9600)
    client.connect()
    rr = client.read_holding_registers(address=1, count=4, unit=x);
    decoder = BinaryPayloadDecoder.fromRegisters(rr.registers, Endian.Big, wordorder=Endian.Big);
    a=str(decoder.decode_32bit_float());
    c = int (float(a))
    client.close()
    print("length",c)
    client = ModbusClient(method='rtu', port='/dev/ttyUSB0', timeout=2, stopbits = 1, bytesize = 8,  parity='N', baudrate = 9600)
    client.connect()
    rr = client.read_holding_registers(address=7, count=4, unit=x);
    decoder = BinaryPayloadDecoder.fromRegisters(rr.registers, Endian.Big, wordorder=Endian.Big);
    b=str(decoder.decode_32bit_float());
    d = int (float(b))
    client.close()
    print("speed",d)
    print(x)
    return c,d

我使用pymodbus中的
.isError()
方法改进了您的代码,如下所示:

from pymodbus.client.sync import ModbusSerialClient as ModbusClient
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder

def error_checker(instance):
    if not instance.isError():
        '''.isError() implemented in pymodbus 1.4.0 and above.'''
        decoder = BinaryPayloadDecoder.fromRegisters(
            instance.registers, byteorder=Endian.Big, wordorder=Endian.Big
        )
        return decoder.decode_32bit_float()
    else:
        # Error handling.
        return None

def length(x):
    client = ModbusClient(
        method='rtu',
        port='/dev/ttyUSB0',
        timeout=2, stopbits=1, bytesize=8, parity='N', baudrate=9600
    )
    try:
        client.connect()
        rr = client.read_holding_registers(address=1, count=4, unit=x)
        c = error_checker(rr)
        print("length: ", c)
        rr = client.read_holding_registers(address=7, count=4, unit=x)
        d = error_checker(rr)
        print("speed: ", d)
        return c, d
    except Exception as exc:
        print(exc)
    finally:
        client.close()

运行一段时间后,请对您的错误进行完整跟踪。代码显示错误“ModbusIOException”对象没有属性“registers”,如果其中一个连接的从机是offI-posted an,我希望这会有所帮助。
count=4
读取和
解码32bit\u float()
相互矛盾,因为您读取的是4regs,Modbus中的每个寄存器都是一个字类型,每个字都是2字节,因此您读取的是8字节,因此您读取的是64位,您需要使用
decode\u 64bit\u float()
对其进行解码。我已经解决了上述问题。实际问题是因为线程。