Функция формирует запрос в протоколе ModBus RTU на основании заданных настроек и пытается выполнить его отправку через выбранный интерфейс (настройка Интерфейс). После отправки запроса функция ожидает ответ в течение заданного времени (настройка Таймаут).
После получения данных функция проверить формат пакета на соответствие протоколу ModBus RTU, проверит, что ответ отправлен именно на этот запрос (с учетом возможностей протокола). Если все проверки пройдены, то на выходе valid
будет установлено True, а на выходах valueX
прочитанные значения регистров.
Если ответ за отведенное время (настройка Таймаут) не получен, то на выходах valueX
остаются предыдущие значения, а на выходе valid
будет установлено False.
Если на входе enable
останется значение True, то через заданное время (настройка Период опроса) после начала предыдущей транзакции функция повторит отправку запроса и разбор пакета (и так далее).
При работе функции используются буферы RXD и TXD
Для работы функции, в конфигурации устройства должен быть настроен соответствующий интерфейс:
Конфигурация > RS-232/RS-485 > Устройство X > Сomplex Events (транзакция).
В меню функций | На схеме |
---|---|
![]() |
![]() |
Название | Тип значения | Описание |
---|---|---|
enable |
bool | Если True, то функция выполняет запросы |
Название | Тип значения | Описание |
---|---|---|
valid |
bool | Если True, то на последний запрос был получен корректный ответ и значения на выходах valueX актуальны |
state |
int32 | Состояние: 0 – не активен; 1 – ожидание доступа к интерфейсу; 2 – доступ к интерфейсу получен; 3 – транзакция в процессе; 4 – транзакция завершена успешно; -1 – интерфейс недоступен (не настроен); -2 – истек таймаут ожидания ответа; -3 – неизвестная ошибка. |
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.
Название | Описание |
---|---|
Количество выходов | Настройка регулирует количество выходных линий valueX |
Интерфейс | Цифровой интерфейс, которым управляет функция. Если выбранный интерфейс не настроен, то функция сформирует ошибку state = -1 . |
Период опроса, мс | Период повторной отправки запроса если на входе enable удерживается значение True.Повтор выполняется как в случае ошибки, так и в случае успешного завершения транзакции. Таймаут рассчитывается от начала предыдущей транзакции. |
Таймаут, мс | Время, в течение которого после отправки данных функция ожидает ответ. Если корректный ответ не получен, то транзакция завершается с ошибкой state = -2 . |
Функция | Функция ModBus, с помощью которой считываются данные: 01 - Чтение флагов ( DO );02 - Чтение дискретных входов ( DI );03 - Чтение регистров хранения ( AO );04 - Чтение регистров ввода ( AI ).Более подробно о регистрах можно прочитать в стате про ModBus RTU |
Сетевой номер (dec) | Сетевой номер, опрашиваемого датчика. В десятичном формате. |
Адрес данных | Адрес запрашиваемого регистра. Если для чтения используется несколько входов, то может быть прочитано несколько регистров. Но в любом случае начальный адрес для чтения будет взят именно из этой настройки. |
Тип | Тип и размер значения для чтения и вывода на каждый выход valueX :uint8 – однобайтовое число без знака; int8 – однобайтовое число со знаком; uint16 – двухбайтовое без знака; int16 – двухбайтовое со знаком; int32/float – четырехбайтовое со знаком / вещественное. |
Порядок байт | Порядок байт, который будет использован при копировании данных из RXD буфера на выходы valueX . Например, RXD = [01,02,03,04] , Тип = int32.Младшим вперед: value = 0х04030201 value = 0х01020304 value = 0х02010403 |
Например, настроим функцию так:
Параметр | Значение |
---|---|
Количество выходов | 3 |
Интерфейс | RS-485 |
Период опроса | 1000 ms |
Таймаут | 100 ms |
Функция | (03) Чтение регистров ввода |
Сетевой номер | 17 |
Адрес данных | 107 (0x6B) |
Тип | int16 |
Порядок байт | Старшим вперед |
В результате такой настройки устройство сформирует запрос:
Значение | Название поля ModBus |
---|---|
0x11 |
Сетевой номер датчика |
0x03 |
Функция ModBus |
0x00 |
Адрес первого регистра (Hi байт) |
0x6B |
Адрес первого регистра (Lo байт) |
0x00 |
Количество регистров (Hi байт) |
0x03 |
Количество регистров (Lo байт) |
0x76 |
CRC (Hi байт) |
0x87 |
CRC (Lo байт) |
и попытается выполнить его отправку через интерфейс RS-485
. После отправки, устройство в течение 100 ms
будет ожидать ответ.
После получения данных устройство проверит формат пакета на соответствие протоколу ModBus, проверит ожидаемую функцию и контрольную сумму.
Пример корректного ответа:
Значение | Название поля ModBus |
---|---|
0x11 |
Сетевой номер датчика |
0x03 |
Функция ModBus |
0x06 |
Количество байт данных |
0xAE |
Значение регистра 0x006B (Hi байт) |
0x41 |
Значение регистра 0x006B (Lo байт) |
0x56 |
Значение регистра 0x006C (Hi байт) |
0x52 |
Значение регистра 0x006C (Lo байт) |
0x43 |
Значение регистра 0x006D (Hi байт) |
0x40 |
Значение регистра 0x006D (Lo байт) |
0x49 |
CRC (Hi байт) |
0xAD |
CRC (Lo байт) |
Если все проверки пройдены, то на выходах будут следующие значения:
valid
= true
value0
= 0xAE41
value1
= 0x5652
value2
= 0x4340
Если ответ за отведенное время не получен, то на выходах valueX
останутся предыдущие значения, а выход valid
примет значение False
.
Если на входе enable
останется значение True
, то через 1000 ms
после начала предыдущей транзакции функция повторит отправку запроса и ожидание ответа.