我尝试了许多与此平台上存在的 pymodpoll 相关的修复。我能够成功写入寄存器,但无法从中读取,我已确认我尝试读取的寄存器实际上是一个 RW 寄存器。 产品的数据表。
正确读取寄存器的 mod poll 命令是这个
modpoll -m rtu -0 -1 -a 1 -b 9600 -p none -r 48 /dev/ttyUSB0
from pymodbus.client import ModbusSerialClient as modbus
#Connection to the modbus
def connect(self) -> None:
self.modbus = modbus(method='rtu',
port="/dev/ttyUSB0",
baudrate=9600,
stopbits=1,
bytesize=8,
timeout=1)
self.modbus.connect()
#function that works properly for setting the register value
def set_voltage(self, voltage:float =0) -> None:
if (voltage < self.min_volt) or (voltage > self.max_volt):
raise modbusError(
"Invalid voltage provided to the interface, voltage provided: {0}"
.format(voltage))
self.modbus.write_register(0x0030, int(voltage*100), unit=1)
#Read register function
def get_voltage_target(self) -> float:
reg = self.modbus.read_holding_registers(0x0030, 1, unit=1)
print(reg.registers)
输出:
AttributeError: 'ModbusIOException' object has no attribute 'registers'
我从 reg.registers 打印中收到此错误,我假设这只是因为我没有正确连接到 modbus 以读取正确的寄存器。
这是我目前正在使用的代码,感谢您的帮助!
简化版编辑:
from pymodbus.client import ModbusSerialClient as modbus
modbus = modbus(method='rtu', port="/dev/ttyUSB0", baudrate=9600,stopbits=1,bytesize=8,timeout=1)
modbus.connect()
modbus.write_register(0x0030, int(10.2*100), unit=1) #correctly writes intended value
registers = modbus.read_holding_registers(0x0030, 1, unit=1)
print(registers.getRegister(0))
输出:
Traceback (most recent call last):
File "test.py", line 6, in <module>
print(registers.getRegister(0))
AttributeError: 'ModbusIOException' object has no attribute 'getRegister'