Modbus Master

 
в палитре на схеме

Блок реализует возможность обмена системы SimInTech с внешними устройствами по протоколу Modbus. Реализация блока основана на использовании внешней свободно распространяемой библиотеки Libmodbus. Библиотека поддерживает следующие версии протокола Modbus для обмена:

Блок поддерживает следующие команды:

Примечание: очерёдность команд при одновременном исполнении на одном расчётном шаге соответствует порядку в приведённом списке.
Примечание: при работе с регистрами в режимах, отличных от word, количество реально обрабатываемых регистров больше количества оперируемых величин (в 2 раза для Float и Long, в 4 раза для Double). Во избежание путаницы в разделах, относящихся к регистрам, используется обобщённый термин «значение (val)». Термин «регистр» используется только там, где речь идёт непосредственно о стандартном двухбайтовом регистре Modbus.

Входы

Примечание: SimInTech не поддерживает динамическое изменение размерности линий связи в процессе расчёта. Для реализации возможности изменения формата запросов в процессе расчёта в блоке принята следующая идеалогия. Общая размерность каждого порта задётся соответствующим ему свойством (ValsReadDimension, ValsWriteDimension, BitsReadDimension, BitsWriteDimension). Запрашиваемое на чтение/запись количество битов/регистров не должно превышать общую размерность. Свободные элементы выходного массива для чтения заполняются нулями. Свободные элементы входного массива для записи не используются.

Выходы

Свойства:

Примечание: для упрощения работы с блоком список отображаемых свойств формируется в зависимости от выбранного режима работы.
Общие свойства для регистров:
  • Тип значений в регистрах (RegsType)
    Стандартный размер регистра, определяемый протоколом Modbus, соответствует 2 байтам памяти (Word), однако часто на практике стоит задача передачи величин большего размера (4 или 8 байт). Для решения этой задачи в блоке предусмотрен механизм, позволяющий интерпретировать несколько идущих подряд регистров как одно значение. Свойство задаёт интерпретацию как считываемых, так и записываемых величин и задаётся до начала расчёта. Реализованы следующие варианты:
    • Word (2-х байтовое беззнаковое целое – стандарт Modbus);
    • Long (4-х байтовое беззнаковое целое);
    • Float (4-х байтовое вещественное число с плавающей точкой);
    • Double (8-х байтовое вещественное число с плавающей точкой).
    Примечание: все величины, передаваемые по линиям связи в SimInTech, имеют тип Double (8 байт).
    Рассмотрим механизм работы свойства для записываемых регистров. Предположим, в блоке задаётся запись одного значение по адресу 0 в Slave-устройство.
    • Word: из подаваемого на вход Double-значения выделяется целая часть и преобразуется к 2-х байтовому беззнаковому целому. В Slave-устройстве будет произведена запись 0 регистра;
    • Long: из подаваемого на вход Double-значения выделяется целая часть и преобразуется к 4-х байтовому беззнаковому целому. В Slave-устройстве будет произведена запись 2 регистров: 0 и 1;
    • Float: подаваемое на вход Double-значение преобразуется к 4-х байтовому вещественному число. В Slave-устройстве будет произведена запись 2 регистров: 0 и 1;
    • Double: подаваемое на вход Double-значение не подвергается никаким преобразованиям. В Slave-устройстве будет произведена запись 4 регистров: 0, 1, 2, 3;
    Аналогично рассмотрим механизм работы свойства для читаемых регистров. Предположим, в блоке задаётся считывание двух(!) последовательных значений из Slave-устройства, начиная с адреса 0.
    • Word: в Slave-устройстве будет произведено считывание 2 регистров (0,1), каждый из которых будет конвертирован в Double-значение и выведен на выходной порт блока;
    • Long: в Slave-устройстве будет произведено считывание 4 регистров (0-3), которые попарно будут интерпретированы как Long-значения, конвертированы в соответствующие Double-значения и выведены на выходной порт блока;
    • Float: в Slave-устройстве будет произведено считывание 4 регистров (0-3), которые попарно будут интерпретированы как Float-значения, конвертированы в соответствующие Double-значения и выведены на выходной порт блока;
    • Double: в Slave-устройстве будет произведено считывание 8 регистров (0-7), которые четвёрками будут интерпретированы как Double-значения и выведены на выходной порт блока.
  • Формат для 4-х байтных целых (LongOrder)

    Для возможности работы с системами, в которых принят другой порядок следования байт, блок предоставляет возможность перестановки байт местами при записи и чтении. Предоставляемые варианты: AB CD, CD AB, BA DC, DC BA.

  • Формат для 4-х байтных вещественных (FloatOrder)

    Предоставляемые варианты: AB CD, CD AB, BA DC, DC BA.

  • Формат для 8 байтных вещественных (DoubleOrder)

    Предоставляемые варианты: AB CD EF GH, GH EF CD AB, BA DC FE HG, HG FE DC BA.

Чтение регистров (0x03)
  • Читать значения (ReadVals)

    Флаг, включающий операцию чтения регистров. Операция может включаться/выключаться в процессе расчёта.

  • Максимальная размерность (ValsReadDimension)

    Свойство задаёт размерность портов REG_READ_VAL и REG_READ_BYTES.

  • Количество читаемых значений по группам (ValsReadNmb)

    Если требуется считать только один непрерывный диапазон значений(регистров), в свойстве достаточно задать скалярное значение, соответствующее количеству запрашиваемых значений. Если необходимо считать нескольких несмежных диапазонов регистров, в свойстве задаётся массив вида:

    [<Количество значений в 1 группе>,..,<Количество значений в N группе>].

    Каждый диапазон считывается отдельным запросом к Slave-устройству. Все запросы выполняются последовательно в порядке следования элементов в массиве в рамках одного расчётного шага SimInTech. Во избежание перегрузки канала между запросами помещается временная пауза, задаваемая свойством TimeStep.

  • Адреса читаемых значений по группам (ValsReadAddr)

    Свойство работает в паре со свойством ValsReadNmb и позволяет задавать адреса начала считываемых диапазонов. Размерность свойства должна соответствовать размерности свойства ValsReadNmb. Запрашиваемые адреса могут динамически меняться в процессе расчёта.

Запись регистров (0x10)
  • Записывать значения (WriteVals)

    Флаг, включающий операцию записи регистров. Операция может включаться/выключаться в процессе расчёта.

  • Максимальная размерность (ValsWriteDimension)

    Свойство задаёт размерность порта REG_WRITE_VAL.

  • Количество записываемых значений по группам (ValsWriteNmb)

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

    [<Количество значений в 1 группе>,..,<Количество значений в N группе>].

    Каждый диапазон записывается отдельным запросом к Slave-устройству. Все запросы выполняются последовательно в порядке следования элементов в массиве в рамках одного расчётного шага SimInTech. Во избежание перегрузки канала между запросами помещается временная пауза, задаваемая свойством TimeStep.

  • Адреса записываемых значений по группам (ValsWriteAddr)

    Свойство работает в паре со свойством ValsWriteNmb и позволяет задавать адреса начала записываемых диапазонов. Размерность свойства должна соответствовать размерности свойства ValsWriteNmb. Записываемые адреса могут динамически меняться в процессе расчёта.

Чтение битов (0x01)
  • Читать биты (ReadBits)

    Флаг, включающий операцию чтения битов. Операция может включаться/выключаться в процессе расчёта.

  • Максимальная размерность (BitsReadDimension)

    Свойство задаёт размерность порта BITS_READ_VAL.

  • Количество читаемых значений по группам (BitsReadNmb)

    Смотрите аналогичные свойства для регистров.

  • Адреса читаемых значений по группам (BitsReadAddr)

    Смотрите аналогичные свойства для регистров.

Запись битов (0x0F)
  • Записывать биты (WriteBits)

    Флаг, включающий операцию записи битов. Операция может включаться/выключаться в процессе расчёта.

  • Максимальная размерность (BitsWriteDimension)

    Свойство задаёт размерность порта BITS_WRITE_VAL.

  • Количество записываемых значений по группам (BitsWriteNmb)

    Смотрите аналогичные свойства для регистров.

  • Адреса записываемых значений по группам (BitsWriteAddr)

    Смотрите аналогичные свойства для регистров.

Общие свойства блока
  • Тип подключения (BackendType)
    Блок предоставляет следующие типы подключений:
    • TCP (обмен по протоколу TCP/IP);
    • TCP PI (PI – Protocol Independent. TCP/IP c возможностью задать IP-адрес в формате IPv6, либо как имя узла);
    • RTU (обмен по протоколам RS в бинарном формате).
    Тип подключения и все сопутствующие настройки задаются до начала расчёта и далее не меняются.
  • Отправлять запросы всем устройствам (broadcast-режим)

    Специальный режим, позволяющий одновременно отправлять запрос всем подключенным устройствам. В данном режиме свойство SlaveNumber не используется.

  • Номер slave-устройства (SlaveNumber)

    Идентификационный номер slave-устройства, к которому отправляется запрос.

  • Количество повторных попыток при ошибке (AttemptsNmb)
    Свойство включает возможность продолжения расчёта и выполнения повторных попыток на следующих расчётных шагах при неудаче на текущем шаге(отсутствие ответа или ошибка). При возникновении проблемы во время выполнения какой-либо операции (чтение/запись регистров/битов) на текущем шаге её выполнение прекращается и включается счётчик неудачных попыток. Несмотря на возникновение ошибки на этом же шаге блок попытается выполнить остальные заказанные операции. Также необходимо отметить, что счётчик неудачных попыток не может получить приращение больше чем +1 за один расчётный шаг, независимо от реального количества ошибок (4 – максимум). При превышении счётчиком заданного в свойствах значения расчёт останавливается. Если на очередном шаге не было зафиксировано ошибок, счётчик сбрасывается. Предусмотрены следующие сценарии работы блока при возникновении ошибки:
    • Останавливать сразу;
    • 1;
    • 2;
    • 3;
    • 4;
    • 5;
    • 10;
    • 15;
    • Пытаться постоянно.
  • Выводить отладочную информацию в текстовый файл (DebugMode)
    Вывод отладочной информации библиотеки Libmodbus в текстовый файл DEBUG.txt. Файл создаётся том же каталоге, где расположен файл проекта.
    Примечание: не оставляйте этот режим включённым в продолжительном расчёте, чтобы не забить жёсткий диск.
Временные настройки блока
  • Шаг работы блока, [мc] (TimeStep)

    Свойство задаёт шаг работы блока относительно расчётного времени системы SimInTech. Если заданный шаг меньше расчётного шага системы, блок будет отрабатывать на каждом расчётном шаге.

    Также данное свойство определяет уже системное время задержки между последовательными запросами к Slave-устройству в рамках одного шага.

  • Время ожидания первого ответного байта при запросе, [мс] (ResponseTimeout)

    Системное время ожидания получения первого пакета ответных байтов после отправки запроса Slave-устройству.

  • Время ожидания промежуточных ответных байтов при запросе, [мс] (ByteTimeout)

    Системное время ожидания получения промежуточных пакетов ответных байтов.

Свойства TCP-IP подключения
  • IP адрес slave-устройства (SlaveIP)
    Примечание: при использовании типа подключения TCP PI (Protocol Independent) адрес в свойстве может быть в формате IPv4, IPv6, либо как имя узла подключения. Например, «192.168.0.5», «::1» или «server.com».
  • TCP порт slave-устройства (SlavePortTCP)
Свойства RTU подключения
Примечание: при работе блока не используется ни аппаратная (hardware handshaking), ни программная (software handshaking) проверка связи.
  • Номер последовательного порта (PortSerial)
  • Скорость передачи данных, [бод] (BaudRate)
  • Контроль ошибок (Parity)
  • Количество бит данных (DataBits)
  • Количество стоп-бит (StopBits)

Параметры

  • RegsInfo – параметр представляет побайтовую информацию о считываемых/записываемых регистрах на текущем расчётном шаге. Параметр необходимо выводить в текстовом формате (создание подписи).
  • BitsInfo – параметр представляет информацию о считываемых/записываемых битах на текущем расчётном шаге. Параметр необходимо выводить в текстовом формате (создание подписи).