bg

Запись данных в устройство MODBUS

Описание задачи:

Есть задача записи сигнала тревоги в контроллер, когда ранее считанное значение превышает заданный лимит.

Требования:

Подразумевается, что:

Вы настроили параметры связи в вашем устройстве:

  • MODBUS TCP - IP адрес, маску подсети, адрес шлюза. Вы должны задать статический IP адрес в устройстве.
  • MODBUS RTU - скорость передачи данных и количество бит данных.

Решение:

1. Создайте новую конфигурацию в главном окне программы, кликнув на кнопке с "зеленым плюсом" (рис. 1). В данном примере приведены настройки подключения для MODBUS TCP. Если ваше устройство использует протокол MODBUS RTU, то посмотрите тут. Если вы уже настроили подключение ранее, то переходите к шагу №4.

Настройки соединения IP
Рис. 1. Настройки соединения IP

2. Перейдите к странице: Модули - Запрос Анализ Фильтрация. Выберите "MODBUS TCP" или "MODBUS RTU" из списков. Затем кликните на кнопке "Настроить".

Выбор модуля MODBUS
Рис. 2. Выбор модуля MODBUS

3. Кликните на кнопке "Действия - Добавить запрос", и добавьте запрос для чтения данных (рис. 3). В вашем приложении, вы должны настроить свои параметры запроса: адрес устройства, функция, адрес, количество регистров, элементы ответа.

Добавление запроса для чтения данных
Рис. 3. Добавление запроса для чтения данных

4. Кликните по "Действие - Добавить запрос" снова и добавьте запрос, который будет записывать данные (рис. 4). Код функции MODBUS должен быть:

  • 6 (запись одного регистра) - если нужно записать значение, которое занимает в памяти контроллера или устройства один регистр (2 байта). Для примера, это могут быть типы данных word, uint16, int16, decimal16.
  • 16 (запись нескольких регистров) - если вы хотите записать значение, которое занимает несколько регистров (dword, uint32, int32, decimal32, float и т.п.).

Выберите метод запроса "Событие". Затем укажите "WRITE" в качестве идентификатора события. Вы можете использовать другой идентификатор, но тогда измените его в настройках ниже.

Группа "Элементы ответа" в данном случае определяет состав и тип отправляемых данных. Именно значение из поля "Значение по умолчанию" и будет отправлено в устройство.

Добавление запроса для записи данных
Рис. 4. Добавление запроса для записи данных

5. Настройте любой один модуль из трех ниже для генерации события "WRITE" при заданных условиях.

5.1. Expressions - это простой модуль, но позволяет выполнить все необходимые операции с помощью одного выражения (рис. 5, 6). Выражение в этом примере сравнивает значение "VALUE" из считываемых данных (из запроса "Read data" рис.3), и генерируется событие, если значение больше 100.

Модуль Expressions
Рис. 5. Модуль Expressions

SEND_EVENT_IF(VALUE > 100, 'WRITE')

Выражение
Рис. 6. Выражение

5.2. Script execute - это самый гибкий модуль. Он позволяет реализовать любую логику, но он требует знание языка программирования (рис. 7, 8). Этот скрипт также отправляет событие, если значение "VALUE" больше 100.

Модуль Script Execute
Рис. 7. Модуль Script Execute

const name = 'VALUE';
var v: variant;
begin
 if IsVariableDefined(name) then
  begin
   v := GetVariable(name);
   if v > 100 then
    SendEvent('WRITE');
  end;
end.

Скрипт
Рис. 8. Скрипт

5.3. Events generator - это самый простой модуль, но он оперирует только с текстовыми значениями, поэтому он может проверить значение только на равенство. (рис. 9, 10).

Модуль Events generator
Рис. 9. Модуль Events generator

Правило
Рис. 10. Правило

6. Кликните на кнопке "OK" и сохраните все настройки.

7. Теперь, модуль MODBUS опрашивает устройство и обрабатывает входящие данные. Модуль фильтрации данных анализирует принятое значение, и при необходимости генерирует событие, которые затем обрабатывается модулем MODBUS.

Расширенная настройка

Модуль "Script Execute" может передать одно или несколько поименованных значений вместе с генерируемым событием. Например, вы можете передать записываемое значение и адрес MODBUS, куда нужно записать данные.

ADDRESS - адрес для записи данных (может отсутствовать). Если это значение присутствует, то оно перекрывает значение адреса в памяти, заданное в настройках запроса MODBUS.
VALUE - значение для записи (может отсутствовать). Модуль MODBUS ищет элемент ответа с соответствующим именем "VALUE", и если он найден, то использует значение из события вместо значения по умолчанию.

const name = 'VALUE';
var v: variant;
begin
 if IsVariableDefined(name) then
  begin
   v := GetVariable(name);
   if v > 100 then
    SendEventEx('WRITE'
	['ADDRESS', 1,
   'VALUE', 2]
	);
  end;
end.

Сопутствующие статьи:

MODBUS RTU, MODBUS ASCII, MODBUS/TCP

BACNET/IP

IEC 62056-21

Data Logger Suite: протоколирование и наблюдение. Дополнительные материалы:

Последовательный интерфейс RS232 разводка и сигналы Кабели и сигналы Кабели мониторинга данных