Специалистам, работающим с серверным оборудованием, известно насколько высокие требования ставятся перед источниками бесперебойного питания и системе кондиционирования и воздухообмена. Непосредственно сам неоднократно сталкивался с ситуациями, когда отказ той или иной системы приводил к падению ЦОДа одного из мобильных операторов стран СНГ. В одной из ситуаций одновременно основная и резервная линии питания ЦОДА были обесточены, дизельные генераторы завелись автоматически, но электрики не переключили определенный рубильник. ИБП до последнего держали нагрузку, а затем более 200 серверов оказались обесточены. В другой ситуации ЦОД после отключения питания на основной линии был переключен на резервную, напряжение на которой оказалось пониженным. Это привело к отказу в запуске кондиционеров, которые питаются в обход ИБП. От перегрева сервера отключились, коммутатор HLR завис надолго и восстановил полную работоспособность лишь спустя 2-3 дня. Все это приводило к тому, что без связи оставалось до миллиона абонентов. Отвечаю сразу на вопрос: “А что делала служба мониторинга?” В первой ситуации она посчитала работу сделанной до конца, во второй поздно заметила аларм на одном из многочисленных мониторов.
Так как непосредственно моей обязанностью было поднимать сервера после таких аварий и, мягко говоря, надоело надеяться на службу мониторинга стал искать решение кроме SNMP трапов. После разбора руководств, шедших в комплекте с ИБП и кондиционерами, было обнаружено, что все они поддерживают сухие контакты. Осталось найти, как с ними работать. На помощь пришла отладочная плата MSP430 Launchpad от Texas Instruments.
Для неспециалистов сухие контакты работают как включатели/выключатели, замыкающие/размыкающие контакты при определенных условиях. Производитель может заложить, например, такие условия: общий аларм (любая неисправность с оборудованием), отсутствие напряжения на входных контактах, разряд батарей, повышение температуры. Все это подробно описывается в руководствах, там же приводятся схемы контактов, к которым нужно подключиться.
Данные выключатели позволяют сформировать критерии HIGH и LOW для микроконтроллера: если контакт разомкнут, то относительно земли будем иметь HIGH на пине контроллера, если замкнут, то сформируется LOW. Такие условия позволяют управлять при помощи простого оператора “if” включением/выключением других пинов на плате. Недолго думая, решил управлять светодиодами и пьезо-пищалкой, чтобы подавать звуковой и визуальный сигнал аларма. Спустя 5 минут на основе примеров, шедших в комплекте с средой Energia, был составлен скетч:
const int ledPin0 = P1_0;
const int ledPin1 = P1_1;
const int ledPin2 = P1_2;
const int ledPin3 = P1_3;
const int ledPin4 = P1_4;
const int ledPin5 = P1_5;
const int buttonPin0 = P2_0;
const int buttonPin1 = P2_1;
const int buttonPin2 = P2_2;
const int buttonPin3 = P2_3;
const int buttonPin4 = P2_4;
const int buttonPin5 = P2_5;
const int tonePin = P1_7;
int buttonState0 = 0;
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;
int buttonState5 = 0;
void setup() {
pinMode(ledPin0, OUTPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
pinMode(buttonPin0, INPUT_PULLUP);
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(buttonPin3, INPUT_PULLUP);
pinMode(buttonPin4, INPUT_PULLUP);
pinMode(buttonPin5, INPUT_PULLUP);
}
void loop() {
buttonState0 = digitalRead(buttonPin0);
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
buttonState3 = digitalRead(buttonPin3);
buttonState4 = digitalRead(buttonPin4);
buttonState5 = digitalRead(buttonPin5);
// LED P1_0
if (buttonState0 == LOW) {
digitalWrite(ledPin0, HIGH);
tone(tonePin, 440, 200);
}
else {
digitalWrite(ledPin0, LOW);
}
// LED P1_1
if (buttonState1 == LOW) {
digitalWrite(ledPin1, HIGH);
tone(tonePin, 440, 200);
}
else {
digitalWrite(ledPin1, LOW);
}
// LED P1_2
if (buttonState2 == LOW) {
digitalWrite(ledPin2, HIGH);
tone(tonePin, 440, 200);
}
else {
digitalWrite(ledPin2, LOW);
}
// LED P1_3
if (buttonState3 == LOW) {
digitalWrite(ledPin3, HIGH);
tone(tonePin, 440, 200);
}
else {
digitalWrite(ledPin3, LOW);
}
// LED P1_4
if (buttonState4 == LOW) {
digitalWrite(ledPin4, HIGH);
tone(tonePin, 440, 200);
}
else {
digitalWrite(ledPin4, LOW);
}
// LED P1_5
if (buttonState5 == LOW) {
digitalWrite(ledPin5, HIGH);
tone(tonePin, 440, 200);
}
else {
digitalWrite(ledPin5, LOW);
}
}
Поясню немного, в серверном помещении расположено 4 ИБП и 2 промышленных кондиционера. Именно они подключены как buttonPinX, светодиоды подключены как ledPinX, пищалка подключена на tonePin. Сложностей с дальнейшим разбором скетча думаю не будет.
Пульты сигнализации планировалось установить в двух помещениях: в кабинете, где размещаются администраторы, и центре мониторинга. Две платы для этого было использовать жалко, поэтому решил распараллелить выводы сигналов. Доставку сигналов до помещений было решено сделать довольно необычно – при помощи уже проложенных сетевых кабелей через кроссировочный шкаф и вывод из розеток. Получилось довольно удобно – 6 кабельков UTP кабеля используются для положительных контактов светодиодов, один для положительного контакта пищалки и последний для земли. Кабеля, шедшие от сухих контактов оборудования, не решил подключить напрямую к плате, использовал резисторы по 10k Ом. Также побоялся того, что со временем светодиоды могут сгореть, так как ток потребления по показаниям тестера составил 6mA, а контроллер MSP430G2553 может обеспечивать до 50mA на выходе. Решил использовать ограничительные резисторы в 390 Ом. В итоге схема получилось такой
Справа образовывается шлейф сигнальных кабелей до пульта, в реальной схеме у меня 2 таких шлейфа для 2 пультов. Пронумерованные выводы идут до сухих контактов ИБП и кондиционеров в паре с землей. На ИБП подключены сухие контакты, информирующие о старте разряда батарей, одновременно это означает, что отсутствует и входное напряжение. На кондиционерах к сухим контактам общего аларма.
Сигнализация сразу же вступила в эксплуатацию, с первого же дня начав уведомлять о нарушении в работе, так как проблемы с питанием практически ежедневно. В планах включение UART для чтения данных о состоянии пинов и образования E-mail или SMS нотификации
Автор: vasiliy_pupkin