0р.
Оформить заказДистанционный мониторинг и визуализация данных солнечных контроллеров EPSolar A, LS-B Series
Что получим в итоге
Данная статья в первую очередь будет полезна обладателям популярных солнечных контроллеров EPSolar (Epever) с наличием порта RS485, какие это модели - смотрите фото выше.Выполнив все действия, описанные в этой статье и потратив примерно 150-350 руб. (дешевле всего покупать на Aliexpress по приведенным в статье ссылкам) вы получите достаточно функциональную систему мониторинга своей солнечной электростанции
Из любого браузера вам будут доступны текущие параметры работы, исторические графики, выгрузка в Exel и оповещения на почту при срабатывании настраиваемых триггеров.
Ниже немного фото дефолтной сцены (далее можно настроить под себя)




1. С какими моделями контроллеров EPSolar тестировался мониторинг
Схема успешно используется на нескольких объектах с контроллерами Tracer MPPT 3210A-3240A, в том числе на учебной солнечной станции Новосибирской ГЭС, посмотреть данные в реальном времени: http://open-monitoring.online/public/scene/279Так же есть действующие системы на базе контроллеров Epsolar LS 2024B-3024B, например мониторинг моего солнечного коллектора, ссылка на сцену: http://open-monitoring.online/public/scene/240
С другими моделями система не тестировалась, но в теории работать должна со всеми, поддерживающими выносную панель MT-50 (не путать с MT-5 - там другой интерфейс!!!!)
2. Что понадобится для сборки, аппаратная часть
Для сборки мониторинга нам понадобится всего три детали:1. Контроллер Wemos D1 Mini Купить на Aliexpress (130 руб. на момент написания)

Вы можете применить и другие платы на основе ESP8266, но я рекомендую именно эту, за ее компактность, цену, возможность прошивки по microUSB и наличие двойного питания (5В и 3,3В) - это все что нам нужно и ничего лишнего
2. Модуль преобразователя интерфейсов UART TTL – RS-485 (на MAX485) Купить на Aliexpress (30 руб. на момент написания)

3. Патч-корд любой длины либо кусок витой пары обжатый с одной стороны коннектором RJ-45

После перехода на WiFi, я думаю у каждого дома такой можно найти в кладовке ну либо обратится к знакомому сисадмину. Совсем на крайний случай зайти в ближайший компьютерный магазин.
3. Схема
Схема очень простая, но я бы посоветовал пропаять все соединения, иначе потом можно промучиться с отладкой, а проблема банально в контакте...
Обратите внимание, что выводы преобразователя интерфейсов RE и DE - объединены, распиновка rj-45 ниже

Соединив выводы по схеме, Wemos D1 Mini подключаем к компьютеру а коннектор rJ-45 к солнечному контроллеру.
На этом с аппаратной частью закончили, ниже немного поговорим о протоколе обмена и какие данные можно получить из контроллера
4. Протокол обмена данными с контроллером EPSolar
Связь с внешним миром контроллеры осуществляют при помощи распространенного промышленного протокола Modbus, именно по нему контроллер обменивается данными с выносной панелью МТ-50. Стоит заметить, что встроенный ЖК экран контроллера, показывает только малую долю доступной для считывания по протоколу информации, подстегивая тем самым к покупке дополнительных аксессуаровОписание протокола с картой регистров привожу по ссылке: Протокол EPSolar Modbus
Желтым отмечены те параметры, которые как мне кажется являются самыми ценными и именно их мы будим отправлять в облако. Если кому-то понадобятся еще какие-то, немного разобравшись со скетчем, добавить другие параметры не составит особого труда, тем более, что резерв по переменным будет заложен.
Благодаря тому, что в автоматизации Modbus очень распространен, для платформ Arduino и ESP8266 давно написаны готовые библиотеки, поэтому мы не будем особо вдаваться в специфику протокола, а просто воспользуемся одной из таких библиотек
Как установить библиотеку в Arduino IDE - читайте здесь
5. Сцена
О том как регистрироваться в сервисе open-monitoring.online и импортировать в него готовую сцену, я уже подробно описывал в предыдущей статьеУ кого еще нет аккаунта в сервисе, воспользовавшись ссылкой выше, вы с легкостью это сделаете (на сегодняшний день наблюдаются проблемы с отправкой писем активации на ящики Gmail.com, поэтому лучше использовать почту mail.ru или Яндекс)
Ссылка на скачивание конфигурации сцены: open_monitoring_epsolar_V1.controller
6. Скетч
Ссылка на скачивание архива: OpenMonitoring_EPSolar_RS485_Ver_2 (Обновлено 01.12.2023) - исправлена ошибка отображения отрицательной температуры контроллера.Скетч для удобства разбит на 4 файла:
1. Monitoring_EPSolar_RS485_Ver_X.ino - основной, объявление переменных, настройки облака, инициализация и главный цикл;
2. Histogram.ino - функция для построения гистограммы по выработке энергии;
3. data_send.ino - функция сборки и отправки строки GET-запроса;
4. request_param.ino - функция опроса солнечного контроллера.
Код основной части
// Строки требующие редактирования в комментариях отмечены (!)
#include <ESP8266WiFi.h> // Стандартная библиотека в пакете
#include <SoftwareSerial.h> // Стандартная библиотека в пакете
#include <ModbusMaster.h> // Скачать библиотеку https://github.com/4-20ma/ModbusMaster
#define FIRMWARE_VER 1 // Версия
//*-- Настройки точки доступа
const char* ssid = "XXXX"; // Название точки доступа (!)
const char* password = "XXXX"; // Пароль (!)
//*-- Параметры полученные при регистрации на http://open-monitoring.online
const char* host = "open-monitoring.online"; // Адрес сервера (не менять)
const char* streamId = "XXX"; // ID (!)
const char* privateKey = "XXXXXX"; // Код доступа (!)
unsigned long send_interval = 61000; // Периодичность отправки пакетов на сервер (не менее 60 сек)
unsigned long request_interval = 15000; // Периодичность опроса контроллера, желат. 3-4 опроса между отправками
unsigned long previousMillis = 0;
unsigned long requestMillis = 0;
float previousEnergy;
#define MAX485_DE 4 // Пины для подключения RE и DE (4 - для платы ОМ)
#define MAX485_RE_NEG 4
#define RX_PIN 0 // Rx - программного порта
#define TX_PIN 5 // Tx - программного порта
SoftwareSerial softSerial;
// instantiate ModbusMaster object
ModbusMaster node;
// Переменные физ. величин контроллера
// 1 2 3 4 5 6 7 9 10 11 12-15 - резерв
float pv_V, pv_I, batt_V, batt_I, load_U, load_I, batt_T, EnergyToday, EnergyTotal, deltaEnergy;
// 8
int batt_SOC;
// 16 17 19-20 резерв
String batt_Status, ch_Status;
uint8_t result;
uint16_t data[6];
boolean flag_1Send = true; // Флаг первой посылки
boolean flag_TotEn = false; // Флаг получения значения полной энергии
boolean flag_startEn = true; // Флаг начального значения энергии
boolean LedStatus = false; // флаг светодиода
boolean dataTrade = false; // флаг состояния обмена данными
//*---------------- INICIALIZATION ------------------*//
void setup() {
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
pinMode(2, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
Serial.begin(115200);
softSerial.begin(115200, SWSERIAL_8N1, RX_PIN, TX_PIN, false, 32, 192);
softSerial.enableIntTx(false);
delay(10);
Serial.println("");
Serial.println("");
Serial.print("Версия ПО: ");
Serial.println(FIRMWARE_VER);
// Адрес контроллера в сети ModBus (по-умолчанию - 1)
node.begin(1, softSerial);
// Callbacks allow us to configure the RS485 transceiver correctly
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
// Подключение к сети WiFi
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
digitalWrite(2, LedStatus);
LedStatus = !LedStatus; // Мигаем каждые 0,5 сек пока идет подключение к сети WiFi
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
//*------------------ MAIN CYCLE --------------------*//
void loop() {
if ( millis() - requestMillis >= request_interval || flag_1Send == true) {
requestMillis = millis();
if ( dataTrade == true ) {
digitalWrite(2, false); // Если связь есть - зажигаем светодиод на время запроса в солн. контроллер
}
else {
digitalWrite(2, true); // Если связи нет - не мигаем
}
tracer_data_request(); // Запрос текущих параметров контроллера
digitalWrite(2, true);
}
if ( millis() - previousMillis >= send_interval || flag_1Send == true ) {
previousMillis = millis();
if (flag_1Send) {
flag_1Send = false; // Снимаем флаг первой отправки
}
data_send(); // Отправка данных на сервер
}
yield();
}
Заключение
До новых встреч, всем спасибо за внимание!
24.07.2020 08:14:33
Комментарии: 6
Просмотры: 8487
Комментарии