Автоматический ввод резерва

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

andrew
Сообщения: 12
Зарегистрирован: Пт фев 12, 2016 9:34 pm
Благодарил (а): 4 раза
Поблагодарили: 4 раза

Автоматический ввод резерва

Сообщение andrew » Вс янв 08, 2017 7:28 pm

Может чет с поиском, но не нашел такого...

(Актуально для частного домовладения)
В общем смысл: переключение вводной линии ЛЭП при отключении на инвертер, а затем (после запуска) на генератор.
andrew
Сообщения: 12
Зарегистрирован: Пт фев 12, 2016 9:34 pm
Благодарил (а): 4 раза
Поблагодарили: 4 раза

Re: Автоматический ввод резерва

Сообщение andrew » Вс янв 08, 2017 7:46 pm

Пока для себя решил делать на Arduino + релейный модуль, управление нагрузкой контакторами, связь с генератором Serial (или аналоговая 2 провода - пока не решил, на генераторе отдельный модуль управления)

-Линия света отдельно, сразу при пропадании питания сети - запитывается инвертером с акб (максимум на 5 минут), после запуска переходит на генератор.

-У меня Вход трехфазный - решил одна фаза для света и необходимого, остальные прочее... + Генератор однофазный + при отсутствии хочется отключить прочее, поэтому дополнительный контактор управляющий 2,3 фазой.

[img]схема1.jpg[/img]
Вложения
схема1.jpg
схема1.jpg (26.42 КБ) 7657 просмотров
Последний раз редактировалось andrew Чт янв 12, 2017 6:48 pm, всего редактировалось 3 раза.
andrew
Сообщения: 12
Зарегистрирован: Пт фев 12, 2016 9:34 pm
Благодарил (а): 4 раза
Поблагодарили: 4 раза

Re: Автоматический ввод резерва

Сообщение andrew » Пн янв 09, 2017 1:14 am

Скрипт:

Код: Выделить всё

// v. 1.0
// Скрипт управления резервным вводом питания,
//  отключением двух фаз по состоянию "отсутствие, присутствие", с WatchDog`ом.

// - не забываем затереть загрузчик (для работы WatchDog`a.).
// Формат запроса: {адрес},{состояние}
// адрес: 3 цифровых знака. Пример: 151 (занесен в переменную addr)
// состояние: 00 - никого нет дома, генератор не нужен
//            01 - никого нет дома, генератор нужен
//            11 - дома кто-то есть

#include <avr/wdt.h>
#include <SoftwareSerial.h>

String addr = "151";          //  адрес контроллера

#define ESKchek A4            //датчик входа тока на контактор ЛЭП
#define Outchek A5         //датчик выхода тока с контактора 
#define GENchek A6            //датчик входа тока в контактор генератора
#define INVchek A7            //датчик тока с инвертера
//#define GENoutchek A7         //датчик выхода контактора генератора

#define GENerrorLED A3        // индикатор ошибки генератора
#define GENonLED A2           // индикатор вкл линии генератора
#define GENoffLED A1          //  индикатор выкл линии генератора
#define ESKonLED A0           // индикатор вкл линии ЛЭП
#define ESKoffLED 13          // индикатор выкл линии ЛЭП

#define  INVon 9              // вкл инвертера
#define  INVrel 8             // реле вкл-выкл инвертера
#define  ESKon 2              // реле вкл контактора ЛЭП
#define  ESKoff 3             // реле выкл контактора ЛЭП
#define  GENon 4              // реле вкл контактора Генератора
#define  GENoff 5             // реле выкл контактора Генератора
#define  NBDon 6              // реле вкл контактора НЕТ НИКОГО
#define  NBDoff 7             // реле выкл контактора НЕТ НИКОГО

SoftwareSerial mySerial(10, 11);   // RX, TX

volatile int i = 0;
volatile bool ON = LOW;            // включить 0
volatile bool OFF = HIGH;          // выключить 1
volatile bool OldESK = HIGH;       // предыдущее состояние ввода ЛЭП
volatile bool State = HIGH;        // состояние присутствия
volatile bool GenOK = LOW;         // ошибка генератора
volatile bool GenState = LOW;      // состояние генератора

void setup() {

  Serial.begin (9600);
  mySerial.begin(4800);

  pinMode (INVchek, INPUT_PULLUP);
  pinMode (ESKchek, INPUT_PULLUP);
  pinMode (GENchek, INPUT_PULLUP);
  pinMode (Outchek, INPUT_PULLUP);

  pinMode (GENerrorLED, OUTPUT);
  pinMode (GENonLED, OUTPUT);
  pinMode (GENoffLED, OUTPUT);
  pinMode (ESKonLED, OUTPUT);
  pinMode (ESKoffLED, OUTPUT);

  pinMode (INVon, OUTPUT);
  pinMode (INVrel, OUTPUT);
  pinMode (ESKon, OUTPUT);
  pinMode (ESKoff, OUTPUT);
  pinMode (GENon, OUTPUT);
  pinMode (GENoff, OUTPUT);
  pinMode(NBDon, OUTPUT);
  pinMode(NBDoff, OUTPUT);

  digitalWrite (GENerrorLED, HIGH);
  digitalWrite (GENonLED, HIGH);
  digitalWrite (GENoffLED, HIGH);
  digitalWrite (ESKonLED, HIGH);
  digitalWrite (ESKoffLED, HIGH);

  digitalWrite (INVon, OFF);
  digitalWrite (INVrel, OFF);
  digitalWrite (ESKon, OFF);
  digitalWrite (ESKoff, OFF);
  digitalWrite (GENon, OFF);
  digitalWrite (GENoff, OFF);
  digitalWrite (NBDon, OFF);
  digitalWrite (NBDoff, OFF);

  delay (1000);

  digitalWrite (GENerrorLED, LOW);
  digitalWrite (GENonLED, LOW);
  digitalWrite (GENoffLED, LOW);
  digitalWrite (ESKonLED, LOW);
  digitalWrite (ESKoffLED, LOW);

  wdt_enable(WDTO_8S);
}

void pause(byte tm) {
  for (i = 0; i < tm; i++) {
    wdt_reset();
    delay(1000);
  }
}

void ESKstart() {
  pause(20);
  if (!digitalRead(ESKchek)) {
      digitalWrite (GENoff, ON);
      delay(500);
      digitalWrite (GENoff, OFF);
      delay(500);
    byte i = 0;
    while (digitalRead(Outchek) || i<10){
      digitalWrite (ESKon, ON);
      if (State) {digitalWrite (NBDon, ON);}
      delay(500);
      digitalWrite (ESKon, OFF);
      digitalWrite (NBDon, OFF);
      delay(500);
      i++;
    }
    if (digitalRead(Outchek)) {
      digitalWrite (ESKoff, ON);
      digitalWrite (NBDoff, ON);
      digitalWrite (GENoff, ON);
      delay(500);
      digitalWrite (ESKoff, OFF);
      digitalWrite (NBDoff, OFF);
      digitalWrite (GENoff, OFF);
    }
  }
}

void GenAnswer(byte ansver) {
      switch (ansver) {
      case 11:  
        digitalWrite (GENerrorLED, LOW);// заглушен все ок
        GenOK = 1;
        GenState = 0;
        break;

      case 22: 
        digitalWrite (GENerrorLED, LOW);// заведен все ок
        GenOK = 1;
        GenState = 1;
        break;

      case 33: 
        digitalWrite (GENerrorLED, HIGH);// заглушен, авария
        GenOK = 0;
        GenState = 0;
        break;

      case 44: 
        digitalWrite (GENerrorLED, HIGH);// заведен, авария
        GenOK = 0;
        GenState = 1;
        break;

      default:
        digitalWrite (GENerrorLED, HIGH);
        GenOK = 0;
        GenState = 1;
    }
}  

void GenStart() {
  if (digitalRead(GENchek)) {
    mySerial.println ("start");
    byte ansver = 0;
    for (i = 0; i < 120; i++) {
      wdt_reset();
      delay(1000);
      if (mySerial.available()) {
        ansver = mySerial.read();
        break;
      }
    }
    GenAnswer (ansver);
  }
}

void GenStop() {
  mySerial.println ("stop");
  byte ansver = 0;
  for (i = 0; i < 100; i++) {
    wdt_reset();
    delay(1200);
    if (mySerial.available()) {
      ansver = mySerial.read();
      break;
    }
  }
    GenAnswer (ansver);
}

void loop() {
  wdt_reset();

  if (digitalRead(ESKchek) != OldESK) {
    OldESK = digitalRead(ESKchek);
    if (!OldESK) {
      ESKstart();
      pause(5);
      GenStop();
    }
    else {
      // выключаем ЛЭП и 2,3 фазы
      digitalWrite (ESKoff, ON);
      digitalWrite (NBDoff, ON);
      delay(500);
      digitalWrite (ESKoff, OFF);
      digitalWrite (NBDoff, OFF);
      delay(500);
      // включаем инвертер
      digitalWrite (INVon, ON);
      delay(500);
      digitalWrite (INVrel, ON);
      // запускаем генератор если нужен
      if (State) {
        GenStart();
        if (!digitalRead(GENchek)) {
          digitalWrite (INVrel, OFF);
          digitalWrite (INVon, OFF);
          delay(500);
          byte i=0;
          while (digitalRead(Outchek) || i<10) {
            digitalWrite (GENon, ON);
            delay(500);
            digitalWrite (GENon, OFF);
            i++;
          }
          if (digitalRead(Outchek)) {
            digitalWrite (ESKoff, ON);
            digitalWrite (NBDoff, ON);
            digitalWrite (GENoff, ON);
            delay(500);
            digitalWrite (ESKoff, OFF);
            digitalWrite (NBDoff, OFF);
            digitalWrite (GENoff, OFF);            
          }
        }
      }
    }
  }
  
//подсветка кнопок
  if (!digitalRead(ESKchek)) {
    if (!digitalRead(Outchek)) {
      digitalWrite (ESKoffLED, LOW);
      digitalWrite (ESKonLED, HIGH);
    }
    else {
      digitalWrite (ESKonLED, LOW);
      digitalWrite (ESKoffLED, HIGH);
    }
  }
  if (!digitalRead(GENchek)) {
    if (!digitalRead(Outchek)) {
      digitalWrite (GENoffLED, LOW);
      digitalWrite (GENonLED, HIGH);
    }
    else {
      digitalWrite (GENonLED, LOW);
      digitalWrite (GENoffLED, HIGH);
    }
  }
//end light button
//состояние никого при вкл генераторе
  if (!State && !digitalRead(GENchek)) {
    digitalWrite (GENoff, ON);
    delay(500);
    digitalWrite (GENoff, OFF);
    pause(5);
    GenStop();
  }
//end состояние
}


void serialEvent() {
  if (Serial.available() > 4) {
    String incomingData = Serial.readString();
    if (incomingData.substring(0, 3) == addr) {
      int dS = incomingData.substring(4, 6).toInt();
      Serial.print(addr);
      Serial.print(":");
      switch (dS) {
        case 11:                  
          digitalWrite (NBDoff, ON);//присутствие нет, генератор нет
          delay(500);
          digitalWrite (NBDoff, OFF);
          State = LOW;
        break;
        case 22:                  
          digitalWrite (NBDoff, ON);//присутствие нет, генератор да
          delay(500);
          digitalWrite (NBDoff, OFF);
          State = HIGH;
        break;
        case 33:                  
          digitalWrite (NBDon, ON);//присутствие да,генератор да
          delay(500);
          digitalWrite (NBDon, OFF);
          State = HIGH;
        break;
        default:
          Serial.print("L:");
          Serial.print(digitalRead(ESKchek));
          Serial.print(":G:");
          Serial.print(digitalRead(GENchek));
          Serial.print(":G:");
          Serial.print(digitalRead(GENchek));
          
      }

      Serial.print(":");
      Serial.println(dS);
    }
  }
}
andrew
Сообщения: 12
Зарегистрирован: Пт фев 12, 2016 9:34 pm
Благодарил (а): 4 раза
Поблагодарили: 4 раза

Re: Автоматический ввод резерва

Сообщение andrew » Пн янв 09, 2017 1:15 am

Какие замечания?
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Автоматический ввод резерва

Сообщение Victor_S » Пн янв 09, 2017 9:33 am

Немного общих замечаний из собственного опыта по резервному питанию...
1. При 3-фазном вводе разумно нагружать все фазы симметрично. В деревне часто бывает отключение одной или двух фаз из трех, а не сразу всего. Поэтому выделять одну фазу для освещения и необходимого, ИМХО, не самый правильный вариант.
2. Инвертор и так должен автоматически переключаться сам. АВР имеет смысл только для генератора. 5 минут - ниочем, даже автоматический запуск и прогрев генератора могут потребовать большего времени.
3. САП выполняет гораздо больше функций, чем просто контроль наличия входного напряжения. Это и напряжение аккумулятора генератора(и его подзарядка), и контроль аккумуляторов инвертора, и параметров(а не только наличия) входной сети и периодический запуск генератора...
Если САП делать не планируете, то лучше и ввод резерва делать вручную(рубильником через ноль), если будете - то заодно с АВР.
У меня довольно паршивая сеть в деревне, хотя и сделана реконструкция. Имею 2 трехфазных ввода. Один полностью резервирую, второй пока нет. Стоит 3 стабилизатора с байпасами, дальше 3 инвертора(объеденены для работы по 3 фазам) на общий банк аккумуляторов, тоже с байпасами. Один инвертор подключен через САП со своим байпасом. Генератор тоже однофазный, мощность номинальная равна одной фазе, работает на тот же банк аккумуляторов через один из инверторов. Смысл всего в том, что при отключении одной или двух фаз, оставшийся инвертор продолжает подавать напряжение на все фазы и заряжать банк аккумуляторов. При отключении всех фаз, после снижения напряжения на аккумуляторах ниже определенного предела автоматически запускается генератор, который заряжает банк аккумуляторов и через инверторы подает напряжение на все фазы. По достижению верхнего предела заряда аккумуляторов(при отсутствии сети), генератор отключается и цикл повторяется. При появлении питания хотя бы на одной фазе генератор отключается и система переходит на внешнее питание. Дополнительно имеется возможность подкачки мощности от аккумуляторов при превышении лимита потребления от сети.
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Автоматический ввод резерва

Сообщение Victor_S » Пн янв 09, 2017 9:37 am

Да, забыл добавить...
При переходе на резервное питание, автоматика отключает все мощные не приоритетные нагрузки, а при возврате включает(в зависимости от режима - нормальный/экономичный/охрана). Вот для этих целей уже можно разные ардуинки использовать...;)
andrew
Сообщения: 12
Зарегистрирован: Пт фев 12, 2016 9:34 pm
Благодарил (а): 4 раза
Поблагодарили: 4 раза

Re: Автоматический ввод резерва

Сообщение andrew » Пн янв 09, 2017 12:46 pm

У вас больше похоже на объект пво.)))

-А по сути: у нас сеть новая, за год особых нареканий нет, кроме отключения когда попало на сколько попало...

1. Фазы примерно симметрично и будут нагружены при 3 фазах:

-свет, холодильник, насос
-духовка, розетки 1 этажа
-бойлер, розетки 2 этажа, улица свет

2. Инвертер маломощный (инвертер - громко сказано - преобразователь напряжения 12DC-220AC) 1200 вт - нужен только для того чтоб до запуска генератора не сидеть впотьмах, питание от автомобильного аккумулятора, вместе с генератором, контроль за состоянием акб и гены будет на др. контроллере.

3. В итоге "сап" (не понял что такое) Cистема автоматического пуска? - будет на генераторе - контроллер генератора, Если что-то иное то ненужно...
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Автоматический ввод резерва

Сообщение Victor_S » Пн янв 09, 2017 1:42 pm

Просто у меня пмж предполагается. Соответственно кроме хреновой электрики никаких внешних коммуникаций, вот и приходится о резерве подумать основательно...
У Вас же, как я понял, небольшая дача с дровяной печкой.
Тогда такой момент... Насос с резерва уберите, Ваш инвертор его пуска не выдержит. Ну и генератор ведь на улице? А уличное освещение Вы не резервируете. Может в Вашем случае правильнее будет отдельная линия дежурного освещения(дом,улица) в параллель к основной? Можно даже 12В. Генератор уже есть? Хороший генератор с автозапуском и АВР стоит приличных денег, а на китайский ширпотреб, лучше ручное переключение, ИМХО.
andrew
Сообщения: 12
Зарегистрирован: Пт фев 12, 2016 9:34 pm
Благодарил (а): 4 раза
Поблагодарили: 4 раза

Re: Автоматический ввод резерва

Сообщение andrew » Пн янв 09, 2017 4:09 pm

Освещение и Резерв одна фаза, но две разные ветки - от инвертера только освещение. На улице свет в основном понты... там не так темно ночью как в доме.

Генератор уже есть без АВР, без Автозапуска, но со стартером. Запуск буду городить все равно сам (в продолжении темы)... некоторые впаривают эти самоделки достаточно не за дешево, и еще даж какую-никакую гарантию дают.... Чем мы хуже?

PS. Печка кстати да дровяная, но немецкая, в паре с эл.котлом (жаль не немецким).))

ЗЫ. Эл. котел на резервной фазе висит мозгами и одним теном, для плюса будет достаточно...
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: Автоматический ввод резерва

Сообщение Victor_S » Пн янв 09, 2017 9:26 pm

andrew писал(а):Генератор уже есть без АВР, без Автозапуска, но со стартером.
Стартер не главное...сам генератор смотрите, ну и движек. Надеюсь Вы его уже проверили на "совместимость" с холодильником, насосом и "мозгами" котла.
andrew писал(а):Запуск буду городить все равно сам (в продолжении темы)... Чем мы хуже?
"Ни что так не убеждает как собственный опыт..." :) Удачи!
Ответить