Миссия невыполнима: подключаем электросчётчик SDM220 к трансформеру Lavritech V7.1 Lite по RS485/Modbus RTU

xca7ycccea6xaypdr7p6vaiunwo.jpeg

Некоторое время назад в моём блоге вышел цикл статей об устройстве и программировании Lavritech V7.1 Lite — ESP32 контроллера с необычной модульной архитектурой. Необычность архитектуры заключается в том, что функционал Lavritech V7.1 Lite можно набирать из отдельных модулей, как в конструкторе Lego. Я подробно рассмотрел как работу с внутренними модулями (вставляемые в специальные разъёмы, на манер плат IBM PC), так и с внешними блоками Wiren Board, на подключение которых рассчитан Lavritech V7.1 Lite.

Но в этих статьях остался нераскрытым один важный аспект — работа контроллера по интерфейсу RS485 при помощи подключаемых (внутренних) модулей. Я оставил эту тему для отдельной статьи ввиду её сложности и объёмности — и вот статья готова и нас ждёт увлекательное путешествие в мир DIY хардкора.

В качестве примера будем подключать электросчётчик SDM220 к модулю Lavritech RS485 V1 по RS485/Modbus RTU (плюс осциллограммы и рабочий код в подарок).

Задача


Задача подключения электросчётчика SDM220 к контроллеру Lavritech V7.1 Lite при помощи модуля Lavritech RS485 V1 по интерфейсу RS485 и протоколу Modbus RTU я отношу к классу задач большой сложности и «замороченности» — нужно совместить множество разных технологий и учесть множество разнородных факторов, каждый из которых добавляет своё измерение в общее пространство сложности достижения конечной цели.

Всё это заработает только в том случае, если вы правильно понимаете, что собой представляют и как работают отдельные элементы («сущности») этой системы и как они взаимодействуют (должны взаимодействовать) в ней.

vmmsegbwa0fodhnevvgtryo8pjk.jpeg

Для решения поставленной задачи нам нужно иметь чёткое и ясное представление о следующих вещах:

  1. Архитектура контроллера Lavritech V7.1 Lite, её своеобразная идеология и её крайне запутанная схемотехника со множеством слоёв хардверной абстракции.
  2. Схемотехника и функционал модуля Lavritech RS485 V1 и схемотехника и функционал китайского модуля XY-017, лежащего в его основе.
  3. Электросчётчик SDM220, его характеристики, особенности работы и интерфейсы.
  4. Общее (теоретическое и, желательно, практическое) представление о работе интерфейса RS485 и протокола Modbus RTU.
  5. Список регистров, адресов и значений параметров, хранящихся в памяти SDM220 и способы извлечения их оттуда.
  6. Программная реализация работы протокола Modbus RTU на ESP32 и соответствующая его имплементация (библиотеки или «чистый код» для вашего языка программирования и среды разработки).
  7. И, наконец, как всё это собрать вместе, причём так, чтобы ничего не сгорело при включении, да ещё и в результате заработало так, как и ожидалось (то есть корректно и стабильно).


Как вы видите, нам будет что обсудить в этой статье.

Стенд


Лучше один день потерять, но потом за 5 минут долететь © народная мудрость (мультфильм «Крылья, ноги и хвосты»).

Начнём мы с изготовления стенда для нашего тестового проекта, чтобы можно было удобно работать с используемым оборудованием и не запутаться во множестве проводов, тем более, что среди них имеются довольно опасные, под напряжением 220 В.

Да и вообще порядок на рабочем столе способствует порядку и системности в реализации (любого) проекта. Поэтому лучше потратить немного времени на изготовление стенда, чем потом пытаться разобраться в клубке перепутанных проводов.

Для изготовления стенда берём кусок ЛДСП панели нужного размера (или любого другого подходящего материала) и соответствующий отрезок DIN-рейки и скрепляем их вместе несколькими шурупами. Перфекционисты могут добавить ещё «ножки» с обратной стороны, чтобы стенд не царапал поверхность стола и всё было совсем «по уму».

hixpqpohciezha8ottcigsxlfve.jpeg

Просто, но это сэкономит нам много времени в дальнейшем и выведет саму культуру разработки на новый уровень (смайл). Далее устанавливаем тестовое оборудование в стенд:

  • Клеммные колодки для подключения сетевого кабеля
  • Автомат в качестве разрывателя (выключателя) фазной линии
  • Электросчётчик SDM220
  • Розетку на DIN-рейку для подключения нагрузки
  • И сам контроллер Lavritech V7.1 Lite в разобранном виде (для наглядности и удобства манипулирования внутренними подключениями)

30tcvewgdmwq2uxq7c4r8gvvoya.jpeg
Работаем красиво

Затем соединяем всё это вместе, согласно инструкциям производителей контроллера и электросчётчика (об этом подробнее дальше). Также не забываем о правилах электробезопасности при работе с напряжением 220 В.

Модуль Lavritech RS485 V1


Собственно обслуживанием интерфейса RS485 будет заниматься модуль Lavritech RS485 V1. На фото видно, что работа модуля обеспечивается двумя группами контактов: 2×5 пинов — это разъём EUHP, а 2×2 пина — это выходные линии внутреннего Wiren Board разъёма.

dhd5jszfz6zelwlgsww5f_wopxa.jpeg

На следующем фото видно, что модуль Lavritech RS485 V1 на самом деле представляет собой «обёртку» или «базу» для стандартного (популярного) китайского RS485 модуля XY-017. Это не случайность и не желание производителя выдать китайскую продукцию за свою — это осознанная политика компании Lavritech по снижению стоимости контроллеров и их комплектующих по принципу «зачем делать полностью свой модуль, если китайцы уже выпускают проверенные и недорогие решения?».

igourv6uf88k2rpndtdpwu9cwye.jpeg

Поскольку в лице Lavritech RS485 V1 мы в действительности имеем дело с XY-017, то давайте познакомимся с ним поближе. Ниже я привожу примерную схему этого модуля. Тут всё просто, «по классике», для нас здесь важным является то, выводы /RE (2) и DE (3) соединены вместе и завязаны на схему автоматического переключения режимов приёма/передачи данных по интерфейсу RS485.

-eewcp21adgtlbrgnqskpn_cna8.jpeg

В результате, при программировании работы модуля Lavritech RS485 V1, нам нужно будет учесть, что режимы переключаются автоматически и для управления работой модуля не нужно использовать отдельный GPIO вывод микроконтроллера ESP32.

Этот модуль также имеет светодиодную индикацию режимов приёма/передачи и резистор на 120 Ом для терминирования линии обмена данными (по умолчанию не подключён).
В целом с модулем всё понятно, осталось только подключить его к Lavritech V7.1 Lite, что осуществить не так-то просто, но мы попробуем это сделать далее.

Контроллер Lavritech V7.1 Lite


Поскольку в условиях задачи у нас стоит работа SDM220 с контроллером Lavritech V7.1 Lite, то нам необходимо будет разобраться с его (контроллера) архитектурой в части, относящейся к подключению модуля Lavritech RS485 V1.

hwwt8urwpj4kjiymhl-0o4ngatq.jpeg

Напомню, что в контроллере Lavritech V7.1 Lite присутствует регион (область) разъёмов для установки внутренних модулей. Он состоит из трёх частей: двух разъёмов (с колодками для внешних подключений) Wiren Board (выделены жёлтым цветом) и одного разъёма EUHP (выделен синим цветом).

owkqxxv9mib5mapnj9cpkh4vvzg.jpeg

Разъёмы Wiren Board идентичны, только развёрнуты на плате по отношению друг к другу на 180 градусов. При установке в разъём такого модуля, его выходы (если таковые есть) автоматически появляются на контактах в соответствующих (зелёных) колодках (контакты OUT1, OUT2, OUT3 и OUT4).

vbhvabgnco1luupbpwziswqmkiy.png
Распиновка внутреннего разъёма Wiren Board

Разъём EUHP — это самопровозглашённый компанией Lavritech стандарт для подключения внутриконтроллерных модулей. Все EUHP модули рассчитаны на подключение к этому разъёму и имеют соответствующую распиновку.

f04oasm1wqcyupcsfurhn5oq9yc.png
Распиновка EUHP разъёма

Здесь важная и неочевидная особенность заключается в том, что EUHP модули используют для своего подключения «чужие» боковые разъёмы Wirenboard (см. выше фото установки EUHP модуля Lavritech RS485 V1 в плату Lavritech V7.1 Lite).

Другими словами, соединение модуля Lavritech RS485 V1 с микроконтроллером ESP32 осуществляется через пины EUHP разъёма, а вывод сигналов интерфейса RS485 производится через Wiren Board разъём WB 1.2 и его выходные клеммы на колодке.

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

На сайте производителя есть подробная распиновка региона разъёмов контроллера Lavritech V7.1 Lite. Я решил немного упростить нам жизнь и далее привожу часть области разъёмов, которая относится непосредственно к подключению модуля Lavritech RS485 V1. Все неиспользуемые соединения я удалил со схемы, чтобы они не мешали пониманию сути рассматриваемого вопроса.

nu91metf-1-kz01j7d5txyw8c28.png


Тут мы видим, что в качестве RX используется GPIO16 микроконтроллера ESP32, а в качестве TX — GPIO17. А в качестве выходных — O1.2 (RS485 A), O2.2 (RS485 B) и O3.2/O4.2 (GND).

Здесь несколько затрудняет понимание «обратная нотация» нумерации разъёмов и пинов в них компанией Lavritech: гораздо привычнее было бы маркировать, например так: O2.1, O2.2, O2.3, O2.4 и т. д. Но это особенность, которую нужно один раз понять, далее это перестаёт вызывать затруднения.

Всё вышесказанное можно заменить кратким резюме по подключению модуля Lavritech RS485 V1: для работы по RS485 интерфейсу мы используем GPIO16 (RX) и GPIO17 (TX) микроконтроллера ESP32, а для подключений проводов — пины O1.2 (RS485 A), O2.2 (RS485 B) во внешнем (зелёном) разъёме.

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

Электросчётчик SDM220


Теперь давайте уделим внимание ещё одной части нашего тестового проекта — электросчётчику SDM220. На самом деле на рынке присутствует множество модификаций этого счётчика с поддержкой различных интерфейсов, полное название модели, имеющейся в моём распоряжении, EASTRON SDM220-Modbus.

То есть мой тестовый экземпляр поддерживает работу по Modbus RTU Slave интерфейсу (что нам и нужно для нашего мини-проекта). Кроме работы по Modbus, SDM220 имеет два импульсных выхода, дисплей, две управляющие кнопки и прочие функции и возможности.

ktqd_gk1ynlcbfwuett0-qdkrsm.jpeg

Сам SDM220, как электросчётчик, интересен тем, что способен измерять множество параметров сетевого питания: напряжение, силу тока, частоту сети, активную мощность, реактивную мощность, потреблённую энергию и т. д., всего около дюжины параметров.

И все эти параметры он способен (кроме индикации на экране) отдавать по RS485/Modbus RTU в общую систему автоматизации или «умного дома». Относительно небольшая стоимость и широкие возможности сделали SDM220 довольно популярным устройством среди DIY-щиков.

Единственным недостатком SDM220 является то, что он не сертифицирован для коммерческого учёта потребления электроэнергии и вы не сможете использовать его в таком качестве. Но в нашем случае это не имеет принципиального значения.

Подключение SDM220 тривиально, ниже я привожу схему расположения и назначения его контактов.

w-jfgkglaxqtdnbzi5qwlu1oflg.png


Вообще, тема электросчётчика SDM220 требует отдельного повествования, здесь я ограничусь только общим, необходимым для понимания статьи, минимумом.

Проблематика Modbus


Проблематика работы RS485/Modbus на физическом и программном уровне — это тема для отдельного цикла лекций и явно выходит за рамки этой статьи, поэтому я здесь предполагаю, что вы обладаете начальными знаниями по этой теме. Если вы чувствуете себя недостаточно подготовленным для работы с Modbus, то рекомендую сначала обратиться к многочисленным источникам о нём в интернете.

Итак, мы имеем контроллер с интерфейсом RS485 и подопытный электросчётчик с поддержкой RS485/Modbus RTU. Наша задача состоит в том, чтобы получать от счётчика информацию о состоянии питающей электросети по протоколу Modbus RTU. Счётчик имеет в своей памяти множество регистров, которые содержат нужные нам данные — нам остаётся только, согласно определённым правилам, получать их по протоколу Modbus RTU. (На самом деле SDM220 позволяет не только читать данные, но и записывать (изменять), но это не относится к проблематике этой статьи.)

В документации на SDM220 содержится информация по всем регистрам счётчика, нас из всего этого разнообразия будут интересовать только 14 регистров с основными данными (для текущего примера).

p2jjin_si66kxstnhqqozzwwpdu.png


Достаточно правильно, согласно стандарту, сформировать запросы по Modbus RTU протоколу и мы получим требуемые значения в своём скетче на контроллере Lavritech V7.1 Lite (или любом другом с поддержкой RS485/Modbus RTU).

Правда, это легче сказать, чем сделать, далее мы попробуем осуществить это на практике.

Физическое подключение


Про физическое подключение я много говорить не буду — достаточно просто соединить контакты A-A и B-B контроллера и счётчика проводами витой пары. Поскольку тестовые устройства расположены рядом, то вопросы соединения контактов GND-GND и терминирования концов линии не очень актуальны — я в своих тестах этого не делал.

Ради эксперимента я пробовал терминировать концы линии — на таком расстоянии разница небольшая — передача данных стабильно работает и так и так. Разница в форме сигналов видна только на осциллограммах.

7quvhdsa1bg1w_hgyeoxrhh9ipy.png

На всякий случай напомню, что в случае RS485 информация передаётся по дифференциальной паре и состояние потенциала 0/1 определяется не по отношению к земле, а по отношению одного провода к другому.

Программная поддержка


evr7z-kgau2t4iij5gx0mhrgi1y.png


Имея счётчик и контроллер с поддержкой RS485/Modbus RTU, мы можем организовать обмен между ними данными с помощью множества языков программирования и сред разработки. Я здесь буду использовать Arduino версии1.8.5.

В качестве «слейва» будет выступать счётчик SDM220, а в качестве «мастера» — контроллер Lavritech V7.1 Lite с подключённым модулем Lavritech RS485 V1.

RS485/Modbus RTU — это очень популярная технология и в Arduino (как и в других экосистемах программирования) существует множество библиотек, реализующих работу по этому протоколу. Немного углубляясь в этот вопрос, можно сказать, что нам нужно будет выбрать между «чистой» (универсальной) реализацией Modbus RTU на ESP32 или специализированной библиотекой для работы с конкретным счётчиком SDM220 (семейством счётчиков EASTRON).

В процессе работы над проектом я успешно поэкспериментировал с обоими типами библиотек. Но в этой статье я буду разбирать пример работы со специализированной библиотекой для счётчика SDM220. Разбор работы универсальной Modbus RTU Master библиотеки я оставлю для отдельной статьи, возможно с каким-нибудь другим контроллером, например из семейства Norvi, Kincony, AlertBox, JetHome и т. п.

В качестве специализированной библиотеки для счётчика SDM220 мы будем использовать SDM_Energy_Meter. Она «заточена» для работы с устройствами EASTRON и имеет встроенные определения регистров и специализированные функции работы, в частности, со счётчиком SDM220, что значительно упрощает нашу задачу — нужно только грамотно воспользоваться предоставляемыми библиотекой возможностями.

Работа с библиотекой SDM_Energy_Meter имеет некоторую особенность: тут мало написать скетч для получения данных от счётчика, здесь нужно сначала внести изменения в конфигурационный файл SDM_Config_User.h, который находится в каталоге самой библиотеки:

/*
  Library for reading SDM 72/120/220/230/630 Modbus Energy meters
  Reading via Hardware or Software Serial library & rs232<->rs485 converter
  2016-2022 Reaper7
  crc calculation by Jaime García (https://github.com/peninquen/Modbus-Energy-Monitor-Arduino/)
*/

/*
  USER CONFIG
  Lavritech RS485 V1:           BR=9600, RX=16, TX=17, DR=NOT_A_PIN
*/

// Define or undefine USE_HARDWARESERIAL (uncomment only one or none)
//#undef USE_HARDWARESERIAL
#define USE_HARDWARESERIAL

// Baudrate
#define SDM_UART_BAUD                         9600

// SDM_RX_PIN and SDM_TX_PIN for esp/avr Software Serial or ESP32 with Hardware Serial, if default pins not suitable
#if defined ( USE_HARDWARESERIAL )
  #if defined ( ESP32 )
    #define SDM_RX_PIN                        16
    #define SDM_TX_PIN                        17
  #endif
#else
  #if defined ( ESP8266 ) || defined ( ESP32 )
    #define SDM_RX_PIN                        13
    #define SDM_TX_PIN                        15
  #else
    #define SDM_RX_PIN                        10
    #define SDM_TX_PIN                        11
  #endif
#endif


// DERE_PIN for control MAX485 DE+/RE lines
#define DERE_PIN                              NOT_A_PIN


#if defined ( USE_HARDWARESERIAL )

// SDM_UART_CONFIG for hardware serial
#define SDM_UART_CONFIG                       SERIAL_8N1

// Define user SWAPHWSERIAL, if true(1) then swap uart pins from 3/1 to 13/15 (only ESP8266)
//#define SWAPHWSERIAL                      0

#else

// SDM_UART_CONFIG for software serial
#define SDM_UART_CONFIG                       SWSERIAL_8N1

#endif


// Time (ms) to wait for process current request
#define WAITING_TURNAROUND_DELAY              50

// Time (ms) to wait for return response from all devices before next request
#define RESPONSE_TIMEOUT                      100


Поскольку контроллер Lavritech V7.1 Lite сделан на основе ESP32, то для работы с RS485 интерфейсом мы имеем возможность задействовать аппаратный Serial (один из трёх). Для этого нужно в конфигурационном файле раскомментировать строку:

#define USE_HARDWARESERIAL


Затем нужно выставить правильную скорость обмена. По умолчанию SDM220 поставляется с предустановленной скоростью 2400, но я её поднял (манипулируя кнопками и меню на передней панели счётчика) до 9600.

#define SDM_UART_BAUD                         9600


Далее нам нужно выставить правильные RX/TX пины (см. выше разбор подключения модуля Lavritech RS485 V1) в соответствующей секции конфигурационного файла.

    #define SDM_RX_PIN                        16
    #define SDM_TX_PIN                        17


Поскольку выводы /RE и DE в модуле XY-017 соединены вместе и завязаны на схему автоматического управления режимами приёма/передачи, то в конфигурационном файле указываем, что не нужно использовать отдельный GPIO вывод контроллера ESP32.

#define DERE_PIN                              NOT_A_PIN


Стандартную настройку режима работы порта оставляем без изменений.

#define SDM_UART_CONFIG                       SERIAL_8N1


Также можно изменить стандартные таймауты посылки Modbus пакетов. Значения по умолчанию 200/500 я изменил на 50/100 — так всё работает стабильно и гораздо быстрее. Но вы можете поэкспериментировать — конкретные значения зависят от настроек счётчика и количества слейвов на линии.

#define WAITING_TURNAROUND_DELAY              50

#define RESPONSE_TIMEOUT                      100


После настройки конфигурационного файла, можно приступать к созданию самого скетча. Причём, обратите внимание, настройки должны быть правильными — если вы зададите какой-то неверный параметр, то ничего работать не будет.

В тестовом скетче мы будем по Modbus RTU получать от счётчика 4 параметра и один код ошибки проведения операции. Всего, как вы помните, у SDM220 14 основных параметров — остальные вы сможете получить, немного модифицируя нижеприведённый скетч.

/*
  Lavritech V7.1 Lite
  Lavritech RS485 V1 module
  Eastron SDM220-Modbus
  RS485 example
*/

// Uncomment #define USE_HARDWARESERIAL in SDM_Config_User.h for use hardware uart

#include 

#if defined ( USE_HARDWARESERIAL )

#if defined ( ESP8266 )
SDM sdm(Serial1, SDM_UART_BAUD, NOT_A_PIN, SERIAL_8N1);
#elif defined ( ESP32 )
//SDM sdm(Serial1, SDM_UART_BAUD, NOT_A_PIN, SERIAL_8N1, SDM_RX_PIN, SDM_TX_PIN);
SDM sdm(Serial1, SDM_UART_BAUD, DERE_PIN, SDM_UART_CONFIG, SDM_RX_PIN, SDM_TX_PIN);
#else // for AVR
SDM sdm(Serial1, SDM_UART_BAUD, NOT_A_PIN); // config SDM on Serial1 (if available!)
#endif

#else

#include 
#if defined ( ESP8266 ) || defined ( ESP32 )
SoftwareSerial swSerSDM;
SDM sdm(swSerSDM, SDM_UART_BAUD, NOT_A_PIN, SWSERIAL_8N1, SDM_RX_PIN, SDM_TX_PIN);
#else // for AVR
SoftwareSerial swSerSDM(SDM_RX_PIN, SDM_TX_PIN);
SDM sdm(swSerSDM, SDM_UART_BAUD, NOT_A_PIN);
#endif

#endif

float vol, cur, pwr, frq;
uint16_t err;

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println(F("Start Lavritech RS485 V1 module example..."));

  Serial.print(F("RX: ")); Serial.println(SDM_RX_PIN);
  Serial.print(F("TX: ")); Serial.println(SDM_TX_PIN);
  Serial.print(F("BR: ")); Serial.println(SDM_UART_BAUD);
  Serial.print(F("DR: ")); Serial.println(DERE_PIN);
  Serial.print(F("DY: ")); Serial.println(WAITING_TURNAROUND_DELAY);
  Serial.print(F("RT: ")); Serial.println(RESPONSE_TIMEOUT);
  
  sdm.begin();
}

void loop() {
  vol = sdm.readVal(SDM_PHASE_1_VOLTAGE, 0x01);
  cur = sdm.readVal(SDM_PHASE_1_CURRENT, 0x01);
  pwr = sdm.readVal(SDM_PHASE_1_POWER,   0x01);
  frq = sdm.readVal(SDM_FREQUENCY,       0x01);
  err = sdm.getErrCode(true);
  
  Serial.print(" vol:"); Serial.print(vol, 2);
  Serial.print(" cur:"); Serial.print(cur, 2);
  Serial.print(" pwr:"); Serial.print(pwr, 2);
  Serial.print(" frq:"); Serial.print(frq, 2);
  Serial.print(" err:"); Serial.print(err);
  Serial.println();
  //delay(1000);
} // loop


Здесь секция

#if defined ( USE_HARDWARESERIAL )

#if defined ( ESP8266 )
SDM sdm(Serial1, SDM_UART_BAUD, NOT_A_PIN, SERIAL_8N1);
#elif defined ( ESP32 )
//SDM sdm(Serial1, SDM_UART_BAUD, NOT_A_PIN, SERIAL_8N1, SDM_RX_PIN, SDM_TX_PIN);
SDM sdm(Serial1, SDM_UART_BAUD, DERE_PIN, SDM_UART_CONFIG, SDM_RX_PIN, SDM_TX_PIN);
#else // for AVR
SDM sdm(Serial1, SDM_UART_BAUD, NOT_A_PIN); // config SDM on Serial1 (if available!)
#endif

#else

#include 
#if defined ( ESP8266 ) || defined ( ESP32 )
SoftwareSerial swSerSDM;
SDM sdm(swSerSDM, SDM_UART_BAUD, NOT_A_PIN, SWSERIAL_8N1, SDM_RX_PIN, SDM_TX_PIN);
#else // for AVR
SoftwareSerial swSerSDM(SDM_RX_PIN, SDM_TX_PIN);
SDM sdm(swSerSDM, SDM_UART_BAUD, NOT_A_PIN);
#endif

#endif


отвечает за выбор Hardware/Software Serial и использование ESP8266/ESP32 и подключение соответствующих настроек. У нас, как вы помните, ESP32 и HARDWARESERIAL.

Оригинальная строка в библиотечном примере:

//SDM sdm(Serial1, SDM_UART_BAUD, NOT_A_PIN, SERIAL_8N1, SDM_RX_PIN, SDM_TX_PIN);


вызвала у меня сомнения (поэтому я её закомментировал). Похоже это ошибка и корректнее написать так:

SDM sdm(Serial1, SDM_UART_BAUD, DERE_PIN, SDM_UART_CONFIG, SDM_RX_PIN, SDM_TX_PIN);


Далее мы для контроля печатаем основные настройки системы.

  Serial.print(F("RX: ")); Serial.println(SDM_RX_PIN);
  Serial.print(F("TX: ")); Serial.println(SDM_TX_PIN);
  Serial.print(F("BR: ")); Serial.println(SDM_UART_BAUD);
  Serial.print(F("DR: ")); Serial.println(DERE_PIN);
  Serial.print(F("DY: ")); Serial.println(WAITING_TURNAROUND_DELAY);
  Serial.print(F("RT: ")); Serial.println(RESPONSE_TIMEOUT);


И в цикле получаем данные от счётчика (0×01 — это адрес слейва на линии),

  vol = sdm.readVal(SDM_PHASE_1_VOLTAGE, 0x01);
  cur = sdm.readVal(SDM_PHASE_1_CURRENT, 0x01);
  pwr = sdm.readVal(SDM_PHASE_1_POWER,   0x01);
  frq = sdm.readVal(SDM_FREQUENCY,       0x01);


используя определённые в файле библиотеки SDM.h значения адресов регистров (SDM_PHASE_1_VOLTAGE, SDM_PHASE_1_CURRENT, SDM_PHASE_1_POWER, SDM_FREQUENCY). В этом же файле вы можете посмотреть и прочие определения, коих там огромное количество (и использовать их в своих скетчах).

Тут же получаем код ошибки последней операции и (true) сразу же стираем его (после получения).

  err = sdm.getErrCode(true);


Далее выводим полученные значения параметров на печать.

  Serial.print(" vol:"); Serial.print(vol, 2);
  Serial.print(" cur:"); Serial.print(cur, 2);
  Serial.print(" pwr:"); Serial.print(pwr, 2);
  Serial.print(" frq:"); Serial.print(frq, 2);
  Serial.print(" err:"); Serial.print(err);
  Serial.println();


Результат работы нашего скетча (и всей проделанной работы в комплексе) — мы добились получения данных от счётчика SDM220 по RS485/Modbus RTU контроллером Lavritech V7.1 Lite при помощи EUHP модуля Lavritech RS485 V1.

ak3jdetcwliqmpfjt4f_xb2mhxm.png

Здесь:

vol (В) — это напряжение питающей сети.
cur (А) — ток нагрузки. В качестве примера подключена лампа 40 Вт.
pwr (Вт) — текущая потребляемая мощность
frq (Гц) — частота питающей сети
err () — код ошибки последней операции (ошибок нет)

Всё работает очень шустро, практически в реальном времени и очень стабильно — никакие ошибки не фиксируются даже при длительном тестировании.

Теперь, модифицируя представленный скетч, мы можем получать любые данные от счётчика SDM220 и использовать их в своих проектах. Что очень актуально потому, что SDM220 позволяет получить исчерпывающие данные по множеству параметров контролируемой силовой линии.

Заключение


В моей коллекции есть множество контроллеров и периферийных устройств с поддержкой интерфейса RS485 и я думаю, что мы ещё не раз вернёмся к этой интересной и практически полезной теме. В первую очередь можно будет осветить работу контроллеров Kincony с интерфейсом RS485, поскольку в интернете эта информация практически отсутствует.

p-u9l27ynelxi92bcmdxhu76ma8.png

© Habrahabr.ru