Python 连接2个modbus从设备pymodbus时出错
我正在做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
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()
对其进行解码。我已经解决了上述问题。实际问题是因为线程。