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-устройства, к которому отправляется запрос.

  • Занулять непрочитанные выходные значения (NullUnreadElements)

    При отсутствии считанных значений элементы выходных значений на линиях связи будут зануляться, иначе будут выдаваться значения с прошлого шага.

  • Выполнять переподключение к Слейву при ошибке на обмене (ReconnectOnError)

    При возникновении ошибки в процессе обмена блок будет выполнять полное отключение с целью последующего переподключения (если это разрешено опцией AttemptsNmb). Данная опция наиболее критична при обмене по TCP протоколу, т.к. при временном выключении сервера требуется переподключение к нему. При обмене через RTU это не обязательно, т.к. блоки подключаются к COM-портам, а не непосредственно друг к другу.

  • Количество повторных попыток при ошибке (AttemptsNmb)
    Количество последовательных попыток подключения к серверу, которые разрешены блоку до того, как будет остановлен расчёт. Если подключение было выполнено успешно, счётчик сбрасывается. Предусмотрены следующие варианты:
    • Останавливать сразу;
    • 1;
    • 2;
    • 3;
    • 4;
    • 5;
    • 10;
    • 15;
    • Пытаться постоянно.
  • Выводить подключения/отключения в окно программы (ConnectionsToConsole)

    Выводить в консоль программы информацию об успешных событиях подключения/отключения к Слейву (или COM-порту для RTU режима).

  • Выводить ошибки в окно программы (ErrorsToConsole)

    Выводить в консоль программы информацию об ошибках подключения и работы.

  • Выводить отладочную информацию в текстовый файл (DebugMode)
    Вывод отладочной информации библиотеки Libmodbus в текстовый файл DEBUG.txt. Файл создаётся том же каталоге, где расположен файл проекта.
    Прим.: не оставляйте этот режим включённым в продолжительном расчёте, так как размер файла неограниченно возрастает.
Временные настройки блока
  • Шаг попытки переподключения, [мс] (ResponseTimeout)

    Свойство задаёт шаг попытки подключения блока к Slave-устройству относительно расчётного времени системы SimInTech.

  • Шаг работы блока, [м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)

Параметры

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