Настройка системы диспетчеризации, на основе Rapid scada
Диспетчеризация — процесс централизованного оперативного контроля и дистанционного управления, с использованием оперативной передачи информации между объектами диспетчеризации и пунктом управления.
Выдвигались следующие требования:
1 отображение оперативной информации:
- операторам – отделения цехов,
- диспетчеру – по отделениям и цехам,
- руководству цеха – по отделениям и цехам,
- руководству предприятия – завода;
2 архивирование информации и вывод каждого параметра в виде графика и таблицы;
3 задавать пользовательские формулы и функции.
Для диспетчеризации выбрана RapidSCADA.
Достоинства:
- быстрота в работе, отображение контролируемого параметра с минимальным временем задержки;
- малое потребление системных ресурсов, не загружает ОС и физические параметры оборудования;
- отображение данных через веб-интерфейс, это решает первое требование к scada-системе, поскольку веб-интерфейс позволяет большое число одновременных подключений;
- цена, основные модули бесплатны.
Все формулы и функции написаны на языке c#.
- масштабирование значений;
- график ППР для механических служб;
- различные сигнализации для операторов, контролирующих технологический процесс, связанных с
критическими значениями показателей;
- технический учет энергоресурсов;
- автоматический перезапуск удаленного оборудования.
В рамках данного проекта велась техническая поддержка систем коммерческого учета энергоресурсов.
Пример кода на языке с#
public double _timeWorkMinDay(int CnlNumI)
//время работы привода с током CnlNumI
{
bool m = MinuteBeg(); //начало новой минуты
double Z = Val(CnlNum); //текущее время работы в часах
double V = Val(CnlNum) * 60; //текущее время работы в минутах
if (m) //если начало новой минуты
{
if (Val(CnlNumI) > 1) //если ток привода больше единицы
{
V = V + 1;
Z = V / 60;
}
}
DateTime nowDT = DateTime.Now;
DateTime execDT;
if ((nowDT.Hour == 0 && nowDT.Minute > 0 || nowDT.Hour == 1) &&
(!DayBegDict.TryGetValue(CnlNum, out execDT) || execDT.Date < nowDT.Date))
{
DayBegDict[CnlNum] = nowDT;
return Z=0;
}
return Z;
}