AttributeError: 'ModbusSerialClient' object has no attribute 'last_request'
时间: 2023-06-21 12:20:45 浏览: 65
【Python】AttributeError: ‘AutoSchema’ object has no attribute ‘get_link’
5星 · 资源好评率100%
`'ModbusSerialClient' object has no attribute 'last_request'` 错误通常是因为 pymodbus 的版本更新导致 API 发生了变化。在新版本的 pymodbus 中,`ModbusSerialClient` 对象没有 `last_request` 属性了。要获取 Modbus RTU 报文,你可以使用 `ModbusSerialClient` 对象的 `transport` 属性,获取底层的 `serial` 对象,然后使用 `serial` 对象的 `in_waiting` 和 `read` 方法读取串口数据。以下是一个示例代码,可以帮助你获取完整的 Modbus RTU 报文:
```python
from pymodbus.client.sync import ModbusSerialClient
from pymodbus.transaction import ModbusRtuFramer
client = ModbusSerialClient(
port='/dev/ttyUSB0', # 串口号
baudrate=9600, # 波特率
timeout=2, # 超时时间
framer=ModbusRtuFramer(),
)
client.connect() # 连接 Modbus Slave 设备
# 读取保持寄存器
result = client.read_holding_registers(
address=0, # 寄存器地址
count=1, # 寄存器数量
unit=1, # Slave 设备地址
)
# 获取完整的 Modbus RTU 报文
transport = client.transport
response_data = transport.serial.in_waiting # 获取串口缓冲区中的数据量
response = transport.serial.read(response_data) # 读取完整的 Modbus RTU 响应报文
request = transport.framer.buildPacket(client.transaction_id, client.address, result)
print('Request: ', request)
print('Response: ', response)
client.close() # 断开与 Modbus Slave 设备的连接
```
在这个示例代码中,我们使用 `client.transport` 属性获取 ModbusSerialClient 对象的底层 `ModbusSerialTransport` 对象,然后使用 `transport.serial.in_waiting` 方法获取串口缓冲区中的数据量,使用 `transport.serial.read` 方法读取完整的 Modbus RTU 响应报文。同时,我们使用 `transport.framer.buildPacket` 方法构建 Modbus RTU 请求报文。你可以根据需要修改这个示例代码,以适应你的应用场景。
阅读全文