Диплом: Разработка автоматизированной информационной системы мониторинга промышленного кондиционирования ЦОД

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
51
int nf; // Number of function
int rc;
int rs;
int c = 3;
int cons = 0;
Теперь нам необходимо прописывать путь к рабочей папке, которая
находится на веб-сервере и будет содержать наши log-файлы для
получения информации.
string webpath("/var/www/html/infinity"); // Путь к папке веб-сервера
string logname;
FILE *flog;
int option_index;
timeval timeout;
timeval byte_timeout;
const char* short_options = "hH:d:l:cP:";
const struct option long_options[] = {
{"help",no_argument,NULL,'h'},
{"ip",required_argument,NULL,'H'},
{"device",optional_argument,NULL,'d'},
{"logname",optional_argument,NULL,'l'},
{"console",no_argument,NULL,'c'},
{"path",optional_argument,NULL,'P'},
{NULL,0,NULL,0}
};
Начинаем сбор информации по одному кондиционеры (хосту). Поочередно
опрашиваем его сервисы описанные выше. Для этого необходимо
автоматически происходит подключение к IP адресу сервера, происходит
аунтефикация по заданным реквизитам доступа.
52
char *IPad = NULL; // IP address
if (argc < 2) {
cout << argv[0] << " : Could not parse arguments" << endl;
print_help(); return 3; };
while (1) {
rs=getopt_long(argc,argv,short_options,long_options,&option_index);
if (rs == -1) break;
switch(rs){
case 'h':
print_help();
return 0;
case 'H':
IPad = optarg;
break;
case 'd':
devnum = atoi(optarg);
break;
case 'l':
logname = string(optarg);
break;
case 'c':
cons = 1;
break;
case 'P':
webpath = string(optarg);
break;
case '?': default:
print_help(); exit (3);
53
};
};
logname = webpath + "/" + logname;
//cout << logname << "\n" << endl;
if (IPad == NULL) {
cout << argv[0] << " : Could not parse IP address" << endl;
print_help(); return 3;
};
mb = modbus_new_tcp(IPad, mport);
if (mb == NULL) {
cout << "Unable to allocate libmodbus context" << endl;
return 3;
}
if (modbus_connect(mb) == -1) {
cout << "Connection failed: " << modbus_strerror(errno) << endl;
modbus_free(mb);
return 3;
}
На данном этапе нам необходимо прописать тайм-ауты сессий соединения
для ведомых устройств по шине Modbus.Это необходимо для того, чтобы в
случае зависания , соединение сбрасывалось по истечению заданного
времени.
modbus_set_slave(mb,devnum);
timeout.tv_sec = 2;
timeout.tv_usec = 900000;
byte_timeout.tv_sec = 2;
byte_timeout.tv_usec = 900000;
modbus_set_response_timeout(mb, &timeout);
54
modbus_set_byte_timeout(mb, &byte_timeout);
modbus_get_response_timeout(mb, &timeout);
// Zero all arrays
for(int i=0; i<100; i++)tab_reg16[i] = 0;
for(int i=0; i<100; i++)tab_reg8[i] = 0;
int a,b;
char s[20],
s1[5],
s2[5],
s3[5];
int i = 0;
Открываем log-файл на правах чтения, т.к. непредвиденные изменение
недопустимы и так можно вести раздельно процессы чтения и записи
одновременно. Если файл станет не доступен то нас об этом оповестит
строка «Can`t open log file», что конечно же повлечен собой ручную
проверку доступности файла.
// Open log file read mode
if( flog = fopen(logname.c_str(), "r") ){
char* ps;
while( fgets(s, 20, flog) != NULL && !strcmp(s, "Read blocks error 0")){
//printf("We have new line \"%s\"", s);
ps = strtok(s, ":");
//if( ) break;
strcpy(rl[i].addr, ps);
//printf("result 1 is addr %s \n", ps);
//printf("result 1 is addr %s after copy\n", rl[i].addr);
ps = strtok(NULL, ":");
strcpy(rl[i].val, ps);
55
//printf("result 2 is addr %s \n", ps);
//printf("result 2 is addr %s after copy\n", rl[i].val);
i++;
}
fclose(flog);
}else{
printf("Can`t open log file\n");
}
for(int k = 0; k < i;k++ )
printf("%s : %s\n", rl[k].addr, rl[k].val);
//exit (0);
/// Bits parameters
Опишем процесс получение параметров на примере системы
кондиционирования. За пример возьмем параметр отвечающий за
определение системы теплоносителя кондиционера GE/CW.
if(!mb_connect_f1( mb, flog, logname, devnum, 1001, 13, tab_reg8, IPad
))err++;
sleep(1);
if(!mb_connect_f4( mb, flog, logname, devnum, 2338, 14, tab_reg16, IPad
))err++;
sleep(1);
// Write result
if(!cons)
flog = fopen(logname.c_str(), "w+");
for (int i=0; i < 14; i+=2) {
if(cons)
cout << 2338+i << " : " << modbus_get_float_cdab(&tab_reg16[i]) <<
endl;
56
else
fprintf(flog, "%d : %.1f \n", 2338+i,
modbus_get_float_cdab(&tab_reg16[i]));
}
for (int i=0; i < 13; i++) {
if(cons)
cout << 1001+i << " : " << tab_reg8[i] << endl;
else
fprintf(flog, "%d : %d \n", 1001+i, tab_reg8[i]);
}
if(!cons)
fclose(flog);
////// Fun parameters
// mb_connect_f4( mb, flog, logname, devnum, 21616, 10, tab_reg16 );
// sleep(1);
////// GE/CW-valve
В данной части опишем механизм окончания чтения параметров, переход
шины Modbus с ведущего на ведомого.
if(!mb_connect_f4( mb, flog, logname, devnum, 10420, 10, tab_reg16, IPad
))err++;
sleep(1);
if(!cons)
flog = fopen(logname.c_str(), "a");
for (int i=0; i < 10; i+=2) {
if(cons)
cout << 10420+i << " : " << modbus_get_float_cdab(&tab_reg16[i])
<< endl;
else
57
fprintf(flog, "%d : %.1f \n", 10420+i,
modbus_get_float_cdab(&tab_reg16[i]));
}
fprintf(flog, "Read blocks error %d \n", err);
if(!cons)
fclose(flog); // close log file
modbus_close(mb);
modbus_free(mb);
cin.sync();
cout << "Read finished from id " << devnum << endl; //окончание чтения
устройства под данным id
return 0;
}
Переход устройства по шине Modbus в режим ведомого устройста, оно
временно прекращает вещать.
int mb_connect_f4( modbus_t *mb,
FILE * flog,
string logname,
int devnum,
int sad,
int len,
uint16_t *tab_reg16,
char *IPad ){
int c = 3;
int rc;
do{
rc = modbus_read_input_registers(mb, sad, len, tab_reg16);
if (rc == -1) {
cout << "Read f4 failed: " << modbus_strerror(errno) << endl;
58
modbus_close(mb);
modbus_free(mb);
sleep(3);
mb = modbus_new_tcp(IPad, 502);
modbus_connect(mb);
modbus_set_slave(mb,devnum);
c--;
}else break;
}while(c);
return c;
}
//#################################
Завершаем опрос интересующего нас log-файла.По окончанию этого
работы этого скрипта он запуститься вновь. Так происходит постоянное
обновление информации во временной промежуток 5 секунд.
int mb_connect_f1( modbus_t *mb,
FILE * flog,
string logname,
int devnum,
int sad,
int len,
uint8_t *tab_reg8,
char* IPad ){
int c = 3;
int rc;
do{
rc = modbus_read_input_bits(mb, sad, len, tab_reg8);
if (rc == -1) {
cout << "Read f1 failed: " << modbus_strerror(errno) << endl;
59
modbus_close(mb);
modbus_free(mb);
sleep(3);
mb = modbus_new_tcp(IPad, 502);
modbus_connect(mb);
modbus_set_slave(mb,devnum);
c--;
}else break;
}while(c);
return c;
}
(!cons)
fclose(flog); // close log file
modbus_close(mb);
modbus_free(mb);
cin.sync();
cout << "Read finished from id " << devnum << endl;
return 0;
}
В итоге получаем мониторинг системы кондиционирования
машинных залов со следующим видом:
60
Рисунок 20 – Отображение Host, Service в NAGIOS

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)
Value-based education: ценности в системе образования и способы их реализации на уроке английского языка. Опыт Европейских стран