问题
pymodbus主站/客户端可以向从站/服务器发送请求。从属/服务器使事物准备好返回,并正在等待主/客户端将它们捡起。尽管服务器/从机已准备就绪,但主服务器/客户端仅返回错误“ Modbus错误:[输入/输出] Modbus错误:[无效消息]接收到的消息不完整,预期至少2个字节(接收到0个字节)”。
设定
我使用带有此适配器的笔记本电脑作为服务器/从机:https : //www.amazon.com/dp/B076WVFXN8/ref=twister_B076X1BS4H?_encoding=UTF8&psc=1
我有一个Raspberry Pi 3 / BananaPi作为主服务器/客户端,并带有此适配器:https ://www.aliexpress.com/item/32781613765.html?spm=a2g0s.9042311.0.0.1aec4c4d0EXx8M
我下面本教程的大部分的设置,除了Arduino是交换与笔记本电脑适配器:https://circuitdigest.com/microcontroller-projects/rs485-serial-communication-between-arduino-and-raspberry-pi - Raspberry的针脚连接方法与本教程中的相同。
我在笔记本电脑上将此程序作为服务器/从机:
#!/usr/bin/env python
from pymodbus.server.sync import StartTcpServer
from pymodbus.server.sync import StartUdpServer
from pymodbus.server.sync import StartSerialServer
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.datastore import ModbusSequentialDataBlock, ModbusSparseDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from pymodbus.transaction import ModbusRtuFramer, ModbusBinaryFramer
import logging
FORMAT = ('%(asctime)-15s %(threadName)-15s'
' %(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger()
log.setLevel(logging.DEBUG)
def run_server():
slave_store1 = ModbusSlaveContext(co=ModbusSequentialDataBlock(0, [1]*16))
slave_store2 = ModbusSlaveContext(di=ModbusSequentialDataBlock(0, [1]*16))
slave_store3 …Run Code Online (Sandbox Code Playgroud) 我尝试使用“安装”到/dev/cu.SLAB_USBtoUART.
这是我的代码:
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)
from pymodbus.constants import Endian
from pymodbus.constants import Defaults
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
from pymodbus.transaction import ModbusRtuFramer
# settings for USB-RS485 adapter
SERIAL = '/dev/cu.SLAB_USBtoUART'
BAUD = 19200
# set Modbus defaults
Defaults.UnitId = 1
Defaults.Retries = 5
client = ModbusClient(method='rtu', port=SERIAL, stopbits=1, bytesize=8, timeout=3, baudrate=BAUD, parity='E')
connection = client.connect()
print "Readout started"
#result = client.read_discrete_inputs(0)
#result = client.read_holding_registers(12,19)
result = client.read_input_registers(0,1)
print(result) …Run Code Online (Sandbox Code Playgroud) 希望你过得很好!我最近开始使用python进行modbus通信.我想澄清一些疑惑.
使用pymodbus3模块时,我能够使用以下代码编写线圈:
import pymodbus3
import serial
from pymodbus3.pdu import ModbusRequest
from pymodbus3.client.sync import ModbusSerialClient as ModbusClient
from pymodbus3.transaction import ModbusRtuFramer
from serial.tools.list_ports import comports
client = ModbusClient(method = "rtu", port = 'COM4',stopbits = 1, bytesize = 8, parity = 'N', baudrate= 19200)
connection = client.connect()
client.write_coil(1000, 1, unit = 0x01)
Run Code Online (Sandbox Code Playgroud)用于读取线圈状态(功能0x01):
result = client.read_coils(1000,1)
print(result)
client.close()
Run Code Online (Sandbox Code Playgroud)
它返回无.
或者写入注册和阅读也不起作用:
client.write_register(0, 1000, unit=0x01)
resu= client.read_holding_registers(0, 1, unit=0x01)
print(resu)
client.close()
Run Code Online (Sandbox Code Playgroud)
欢迎积极响应!