public double this[int num]
{{{return (double) Mas[num]; }{ return 0;}}
{
{Mas[num] = value; }{}
}
}
Расчет статистических параметров происходит в процедуре Set_StatistikParameter(), а выдача самих параметров реализована через соответствующие свойства.
double Disp //дисперсия
{
{Dispersia;
}
}
double Koef_Assimetr //коэф ассиметрии
{
{KoefAssimetr;
}
}
На основе класса Massiv были созданы еще два класса: MassivTP и MassivYstavok.
Класс MassivTP предназначен для хранения технологических параметров агрегата, в связи с этим в него была добавлена функция вывода по номеру соответствующего технологического параметра.
MassivTP:Massiv
{string Parameter(int num);
}
Класс MassivYstavok используется в программе для хранения уставок диагностических параметров. Уставка - заданные технологические параметры, характеризующие полностью исправный агрегат. По превышению уставки над реальным полученным значением можно судить о том или ином дефекте. Диагностических параметров очень много, но для удобства программирования доступ к ним реализован через свойства класса.
double U_Rfo
{
{(double)Mas[3];
}
}double U_R2fo
{
{(double)Mas[8];
}
}
Еще из нововведений функция получения названия уставки по номеру public string Parameter(int num), процедура вывода уставок в компонент ListBox public void SetListBox(NListView list) и процедура изменения значения выбранной пользователем уставки public void SetUstavki(int num, double znach).
MassivYstavok:Massiv
{double ОП;double УП;double fl1;double fl2;double fl3;double fna;double fz;double ред;double KOEFF;void SetUstavki(int num, double znach)
{[num] = znach;
}void SetListBox(NListView list){...}string Parameter(int num)
{ret = "";(num)
{0:= "U1_Sfгг";;
}
}
Для хранения и безопасного использования всех данных предназначен класс Dannie. Наряду с исходными данными, считанными из файла или заданными по умолчанию (сигналы с опор, дата измерения и название агрегата, массивы уставок и технологических параметров), он содержит множество дополнительных переменных для хранения промежуточных данных. Все переменные скрыты от внешнего изменения с помощью ключевого слова private. Весь функционал и взаимодействие с пользователем реализован через открытые внешне процедуры и функции.
partial class Dannie
{string U_NAME; // название аппаратурыstring DiagDate; //Дата и время измеренияint CountInMas; // число измерений в массивах сигналовint CountInMasTehParametr; //числоТПMassivTP TP; // Значения технологических параметровint kodZ;
//- 1 - нет сигнала ЗО верт;
//- 2 - нет сигнала ЗО гориз;
//- 4 - нет сигнала ЗО осев;
//- 8- нет сигнала ПО верт;
//- 16 - нет сигнала ПО гориз;
//- 32 - ошибки чтения ТПMassiv X_MSEK; // E6:E8197 Отсчеты сигналов, мсекMassiv SI_ZOV; //Cигналы с опорMassiv SI_ZOH;Massiv SI_ZOA;Massiv SI_POV;Massiv SI_POH;
}
Класс Dannie
очень большой - около 500 переменных и более 200 функций, поэтому с помощью
ключевого слова partial
разбит на несколько файлов, а сами файлы сгруппированы по папкам в соответствии
с выполняемыми в них действиями (см. рисунок 5.1).
Рисунок 5.1 - Внешний вид проекта
В последующих разделах весь функционал проекта будет рассмотрен подробнее.
5.3 Общий алгоритм работы
В соответствии с методикой диагностирования, разработанной заказчиком, программа для получения конечного результата должна пройти через шесть шагов:
Шаг 1. Ввод данных для диагностирования.
Шаг 2. Предварительная обработка информации для диагностирования.
Шаг 3. Расчет диагностических параметров.
Шаг 4. Подготовка и расчет диагностической матрицы.
Шаг 5. Вывод результатов диагностики и графиков функций исходных данных.
Шаг 6. Сохранение результатов диагностики
Рассмотрим эти шаги подробнее.
5.3.1 Ввод данных для диагностирования
Для выявления дефектов оборудования необходимо загрузить из файлов следующую информацию:
1) виброакустические данные с опор оборудования и технологические данные агрегата;
) конфигурацию агрегата;
3) справочник диагностических состояний.
. Загрузка сигналов
Данные сигналов и технологические параметры
содержатся в Excel-файле, который имеет структуру, изображенную в таблице 5.1.
Полностью функции загрузки данных из Excel
приведены в приложении А.1.
Таблица 5.1 - Структура файла сигналов
|
№ |
Имя массива в программе |
Номера ячеек в Excel |
Назначение массива |
|
1 |
X_MSEK |
E6:E8197 |
Отсчеты сигналов, мсек, для отображения сигналов. |
|
2 |
SI_ZOV |
A6:A8197 |
Значения сигнала, измеренного на задней опоре в вертикальном направлении |
|
3 |
SI_ZOH |
B6:B8197 |
Значения сигнала, измеренного на задней опоре в горизонтальном направлении |
|
4 |
SI_ZOA |
C6:C8197 |
Значения сигнала, измеренного на задней опоре в осевом направлении |
|
5 |
SI_POV |
G6:G8197 |
Значения сигнала, измеренного на передней опоре в вертикальном направлении |
|
6 |
SI_POH |
H6:H8197 |
Значения сигнала, измеренного на передней опоре в горизонтальном направлении |
|
7 |
TP |
K6:K19 |
Значения технологических параметров |
|
8 |
U_NAME |
F3 |
Имя выбранного агрегата |
|
9 |
DiagDate |
J3 |
Дата и время измерения |
|
10 |
kodZ |
I3 |
1 - нет сигнала ЗО верт; 2 - нет сигнала ЗО гориз; 4 - нет сигнала ЗО осев; 8- нет сигнала ПО верт; 16 - нет сигнала ПО гориз; 32 - ошибки чтения технологических параметров. |
Загрузка данных происходит по нажатию пользователем кнопки «Шаг 1: Загрузка сигналов» (см. пункт 5.4). По нажатию этой кнопки происходит вызов процедуры public bool LoadFromExcel(string fileName). Внутри процедуры находится связка try{}.. catch{}. Если при загрузке данных возникла ошибка, то внутри catch{} происходит вызов return false и пользователю выдается сообщение, что при загрузке данных произошла ошибка. Если ошибки нет - функция возвращает true.
Для загрузки данных из Excel
пришлось добавить ссылку на соответствующую Com-сборку.
using Excel = Microsoft.Office.Interop.Excel;
public bool LoadFromExcel(string fileName)
{.Application excelapp;.Window excelWindow; //Окно.Workbooks excelappworkbooks; // Рабочие книги.Workbook excelappworkbook; // рабочая книга.Sheets excelsheets; //Листы.Worksheet excelworksheet; //Лист.Range excelcells; //Ячейки= new Excel.Application();.Visible = false;
{= excelapp.Workbooks;
//Открываем книгу и получаем на нее ссылку= excelapp.Workbooks.Open(fileName,.Missing, Type.Missing, Type.Missing, Type.Missing,.Missing, Type.Missing, Type.Missing, Type.Missing,.Missing, Type.Missing, Type.Missing, Type.Missing,.Missing, Type.Missing);= excelappworkbook.Worksheets;
//Получаем ссылку на лист 1= (Excel.Worksheet)excelsheets.get_Item(1);
//считываем Название= excelworksheet.get_Range("F3", Type.Missing);_NAME = Convert.ToString(excelcells.Value2);
//считываем дату= excelworksheet.get_Range("J3", Type.Missing);= Convert.ToString(excelcells.Value2);= excelworksheet.get_Range("A4", Type.Missing);= Convert.ToInt32(excelcells.Value2);= excelworksheet.get_Range("K4", Type.Missing);= Convert.ToInt32(excelcells.Value2);= excelworksheet.get_Range("I3", Type.Missing); //kodZ= Convert.ToInt32(excelcells.Value2);(kodZ != 1) //ЗО верт SI_ZOV
{_ZOV = new Massiv();_ZOV.Add(new Queue((Array)excelworksheet.get_Range("A6",
"A" + (6 + CountInMas - 1).ToString()).Cells.Value2));
}
{_ZOV = new Massiv();_ZOV.Add(new Queue((Array)new double[CountInMas]));
}.Quit();true;
}
{.Quit();false;
}}
При успешной загрузке файла сигналов, открывается доступ к кнопке «Шаг 2: Загрузка конфигурации».
. Загрузка конфигурации агрегата
Файл конфигурации имеет структуру, представленную в таблице 5.2. Разделители полей везде пробелы. Кодировка файла - UTF-8.
Таблица 5.2 - Структура файла конфигурации агрегата
|
№ строки файла |
Состав |
Пример |
|
1 |
Имя конфигурации |
ГПА_1 |
|
2 |
Значение максимального виброперемещения |
Smax 52 |
|
3 |
Границы Fo - нижняя и верхняя границы |
Fo 80 85 |
|
4 |
Маркер начала описателей опор: «Опоры» |
Опоры |
|
5 |
Номер опоры, тип подшипника, его характеристики в зависимости от типа. Для скольжения: «скл» - число вкладышей опорной и упорной частей. Для качения: «кач<номер>» Dвнутр, Dнар, Dтк, Nтк, угол с опорой |
1 скл 5 6 2 кач 0322 110 240 41.28 8 0 |
|
6 |
Маркер конца описателей опор: «Опоры-к» |
Опоры-к |
|
7 |
Число зубьев передачи - ведущая шестерня (Fz) ведомая шестерня (Fред) |
ЗП 19 26 |
|
8 |
Муфта - число зубьев/пальцев |
Мф 10 |
|
9 |
Число направляющих лопаток на диафрагме |
НА 28 |
|
9 |
Число лопаток на каждом колесе (группе колес) |
Лоп 13 13 13 |
|
10 |
Маркер начала матрицы ДС: «ДС» |
ДС |
|
11 |
Перечень ДС с указанием номеров физических опор. Для каждого ДС - одна запись формата: <Имя ДС по справочнику> <Имя ДС для Протокола> Имя ДС не может содержать пробелов. |
Дисбаланс_вала Дисбаланс_вала_ГПА1 |
|
12 |
Маркер конца матрицы ДС: «ДС-к» |
ДС-к |
После нажатия кнопки «Шаг 2: Загрузка конфигурации» происходит вызов функции bool SetConfigFile(string fname), где осуществляется проверка на соответствие файла требуемой структуре. В частности проверяется наличие маркеров «ДС», «ДС-к», «Опоры», «Опоры-к». При успешном прохождении проверки данные считываются, функция возвращает true и открывается доступ к следующей кнопке «Шаг 3: Загрузка справочника ДС» (см. пункт 5.4).
. Загрузка справочника диагностических состояний
Файл справочника диагностических состояний имеет структуру, представленную в таблице 5.3. Разделители полей везде пробелы. Кодировка файла - UTF-8.
Таблица 5.3 - Структура файла справочника диагностических состояний
|
№ строки файла |
Состав |
Пример |
|
1 |
Заголовок |
Справочник ДС |
|
2 |
Имя ДС, n блоков <Имя пар-ра>:<номер опоры> Если параметр связан с другими: <Имя пар-ра>:<номер опоры>И(<Имя пар-ра>:<номер опоры>ИЛИ<Имя пар-ра>:<номер опоры>) |
Дисбаланс_вала SFo:1 Дисбаланс_вала RFo:2 ИЛИ AFo:2 |
<Номер опоры> может принимать значения:
- Передняя опора.
- Задняя опора.
- Задняя опора в осевом направлении.
- Технологические параметры.
Как и в случае с предыдущим файлом происходит
вызов функции проверки правильности структуры файла bool SetDiagnFlle(string
fname). При успешном завершении данные считываются и открывается доступ к
следующей кнопке «Шаг 4: Диагностика» (см. пункт 5.4).
5.3.2 Предварительная обработка информации для диагностирования
Для запуска процесса диагностирования необходимо
предварительно переработать вводимую информацию: преобразовать сигналы
виброперемещения в спектры виброперемещения и виброускорения, вычислить
оборотную частоту вращения вала нагнетателя и рассчитать уставки, зависящие от
оборотной частоты вращения вала [13]. Кроме того, нужно убедиться, что сигналы,
полученные с датчиков валидные, т.е. проверить было ли вообще считывание
сигнала, не было ли обрыва линии на середине считывания, не выдается ли ложный
сигнал, в связи с плохим креплением датчика к опоре ЦБН. Блок-схема алгоритма
предварительной обработки виброакустических данных для выполнения
диагностирования изображена на рисунке 5.2.
Рисунок 5.2 - Алгоритм предварительной обработки
виброакустических данных
Для расчета сигналов виброперемещения используется процедура SetSpektr(). Сигналы, измеренные с опоры, преобразуются с помощью быстрого преобразования Фурье (БПФ) в массив комплексных чисел. Затем полученный массив нормализуется в массив вещественных чисел. Для использования БПФ и комплексных чисел к проекту была подключена бесплатная математическая библиотека AlgLib.
void SetSpektr ()
{j = CountInMas / 2;fmaxFFT = (int)4000 * 1.28;freqmax = 4000;[] dd;= new Massiv();(int i = 0; i < j; i++)
{.Add((i * fmaxFFT) / j);
}
//SI_ZOV= SI_ZOV.ToDoubleMas;= new AP.Complex[0];.fft.fftr1d(ref dd, CountInMas, ref FZOV);= Norm(FZOV);
}
Спектры виброускорения рассчитываются из спектров виброперемещения c помощью функции AP.Complex[] FillA(AP.Complex[] compMas).
AP.Complex[] FillA(AP.Complex[] compMas)
{SpecChanelPrice = 1.25;.Complex[] res = new AP.Complex[CountInMas / 2];(int i = 0; i < CountInMas / 2; i++)
{ymn = Math.Pow(2 * Math.PI * i * SpecChanelPrice, 2.0) / 1000000;[i] = new AP.Complex(compMas[i].x * ymn, compMas[i].y * ymn);
}res;
}
Проверка сигнала на те или иные неисправности происходит в следующем куске кода.
.Text = "SI_ZOV";(noSignal(SI_ZOV.Disp))
{.Text += ": Нет сигнала";.BackColor = Color.Tomato;
}if (ZeroShift(SI_ZOV.SrAr))
{.Text += ": Смещение нуля";.BackColor = Color.Tomato;
}if (lineBreak(fS06FoZov,freq[1],S06FoZov,Szov_fo))
{.Text += ": Обрыв линии";.BackColor = Color.Tomato;
}if (deviceMalfunction(lzov,Szov_fo))
{.Text += ": Плохое крепление датчика";.BackColor = Color.Tomato;
}
{.Text += ": Есть сигнал";.BackColor = Color.LimeGreen;
}
По синтаксису эти функции довольно просты. Например, функция проверки сигнала bool noSignal(SI_ZOV.Disp) показывает отсутствие сигнала, когда дисперсия массива сигнала меньше единицы, а смещение нуля ZeroShift(SI_ZOV.SrAr) диагностируется, если среднее арифметическое массива сигналов больше 0.001.
bool ZeroShift(double p1)
{res;(Math.Abs(p1) < 0.001)= false;= true;res;
}bool noSignal(double p1)
{res;(Math.Abs(p1) > 1)= false;= true;res;
5.3.3 Расчет диагностических параметров
Диагностические параметры можно разбить на следующие типы:
1) Частота вращения вала нагнетателя Fo.
) Размах виброперемещения Sр(Fo) - величина, определяемая руководством по эксплуатации ЦБН и свидетельствующая об общем состоянии опоры и агрегата. В скобках (в данном случае Fo) указывается частота, на которой рассчитан данный параметр.
3) Амплитуда пика в спектре виброперемещения S(Fo) и виброускорения A(Fo).
) Наличие пика и бокового пика на определенной частоте R(Fo) и Ra(Fo), которое определяется в виде отношения амплитуды спектра на соответствующей частоте к среднему уровню спектра в окрестности данной частоты.
) Параметры, определяющий число гармоник указанной частоты М(Fo) и Ma(Fo), присутствующих в конкретном спектре.
) Параметр, характеризующий превышение амплитуды определенной частоты над другими информативными пиками EXCS(Fo).
Рассмотрим тонкости вычисления этих параметров ниже.
Наибольший вклад в максимальную величину (Smax)
вносят гармоники и субгармоники частоты вращения вала Fo.
Для этого общий уровень вибрации Smax
(определяемый пользователем, по умолчанию 52 мкм.) раскладывается обратно
пропорционально номеру гармоники N
частоты вращения вала Fo
[14]. Размах виброперемещения Sp
на частоте вращения Fo
оценивается равным половине Smax.
Таким образом,
Smax(1) = Smax/2,
Smax(N) = Smax/2/Сум/N,
где Сум = 1/0.5+1/2+1/3+1/4+…1/9+1/10,
а N - номер гармоники.
Важным диагностическим параметром является частота вращения вала - Fo. Для расчета нужно взять значение технологического параметра «Fo СТ». По спектру виброперемещения найти пик в диапазоне ± 2.5 Гц. Из 5 каналов выбирается наибольший по амплитуде. Затем берется выбранный канал и по одному каналу с каждой стороны и с использованием квадратичной аппроксимации по трем точкам, находится его реальное значение (вещественное) как значение частоты перегиба аппроксимационной функции. Найденное значение и есть Fo, которое используется как основа пересчета частот при дальнейших расчетах. Для квадратичной аппроксимации по трем точкам используется класс Polynomial из библиотеки AlgLib. Функция, иллюстрирующая этот алгоритм, представлена ниже.