Skip to main content

Modbus

Версия: 1.26.0

Агенты Modbus TCP и RTU позволяют интегрировать устройства Modbus в OpenRemote, обеспечивая связь через Ethernet (TCP) или последовательный порт (RTU).

Как это работает

В OpenRemote агенты Modbus действуют как ведущие Modbus, обмениваясь данными напрямую с ведомыми устройствами Modbus. Агент управляет параметрами соединения (TCP или Serial) и обеспечивает чтение и запись данных в указанные регистры или катушки подключенных устройств Modbus. Агенты могут оптимизировать свои запросы на чтение, группируя несколько регистров за один вызов. По умолчанию это отключено (см. пакетные запросы).

Настройка агента Modbus

Вы можете настроить агенты Modbus TCP или Modbus RTU:

Агент Modbus TCP

Параметр

Описание

Требуется

По умолчанию

хозяин

IP-адрес или имя хоста устройства Modbus

Да

-

порт

Номер TCP-порта устройства Modbus

Да

-

конфигурация устройства

Настройки, специфичные для устройства (unitID), применяются настройки «по умолчанию», если не добавлена конкретная конфигурация UnitID.

Нет

автоматически заполняется значениями по умолчанию

Агент Modbus RTU

Параметр

Описание

Требуется

По умолчанию

последовательныйпорт

Идентификатор последовательного порта (например, /dev/ttyUSB0)

Да

-

Скорость последовательного порта

Скорость передачи данных для последовательной связи

Нет

9600

биты данных

Количество бит данных на кадр

Нет

8

паритет

Установка бита четности (NONE, ODD, EVEN)

Нет

EVEN

стоп-биты

Количество стоповых битов (STOPBITS_1, STOPBITS_2)

Нет

STOPBITS_1

конфигурация устройства

Настройки, специфичные для устройства (unitID), применяются настройки «по умолчанию», если не добавлена конкретная конфигурация UnitID.

Нет

автоматически заполняется значениями по умолчанию

Конфигурация устройства

Хотя приведенные выше настройки применимы для всех устройств на порту шины, некоторые настройки могут различаться в зависимости от устройства (unitId/адрес устройства modbus). Настройка «по умолчанию» применяется ко всем идентификаторам unitID, если не указано иное. Если у вас есть unitID на шине, требующий другой конфигурации, добавьте в конфигурацию дополнительное свойство с этим unitID в качестве имени. Например, конкретная конфигурация для unitID 1 будет такой:

Пример конфигурации устройства:

{ "default": { "endianFormat": "BIG_ENDIAN", "illegalRegisters": "", "maxRegisterLength": 1 }, "1": { "endianFormat": "LITTLE_ENDIAN", "illegalRegisters": "23,24,100-200", "maxRegisterLength": 40 }}

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

Параметр

Описание

endianFormat

Порядок байтов: BIG_ENDIAN (ABCD), LITTLE_ENDIAN (DCBA), BIG_ENDIAN_BYTE_SWAP (BADC), LITTLE_ENDIAN_BYTE_SWAP (CDAB).

незаконные регистры

Регистры, не поддерживаемые устройством (например, "23,24,100-200")

максрегистрдлина

Максимальное количество регистров в одном запросе (по умолчанию: 1)

Пакетные запросы

Настройки illegalRegisters и maxRegisterLength используются для настройки объединенных регистров, считываемых в одном запросе. Это может значительно снизить трафик на шине и сократить время реагирования. По умолчанию для параметра maxRegisterlength установлено значение 1, что приводит к отсутствию пакетной обработки. При повышении maxRegisterLength необходимо использовать нелегальныйRegister, чтобы учитывать диапазоны регистров, которые недопустимы для этого конкретного устройства. Например, когда агентские ссылки настроены на регистрацию 1 и 20, это будет объединено в один вызов, если maxRegisterLength > 20. Однако, если вызов регистрации 19 приведет к ответу устройства на исключение, это завершится неудачно, поэтому вам нужно будет добавить 19 к незаконному регистру. Агент формирует группы пакетов на основе идентичных requestInterval, unitID и readMemoryArea.

Каждый атрибут актива может быть связан с агентом Modbus через Связь агента. Ниже приведены необходимые параметры:

Параметр

Описание

Требуется

Читать адрес

Регистр или адрес катушки

Да (для чтения)

Читать область памятиТип регистра (COIL, DISCRETE, HOLDING, INPUT)

Да (для чтения)

Читать тип значения

Тип данных (BOOL, INT, UINT, DINT, REAL и т. д.). Также используется для преобразований записи в несколько регистров.

Да (для чтения)

Напишите адрес

Регистр или адрес катушки для записи

Да (для записи)

Запись области памяти

Тип регистра для записи (COIL, HOLDING)

Да (для записи)

Идентификатор объекта

Адрес устройства Modbus (1–255). Требуется для чтения. По умолчанию записывает 1, если он опущен. Для TCP это обычно 1, если только соединение не осуществляется через шлюз Modbus.

Да (для чтения)

Интервал запроса

Интервал между чтением/записью в миллисекундах (минимум: 1000). Если не установлено, чтение выполняется один раз при подключении, а запись выполняется только по требованию.

Необязательно

Количество регистров

Количество регистров для чтения/записи (автоматически определяется по типу данных, если не установлено)

Необязательно

Важно: Адресация Modbus в OpenRemote начинается с 1. Адрес 1 соответствует адресу PDU 0x0000.

Пример ссылки на атрибут:

{ "readAddress": 24, "readMemoryArea": "HOLDING", "readValueType": "UINT", "writeAddress": 24, "writeMemoryArea": "HOLDING", "unitId": 1, "requestInterval": 5000}

Типы данных

Интеграция OpenRemote Modbus поддерживает различные типы данных:

  • BOOL: логическое значение (однобитовое)
  • SINT/USINT/BYTE: 8-битное целое число (со знаком/без знака).
  • INT/UINT/WORD: 16-битное целое число (со знаком/без знака).
  • DINT/UDINT/DWORD: 32-битное целое число (со знаком/без знака).
  • LINT/ULINT/LWORD: 64-битное целое число (со знаком или без знака, для очень больших значений можно использовать такие термины, как long или BigInteger).
  • REAL: 32-битные числа с плавающей запятой.
  • LREAL: 64-битные числа с плавающей запятой.
  • CHAR/WCHAR: Символ (одиночный или широкий, представленный как char или String)

Пример конфигурации

Вот полный пример конфигурации датчика температуры Modbus TCP:

Конфигурация агента:

{ "host": "192.168.1.50", "port": 502, "deviceConfig": { "default": { "endianFormat": "BIG_ENDIAN", "illegalRegisters": "", "maxRegisterLength": 1 } }}

Конфигурация агентской связи:

{ "readAddress": 23, "readMemoryArea": "INPUT", "readValueType": "REAL", "registersAmount": 2, "requestInterval": 60000, "unitId": 1}

Под капотом

Агент Modbus изначально написан для openremote. Это обеспечивает тщательную интеграцию в модель событий атрибутов openremote. Когда вы настраиваете связанный атрибут с настройкой чтения вместе с интервалом запроса, агент планирует периодические запросы чтения к устройству (используя указанный код функции на основе типа чтения, например, функция 0x03 для регистров хранения или 0x01 для катушек и т. д.). Ответ анализируется в соответствии с типом считываемого значения (например, UINT, BOOL и т. д.), а затем значение атрибута обновляется в OpenRemote. Если активна только запись, подтверждение запроса будет использоваться для определения успешности записи, а значение атрибута обновляется локально. Однако может случиться так, что вы записываете регистр заданного значения, но хотите обновить значение из другого регистра, который содержит фактическое значение (например, устройство может иметь ограничения). В этом случае включите как чтение, так и запись. Вы можете сделать это либо с тем же, либо с другим регистром, в зависимости от того, как работает устройство. Когда активны и чтение, и запись, вместо использования подтверждения запроса значение немедленно считывается обратно с помощью запроса на чтение после запроса на запись.

Интервал чтения/записи и комбинации

Чтение настроенных

Запись настроена

Запросить набор интервалов

Итоговое поведение

да

нет

нет

однократное чтение после подключения агента

нет

да

нет

пишет только после манипуляций с атрибутом

да

да

нет

однократное чтение после подключения агента, запись только после манипуляций с атрибутом, затем чтение обратно.

да

нет

да

циклическое чтение

нет

да

да

циклическая запись (повторно отправляет текущее значение атрибута каждый интервал)

да

да

дациклическое чтение; запись выполняется по требованию при изменении значения атрибута, после чего следует проверочное чтение

Примечание по адресации: Помните, что OpenRemote использует адресацию на основе 1 для Modbus. Это распространенный источник путаницы. Всегда проверяйте, указаны ли в документации вашего устройства адреса регистров, начинающиеся с 1 или 0, и вносите соответствующие изменения. Например, если в документации устройства упоминается «Регистр 100» (но отсчет начинается с нуля), вам может действительно потребоваться использовать 101. Однако, если это относится к «Регистру 40001» (соглашение Modbus для первого регистра хранения), вам следует использовать 1. Агент OpenRemote Modbus в конечном итоге преобразует заданный вами адрес в правильный адрес Modbus PDU (например, адрес 1 будет отправлен как 0x0000 в запросе).

Примечание о типах данных. Доступно большинство стандартных типов. Например, если вам нужно прочитать 32-битное целое число, разделенное на два регистра (так используют многие устройства), вы можете выбрать DINT или UDINT. Если вам нужно 32-битное число с плавающей запятой, выберите REAL. Агент автоматически прочитает необходимое количество регистров (два для 32-битных, четыре для 64-битных и т.д.) за один запрос. Если вы выберете 64-битный тип (LINT, ULINT, LREAL), обратите внимание, что он будет считывать четыре последовательных 16-битных регистра (поскольку каждый регистр Modbus по 16 бит) для сборки 64-битного значения. Убедитесь, что соседние регистры свободны или принадлежат одному и тому же значению в вашем устройстве, иначе вы можете получить неверные данные. Логические значения (BOOL) соответствуют одиночным битам при использовании с катушками или дискретными входами. Если вы используете BOOL для типа регистра (хранение/ввод), любое ненулевое значение регистра интерпретируется как истинное. Обратите внимание, что отдельного типа записываемого значения не существует; При записи в несколько регистров для преобразования данных используется тип значения чтения.

Подводя итог, агент Modbus позволяет передавать данные от ПЛК, измерителей мощности, датчиков и других устройств на базе Modbus в OpenRemote и управлять этими устройствами с помощью протокола Modbus. Настроив агенту правильные параметры соединения и связав атрибуты с правильным типом регистра, адресом и типом данных, вы можете легко интегрировать данные Modbus в свой проект OpenRemote. Гибкая конфигурация (разделение настроек чтения и записи) позволяет использовать устройства, использующие отдельные регистры для состояния и управления, а использование стандартных определений типов данных упрощает обработку значений с несколькими регистрами. Постоянная работа над документацией и отзывы сообщества (см. форумы OpenRemote) совершенствуют эту функцию, но с помощью приведенной выше информации вы сможете начать работу с интеграцией Modbus в OpenRemote. Запросы Modbus имеют таймаут 3 секунды.


Уведомление о лицензии: атрибуция документации OpenRemote