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-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 мс, и он должен работать.

РЕДАКТИРОВАТЬ: как указано в комментарии ниже, я даю более подробную информацию о своем предложении. Судя по деталям, приведенным в вопросе, и последующим ответам и комментариям, настройка оборудования кажется правильной. Я видел, как это происходило время от времени: когда вы устанавливаете очень короткий тайм-аут на одной стороне, ссылка внезапно перестает работать (это тоже имеет смысл, ошибка тайм-аута возникает, когда вы не получили ответа в течение периода времени, который вы определяете с помощью параметр тайм-аута), и он снова становится активным, как только вы его снова увеличиваете. Я также заметил, что этот эффект зависит от оборудования, некоторые устройства могут отвечать быстрее, чем другие.

Другие вопросы по тегам