Некоторое время назад в моём блоге вышел цикл статей об устройстве и программировании 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 я отношу к классу задач большой сложности и «замороченности» — нужно совместить множество разных технологий и учесть множество разнородных факторов, каждый из которых добавляет своё измерение в общее пространство сложности достижения конечной цели.

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



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

  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-рейки и скрепляем их вместе несколькими шурупами. Перфекционисты могут добавить ещё «ножки» с обратной стороны, чтобы стенд не царапал поверхность стола и всё было совсем «по уму».



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

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



Работаем красиво

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

Модуль Lavritech RS485 V1


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



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



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



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

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

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


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



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



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


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

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


Распиновка 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. Все неиспользуемые соединения я удалил со схемы, чтобы они не мешали пониманию сути рассматриваемого вопроса.


Тут мы видим, что в качестве 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 имеет два импульсных выхода, дисплей, две управляющие кнопки и прочие функции и возможности.



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

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

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

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


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

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


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

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

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


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

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

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


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

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



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

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



Имея счётчик и контроллер с поддержкой 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 <SDM.h>

#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 <SoftwareSerial.h>
#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 <SoftwareSerial.h>
#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);

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

  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.



Здесь:

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

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

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

Заключение


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

Комментарии (6)


  1. gagarinas
    16.01.2023 12:14
    +1

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

    Незнаю, может только нам неповезло, брак или другое, но эти китайские модули охотно дохнут у нас. Считываем порядка 400 ел. счечиков, на контроллер как придется, от 1 до 15 счечиков. Проблемы только с модулями. Покупали через брендовые дилеры, типо Digi-Key и похожых.


    1. aumi13
      16.01.2023 12:28

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


      1. gagarinas
        16.01.2023 14:56

        Они у нас дохнут иногда и на столе, стенде, где нет никаких сильных токов... По описанию они hot-plug, небоятся статики до 25 кв., сам чип токи на уровне микроамперов потребяет. А блоки питания применяем очень качественные, по цене 10 раз дороже модуля.


    1. smart_alex Автор
      16.01.2023 12:34
      -1

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

      Или делает свой собственный модуль, где всё "по уму".

      А мы его покупаем и ставим в контроллер, благо это "трансформер".


  1. tigreavecdesailes
    16.01.2023 15:09
    +3

    Не могу удержаться

    Ожидание:
    ...и вот статья готова и нас ждёт увлекательное путешествие в мир DIY хардкора.

    Реальность:
    Но в этой статье я буду разбирать пример работы со специализированной библиотекой для счётчика SDM220. Разбор работы универсальной Modbus RTU Master библиотеки я оставлю для отдельной статьи. Я здесь буду использовать Arduino версии1.8.5.

    Краткий пересказ: синие проводки к синим, белые к белым, качаем древнюю версию Arduino, качаем готовую либу для девайса, в типичном скетче из 20 строк дёргаем методы либы и суём результат в Serial.print().


    1. smart_alex Автор
      16.01.2023 15:21
      -2

      Именно так, но только после всей проделанной работы и прочтения статьи.

      Но!

      Перео мной лежит "фирменный" модуль Wiren Board RS485 (аналогичный описанному в статье) и ничто, в том числе "синие и белые проводки" и никакие мои усилия в течение нескольких дней не приводят к его работе в составе Lavritech L1.

      Так что не всё так просто. А вот когда я решу эту проблему и опишу своё решение, то всё покажется просто.