Modbus Slave не отвечает
Я пытаюсь использовать Raspberry Pi 3B (с операционной системой Ubuntu Mate 16.04) в качестве мастера для считывания значений с счетчика электроэнергии, который поддерживает протокол Modbus-RTU.
Я использовал адаптер RS232/USB и адаптер RS485/RS232, чтобы связать счетчик и порт USB на Raspberry Pi. Я попробовал modbus_tk 0.5.7 и MinimalModbus для реализации связи по протоколу Modbus-RTU.
Когда я использую modbus_tk 0.5.7 и запускаю следующий код:
import sys import serial
#add logging capability import logging import modbus_tk import modbus_tk.defines as cst import modbus_tk.modbus_rtu as modbus_rtu
logger = modbus_tk.utils.create_logger("console")
if __name__ == "__main__":
try:
#Connect to the slave
master = modbus_rtu.RtuMaster(serial.Serial(port="/dev/ttyUSB0", baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0))
master.set_timeout(5.0) #Change the timeout value/Defines a timeout on the MAC layer
master.set_verbose(True) #print some more log prints for debug purpose
logger.info("connected")
logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 49))
except modbus_tk.modbus.ModbusError, e:
logger.error("%s- Code=%d" % (e, e.get_exception_code()))
Параметры, такие как порт, скорость передачи, байтовый размер, четность и стоп-биты были установлены правильно, но это всегда возвращает это:
2017-08-10 19:24:34,282 INFO modbus_rtu.__init__ MainThread RtuMaster /dev/ttyUSB0 is opened
2017-08-10 19:24:34,283 INFO rtumaster_example.<module> MainThread connected
2017-08-10 19:24:34,284 DEBUG modbus.execute MainThread -> 1-3-0-0-0-49-132-30
2017-08-10 19:24:39,291 DEBUG modbus.execute MainThread <-
Traceback (most recent call last):
File "rtumaster_example.py", line 34, in <module>
logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 49))
File "build/bdist.linux-x86_64/egg/modbus_tk/utils.py", line 39, in new
modbus_tk.exceptions.ModbusInvalidResponseError: Response length is invalid 0
Когда я использую MinimalModbus и запускаю следующий код:
#!/usr/bin/env python
import minimalmodbus
instrument.serial.port='/dev/ttyUSB0' # this is the serial port name
instrument.serial.baudrate = 9600 # Baud
instrument.serial.bytesize = 8
instrument.serial.parity = serial.PARITY_NONE
instrument.serial.stopbits = 1
instrument.serial.timeout = 0.05 # seconds
#instrument.address # this is the slave address number
instrument.mode = minimalmodbus.MODE_RTU # rtu or ascii mode
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1) # port name, slave address (in decimal)
energy = instrument.read_register(10, 1) # Registernumber, number of decimals
print energy
Это всегда возвращает это:
raise IOError('No communication with the instrument (no answer)')
IOError: No communication with the instrument (no answer)
А затем я использую ту же линию последовательной передачи, чтобы связать счетчик и ноутбук, и использую инструмент отладки, работающий на Windows XP, который был разработан производителем счетчика. Средство отладки отправляет тот же запрос (1-3-0-0-0-49-132-30), что и раньше, но средство отладки может получить правильные ответы. (Возможно, это связано с тем, что он игнорировал некоторые неправильные ответы и регулярно отправлял запросы на отправку). Это также может означать, что сообщение с запросом является правильным, и соединение с последовательной передачей не имеет проблем.
Я также использовал CuteCom(графический последовательный терминал) и адаптер RS232/USB, чтобы подтвердить, что порт USB может отправлять и получать правильно. Также бесполезно добавлять резистор между двумя линиями RS485
Я пробовал много раз, но Raspberry Pi никогда не получает отклик и всегда возвращает одну и ту же информацию об ошибке. Я также пытаюсь запустить тот же код на виртуальной машине Ubuntu, он вернул то же сообщение, что и выше, и никогда не получал ответ.
Я новичок в Modbus и последовательной связи, поэтому любая помощь будет оценена.
3 ответа
Я решил свою проблему, используя более дорогой разъем USBtoRS485. Проблема заняла у меня много времени, чтобы попробовать другую библиотеку и другой код. Получается, что приобретенный мной переходник "usb-serial QLHeng Electronics HL-340" хорошо работает на Windows, но не работает с Linux. Он может отправлять и получать сообщения в Linux, но не поддерживает связь Modbus.
Поэтому я предлагаю вам купить более дорогой разъем, и это может сэкономить вам много времени и энергии.
Это все, спасибо!
У меня была такая же проблема. После использования инструмента mbpoll я понял, что соотношение было неверным. Только что обновил до четности. ЕЩЕ и теперь все нормально.
- Попробуйте подключить конец RS232 кабеля к ПК с последовательным портом (если он у вас есть), чтобы убедиться, что usb / rs232 работает
- Если у вас есть осциллограф (например, Fluke), вы можете наблюдать линию RS485 (это на самом деле не сложно), чтобы понять, в чем проблема.
- Мне пришло в голову выяснить, что последовательные параметры (например, скорость передачи) можно настроить в двух местах для Windows - при открытии порта и в конфигурации драйвера.
- Попробуйте выровнять потенциал для всех устройств. Я знаю, что RS485 должен быть невосприимчив к этому, но RS232 не
У вас слишком короткий тайм-аут на вашем Pi, попробуйте увеличить его до 100 мс, и он должен работать.
РЕДАКТИРОВАТЬ: как указано в комментарии ниже, я даю более подробную информацию о своем предложении. Судя по деталям, приведенным в вопросе, и последующим ответам и комментариям, настройка оборудования кажется правильной. Я видел, как это происходило время от времени: когда вы устанавливаете очень короткий тайм-аут на одной стороне, ссылка внезапно перестает работать (это тоже имеет смысл, ошибка тайм-аута возникает, когда вы не получили ответа в течение периода времени, который вы определяете с помощью параметр тайм-аута), и он снова становится активным, как только вы его снова увеличиваете. Я также заметил, что этот эффект зависит от оборудования, некоторые устройства могут отвечать быстрее, чем другие.