Опрос устройств MODBUS RTU/TCP: Настройка сервера сбора данных
Задача:
Задача: стоит задача опроса двух устройств, работающих по протоколу MODBUS и запись полученных значений в базу данных.
Предварительные требования:
Подразумевается, что:
- Вы ранее работали с устройствами c MODBUS.
- Вам известны адреса регистров, в которых хранятся необходимые данные.
- Вам известны коммуникационные параметры для связи с устройствами (скорость, количество бит данных и т.п.).
Скачайте бесплатную пробную версию! Она позволяет попробовать все возможности!
Настройка порта
Необходимо настроить коммуникационные параметры (рис.1). Обычно MODBUS устройства подключаются к компьютеру по интерфейсу RS485 с использованием специального конвертера. В этом случае необходимо дополнительно включить опцию поддержки этого интерфейса "Режим интерфейса RS485".
Рис.1 - Параметры связи
Настройка опроса данных через MODBUS
При опросе и считывании данных через MODBUS компьютер является мастером, а устройство ведомым. Это означает, что программа на компьютере отправляет запросы MODBUS, на которые устройство отвечает. Настроить отправку запросов можно с помощью модуля "MODBUS RTU" (рис. 2). Необходимо выбрать данный модуль на закладке "Запрос Анализ Фильтрация" и нажать на кнопку "Настроить" справа от имени модуля в списке.
Рис. 2 - Выбор модуля запроса и обработки данных
В появившемся окне (рис.3) необходимо добавить один или несколько запросов используя кнопку "Действие → Добавить новый запрос".
Рис. 3 - Добавление запросов в очередь
Назначение опций запроса понятно из их названия. Дополнительную информацию по опциям можно найти в файле справки по этому модулю (Пуск → Программы → Advanced Serial Data Logger → Справка).
Обратите внимание, что необходимо определить элементы ответа устройства и их формат. Без описания элементов ответа программа не сможет разобрать MODBUS пакет на составляющие части. Например, в примере на рис.3 считываются два регистра, расположенных по адресу 8214. Значение каждого регистра состоит из двух байт (16 бит). Итого в примере выше будут считаны 4 байта, начиная с адреса 8214. В зависимости от прошивки MODBUS устройства и карты регистров устройства эти байты можно трактовать по-разному.
Вариант 1 (рис. 3). Оба считываемых регистра имеют одинаковый тип данных. Каждое значение состоит из двух байт (2*8 = 16 бит).
- В поле "Имя" задаем базовое имя для каждого значения: VALUE;
- В поле "Количество" задаем количество значений: 2;
- Выбираем опцию "Добавлять счетчик к имени": программа автоматически добавит порядковый номер 1 и 2 к базовому имени. В результате получившиеся значения будут иметь имя VALUE1 и VALUE2.
- В поле "Тип данных" выбираем тип данных, в зависимости от количества бит данных;
- Ставим галочку "Число без знака", если значение беззнаковое.
Вариант 2 (рис. 4). Оба считываемых регистра имеют размер 16 бит, но разный тип данных (одно значение со знаком, другое нет).
- Добавляем два элемента ответа. Для этого выбираем в дереве "Элементы ответа" и нажимаем "Действие → Добавить ответ".
- В поле "Имя" задаем базовое имя для каждого значения: VALUE1 или VALUE2;
- В поле "Количество" задаем количество значений: 1;
- Отключаем опцию "Добавлять счетчик к имени", поскольку полное имя задано в поле "Имя". В результате получившиеся значения будут иметь имя VALUE1 и VALUE2.
- В поле "Тип данных" выбираем свой тип данных для каждого элемента ответа;
- Ставим/снимаем галочку "Число без знака" для значения.
Рис.4 - Вариант ответа
Вариант 3 (рис. 5). Одно значение имеет размер 16 бит и соответственно занимает один регистр, а другое значение 32 бита и занимает 2 регистра.
- Добавляем два элемента ответа. Для этого выбираем в дереве "Элементы ответа" и нажимаем "Действие → Добавить ответ".
- В поле "Имя" задаем базовое имя для каждого значения: VALUE1 или VALUE2;
- В поле "Количество" задаем количество значений: 1;
- Отключаем опцию "Добавлять счетчик к имени", поскольку полное имя задано в поле "Имя". В результате получившиеся значения будут иметь имя VALUE1 и VALUE2.
- В поле "Тип данных" выбираем свой тип данных для каждого элемента ответа;
- Ставим/снимаем галочку "Число без знака" для значения.
Рис. 5 - Вариант ответа
Вариант 4 (рис. 6). Необходимо считать два регистра, но они расположены в памяти устройства не по порядку, а между ними есть другие регистры (значения).
Через MODBUS можно за один раз считать около 100 регистров. Если "разрыв" между двумя нужными регистрами в памяти устройства не очень большой, то можно считать весь диапазон значений в одном запросе и потом выбрать из считанного массива данных только нужные значения. Иначе придется разбить запрос на два разных запроса с разными адресами. Ниже приведен пример для одного запроса. В памяти устройства нужные значения имеют адреса 8214 и 8218.
- Добавляем запрос и указываем в свойствах запроса считывать пять регистров, начиная с 8214.
- Добавляем два элемента ответа. Для этого выбираем в дереве "Элементы ответа" и нажимаем "Действие → Добавить ответ".
- В поле "Имя" задаем базовое имя для каждого значения: VALUE1 или VALUE2;
- В поле "Количество" задаем количество значений: 1;
- Отключаем опцию "Добавлять счетчик к имени", поскольку полное имя задано в поле "Имя". В результате получившиеся значения будут иметь имя VALUE1 и VALUE2.
- В поле "Тип данных" выбираем свой тип данных для каждого элемента ответа;
- Ставим/снимаем галочку "Число без знака" для значения.
У второго элемента ответа указываем смещения в байтах относительно начала массива данных. В данном случае "8" означает, что нужно пропустить 4 регистра, каждый из которых занимает два байта. В предыдущих примерах мы указывали "-1" в качестве смещения. В этом случае программа рассчитывала смещение автоматически в зависимости от количества данных предыдущих элементов ответа.
Рис. 6 - Вариант запроса и ответа
Вариант 5 (рис. 7). Необходимо считать значения аналоговых входов и выходов, согласно карты регистров MODBUS ниже:
Адрес |
Имя |
Описание |
0003 |
ain1 |
Аналоговый вход №1 |
0004 |
ain2 |
Аналоговый вход №2 |
0005 |
ain3 |
Аналоговый вход №3 |
0006 |
ain4 |
Аналоговый вход №4 |
0007 |
dot |
Цифровые выходы (16 бит, 0 если не установлен) |
0008 |
aot1 |
Аналоговый выход №1 |
0009 |
aot2 |
Аналоговый выход №2 |
0010 |
aot3 |
Аналоговый выход №3 |
0011 |
aot4 |
Аналоговый выход №4 |
- Добавляем запрос и указываем в свойствах запроса считывать девять регистров, начиная с 0003.
- Добавляем два элемента ответа. Для этого выбираем в дереве "Элементы ответа" и нажимаем "Действие → Добавить ответ".
- В поле "Имя" задаем базовое имя для каждого значения: ain или aot;
- В поле "Количество" задаем количество значений: 4;
- Включаем опцию "Добавлять счетчик к имени". В результате получившиеся значения будут иметь имя AIN1- AIN4 и AOT1- AOT4.
- В поле "Тип данных" выбираем свой тип данных для каждого элемента ответа: Decimal 16 bit;
- У второго элемента ответа указываем смещения в байтах относительно начала массива данных. В данном случае "10" означает, что нужно пропустить 5 регистров, каждый из которых занимает два байта.
Рис. 7 - Вариант запроса и ответа
Как записать данные в базу данных описано в следующих главах (ссылки ниже).
Сопутствующие статьи:
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