ФОРУМ КУПИТЬ

Последние статьи

ВСЕ СТАТЬИ

MegaD-2561 в качестве шлюза RS-485/Modbus RTU - Ethernet

01/12/2019 14:57:27

Стандарт физического уровня RS-485 широко распространен среди промышленного оборудования. Он используется для обмена данными со счетчиками электроэнергии, для считывания показаний  всевозможных датчиков (охранных, климатических, погодных), для управления всякого рода исполнительными модулями.
В качестве сетевого протокола поверх RS-485 чаще всего в таких случаях используется компактный Modbus RTU.

Я бы хотел рассказать о возможности подключения к контроллеру MegaD-2561 устройств с интерфейсом RS-485/Modbus RTU на примере недорогого счетчика электроэнергии DDS238-1 ZN.

MegaD-2561-RS485-Modbus-Ethernet-gateway
Счетчик электроэнергии DDS238-1 ZN с интерфейсом RS-485 на фоне MegaD-2561

У пользователей в процессе реализации проектов домашней автоматизации часто возникает желание контролировать параметры потребления электроэнергии тех или иных устройств или целых групп. Они хотели бы знать главным образом текущее потребление в Ваттах и Амперах, но также общее потребление, сетевое напряжение, частоту и прочие параметры. Измерение точных значений потребления с помощью внешних трансформаторов, выпрямителей и АЦП-портов крайне затруднительно в силу универсальности и многофункциональности контроллера. Но есть способ лучше. В современных условиях производители предлагают большой выбор компактных (1 DIN) и недорогих счетчиков электроэнергии с цифровым интерфейсом RS-485/Modbus RTU.

Для подключения такого счетчика к контроллеру MegaD-2561 необходимо следующее:

  • Прошивка не ниже 4.40b8
  • Преобразователь интерфейсов RS485-TTL
  • Свободные порты клеммы XT2: P32 и P33, имеющие функцию UART

Ключевым элементом здесь является преобразователь интерфейсов RS485-TTL. Это маленькая платка стоимостью менее 100 руб, которая с помощью трансивера MAX485 обеспечивает работу физического уровня RS485. Такие преобразователи бывают двух типов: с автопереключением направления передачи и с контролируемым переключением направления передачи. С MegaD-2561 будет работать и тот и другой, но если управлением передачи будет заниматься контроллер, то помимо P32 и P33 необходимо задействовать дополнительно любой цифровой порт.

Преобразователь RS-485-TTL
Преобразователь RS485-TTL с контролем переключения направления (DE/RE)

Подключение преобразователя простое.

  • VCC - к клемме питания +3.3В
  • GND - земля (Ground)
  • RO (Output) - P32 (RX)
  • DI (Input) - P33 (TX)
  • DE/RE (управление передачей, если есть) - к любому цифровому порту, например P35
  • A (прямая линия) - A (счетчика или другого устройства с интерфейсом RS485)
  • B (инверсная линия) - B (счетчика или другого устройства с интерфейсом RS485)

Для активации соответствующего режима работы UART-портов в настройках контроллера следует выбрать RS485.

Baud - скорость работы UART. По умолчанию 9600.
В поле "Dir" (Direction Control) указывается номер порта, к которому подключаются пины DE/RE.
Этот порт будет отвечать за переключение направления передачи. Настройка данного порта - "NC".
Если адаптер RS485-TTL имеет функцию автоматического переключения направления, то поле "Dir" нужно оставить пустым.

Процесс взаимодействия с устройствами, подключенными к интерфейсу RS-485/Modbus RTU состоит из двух этапов:

  • Отправляем команду (HTTP/GET), которая включает адрес устройства SlaveID, функциональный код, адрес регистра и т.д.
    GET-параметр: uart_tx=xxxx..xx, где xx - символьное представление команды в 16-ричном виде
  • Получаем ответ устройства (HTTP/GET) из буфера контроллера
    GET-параметр: uart_rx=1

В текущий момент контроллер может работать с устройствами в 2-х режимах: RS485 и RAW
Скорость по умолчанию: 9600

 

Режим RS485

В этом режиме контроллер сам вычисляет контрольную сумму (CRC16 Modbus) запроса, а также проверяет контрольную сумму ответа.
Пример команды для запроса у счетчика DDS238-1 ZN значения текущего напряжения в сети.

http://192.168.0.14/sec/?uart_tx=0103000C0001&mode=rs485

Команду можно "расшифровать" следующим образом:
[01][03][000C][0001], где
[01] - адрес устройства SlaveID. По умолчанию 01.
[03] - функциональный код чтения AO (Analog Output)
[000C] - адрес регистра, который следует считать со счетчика. Указывается в документации к счетчику или другому устройству
[0001] - количество запрашиваемых регистров (каждый регистр может возвражать 2 байта)
Как уже было сказано, CRC считается автоматически.

Теперь необходимо получить результат.

http://192.168.0.14/sec/?uart_rx=1&mode=rs485

Контроллер возвращает результат также 16-ричном формате в символьном представлении. Но для удобства разбора данных на стороне сервера, каждый байт разделяется символом "|".

01|03|02|08|a1

Ответ стоит интерпретировать так:
[01] - адрес устройства SlaveID
[03] - функциональный код
[02] - количество возвращаемых байт
[08a1] - в данном случае значение напряжения 0x08a1 или в десятичном представлении 2209 (220,9В)

Если контроллер выявил сбой в передаче данных (контрольная сумма не совпала), то он возвращает сообщение: CRC Error.

Учитывая все вышесказанное, можно разработать простейшую программу, для считывания данных со счетчика с помощью контроллера MegaD-2561.
Пример кода на языке PHP.

while (true)
{
    $res = file_get_contents("http://192.168.0.14/sec/?uart_tx=0103000C0001&mode=rs485");
    usleep(100000);
    $res = file_get_contents("http://192.168.0.14/sec/?uart_rx=1&mode=rs485");
    if ( $res != 'CRC Error' )
    {
        $data = explode("|", $res);
        $voltage = number_format(hexdec($data[3].$data[4]) / 10, 1);
        echo "Текущее напряжение: ".$voltage."В";
    }
    else
    echo "Ошибка CRC";

    sleep(1);
}

Программа в бесконечном цикле раз в секунду считывает и выводит на экран значение напряжения сети.
Важно обратить внимание, что между отправкой команды и запросом ответа установлена пауза в 0,1с. Эта небольшая пауза необходима, чтобы сеанс связи между контроллером и счетчиком успел завершиться, так как скорость RS-485 существенно ниже, чем скорость Ethernet.

Таким образом можно считывать любые другие регистры из счетчика электроэнергии:

  • Общее потребление электроэнергии (Регистры 0x00-0x01)
  • Текущее напряжение, В (0x0C)
  • Текущее значение тока, А (0x0D)
  • Текущая активная мощность, Вт (0x0E)
  • Текущая реактивная мощность, ВА (0x0F)
  • CosF (0x10)
  • Частота, Гц (0x11)

Стоит отметить, что к шине RS-485 можно подключить несколько различных или однотипных устройств, имеющих разные адреса.
Для смены адреса в устройства необходимо отправить соответствующие команды.
Например, для смены адреса (SlaveID) счетчика DDS238-1 ZN необходимо отправить команду: 011000150001020301
Здесь предпоследний байт [03] - новый SlaveID. Был 01, станет 03.

Таким образом к одному контроллеру на шину RS-485 можно подключить 248 устройств (0-247), адреса (248-255) зарезервированы.

 

Режим RAW

В этом режиме контроллер не занимается подсчетом контрольной суммы отправляемых и принимаемых данных. Все необходимые проверки должны производиться на стороне сервера. Но данный режим позволяет не ограничиваться протоколом Modbus RTU, а значит отправлять и принимать через UART порты произвольные данные, даже если интерфейс физического уровня не RS-485.

Примеры отправки команды и запроса ответа в режиме RAW (GET-параметр "mode" отсутствует).

http://192.168.0.14/sec/?uart_tx=0103000C00014409
http://192.168.0.14/sec/?uart_rx=1

 

Перспективы интеграции устройств RS-485/Modbus RTU

В настоящее время индустрия выпускает огромное количество устройств с интерфейсом RS-485/Modbus RTU. И у каждого устройства есть свои нюансы работы, свой набор регистров, которые используются для считывания и записи данных. Поэтому важно было обеспечить принципиальную возможность простой интеграции устройств RS-485/Modbus RTU в систему домашней автоматизации посредством контроллера MegaD-2561.

Вместе с тем, в перспективе MegaD-2561 может поддерживать работу с конкретным оборудованием не только в режиме "шлюза", но и полностью автономно. В этом случае контроллер, имея информацию о структуре регистров и команд подчиненного устройства сможет формировать запросы и интерпретировать ответы самостоятельно.
Применительно к описанному в статье счетчику это означает, что сервер мог бы получать уже готовые данные в Амперах, Вольтах, Ваттах и т.д., которые бы не требовали дополнительной обработки. Вероятно, это облегчило бы процесс интеграции некоторых устройств с интерфейсом RS-485 в программное обеспечение сервера.

 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:

(необязательно, не отображается на сайте)


Сортировка комментариев: Последние сверху | Первые сверху

2022-12-16 15:03:55 | Пупкин Василий
Какое напряжение может быть на входах А В? А то на выходе кондиционера 18в, не могу найти даташиты.


2022-10-27 11:11:54 | Andrey_B
евгений, в текущий момент управлять контроллером через Modbus к сожалению нельзя. Контроллер выступает в роли Mosbus-Ethernet шлюза, но самостоятельно без внешней команды никакие данные не получает и не интерпретирует.


2022-10-26 22:19:19 | евгений
здравсвуйте. в продолжении темы ведомого. можно ли по Modbus управлять контроллером мега?
есть например устройство ectoControl оно умеет управлять по Modbus было бы не плохо использовать экто контрол как сервер для меги.


2022-09-29 14:07:42 | Andrey_B
Дмитрий, значение "1" параметра uart_rx ничего не значит. Это значение может быть любым. Этот параметр лишь дает команду контроллеру считать содержимое буфера UART.


2022-09-29 13:02:31 | Дмитрий
Добрый день Андрей,
Ворпос: что именно означает значение "1" в uart_rx=1 при чтении? У меня счётчик с адресом 167, два типа регистров (readonly:0x04 и RW:0x03). Пробовал /sec/?uart_tx=A703000C0001&mode=rs485 , при чтении из буфера uart_rx=1 всегда "CRC Errоr".
прошивка 4.54b9


2022-06-16 15:27:55 | Andrey_B
Алексей, что конкретно вы имеете ввиду? С каким конкретно оборудованием контроллер должен работать в таком режиме?


2022-06-16 10:39:37 | Алексей
И снова здравствуйте!
Планируется ли возможность работы меги в режиме ведомого?


2021-09-16 17:04:32 | Артем
Ссылка на все параметры:
https:/gist.github.com/alphp/95e1efe916c0dd6df7156f43dd521d53


2021-09-16 11:07:37 | Andrey_B
Артем, последний байт команды - количество запрашиваемых слов.
Регистр - это адрес первоначального смещения. Дальше счетчик будет отдавать по порядку столько данных из регистров, сколько запрошено.


2021-09-16 09:38:10 | Артем
Как одним запросом получить несколько параметров?


2021-09-15 18:03:16 | Andrey_B
Артем, да почти точно также, как и напряжение в примере.
Вместо регистра 0C нужно запросить регистр 00, и не 1 слово (word), а 2 слова (dword).
uart_tx=010300000002
В ответ счетчик пришлет что-нибудь типа
01|03|04|00|00|00|1c
Последние 4 байта и есть общая энергия (импорт+экспорт), которая просто конвертируется из hex в int, как в примере.
0000001c - это 0.28кВт


2021-09-15 13:41:28 | Артем
Подскажите как получить Общее потребление электроэнергии


2021-01-27 19:50:37 | Andrey_B
Евгений, шина RS-485 поддерживает адресацию и подключение нескольких устройств. Важно только, чтобы адреса устройств были разными. У каждого устройства должна быть процедура (команда) изменения адреса.


2021-01-27 16:10:16 | Евгений
А можно к одному RS485-TTL подключить несколько устройств?


2020-12-18 20:19:18 | Andrey_B
P_Dmitrij, пока нет, но в перспективе планируется.


2020-12-18 11:22:54 | Andrey_B
Дмитрий, это написано в инструкции, которая идет с каждым счетчиком.
1 импульс = 0,5Вт
2000 импульсов = 1кВт


2020-12-17 13:37:40 | P_Dmitrij
Здравствуйте, Андрей! Возникла необходимость подключить устройство (частотный преобразователь) по Modbus к УД. К сожалению, устройство имеет фикс. скорость передачи данных - 38400 Кбит/с. Вы не добавляли пока возможность менять настройки на стороне Меги?


2020-12-11 19:21:12 | Дмитрий
Андрей здравствуйте. Я у вас приобрел три таких счетчика и подключил их с помощью адаптера и так же с помощью контактов для считывания импульсов.
А сколько идёт импульсов на киловатт???


2020-09-29 22:54:50 | Геннадий
Сжёг два адаптера, пока не поставил в цепь прямой линии (А) сопротивление 200 Ом.


2020-08-17 07:58:47 | Andrey_B
Алексей, контроллер MegaD-2561 выступает в данный момент только в роли шлюза. Ему все равно, какое RS485-Modbus RTU устройство подключено. Все команды отправляет серверное ПО. Контроллер только транслирует их в шину.


2020-08-16 22:28:21 | Алексей
Андрей здравствуйте. Если подключить другое устройство по rs485 modbus rtu, зная регистры, megad2561 будет работать с подобными устройствами?


2020-08-14 12:06:10 | Andrey_B
В данном случае контроллер выступает только в качестве шлюза RS485/Modbus-RTU - Ethernet. И какое устройство будет подключено к RS-485 принципиального значения не имеет.


2020-08-14 10:24:23 | Андрей
Андрей, подскажите есть ли возможность для сбора данных с трехфазных счетчиков с отдельным трансформатором тока. Например таких как DMG 610 с RS485


2020-07-12 09:29:38 | Andrey_B
Дмитрий, если все подключено правильно и заводской адрес счетчика не менялся, все должно работать. Если не работает, значит есть проблемы в подключении или еще где-то.


2020-07-11 22:27:06 | Дмитрий
Андрей здравствуйте. Подскажите в чем может быть дело с ошибкой CRC error на счетчике 238-1 zn. Подключил все правильно, согласно Вашей инструкции. Прошивка 4.45 beta5


2020-06-12 15:41:22 | Andrey_B
Подобные многотарифные счетчики на глаза не попадались, но специально не искал. Если габариты не имеют значения, то можно взять CE102M или Меркурий 206 RN. Они многотарифные и имеют интерфейс RS485. Принцип получения данных по RS485 будет похожий.


2020-06-11 21:56:23 | Леонид
Подскажите, а двухтарифная модель имеется? А то данный счетчик однотарифный.


2020-05-06 19:05:23 | Andrey_B
Andrey, вы пытаетесь работать с этим устройством в режиме Raw?
Я лично не подключал PZEM 004T, поэтому не могу сказать что-то определенное.


2020-05-06 09:35:14 | Andrey
Добрый день, Андрей! на выходах P32 и P33 MegaD-2561 всегда 3.3 вольта вне зависимости от режима. это так и должно быть? подключаю PZEM 004T не видит.


2020-04-21 19:24:06 | Andrey_B
Nail, что означает "после очередных запросов"? Это работало и перестало?
И в комментариях очень неудобно обсуждать конкретику. Пишите лучше мне на почту или на форуме.


2020-04-21 18:18:24 | Nail
после очередных запросов в командной строке-
/192.168.0.14/sec/?uart_tx=0103000C0001&mode=rs48
/192.168.0.14/sec/?uart_rx=1&mode=rs485 -выдает CRC Error
не подскажете что то не так ?(подключен к моноблоку)


2020-03-13 16:26:47 | Andrey_B
Rashad_B, вы имеете ввиду, как должны быть настроены порты P32, P33?
Можно никак не настраивать - оставить в состоянии NC. Важно только не перепутать RX и TX. Тогда связи не будет. Ну и стоит уточнить, какие параметры скорости используются в инверторе. В контроллере пока по умолчанию 9600.


2020-03-13 13:02:49 | Rashad_B
Андрей, не могли бы вы подсказать какая конфигурация должна быть установлена на входах-выходах ab-log-а? У меня проблема с тем, что я всегда получаю CRC Error. Есть подозрение, что проблема в конфигурации. Пытаюсь подключиться к инвертору Altivar ATV-212. Использую MAX485


2020-02-25 09:44:43 | Andrey_B
Борис, пока да, параметры типовые - 9600 8N1, но в перспективе, конечно, необходимо дать возможность их менять.


2020-02-24 21:47:24 | Борис
Здравствуйте. Какие параметры передачи данных в режиме RAW ?
9600 8N1 или другой?
Стартовый, стоповый, бит четности(или его отсутствие) заложены по умолчанию?


2020-02-04 13:50:01 | Andrey_B
Дмитрий, не имел дело с данным адаптером, поэтому ничего конкретного сказать не могу. Но теоретически, возможно.


2020-02-03 15:32:25 | Дмитрий
Андрей, по данной схеме возможно управление котлом с помощью такого адаптера eBus: https:/ectostroy.ru/products/adapter-ebus


2020-01-09 10:26:31 | Andrey_B
Владимир, попробуйте с прошивкой 4.40b8


2020-01-07 21:22:23 | Andrey_B
Владимир, спасибо. Проверю и постараюсь исправить.


2020-01-07 14:22:33 | Владимир
Добрый день Андрей. Если в ответе есть байт равный нулю, то после него все обрезается. Например, если Modbus устройство ответило ff|00|ff, то по команде /192.168.0.14/sec/?uart_rx=1 вывод будет таким - ff все что после 00 обрезается.


2019-12-07 19:40:52 | DMITRIY SANNIKOV
Извиняюсь за дубли, никакой проверки к сожалению тут нет. Также хотел бы добавить, что просто к использование мегад-2651 как конвертер eth2rs485 нет никакого смысла, так как сервер может это делать и сам, а вот как устройство опроса устройств - было бы замечательно


2019-12-07 17:45:46 | DMITRIY SANNIKOV
Андрей, как раз было бы хорошо научить головной контроллер самостоятельно опрашивать и управлять исполнительными устройствами вместо сервера. Чтоб не придумывать на сервере шараду из сервиса опроса, сервиса мониторинга и тд, использовать уже имеющиеся протоколы.

Также я бы рассмотрел необходимость включения этого преобразователя в стандартную поставку головного контроллера при ближайшей модернизации.

Навскидку предположу, что такой готовый ПЛК из коробки будет намного эффективней решений WB )

Для тестов можно за 500 руб купить простейший релейный модуль https:/ru.aliexpress.com/item/33028481145.html?spm=a2g0s.9042311.0.0.1e7333edq17TLP


2019-12-07 11:27:52 | Andrey_B
DMITRIY, да в теории их и сейчас можно подключить. В плане управления они вряд ли отличаются от описанного в статье счетчика. Контроллер MegaD-2561 предоставляет как бы простейший HTTP/GET-интерфейс к Modbus RTU.
Вопрос только в том, достаточно ли этого для серверного ПО или необходимо что-то более высокоуровневое. Имеется ввиду возможность управлять слейвами с помощью более человекопонятных запросов. Сомнения лишь в том, что серверу то все равно. "Нативная" поддержка конкретных слейвов поможет разве что только администратору серверного ПО в плане настройки/интеграции. Вопрос по-прежнему открыт. Время покажет.


2019-12-07 10:17:02 | DMITRIY SANNIKOV
Андрей, означает ли это, что в скором времени можно будет к голосе подключить модбас исполнительные модули, например от разумдом, овен или вайрен?