如何从 Register with pymodbus 中读取信息?
我正在尝试这段代码:
import pymodbus
from pymodbus.pdu import ModbusRequest
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
#initialize a serial RTU client instance
from pymodbus.transaction import ModbusRtuFramer
#count= the number of registers to read
#unit= the slave unit this request is targeting
#address= the starting address to read from
client = ModbusClient(method = 'rtu', port='/dev/extcomm/0/0', stopbits = 1, bytesize = 8, parity = 'N' , baudrate= 38400)
#Connect to the serial modbus server
connection = client.connect()
print(connection)
#Starting add, num of reg to read, slave unit.
coil = client.read_holding_registers(0x01,1,unit=1)# address, count,
slave address
print(coil)
#Closes the underlying socket connection
client.close()
这给了我这个错误:
Modbus Error: [Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 2 bytes (0 received)
我的slave id是1号,我要读的register也是1号,但是不知道为什么还是不想工作
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
client = ModbusClient(method='rtu', port='COM4', baudrate=2400, timeout=1)
client.connect()
read=client.read_holding_registers(address = 222 ,count =10,unit=1)
//Address is register address e.g 30222,
//and count is number of registers to read,
//so it will read values of register 30222 to 30232
//unit is slave address, for 1 device leave it 1
data=read.registers[int(2)] #reading register 30223
print(data) #printing value read in above line
此代码也适用于我:
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
client = ModbusClient(method='rtu', port='COM5', baudrate=9600, timeout=0.5)
client.connect()
read=client.read_holding_registers(address = 0x00,
count =65,
unit=1)
data=read.registers[int(64)] #read register id 64
print(data) #print register data
也许你应该试试这个:
print(coil.registers)
很可能您收到的错误是由于串口被另一个应用程序访问或代码的先前执行从未释放或关闭通信。断开并重新连接设备,这应该可以解决此错误。验证重新连接的端口与您的代码中的相同。
正如 Holub Dávid 提到的,您应该访问 coil.registers 但按照建议打印它们会遗漏一个值。线圈中的值是 coil.registers[0], coil.registers[1], coil.registers[2], ....coil.registers[n-1] for n values.
出于某种原因 print(coil.registers) 提供的值不包括第一个值。
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
client = ModbusClient(method='rtu', port='COM5', baudrate=9600, timeout=0.5)
client.connect()
read=client.read_holding_registers(address = 0x00,
count =65,
unit=1)
data=read.registers[int(64)] # Error line
print(data) #print register data
上面的代码在运行时产生这个错误:
AttributeError: 'ModbusIOException' object has no attribute 'registers'