Я пытаюсь установить клиент Modbus RTU на моем Raspberry Pi 4, который разговаривает с синхронным сервером modbus, доступным в примерах pymodbus (https://pymodbus.readthedocs.io/en/latest/source/example/synchronous_client.html). Я настроил сервер следующим образом:
# RTU:
StartSerialServer(context, framer=ModbusRtuFramer, identity=identity,
port='/dev/ttyAMA0', timeout=.5, baudrate=9600)
Что делает мой клиент:
from pymodbus.pdu import ModbusRequest
from pymodbus.client.sync import ModbusSerialClient
from pymodbus.transaction import ModbusRtuFramer
import time
import logging
### Logs
FORMAT = ('%(asctime)-15s %(threadName)-15s '
'%(levelname)-8s %(module)-15s:%(lineno)-8s %
(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger()
log.setLevel(logging.DEBUG)
### Modbus RTU stuff
client = ModbusSerialClient(method='rtu', port='/dev/ttyAMA0', baudrate=9600, timeout=.5, parity='N')
client.connect()
client.write_registers(1, 1, unit=1)
client.close()
Что я вижу в консоли сервера:
2020-03-24 00:08:14,189 MainThread DEBUG sync :46 Client Connected [/dev/ttyAMA0:/dev/ttyAMA0]
2020-03-24 00:08:14,190 MainThread DEBUG sync :580 Started thread to serve client
Журналы клиента:
2020-03-24 00:09:53,937 MainThread DEBUG transaction :115 Current transaction state - IDLE
2020-03-24 00:09:53,938 MainThread DEBUG transaction :120 Running transaction 1
2020-03-24 00:09:53,939 MainThread DEBUG transaction :219 SEND: 0x1 0x10 0x0 0x1 0x0 0x1 0x2 0x0 0x1 0x66 0x41
2020-03-24 00:09:53,939 MainThread DEBUG sync :75 New Transaction state 'SENDING'
2020-03-24 00:09:53,940 MainThread DEBUG transaction :238 Transaction failed. ([Errno 25] Inappropriate ioctl for device)
2020-03-24 00:09:53,941 MainThread DEBUG rtu_framer :235 Frame - [b''] not ready
2020-03-24 00:09:53,941 MainThread DEBUG transaction :394 Getting transaction 1
2020-03-24 00:09:53,942 MainThread DEBUG transaction :193 Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
Меня действительно смущает сообщение об ошибке:
[Errno 25] Inappropriate ioctl for device
До этого момента в журналах показывалось то, что я ожидал (похоже, я могу подключиться, и отправка правильно), но я не могу понять, что происходит с этим сообщением об ошибке. На стороне сервера ничего не происходит в окне терминала. Я убедился, что с помощью
sudo raspi-config
можно отключить оболочку и ядро от последовательного соединения.
Есть идеи о том, в чем проблема? Ty