Функция формирует команду в протоколе ModBus RTU с учетом задынных настроекдля передачи значиний со входов valueX на внешние устройтсва. Далее функция пытается выполнить отправку команды через выбранный интерфейс (настройка Интерфейс). После отправки команды функция ожидает ответ в течение заданного времени (настройка Таймаут).
После получения ответа функция проверит формат пакета на соответствие протоколу ModBus RTU, проверит, что ответ отправлен именно на этот запрос (с учетом возможностей протокола). Если все проверки пройдены, то на выходе actual
будет установлено True.
Если ответ за отведенное время (настройка Таймаут) не получен, то на выходе actual
будет установлено False.
Если на входе enable
останется значение True, то через заданное время (настройка Период опроса) после начала предыдущей транзакции функция повторит отправку команды и разбор ответа (и так далее).
При работе функции используются буферы RXD и TXD
Для работы функции, в конфигурации устройства должен быть настроен соответствующий интерфейс:
Конфигурация > RS-232/RS-485 > Устройство X > Сomplex Events (транзакция).
В меню функций | На схеме |
---|---|
![]() |
![]() |
Название | Тип значения | Описание |
---|---|---|
enable |
bool | Если True, то функция отправляет команды |
value0 |
float, int32, bool | Записываемое значение 0 |
value1 |
float, int32, bool | Записываемое значение 1 |
... | ... | ... |
valueX |
float, int32, bool | Записываемое значение X. Количество входных линий, регулируется настройкой "Количество входов" |
Логика работы функции зависит от типа данных:
Если ко входу
value
подключена переменная с типом Float и настройка Тип = int32/float, то функция записывает данные в буфер по стандарту IEEE754. Такой способ необходимо использовать для значений, которые передаются в формате Float (например, значение 12.6).Иначе функция записывает данные как Int32.
Конвертация выполняется автоматически при помощи скрытых функций FROM_FLOAT и TO_FLOAT.
Название | Тип значения | Описание |
---|---|---|
actual |
bool | Если True, то на последнюю команду был получен корректный ответ и значения на входах valueX успешно записаны |
state |
int32 | Состояние: 0 – не активен; 1 – ожидание доступа к интерфейсу; 2 – доступ к интерфейсу получен; 3 – транзакция в процессе; 4 – транзакция завершена успешно; -1 – интерфейс недоступен (не настроен); -2 – истек таймаут ожидания ответа; -3 – неизвестная ошибка. |
Название | Описание |
---|---|
Количество входов | Настройка регулирует количество входных линий valueX |
Интерфейс | Цифровой интерфейс, которым управляет функция. Если выбранный интерфейс не настроен, то функция сформирует ошибку state = -1 . |
Период опроса, мс | Период повторной отправки команды если на входе enable удерживается значение True.Повтор выполняется как в случае ошибки, так и в случае успешного завершения транзакции. Таймаут рассчитывается от начала предыдущей транзакции. |
Таймаут, мс | Время, в течение которого после отправки данных функция ожидает ответ. Если корректный ответ не получен, то транзакция завершается с ошибкой state = -2 . |
Функция | Функция ModBus, с помощью которой записываются данные: 05 - Запись одного флага ( DO );06 - Запись одного регистра ( AO );15 - Запись нескольких флагов ( DO );16 - Запись нескольких регистров ( AO ).Более подробно о регистрах можно прочитать в стате про ModBus RTU |
Сетевой номер (dec) | Сетевой номер датчика, которому отправляется команда. В десятичном формате. |
Адрес данных | Адрес регистра для записи. Если для записи используется несколько входов, то может быть записано несколько регистров. Но в любом случае начальный адрес для записи будет взят именно из этой настройки. |
Тип | Тип и размер значения, которое будет взято для записи с каждого из входов valueX :uint8 – однобайтовое число без знака; int8 – однобайтовое число со знаком; uint16 – двухбайтовое без знака; int16 – двухбайтовое со знаком; int32/float – четырехбайтовое со знаком / вещественное. |
Порядок байт | Порядок байт, который будет использован при копировании значений со входов valueX в TXD буфер. Например, value0 = 0x01020304 , Тип = int32/float.Младшим вперед: TXD = Старшим вперед:[04,03,02,01] TXD = Старшим вперед (2 байта):[01,02,03,04] TXD = [02,01,04,03] |
Например, настроим функцию так:
Параметр | Значение |
---|---|
Количество входов | 1 (value0 = 3) |
Интерфейс | RS-485 |
Период опроса | 1000 ms |
Таймаут | 100 ms |
Функция | (06) Запись одного регистра |
Сетевой номер | 17 |
Адрес данных | 1 (0x01) |
Тип | uint8 |
Порядок байт | Старшим вперед |
В результате такой настройки устройство сформирует команду:
Значение | Название поля ModBus |
---|---|
0x11 |
Сетевой номер датчика |
0x06 |
Функция ModBus |
0x00 |
Адрес первого регистра (Hi байт) |
0x01 |
Адрес первого регистра (Lo байт) |
0x00 |
Устанавливаемое значение (Hi байт) |
0x03 |
Устанавливаемое значение (Lo байт) |
0x9A |
CRC (Hi байт) |
0x9B |
CRC (Lo байт) |
и попытается выполнить ее отправку через интерфейс RS-485
. После отправки, устройство в течение 100 ms
будет ожидать ответ.
После получения данных устройство проверит формат пакета на соответствие протоколу ModBus, проверит ожидаемую функцию и контрольную сумму.
Пример корректного ответа:
Значение | Название поля ModBus |
---|---|
0x11 |
Сетевой номер датчика |
0x06 |
Функция ModBus |
0x00 |
Адрес первого регистра (Hi байт) |
0x01 |
Адрес первого регистра (Lo байт) |
0x00 |
Установленное значение (Hi байт) |
0x03 |
Установленное значение (Lo байт) |
0x9A |
CRC (Hi байт) |
0x9B |
CRC (Lo байт) |
При отправке команды на установку одного регистра хранения в ответ ожидается эхо
Если все проверки пройдены, то на выходе actual
будет установлено значение True.
Если ответ за отведенное время не получен, то на выходе actual
будет установлено значение False
.
Если на входе enable
останется значение True
, то через 1000 ms
после начала предыдущей транзакции функция повторит отправку команды и ожидание ответа.