bg

Опрос устройств MODBUS RTU/TCP: Настройка сервера сбора данных

Задача:

Задача: стоит задача опроса двух устройств, работающих по протоколу MODBUS и запись полученных значений в базу данных.

Предварительные требования:

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

  1. Вы ранее работали с устройствами c MODBUS.
  2. Вам известны адреса регистров, в которых хранятся необходимые данные.
  3. Вам известны коммуникационные параметры для связи с устройствами (скорость, количество бит данных и т.п.).
Скачайте бесплатную пробную версию! Она позволяет попробовать все возможности!

Настройка порта

Необходимо настроить коммуникационные параметры (рис.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 бит).

  1. В поле "Имя" задаем базовое имя для каждого значения: VALUE;
  2. В поле "Количество" задаем количество значений: 2;
  3. Выбираем опцию "Добавлять счетчик к имени": программа автоматически добавит порядковый номер 1 и 2 к базовому имени. В результате получившиеся значения будут иметь имя VALUE1 и VALUE2.
  4. В поле "Тип данных" выбираем тип данных, в зависимости от количества бит данных;
  5. Ставим галочку "Число без знака", если значение беззнаковое.

Вариант 2 (рис. 4). Оба считываемых регистра имеют размер 16 бит, но разный тип данных (одно значение со знаком, другое нет).

  1. Добавляем два элемента ответа. Для этого выбираем в дереве "Элементы ответа" и нажимаем "Действие → Добавить ответ".
  2. В поле "Имя" задаем базовое имя для каждого значения: VALUE1 или VALUE2;
  3. В поле "Количество" задаем количество значений: 1;
  4. Отключаем опцию "Добавлять счетчик к имени", поскольку полное имя задано в поле "Имя". В результате получившиеся значения будут иметь имя VALUE1 и VALUE2.
  5. В поле "Тип данных" выбираем свой тип данных для каждого элемента ответа;
  6. Ставим/снимаем галочку "Число без знака" для значения.

Вариант ответа
Рис.4 - Вариант ответа

Вариант 3 (рис. 5). Одно значение имеет размер 16 бит и соответственно занимает один регистр, а другое значение 32 бита и занимает 2 регистра.

  1. Добавляем два элемента ответа. Для этого выбираем в дереве "Элементы ответа" и нажимаем "Действие → Добавить ответ".
  2. В поле "Имя" задаем базовое имя для каждого значения: VALUE1 или VALUE2;
  3. В поле "Количество" задаем количество значений: 1;
  4. Отключаем опцию "Добавлять счетчик к имени", поскольку полное имя задано в поле "Имя". В результате получившиеся значения будут иметь имя VALUE1 и VALUE2.
  5. В поле "Тип данных" выбираем свой тип данных для каждого элемента ответа;
  6. Ставим/снимаем галочку "Число без знака" для значения.

Вариант ответа
Рис. 5 - Вариант ответа

Вариант 4 (рис. 6). Необходимо считать два регистра, но они расположены в памяти устройства не по порядку, а между ними есть другие регистры (значения).
Через MODBUS можно за один раз считать около 100 регистров. Если "разрыв" между двумя нужными регистрами в памяти устройства не очень большой, то можно считать весь диапазон значений в одном запросе и потом выбрать из считанного массива данных только нужные значения. Иначе придется разбить запрос на два разных запроса с разными адресами. Ниже приведен пример для одного запроса. В памяти устройства нужные значения имеют адреса 8214 и 8218.

  1. Добавляем запрос и указываем в свойствах запроса считывать пять регистров, начиная с 8214.
  2. Добавляем два элемента ответа. Для этого выбираем в дереве "Элементы ответа" и нажимаем "Действие → Добавить ответ".
  3. В поле "Имя" задаем базовое имя для каждого значения: VALUE1 или VALUE2;
  4. В поле "Количество" задаем количество значений: 1;
  5. Отключаем опцию "Добавлять счетчик к имени", поскольку полное имя задано в поле "Имя". В результате получившиеся значения будут иметь имя VALUE1 и VALUE2.
  6. В поле "Тип данных" выбираем свой тип данных для каждого элемента ответа;
  7. Ставим/снимаем галочку "Число без знака" для значения.

У второго элемента ответа указываем смещения в байтах относительно начала массива данных. В данном случае "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
  1. Добавляем запрос и указываем в свойствах запроса считывать девять регистров, начиная с 0003.
  2. Добавляем два элемента ответа. Для этого выбираем в дереве "Элементы ответа" и нажимаем "Действие → Добавить ответ".
  3. В поле "Имя" задаем базовое имя для каждого значения: ain или aot;
  4. В поле "Количество" задаем количество значений: 4;
  5. Включаем опцию "Добавлять счетчик к имени". В результате получившиеся значения будут иметь имя AIN1- AIN4 и AOT1- AOT4.
  6. В поле "Тип данных" выбираем свой тип данных для каждого элемента ответа: Decimal 16 bit;
  7. У второго элемента ответа указываем смещения в байтах относительно начала массива данных. В данном случае "10" означает, что нужно пропустить 5 регистров, каждый из которых занимает два байта.

Вариант запроса и ответа
Рис. 7 - Вариант запроса и ответа

Как записать данные в базу данных описано в следующих главах (ссылки ниже).

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

MODBUS RTU, MODBUS ASCII, MODBUS/TCP

BACNET/IP

IEC 62056-21

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

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