Запись данных в устройство MODBUS
Описание задачи:
Есть задача записи сигнала тревоги в контроллер, когда ранее считанное значение превышает заданный лимит.
Требования:
Подразумевается, что:
Вы настроили параметры связи в вашем устройстве:
- MODBUS TCP - IP адрес, маску подсети, адрес шлюза. Вы должны задать статический IP адрес в устройстве.
- MODBUS RTU - скорость передачи данных и количество бит данных.
Решение:
1. Создайте новую конфигурацию в главном окне программы, кликнув на кнопке с "зеленым плюсом" (рис. 1). В данном примере приведены настройки подключения для MODBUS TCP. Если ваше устройство использует протокол MODBUS RTU, то посмотрите тут. Если вы уже настроили подключение ранее, то переходите к шагу №4.
Рис. 1. Настройки соединения IP
2. Перейдите к странице: Модули - Запрос Анализ Фильтрация. Выберите "MODBUS TCP" или "MODBUS RTU" из списков. Затем кликните на кнопке "Настроить".
Рис. 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.
Рис. 5. Модуль Expressions
SEND_EVENT_IF(VALUE > 100, 'WRITE')
Рис. 6. Выражение
5.2. Script execute - это самый гибкий модуль. Он позволяет реализовать любую логику, но он требует знание языка программирования (рис. 7, 8). Этот скрипт также отправляет событие, если значение "VALUE" больше 100.
Рис. 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).
Рис. 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
- Чтение данных со счетчиков и анализаторов энергии через MODBUS (простой метод)
- Совместимые с Sunspec анализаторы, инверторы, счетчики MODBUS (простой метод)
- Опрос устройств MODBUS RTU/TCP: Настройка сервера сбора данных (MODBUS RTU, MODBUS TCP, запросы, элементы ответа).
- Как проверить, что программа отправляет запросы и получает ответы?
- Как просматривать значения регистров, а не пакеты MODBUS?
- Как проверить, что программа правильно интерпретирует получаемые ответы?
- Как просматривать значения регистров MODBUS в более наглядной форме (графики, индикаторы и т.п.)?
- Как объединить данные из двух запросов?
- Как правильно организовать опрос большого количества устройств?
- Копирование настроек Simply MODBUS RTU Master наш логгер.
- Копирование настроек из утилиты MODBUS Poll.
- Контроль состояния ячейки памяти (coil input) PLC контроллера через MODBUS TCP (парсер MODBUS, скрипты, генерация и обработка событий).
- MODBUS в MSSQL: Запись значений регистров MODBUS раздельные колонки в таблице
- MODBUS в MySQL: Запись данных MODBUS в БД MySQL
- Запись данных MODBUS в другую базу данных SQL
- MODBUS в базу: Запись данных в две разные таблицы.
- MODBUS в базу: Запись данных в две разные БД, делая полную копию данных.
- Sentron PAC 3200: Чтение и запись со счетчика электроэнергии через MODBUS TCP
- Запись данных в устройство MODBUS
- SQL в MODBUS: Отправка значений из базы данных в MODBUS.
BACNET/IP
IEC 62056-21