commit 5b5c8e01b55e66be2da96463c57f5ddc649c8b82 Author: aleksey_k Date: Wed Nov 15 22:06:15 2023 +0900 first commit diff --git a/solid/belt.js b/solid/belt.js new file mode 100644 index 0000000..d1e5c0a --- /dev/null +++ b/solid/belt.js @@ -0,0 +1,530 @@ +"use strict"; +var signals = gtl.options.record.signalsModel; +var options = gtl.options; +var record = gtl.options.record; +var point = gtl.options.point; + +var imp = gtl.import("unimodule.js"); + +//настройки для датчика оборотов +var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра +filter_freq.kind = gtl.filter_iir.butterworth; //тип окна +filter_freq.type = gtl.filter_iir.lowpass; //тип фильтра (ФНЧ) +filter_freq.order = 8; //порядок фильтра +filter_freq.frequency = 10; //граничная частота фильтра + +//определение частоты вращения +var freq = gtl.add_value_freq(filter_freq); +freq.time = 1; +freq.avg_cnt = 6; +//gtl.diagnostic.interval = /*1*/10; + +//[Блок настройки параметров измерений] +//мониторинговый спектр вибрации +var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации +ausp2.name = "AUSPm"; //присвоение имени спектра +ausp2.color = 0x0000ffff; //цвет линии спектра +ausp2.frequency = 1600; //граничная частота спектра +ausp2.lines = 1600; //разрешение спектра (количество линий) +ausp2.average = 6; //количество усреднений +ausp2.unit = gtl.spec.db; //отображение в дБ + +//спектр вибрации +var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации +ausp.name = "AUSPd"; //присвоение имени спектра +ausp.color = 0x0000ff00; //цвет линии спектра +//ausp.frequency = 1600; //граничная частота спектра +ausp.lines = 1600; //разрешение спектра (количество линий) +ausp.average = 6; //количество усреднений +ausp.unit = gtl.spec.db; //отображение в дБ +ausp.smoothing_factor = 50; //коэффициент сглаживания спектра +ausp.smoothed_line_color = 0x000000ff; //цвет линии сглаживания (средней линии) +ausp.peak_level = 20; //порог обнаружения гармоник +ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/- + +//фильтр для формирования спектра огибающей +var n = 3; //количество долей октавного фильтра +var kf = (2 ** (1 / n) - 1) / ((2 ** (1 / n)) ** (1 / 2));//коэффициент для полосового фильтра +var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра +filter_spen.kind = gtl.filter_iir.butterworth; //тип окна +filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter_spen.order = 10; //порядок фильтра +filter_spen.frequency = 6400; //центральная частота полосового фильтра +//filter_spen.frequency = 6013.41 * Math.log(0.266935 * imp.FREQ() + 1.1201); //расчетная центральная частота полосового фильтра +filter_spen.color = 255; +filter_spen.width = kf * filter_spen.frequency; //ширина полосы фильтра + +//спектр огибающей +var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей +spen.name = "SPEN"; //присвоение имени спектра огибающей +spen.color = 0x00ff0000; //цвет линии спектра огибающей +//spen.frequency = spen_frequency(); //граничная частота спектра огибающей +//spen.lines = spen_lines(); //разрешение спектра огибающей (количество линий) +spen.average = 8; //количество усреднений +spen.unit = gtl.spec.db; //отображение в дБ +spen.window = gtl.spec.hann; //окно +spen.smoothing_factor = 100; //коэффициент сглаживания спектра +spen.smoothed_line_color = 0xff004dff; //цвет средней линии +spen.peak_level = 10; //порог обнаружения гармоник +spen.harm_tolerance = spen.resolution; //диапазон поиска гармоник +/- + +//RMS и Amplitude в диапазоне спектра огибающей (контроль работы сил трения) +var rms_spen = gtl.add_value_rms(filter_spen); //назначение переменной RMS (spen) +var ampl_spen = gtl.add_value_ampl(filter_spen); //назначение переменной Amplitude (spen) +rms_spen.name = "RMS (spen)" //присвоение имени RMS (spen) +rms_spen.time = 0.5; //интервал расчета RMS (spen) +ampl_spen.time = 0.5; //интервал расчета Amplitude (spen) +rms_spen.avg_cnt = 4; //количество усреднений RMS (spen) +ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen) + +//RMS и Amplitude в УВЧ диапазоне 10-25 кГц (контроль разрыва масляной пленки) +var filter_uhf = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный) +filter_uhf.kind = gtl.filter_iir.butterworth; //тип окна +filter_uhf.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter_uhf.order = 10; //порядок фильтра +filter_uhf.frequency = 17500; //центральная частота полосового фильтра +filter_uhf.width = 15000; //ширина полосы фильтра + +var rms_uhf = gtl.add_value_rms(filter_uhf); //назначение переменной RMS +var ampl_uhf = gtl.add_value_ampl(filter_uhf); //назначение переменной Amplitude +rms_uhf.name = "RMS (uhf)" //присвоение имени RMS (uhf) +rms_uhf.time = 0.5; //интервал расчета RMS (uhf) +ampl_uhf.time = 0.5; //интервал расчета Amplitude (uhf) +rms_uhf.avg_cnt = 4; //количество усреднений RMS (uhf) +ampl_uhf.avg_cnt = 4; //количество усреднений Amplitude (uhf) + +//Виброскорость в дипазоне 2-1000 Гц (вибромониторинг) +var filter2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный) +filter2_1000.kind = gtl.filter_iir.butterworth; //тип окна +filter2_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter2_1000.order = 10; //порядок фильтра +filter2_1000.frequency = 501; //центральная частота полосового фильтра +filter2_1000.width = 998; //ширина полосы фильтра +var filter2_1000v = gtl.add_intg(filter2_1000); // интегрирование +filter2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное) + +var rms_v2 = gtl.add_value_rms(filter2_1000v); //назначение переменной RMS(V) +rms_v2.name = "RMS(V) 2-1000 Гц" //присвоение имени RMS(V) +rms_v2.time = 0.5; //интервал расчета RMS(V) +rms_v2.avg_cnt = 4; //количество усреднений RMS(V) + +//Виброскорость в дипазоне 10-1000 Гц (вибромониторинг) +var filter10_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный) +filter10_1000.kind = gtl.filter_iir.butterworth; //тип окна +filter10_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter10_1000.order = 10; //порядок фильтра +filter10_1000.frequency = 505; //центральная частота полосового фильтра +filter10_1000.width = 990; //ширина полосы фильтра +var filter10_1000v = gtl.add_intg(filter10_1000); // интегрирование +filter10_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное) + +var rms_v10 = gtl.add_value_rms(filter10_1000v); //назначение переменной RMS(V) +rms_v10.name = "RMS(V) 10-1000 Гц" //присвоение имени RMS(V) +rms_v10.time = 0.5; //интервал расчета RMS(V) +rms_v10.avg_cnt = 4; //количество усреднений RMS(V) + +//[Диагностика] +gtl.diagnostic.interval = freq.time * freq.avg_cnt; +let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала +let acq_time = 0; + +function diagnose() { + switch (state) { + case 0: // считаем частоту вращения и настраиваем спектры + if (imp.INSTABILITY() > imp.tolerance()) { + gtl.log.info("Критическая нестабильность частоты вращения, %", imp.INSTABILITY() * 100); + gtl.log.info("Результат:", "Диагностика прервана"); + //gtl.diagnostic.stop(); //принудительная остановка диагностики + + let __result = { + Result: false + }; + gtl.results = __result; + }; + + if (imp.FREQ() <= imp.FREQNESS()) { + gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + imp.FREQNESS()); + }; + + //установка стандартной ширины спектра огибающей и количества линий спектра + filter_spen.frequency = imp.filter_frequency(); + filter_spen.width = imp.filter_width(); + + spen.frequency = imp.standart_width(); + spen.lines = imp.standart_lines(); + + ausp.frequency = imp.standart_width(); + ausp.lines = imp.standart_lines(); + + //определение минимально необходимой длительности сигнала для проведения диагностики + var acq_times = []; + acq_times.push(ausp.acq_time); + acq_times.push(spen.acq_time); + acq_time = Math.max(...acq_times); + + gtl.diagnostic.interval = acq_time; + state = 3; + break; + + case 1: //частота вращения фиксированная + //установка стандартной ширины спектра огибающей и количества линий спектра + filter_spen.frequency = imp.filter_frequency(); + filter_spen.width = imp.filter_width(); + + spen.frequency = imp.standart_width(); + spen.lines = imp.standart_lines(); + + ausp.frequency = imp.standart_width(); + ausp.lines = imp.standart_lines(); + + //определение минимально необходимой длительности сигнала для проведения диагностики + var acq_times = []; + acq_times.push(ausp.acq_time); + acq_times.push(spen.acq_time); + acq_time = Math.max(...acq_times); + + gtl.diagnostic.interval = acq_time; + state = 3; + break; + + case 2: //частота вращения из поля INFO (виброметр) + //установка стандартной ширины спектра огибающей и количества линий спектра + filter_spen.frequency = imp.filter_frequency(); + filter_spen.width = imp.filter_width(); + + spen.frequency = imp.standart_width(); + spen.lines = imp.standart_lines(); + + ausp.frequency = imp.standart_width(); + ausp.lines = imp.standart_lines(); + + //определение минимально необходимой длительности сигнала для проведения диагностики + var acq_times = []; + acq_times.push(ausp.acq_time); + acq_times.push(spen.acq_time); + acq_time = Math.max(...acq_times); + + gtl.diagnostic.interval = acq_time; + state = 3; + break; + + case 3: //выполняем анализ спектов + ausp.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре вибрации + spen.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре огибающей + + //[Блок настройки определения гармоник в спектрах] + //AUSP + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + var ausp_f0 = ausp.add_harms_set(imp.FREQ(), 10, 0xff0000f0, 2); //биение вала "синий" + for (let i = 0; i <= 9; i++) { ausp_f0.harms[i].tolerance = (1 + i) * imp.FREQ() * imp.tolerance() }; //коридор обнаружения гармоник + ausp_f0.name = 'Биение вала'; + + var ausp_BPFO2 = ausp.add_harms_set(imp.BPFO(), 10, 0xff009000, 2); //раковины на наружном кольце "зелёный" + for (let i = 0; i <= 9; i++) { ausp_BPFO2.harms[i].tolerance = (1 + i) * imp.BPFO() * imp.tolerance() }; + ausp_BPFO2.name = 'Раковины на наружном кольце'; + + var ausp_BPFI2 = ausp.add_harms_set(imp.BPFI(), 10, 0xff990090, 2); //раковины на внутреннем кольце "фиолетовый" + for (let i = 0; i <= 9; i++) { ausp_BPFI2.harms[i].tolerance = (1 + i) * imp.BPFI() * imp.tolerance() }; + ausp_BPFI2.name = 'Раковины на внутреннем кольце'; + + var ausp_BSF0 = ausp.add_harms_set(imp.BSF(), 20, 0xff994000, 2); //раковины и сколы на телах качения "оранжевый" + for (let i = 0; i <= 19; i++) { ausp_BSF0.harms[i].tolerance = (1 + i) * imp.BSF() * imp.tolerance() }; + ausp_BSF0.name = 'Раковины и сколы на телах качения'; + + //добавляем модулирующие гармоники: частота, кол-во, цвет, вес + ausp.harms_sets[1].modulate(imp.FTF(), 2, 0xff009030, 1); //модуляция Fн +/- Fс "зелёный" + ausp.harms_sets[1].modulate(imp.FREQ(), 2, 0xff009030, 1); //модуляция Fн +/- Fвр "зелёный" + ausp.harms_sets[2].modulate(imp.FREQ(), 2, 0xff923090, 1); //модуляция Fв +/- Fвр "фиолетовый" + ausp.harms_sets[3].modulate(imp.FTF(), 2, 0xff996000, 1); //модуляция Fтк +/- Fс "горчичный" + + //при необходимости можно изменить параметры каждой гармоники индивидуально + /* + ausp.harms_sets[0].harms[0].color = 0x0000ffff; + ausp.harms_sets[0].harms[0].weight = 1; + ausp.harms_sets[0].harms[2].color = 0x0000ff00; + ausp.harms_sets[0].harms[0].weight = 0.5; + ausp.harms_sets[0].modulating[0].harms[0].color = 0x00ffff00; + ausp.harms_sets[0].modulating[0].harms[0].weight = 5; + */ + + //SPEN + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + var spen_f0 = spen.add_harms_set(imp.FREQ(), 10, 0xff0000f0, 1); //биение вала - "синий" + for (let i = 0; i <= 9; i++) { spen_f0.harms[i].tolerance = (1 + i) * imp.FREQ() * imp.tolerance() }; //коридор обнаружения гармоник + spen_f0.name = 'Биение вала'; + + var spen_f1 = spen.add_harms_set(2 * imp.FREQ(), 5, 0xff009ff0, 2); //неоднородный радиальный натяг "голубой" + for (let i = 0; i <= 4; i++) { spen_f1.harms[i].tolerance = 2 * (1 + i) * imp.FREQ() * imp.tolerance() }; + spen_f1.name = 'Неоднородный радиальный натяг'; + + var spen_BPFO0 = spen.add_harms_set(imp.BPFO(), 5, 0xff009000, 1); //износ дорожки качения наружного кольца "зелёный" + for (let i = 0; i <= 4; i++) { spen_BPFO0.harms[i].tolerance = (1 + i) * imp.BPFO() * imp.tolerance() }; + spen_BPFO0.name = 'Износ дорожки качения наружного кольца'; + + var spen_BPFO1 = spen.add_harms_set(2 * imp.BPFO(), spen.frequency / (2 * imp.BPFO()), 0xff009000, 2); //перекос наружного кольца "зелёный" + for (let i = 0; i <= (spen.frequency / (2 * imp.BPFO())) - 1; i++) { spen_BPFO1.harms[i].tolerance = 2 * (1 + i) * imp.BPFO() * imp.tolerance() }; + spen_BPFO1.name = 'Перекос наружного кольца'; + + var spen_BPFO2 = spen.add_harms_set(imp.BPFO(), spen.frequency / imp.BPFO(), 0xff009000, 1); //раковины на наружном кольце "зелёный" + for (let i = 0; i <= (spen.frequency / imp.BPFO()) - 1; i++) { spen_BPFO2.harms[i].tolerance = (1 + i) * imp.BPFO() * imp.tolerance() }; + spen_BPFO2.name = 'Раковины на наружном кольце'; + + var spen_BPFI0 = spen.add_harms_set(imp.FREQ(), 5, 0xff0000f0, 1); //износ дорожки качения внутреннего кольца "синий" + for (let i = 0; i <= 4; i++) { spen_BPFI0.harms[i].tolerance = (1 + i) * imp.FREQ() * imp.tolerance() }; + spen_BPFI0.name = 'Износ дорожки качения внутреннего кольца'; + + var spen_BPFI1 = spen.add_harms_set(imp.BPFI(), 5, 0xff990090, 1); //износ дорожки качения внутреннего кольца "фиолетовый" + for (let i = 0; i <= 4; i++) { spen_BPFI1.harms[i].tolerance = (1 + i) * imp.BPFI() * imp.tolerance() }; + spen_BPFI1.name = 'Износ дорожки качения внутреннего кольца (вторичный признак)'; + + var spen_BPFI2 = spen.add_harms_set(imp.BPFI(), spen.frequency / imp.BPFI(), 0xff990090, 1); //раковины на внутреннем кольце "фиолетовый" + for (let i = 0; i <= (spen.frequency / imp.BPFI()) - 1; i++) { spen_BPFI2.harms[i].tolerance = (1 + i) * imp.BPFI() * imp.tolerance() }; + spen_BPFI2.name = 'Раковины на внутреннем кольце'; + + var spen_FTF0 = spen.add_harms_set(imp.FTF(), 10, 0xffff0000, 2); //износ тел качения и сепаратора "красный" + for (let i = 0; i <= 9; i++) { spen_FTF0.harms[i].tolerance = (1 + i) * imp.FTF() * imp.tolerance() }; + spen_FTF0.name = 'Износ тел качения и сепаратора'; + + var spen_BSF0 = spen.add_harms_set(imp.BSF(), 10, 0xff994000, 1); //раковины и сколы на телах качения "оранжевый" + for (let i = 0; i <= 9; i++) { spen_BSF0.harms[i].tolerance = (1 + i) * imp.BSF() * imp.tolerance() }; + spen_BSF0.name = 'Раковины и сколы на телах качения'; + + //добавляем модулирующие гармоники: частота, кол-во, цвет, вес + spen.harms_sets[4].modulate(imp.FTF(), 2, 0xff009030, 1); //модуляция Fн +/- Fс "зелёный" + spen.harms_sets[4].modulate(imp.FREQ(), 2, 0xff009030, 1); //модуляция Fн +/- Fвр "зелёный" + spen.harms_sets[7].modulate(imp.FREQ(), 2, 0xff923090, 1); //модуляция Fв +/- Fвр "фиолетовый" + spen.harms_sets[9].modulate(imp.FTF(), 3, 0xff996000, 1); //модуляция Fтк +/- Fс "горчичный" + + //при необходимости можно изменить параметры каждой гармоники индивидуально + /* + spen.harms_sets[0].harms[0].color = 0x0000ffff; + spen.harms_sets[0].harms[0].weight = 1; + spen.harms_sets[0].harms[2].color = 0x0000ff00; + spen.harms_sets[0].harms[0].weight = 0.5; + spen.harms_sets[0].modulating[0].harms[0].color = 0x00ffff00; + spen.harms_sets[0].modulating[0].harms[0].weight = 5; + */ + + //Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра + var AQ = imp.spec_square(ausp2.data, 800, ausp2.frequency); + + //[Блок диагностики] + //вывод информации в лог + //gtl.log.info("description", function) + + gtl.log.info("Объект диагностики", "Подшипник качения " + options.rbModelName); + gtl.log.info("Минимально необходимая длительность сигнала", acq_time); + gtl.log.info("FREQ", imp.FREQ()); + gtl.log.info("Минимально необходимая частота вращения", imp.FREQNESS()); + gtl.log.info("Площадь спектра", AQ); + gtl.log.info("Нестабильность частоты вращения, %", imp.INSTABILITY() * 100); + gtl.log.info("FTF", imp.FTF()); + gtl.log.info("BPFO", imp.BPFO()); + gtl.log.info("BPFI", imp.BPFI()); + gtl.log.info("BSF", imp.BSF()); + gtl.log.info("Центральная частота полосового фильтра", filter_spen.frequency); + gtl.log.info("Количество долей октавного фильтра", n); + gtl.log.info("Коэффициент для октавного фильтра", kf); + gtl.log.info("Граничная частота спектра", imp.spec_frequency()); + gtl.log.info("Расчетное разрешение спектра", imp.spec_resolution()); + gtl.log.info("Расчетное количество линий", imp.spec_lines()); + gtl.log.info("Расчетный коридор обнаружения, %", imp.tolerance() * 100); + gtl.log.info("spen.frequency", spen.frequency); + gtl.log.info("spen.lines", spen.lines); + gtl.log.info("СКЗ(A) ВЧ вибрации", rms_spen.value); + gtl.log.info("СКЗ(A) УВЧ вибрации", rms_uhf.value); + gtl.log.info("ПФ(A) в ВЧ диапазоне", ampl_spen.value / rms_spen.value); + gtl.log.info("ПФ(A) в УВЧ диапазоне", ampl_uhf.value / rms_uhf.value); + gtl.log.info("СКЗ(V) 2-1000 Гц", rms_v2.value); + gtl.log.info("СКЗ(V) 10-1000 Гц", rms_v10.value); + + //вывод количества гармоник + //ausp.harms_sets[0].get_count(1, 2, 1, true); + //1 - начало отсчета гармоники; + //2 - допуситмое количество пропущенных в ряду; + //3 - количество модулирующих с одной стороны; + //4 - модулирующие с двух сторон (true); + + //вывод параметров гармоник + //ausp_set0.harms[1].is_present); //гармоника есть (есть превышение на порогом) + //ausp_set0.harms[1].amplitude); //амплитуда + //ausp_set0.harms[1].level); //превышении над средней + //ausp_set0.harms[1].base); //уровень фона под гармоникой + //ausp_set0.harms[1].tolerance; //коридор обнаружения гармоники + + var Defect = false; + var Defect_type = []; + + //биение вала + if ( + spen.harms_sets[0].get_count(0, 2) >= 1 && spen.harms_sets[0].get_count(0, 2) <= 10 && + ausp.harms_sets[0].get_count(0, 2) >= 0 && ausp.harms_sets[0].get_count(0, 2) <= 10 + ) { + Defect = true; + Defect_type.push("Биение вала"); + for (let i = 0; i <= 9; i++) { + if (spen_f0.harms[i].is_present == true) + gtl.log.info("Биение вала. Признаки в ES " + (i + 1) + "Fвр", imp.deep_factor(spen_f0.harms[i].amplitude, spen_f0.harms[i].base)); + } + + for (let i = 0; i <= 9; i++) { + if (ausp_f0.harms[i].is_present == true) + gtl.log.info("Биение вала. Признаки в AS " + (i + 1) + "Fвр", ausp_f0.harms[i].amplitude); + } + } + else + gtl.log.info("Биение вала", "Признаков дефекта не обнаружено"); + + //неоднородный радиальный натяг + if ( + spen_f1.harms[0].level >= spen_f0.harms[0].level && + spen.harms_sets[1].get_count(0) >= 1 && spen.harms_sets[1].get_count(0) <= 5 + ) { + Defect = true; + Defect_type.push("Неоднородный радиальный натяг"); + for (let i = 0; i <= 4; i++) { + if (spen_f1.harms[i].is_present == true) + gtl.log.info("Неоднородный радиальный натяг. Признаки в ES " + (i + 1) + "Fвр[x2]", imp.deep_factor(spen_f1.harms[i].amplitude, spen_f1.harms[i].base)); + } + } + else + gtl.log.info("Неоднородный радиальный натяг", "Признаков дефекта не обнаружено"); + + //износ дорожки качения наружного кольца + if (spen.harms_sets[2].get_count(0, 1) >= 1 && spen.harms_sets[2].get_count(0, 1) <= 5) { + Defect = true; + Defect_type.push("Износ дорожки качения наружного кольца"); + for (let i = 0; i <= 4; i++) { + if (spen_BPFO0.harms[i].is_present == true) + gtl.log.info("Износ дорожки качения наружного кольца. Признаки в ES " + (i + 1) + "Fн", imp.deep_factor(spen_BPFO0.harms[i].amplitude, spen_BPFO0.harms[i].base)); + } + } + else + gtl.log.info("Износ дорожки качения наружного кольца", "Признаков дефекта не обнаружено"); + + //перекос наружного кольца + if ( + spen_BPFO1.harms[0].level >= spen_BPFO0.harms[0].level && + spen.harms_sets[3].get_count(0, 1) >= 1 && spen.harms_sets[3].get_count(0, 1) <= 3 + ) { + Defect = true; + Defect_type.push("Перекос наружного кольца"); + for (let i = 0; i <= spen.frequency / (2 * imp.BPFO()) - 1; i++) { + if (spen_BPFO1.harms[i].is_present == true) + gtl.log.info("Перекос наружного кольца. Признаки в ES " + (i + 1) + "Fн[x2]", imp.deep_factor(spen_BPFO1.harms[i].amplitude, spen_BPFO1.harms[i].base)); + } + } + else + gtl.log.info("Перекос наружного кольца", "Признаков дефекта не обнаружено"); + + //раковины на наружном кольце + if ( + spen.harms_sets[4].get_count(0, 1) >= 5 && + ausp.harms_sets[1].get_count(0, 3) >= 5 + ) { + Defect = true; + Defect_type.push("Раковины на наружном кольце"); + for (let i = 0; i <= (spen.frequency / imp.BPFO()) - 1; i++) { + if (spen_BPFO2.harms[i].is_present == true) + gtl.log.info("Раковины на наружном кольце. Признаки в ES " + (i + 1) + "Fн", imp.deep_factor(spen_BPFO2.harms[i].amplitude, spen_BPFO2.harms[i].base)); + } + + for (let i = 0; i <= (spen.frequency / imp.BPFO()) - 1; i++) { + if (ausp_BPFO2.harms[i].is_present == true) + gtl.log.info("Раковины на наружном кольце. Признаки в AS " + (i + 1) + "Fн", ausp_BPFO2.harms[i].amplitude); + } + } + else + gtl.log.info("Раковины на наружном кольце", "Признаков дефекта не обнаружено"); + + //износ дорожки качения внутреннего кольца + if ( + (spen.harms_sets[5].get_count(0, 1) >= 1 && spen.harms_sets[5].get_count(0, 1) <= 2) || + (spen.harms_sets[6].get_count(0, 1) >= 1 && spen.harms_sets[6].get_count(0, 1) <= 2) + ) { + Defect = true; + Defect_type.push("Износ дорожки качения внутреннего кольца"); + for (let i = 0; i <= 2; i++) { + if (spen_BPFI0.harms[i].is_present == true) + gtl.log.info("Износ дорожки качения внутреннего кольца. Признаки в ES " + (i + 1) + "Fвр", imp.deep_factor(spen_BPFI0.harms[i].amplitude, spen_BPFI0.harms[i].base)); + else if (spen_BPFI1.harms[i].is_present == true) + gtl.log.info("Износ дорожки качения внутреннего кольца. Признаки в ES " + (i + 1) + "Fв", imp.deep_factor(spen_BPFI1.harms[i].amplitude, spen_BPFI1.harms[i].base)); + } + } + else + gtl.log.info("Износ дорожки качения внутреннего кольца", "Признаков дефекта не обнаружено"); + + //раковины на внутреннем кольце + if ( + spen.harms_sets[7].get_count(0, 0, 1) >= 3 && + ausp.harms_sets[2].get_count(0, 1, 1) >= 3 + ) { + Defect = true; + Defect_type.push("Раковины на внутреннем кольце"); + for (let i = 0; i <= (spen.frequency / imp.BPFI()) - 1; i++) { + if (spen_BPFI2.harms[i].is_present == true) + gtl.log.info("Раковины на внутреннем кольце. Признаки в ES " + (i + 1) + "Fв +/- Fвр", imp.deep_factor(spen_BPFI2.harms[i].amplitude, spen_BPFI2.harms[i].base)); + } + + for (let i = 0; i <= (spen.frequency / imp.BPFI()) - 1; i++) { + if (ausp_BPFI2.harms[i].is_present == true) + gtl.log.info("Раковины на внутреннем кольце. Признаки в AS " + (i + 1) + "Fв +/- Fвр", ausp_BPFI2.harms[i].amplitude); + } + } + else + gtl.log.info("Раковины на внутреннем кольце", "Признаков дефекта не обнаружено"); + + //износ тел качения и сепаратора + if (spen.harms_sets[8].get_count(0, 1) >= 1) { + Defect = true; + Defect_type.push("Износ тел качения и сепаратора"); + for (let i = 0; i <= 9; i++) { + if (spen_FTF0.harms[i].is_present == true) + gtl.log.info("Износ тел качения и сепаратора. Признаки в ES " + (i + 1) + "Fс", imp.deep_factor(spen_FTF0.harms[i].amplitude, spen_FTF0.harms[i].base)); + } + } + else + gtl.log.info("Износ тел качения и сепаратора", "Признаков дефекта не обнаружено"); + + //раковины и сколы на телах качения + if ( + spen.harms_sets[9].get_count(0, 1, 1) >= 3 && + ausp.harms_sets[3].get_count(0, 3, 1) >= 3 + ) { + Defect = true; + Defect_type.push("Раковины и сколы на телах качения"); + for (let i = 0; i <= 9; i++) { + if (spen_BSF0.harms[i].is_present == true) + gtl.log.info("Раковины и сколы на телах качения. Признаки в ES " + (i + 1) + "Fтк +/- Fс", imp.deep_factor(spen_BSF0.harms[i].amplitude, spen_BSF0.harms[i].base)); + } + + for (let i = 0; i <= 29; i++) { + if (ausp_BSF0.harms[i].is_present == true) + gtl.log.info("Раковины и сколы на телах качения. Признаки в AS " + (i + 1) + "Fтк +/- Fс", ausp_BSF0.harms[i].amplitude); + } + } + + else + gtl.log.info("Раковины и сколы на телах качения", "Признаков дефекта не обнаружено"); + + let __result = { + "Result": true, + "RMS(A)": rms_spen.value, + "RMS_UHF(A)": rms_uhf.value, + "PF(A)": ampl_spen.value / rms_spen.value, + "PF_UHF(A)": ampl_uhf.value / rms_uhf.value, + "RMS(V) 2-1000 Гц": rms_v2.value, + "RMS(V) 10-1000 Гц": rms_v10.value, + "Square": AQ, + "Defects": Defect, + "Types": Defect_type + }; + + gtl.results = __result; + gtl.diagnostic.stop(); + break; + + default: + break; + } +} \ No newline at end of file diff --git a/solid/gear transmission.js b/solid/gear transmission.js new file mode 100644 index 0000000..1ddac8d --- /dev/null +++ b/solid/gear transmission.js @@ -0,0 +1,441 @@ +"use strict"; +var signals = gtl.options.record.signalsModel; +var options = gtl.options; +var record = gtl.options.record; +var point = gtl.options.point; + +var imp = gtl.import("unimodule.js"); + +//настройки для датчика оборотов +var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра +filter_freq.kind = gtl.filter_iir.butterworth; //тип окна +filter_freq.type = gtl.filter_iir.lowpass; //тип фильтра (ФНЧ) +filter_freq.order = 8; //порядок фильтра +filter_freq.frequency = 10; //граничная частота фильтра + +//определение частоты вращения +var freq = gtl.add_value_freq(filter_freq); +freq.time = 1; +freq.avg_cnt = 6; +//gtl.diagnostic.interval = /*1*/10; + +//[Блок настройки параметров измерений] +//мониторинговый спектр вибрации +var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации +ausp2.name = "AUSPm"; //присвоение имени спектра +ausp2.color = 0x0000ffff; //цвет линии спектра +ausp2.frequency = 1600; //граничная частота спектра +ausp2.lines = 1600; //разрешение спектра (количество линий) +ausp2.average = 6; //количество усреднений +ausp2.unit = gtl.spec.db; //отображение в дБ + +//спектр вибрации +var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации +ausp.name = "AUSPd"; //присвоение имени спектра +ausp.color = 0x0000ff; //цвет линии спектра +//ausp.frequency = 1600; //граничная частота спектра +ausp.lines = 1600; //разрешение спектра (количество линий) +ausp.average = 6; //количество усреднений +ausp.unit = gtl.spec.db; //отображение в дБ +ausp.smoothing_factor = 50; //коэффициент сглаживания спектра +ausp.smoothed_line_color = 0x000000ff; //цвет линии сглаживания (средней линии) +ausp.peak_level = 20; //порог обнаружения гармоник +ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/- + +//фильтр для формирования спектра огибающей +var n = 3; //количество долей октавного фильтра +var kf = (2 ** (1 / n) - 1) / ((2 ** (1 / n)) ** (1 / 2));//коэффициент для полосового фильтра +var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра +filter_spen.kind = gtl.filter_iir.butterworth; //тип окна +filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter_spen.order = 10; //порядок фильтра +filter_spen.frequency = 8000; //центральная частота полосового фильтра +//filter_spen.frequency = 6013.41 * Math.log(0.266935 * imp.FREQ() + 1.1201); //расчетная центральная частота полосового фильтра +filter_spen.color = 255; +filter_spen.width = kf * filter_spen.frequency; //ширина полосы фильтра + +//спектр огибающей +var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей +spen.name = "SPEN"; //присвоение имени спектра огибающей +spen.color = 0x00ffaa00; //цвет линии спектра огибающей +//spen.frequency = spen_frequency(); //граничная частота спектра огибающей +//spen.lines = spen_lines(); //разрешение спектра огибающей (количество линий) +spen.average = 8; //количество усреднений +spen.unit = gtl.spec.db; //отображение в дБ +spen.window = gtl.spec.hann; //окно +spen.smoothing_factor = 100; //коэффициент сглаживания спектра +spen.smoothed_line_color = 0xff004dff; //цвет средней линии +spen.peak_level = 10; //порог обнаружения гармоник +spen.harm_tolerance = spen.resolution; //диапазон поиска гармоник +/- + +//RMS и Amplitude в диапазоне спектра огибающей (контроль работы сил трения) +var rms_spen = gtl.add_value_rms(filter_spen); //назначение переменной RMS (spen) +var ampl_spen = gtl.add_value_ampl(filter_spen); //назначение переменной Amplitude (spen) +rms_spen.name = "RMS (spen)" //присвоение имени RMS (spen) +rms_spen.time = 0.5; //интервал расчета RMS (spen) +ampl_spen.time = 0.5; //интервал расчета Amplitude (spen) +rms_spen.avg_cnt = 4; //количество усреднений RMS (spen) +ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen) + +//RMS и Amplitude в УВЧ диапазоне 10-25 кГц (контроль разрыва масляной пленки) +var filter_uhf = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный) +filter_uhf.kind = gtl.filter_iir.butterworth; //тип окна +filter_uhf.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter_uhf.order = 10; //порядок фильтра +filter_uhf.frequency = 17500; //центральная частота полосового фильтра +filter_uhf.width = 15000; //ширина полосы фильтра + +var rms_uhf = gtl.add_value_rms(filter_uhf); //назначение переменной RMS +var ampl_uhf = gtl.add_value_ampl(filter_uhf); //назначение переменной Amplitude +rms_uhf.name = "RMS (uhf)" //присвоение имени RMS (uhf) +rms_uhf.time = 0.5; //интервал расчета RMS (uhf) +ampl_uhf.time = 0.5; //интервал расчета Amplitude (uhf) +rms_uhf.avg_cnt = 4; //количество усреднений RMS (uhf) +ampl_uhf.avg_cnt = 4; //количество усреднений Amplitude (uhf) + +//Виброскорость в дипазоне 2-1000 Гц (вибромониторинг) +var filter2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный) +filter2_1000.kind = gtl.filter_iir.butterworth; //тип окна +filter2_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter2_1000.order = 10; //порядок фильтра +filter2_1000.frequency = 501; //центральная частота полосового фильтра +filter2_1000.width = 998; //ширина полосы фильтра +var filter2_1000v = gtl.add_intg(filter2_1000); // интегрирование +filter2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное) + +var rms_v2 = gtl.add_value_rms(filter2_1000v); //назначение переменной RMS(V) +rms_v2.name = "RMS(V) 2-1000 Гц" //присвоение имени RMS(V) +rms_v2.time = 0.5; //интервал расчета RMS(V) +rms_v2.avg_cnt = 4; //количество усреднений RMS(V) + +//Виброскорость в дипазоне 10-1000 Гц (вибромониторинг) +var filter10_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный) +filter10_1000.kind = gtl.filter_iir.butterworth; //тип окна +filter10_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter10_1000.order = 10; //порядок фильтра +filter10_1000.frequency = 505; //центральная частота полосового фильтра +filter10_1000.width = 990; //ширина полосы фильтра +var filter10_1000v = gtl.add_intg(filter10_1000); // интегрирование +filter10_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное) + +var rms_v10 = gtl.add_value_rms(filter10_1000v); //назначение переменной RMS(V) +rms_v10.name = "RMS(V) 10-1000 Гц" //присвоение имени RMS(V) +rms_v10.time = 0.5; //интервал расчета RMS(V) +rms_v10.avg_cnt = 4; //количество усреднений RMS(V) + +//[Диагностика] +gtl.diagnostic.interval = freq.time * freq.avg_cnt; +let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала +let acq_time = 0; + +function diagnose() { + switch (state) { + case 0: // считаем частоту вращения и настраиваем спектры + if (imp.INSTABILITY() > imp.tolerance()) { + gtl.log.info("Критическая нестабильность частоты вращения, %", imp.INSTABILITY() * 100); + gtl.log.info("Результат:", "Диагностика прервана"); + //gtl.diagnostic.stop(); //принудительная остановка диагностики + + let __result = { + Result: false + }; + gtl.results = __result; + }; + + //установка стандартной ширины спектра огибающей и количества линий спектра + spen.frequency = imp.standart_width(); + spen.lines = imp.standart_lines(); + filter_spen.frequency = 6013.41 * Math.log(0.266935 * imp.FREQ() + 1.1201); + ausp.frequency = imp.standart_width(); + //ausp.lines = imp.standart_lines(); + + //определение минимально необходимой длительности сигнала для проведения диагностики + var acq_times = []; + acq_times.push(ausp.acq_time); + acq_times.push(spen.acq_time); + acq_time = Math.max(...acq_times); + + gtl.diagnostic.interval = acq_time; + state = 3; + break; + + case 1: //частота вращения фиксированная + //установка стандартной ширины спектра огибающей и количества линий спектра + spen.frequency = imp.standart_width(); + spen.lines = imp.standart_lines(); + filter_spen.frequency = 6013.41 * Math.log(0.266935 * imp.FREQ() + 1.1201); + ausp.frequency = imp.standart_width(); + //ausp.lines = imp.standart_lines(); + + //определение минимально необходимой длительности сигнала для проведения диагностики + var acq_times = []; + acq_times.push(ausp.acq_time); + acq_times.push(spen.acq_time); + acq_time = Math.max(...acq_times); + + gtl.diagnostic.interval = acq_time; + state = 3; + break; + + case 2: //частота вращения из поля INFO (виброметр) + //установка стандартной ширины спектра огибающей и количества линий спектра + spen.frequency = imp.standart_width(); + spen.lines = imp.standart_lines(); + filter_spen.frequency = 6013.41 * Math.log(0.266935 * imp.FREQ() + 1.1201); + ausp.frequency = imp.standart_width(); + //ausp.lines = imp.standart_lines(); + + //определение минимально необходимой длительности сигнала для проведения диагностики + var acq_times = []; + acq_times.push(ausp.acq_time); + acq_times.push(spen.acq_time); + acq_time = Math.max(...acq_times); + + gtl.diagnostic.interval = acq_time; + state = 3; + break; + + case 3: //выполняем анализ спектов + ausp.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре вибрации + spen.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре огибающей + + //[Блок настройки определения гармоник в спектрах] + //AUSP + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + var ausp_f1 = ausp.add_harms_set(imp.FREQ(), 10, 0xff0000f0, 1); //биение вала (шестерни) + for (let i = 0; i <= 9; i++) { ausp_f1.harms[i].tolerance = (1 + i) * imp.FREQ() * imp.tolerance() }; //коридор обнаружения гармоник + ausp_f1.name = 'Биение вала (шестерни)'; + + var ausp_f2 = ausp.add_harms_set(imp.GTF2(), 10, 0xff009000, 1); //биение вала (зубчатого колеса) + for (let i = 0; i <= 9; i++) { ausp_f2.harms[i].tolerance = (1 + i) * imp.GTF2() * imp.tolerance() }; + ausp_f2.name = 'Биение вала (зубчатого колеса)'; + + var ausp_fz1 = ausp.add_harms_set(imp.GTFZ(), 5, 0xff990090, 1); //дефект зубьев шестерни + for (let i = 0; i <= 4; i++) { ausp_fz1.harms[i].tolerance = (1 + i) * imp.GTFZ() * imp.tolerance() }; + ausp_fz1.name = 'Дефект зубьев шестерни'; + + var ausp_fz2 = ausp.add_harms_set(imp.GTFZ(), 5, 0xff994000, 1); //Дефект зубьев зубчатого колеса + for (let i = 0; i <= 4; i++) { ausp_fz2.harms[i].tolerance = (1 + i) * imp.GTFZ() * imp.tolerance() }; + ausp_fz2.name = 'Дефект зубьев зубчатого колеса'; + + //добавляем модулирующие гармоники: частота, кол-во, цвет, вес + ausp.harms_sets[2].modulate(imp.FREQ(), 2, 0x000000ff, 1); //модуляция Fн +/- Fвр1 + ausp.harms_sets[3].modulate(imp.GTF2(), 2, 0x000000ff, 1); //модуляция Fн +/- Fвр2 + + //при необходимости можно изменить параметры каждой гармоники индивидуально + /* + ausp.harms_sets[0].harms[0].color = 0x0000ffff; + ausp.harms_sets[0].harms[0].weight = 1; + ausp.harms_sets[0].harms[2].color = 0x0000ff00; + ausp.harms_sets[0].harms[0].weight = 0.5; + ausp.harms_sets[0].modulating[0].harms[0].color = 0x00ffff00; + ausp.harms_sets[0].modulating[0].harms[0].weight = 5; + */ + + //SPEN + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + var spen_f1 = spen.add_harms_set(imp.FREQ(), 10, 0xff0000f0, 1); //биение вала (шестерни) + for (let i = 0; i <= 9; i++) { spen_f1.harms[i].tolerance = (1 + i) * imp.FREQ() * imp.tolerance() }; + spen_f1.name = 'Биение вала (шестерни)'; + + var spen_f2 = spen.add_harms_set(imp.GTF2(), 10, 0xff009000, 1); //биение вала (зубчатого колеса) + for (let i = 0; i <= 9; i++) { spen_f2.harms[i].tolerance = (1 + i) * imp.GTF2() * imp.tolerance() }; + spen_f2.name = 'Биение вала (зубчатого колеса)'; + + var spen_fz1 = spen.add_harms_set(imp.GTFZ(), 5, 0xff990090, 1); //дефект зубьев шестерни + for (let i = 0; i <= 4; i++) { spen_fz1.harms[i].tolerance = (1 + i) * imp.GTFZ() * imp.tolerance() }; + spen_fz1.name = 'Дефект зубьев шестерни'; + + var spen_fz2 = spen.add_harms_set(imp.GTFZ(), 5, 0xff994000, 1); //дефект зубьев зубчатого колеса + for (let i = 0; i <= 4; i++) { spen_fz2.harms[i].tolerance = (1 + i) * imp.GTFZ() * imp.tolerance() }; + spen_fz2.name = 'Дефект зубьев зубчатого колеса'; + + //добавляем модулирующие гармоники: частота, кол-во, цвет, вес + spen.harms_sets[2].modulate(imp.FREQ(), 2, 0xff0000f0, 1); //модуляция Fz +/- Fвр1 + spen.harms_sets[3].modulate(imp.GTF2(), 2, 0xff009000, 1); //модуляция Fz +/- Fвр2 + + //при необходимости можно изменить параметры каждой гармоники индивидуально + /* + spen.harms_sets[0].harms[0].color = 0x0000ffff; + spen.harms_sets[0].harms[0].weight = 1; + spen.harms_sets[0].harms[2].color = 0x0000ff00; + spen.harms_sets[0].harms[0].weight = 0.5; + spen.harms_sets[0].modulating[0].harms[0].color = 0x00ffff00; + spen.harms_sets[0].modulating[0].harms[0].weight = 5; + */ + + //Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра + var AQ = imp.ausp_square(ausp2.data, 800, ausp2.frequency); + + //[Блок диагностики] + //вывод информации в лог + //gtl.log.info("description", function) + + gtl.log.info("Минимально необходимая длительность сигнала", acq_time); + gtl.log.info("FREQ", imp.FREQ()); + gtl.log.info("FZ", imp.GTFZ()); + gtl.log.info("F2", imp.GTF2()); + gtl.log.info("Граничная частота спектра", imp.spen_frequency()); + gtl.log.info("Расчетное разрешение спектра", imp.spen_resolution()); + gtl.log.info("Расчетное количество линий", imp.spen_lines()); + gtl.log.info("Расчетный коридор обнаружения, %", imp.tolerance() * 100); + gtl.log.info("spen.frequency", spen.frequency); + gtl.log.info("spen.lines", spen.lines); + gtl.log.info("СКЗ(A) ВЧ вибрации", rms_spen.value); + gtl.log.info("СКЗ(A) УВЧ вибрации", rms_uhf.value); + gtl.log.info("ПФ(A) в ВЧ диапазоне", ampl_spen.value / rms_spen.value); + gtl.log.info("ПФ(F) в УВЧ диапазоне", ampl_uhf.value / rms_uhf.value); + gtl.log.info("СКЗ(V) 2-1000 Гц", rms_v2.value); + gtl.log.info("СКЗ(V) 10-1000 Гц", rms_v10.value); + + //вывод количества гармоник + //ausp.harms_sets[0].get_count(1, 2, 1, true); + //1 - начало отсчета гармоники; + //2 - допуситмое количество пропущенных в ряду; + //3 - количество модулирующих с одной стороны; + //4 - модулирующие с двух сторон (true); + + //вывод параметров гармоник + //ausp_set0.harms[1].is_present); //гармоника есть (есть превышение на порогом) + //ausp_set0.harms[1].amplitude); //амплитуда + //ausp_set0.harms[1].level); //превышении над средней + //ausp_set0.harms[1].base); //уровень фона под гармоникой + //ausp_set0.harms[1].tolerance; //коридор обнаружения гармоники + + var Defect = false; + var Defect_type = []; + + //биение вала шестерни + if ( + spen.harms_sets[0].get_count(1, 2) >= 3 & spen.harms_sets[0].get_count(1, 2) <= 5 & + ausp.harms_sets[0].get_count(1, 2) >= 3 & ausp.harms_sets[0].get_count(1, 2) <= 5 & + spen.harms_sets[2].get_count(1, 1, 1) >= 1 & spen.harms_sets[2].get_count(1, 1, 1) <= 3 & + ausp.harms_sets[2].get_count(1, 1, 1) >= 1 & ausp.harms_sets[2].get_count(1, 1, 1) <= 3 + ) { + Defect = true; + Defect_type.push("Биение вала шестрени"); + for (let i = 0; i <= 9; i++) { + if (spen_f1.harms[i].is_present == true) + gtl.log.info("Биение вала шестерни. Признаки в ES " + (i + 1) + "Fвр1", imp.deep_factor(spen_f1.harms[i].amplitude, spen_f1.harms[i].base)); + } + for (let i = 0; i <= 4; i++) { + if (spen_fz1.harms[i].is_present == true) + gtl.log.info("Биение вала шестерни. Признаки в ES " + (i + 1) + "Fz1", imp.deep_factor(spen_fz1.harms[i].amplitude, spen_fz1.harms[i].base)); + } + for (let i = 0; i <= 9; i++) { + if (ausp_f1.harms[i].is_present == true) + gtl.log.info("Биение вала шестерни. Признаки в AS " + (i + 1) + "Fвр1", ausp_f1.harms[i].amplitude); + } + for (let i = 0; i <= 4; i++) { + if (ausp_fz1.harms[i].is_present == true) + gtl.log.info("Биение вала шестерни. Признаки в AS " + (i + 1) + "Fz1", ausp_fz1.harms[i].amplitude); + } + } + else + gtl.log.info("Биение вала шестерни", "Признаков дефекта не обнаружено"); + + //биение вала зубчатого колеса + if ( + spen.harms_sets[1].get_count(1, 2) >= 3 & spen.harms_sets[1].get_count(1, 2) <= 5 & + ausp.harms_sets[1].get_count(1, 2) >= 3 & ausp.harms_sets[1].get_count(1, 2) <= 5 & + spen.harms_sets[3].get_count(1, 1, 1) >= 1 & spen.harms_sets[3].get_count(1, 1, 1) <= 3 & + ausp.harms_sets[3].get_count(1, 1, 1) >= 1 & ausp.harms_sets[3].get_count(1, 1, 1) <= 3 + ) { + Defect = true; + Defect_type.push("Биение вала зубчатого колеса"); + for (let i = 0; i <= 9; i++) { + if (spen_f2.harms[i].is_present == true) + gtl.log.info("Биение вала зубчатого колеса. Признаки в ES " + (i + 1) + "Fвр2", imp.deep_factor(spen_f2.harms[i].amplitude, spen_f2.harms[i].base)); + } + for (let i = 0; i <= 4; i++) { + if (spen_fz2.harms[i].is_present == true) + gtl.log.info("Биение вала зубчатого колеса. Признаки в ES " + (i + 1) + "Fz2", imp.deep_factor(spen_fz2.harms[i].amplitude, spen_fz2.harms[i].base)); + } + for (let i = 0; i <= 9; i++) { + if (ausp_f2.harms[i].is_present == true) + gtl.log.info("Биение вала зубчатого колеса. Признаки в AS " + (i + 1) + "Fвр2", ausp_f2.harms[i].amplitude); + } + for (let i = 0; i <= 4; i++) { + if (ausp_fz2.harms[i].is_present == true) + gtl.log.info("Биение вала зубчатого колеса. Признаки в AS " + (i + 1) + "Fz2", ausp_fz2.harms[i].amplitude); + } + } else + gtl.log.info("Биение вала зубчатого колеса", "Признаков дефекта не обнаружено"); + + //дефект зубьев шестерни + if ( + spen.harms_sets[0].get_count(1, 2) >= 5 & ausp.harms_sets[0].get_count(1, 2) >= 5 & + spen.harms_sets[2].get_count(1, 1, 1) >= 3 & spen.harms_sets[2].get_count(1, 1, 1) <= 5 & + ausp.harms_sets[2].get_count(1, 1, 1) >= 3 & ausp.harms_sets[2].get_count(1, 1, 1) <= 5 + ) { + Defect = true; + Defect_type.push("Дефект зубьев шестерни"); + for (let i = 0; i <= 9; i++) { + if (spen_f1.harms[i].is_present == true) + gtl.log.info("Дефект зубьев шестерни. Признаки в ES " + (i + 1) + "Fвр1", imp.deep_factor(spen_f1.harms[i].amplitude, spen_f1.harms[i].base)); + } + for (let i = 0; i <= 4; i++) { + if (spen_fz1.harms[i].is_present == true) + gtl.log.info("Дефект зубьев шестерни. Признаки в ES " + (i + 1) + "Fz1", imp.deep_factor(spen_fz1.harms[i].amplitude, spen_fz1.harms[i].base)); + } + for (let i = 0; i <= 9; i++) { + if (ausp_f1.harms[i].is_present == true) + gtl.log.info("Дефект зубьев шестерни. Признаки в AS " + (i + 1) + "Fвр1", ausp_f1.harms[i].amplitude); + } + for (let i = 0; i <= 4; i++) { + if (ausp_fz1.harms[i].is_present == true) + gtl.log.info("Дефект зубьев шестерни. Признаки в AS " + (i + 1) + "Fz1", ausp_fz1.harms[i].amplitude); + } + } + else + gtl.log.info("Дефект зубьев шестерни", "Признаков дефекта не обнаружено"); + + //дефект зубьев зубчатого колеса + if ( + spen.harms_sets[1].get_count(1, 2) >= 5 & ausp.harms_sets[1].get_count(1, 2) >= 5 & + spen.harms_sets[3].get_count(1, 1, 1) >= 3 & spen.harms_sets[3].get_count(1, 1, 1) <= 5 & + ausp.harms_sets[3].get_count(1, 1, 1) >= 3 & ausp.harms_sets[3].get_count(1, 1, 1) <= 5 + ) { + Defect = true; + Defect_type.push("Дефект зубьев зубчатого колеса"); + for (let i = 0; i <= 9; i++) { + if (spen_f2.harms[i].is_present == true) + gtl.log.info("Дефект зубьев зубчатого колеса. Признаки в ES " + (i + 1) + "Fвр2", inp.deep_factor(spen_f2.harms[i].amplitude, spen_f2.harms[i].base)); + } + for (let i = 0; i <= 4; i++) { + if (spen_fz2.harms[i].is_present == true) + gtl.log.info("Дефект зубьев зубчатого колеса. Признаки в ES " + (i + 1) + "Fz2", imp.deep_factor(spen_fz2.harms[i].amplitude, spen_fz2.harms[i].base)); + } + for (let i = 0; i <= 9; i++) { + if (ausp_f2.harms[i].is_present == true) + gtl.log.info("Дефект зубьев зубчатого колеса. Признаки в AS " + (i + 1) + "Fвр2", ausp_f2.harms[i].amplitude); + } + for (let i = 0; i <= 4; i++) { + if (ausp_fz2.harms[i].is_present == true) + gtl.log.info("Дефект зубьев зубчатого колеса. Признаки в AS " + (i + 1) + "Fz2", ausp_fz2.harms[i].amplitude); + } + } + else + gtl.log.info("Дефект зубьев зубчатого колеса", "Признаков дефекта не обнаружено"); + + let __result = { + "Result": true, + "RMS(A)": rms_spen.value, + "RMS_UHF(A)": rms_uhf.value, + "PF(A)": ampl_spen.value / rms_spen.value, + "PF_UHF(A)": ampl_uhf.value / rms_uhf.value, + "RMS(V) 2-1000 Гц": rms_v2.value, + "RMS(V) 10-1000 Гц": rms_v10.value, + "Square": AQ, + "Defects": Defect, + "Types": Defect_type + }; + + gtl.results = __result; + gtl.diagnostic.stop(); + break; + + default: + break; + } +} \ No newline at end of file diff --git a/solid/master_script.js b/solid/master_script.js new file mode 100644 index 0000000..f3238a5 --- /dev/null +++ b/solid/master_script.js @@ -0,0 +1,52 @@ +"use strict"; + +//gtl.results = { "Diagnostic results": gtl.options }; + +gtl.results = { + "Results 0": gtl.options['Sensor1'][0].resultJSON, + "Results 1": gtl.options['Sensor1'][1].resultJSON, + "Results 2": gtl.options['Sensor1'][2].resultJSON +}; //+ + + +//gtl.results = { "Diagnostic results": gtl.options['NKD'][0].resultJSON.RMS }; //+ +//gtl.results = { "Diagnostic results": gtld.node.options }; //+ +//gtl.results = { "Diagnostic results": gtld.node.getDiagnosticResult() }; //+ +//gtl.results = { "Diagnostic results": gtld.node.name }; //+ +//gtl.results = { "Diagnostic results": gtld.node.uuid.toString() }; //+ +//gtl.results = { "Diagnostic results": gtld.node.parent }; //+ + +/*gtl.results = { + "Diagnostic results": gtld.storage.selectLastPointMasterValue( + { + count: 1, + pointUUID: gtld.node.uuid.toString(), + objectUUID: gtld.node.parent.uuid.toString(), + tag: "0", + masterValueAddress: gtld.node.options["masterValueAddress"] + }) +};*/ + +/*gtl.results = { + "Diagnostic results": gtld.storage.selectLastObjectResults( + { + count: 3, + //pointUUID: gtld.node.uuid.toString(), + objectUUID: gtld.node.uuid.toString(), + tag: "0" + }) +};*/ + +/*gtl.results = { + "Diagnostic results": gtld.storage.selectLastPointMasterValue( + { + count: 3, + pointUUID: gtld.node.uuid.toString(), + objectUUID: gtld.node.parent.uuid.toString(), + tag: "0", + masterValueAddress: gtld.node.options["RMS"] + }) +};*/ + + + diff --git a/solid/planetary gear.js b/solid/planetary gear.js new file mode 100644 index 0000000..ac6ddd5 --- /dev/null +++ b/solid/planetary gear.js @@ -0,0 +1,459 @@ +"use strict"; +var signals = gtl.options.record.signalsModel; +var options = gtl.options; +var record = gtl.options.record; +var point = gtl.options.point; + +var imp = gtl.import("unimodule.js"); + +//настройки для датчика оборотов +var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра +filter_freq.kind = gtl.filter_iir.butterworth; //тип окна +filter_freq.type = gtl.filter_iir.lowpass; //тип фильтра (ФНЧ) +filter_freq.order = 8; //порядок фильтра +filter_freq.frequency = 10; //граничная частота фильтра + +//определение частоты вращения +var freq = gtl.add_value_freq(filter_freq); +freq.time = 1; +freq.avg_cnt = 6; +//gtl.diagnostic.interval = /*1*/10; + +//[Блок настройки параметров измерений] +//мониторинговый спектр вибрации +var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации +ausp2.name = "AUSPm"; //присвоение имени спектра +ausp2.color = 0x0000ffff; //цвет линии спектра +ausp2.frequency = 1600; //граничная частота спектра +ausp2.lines = 1600; //разрешение спектра (количество линий) +ausp2.average = 6; //количество усреднений +ausp2.unit = gtl.spec.db; //отображение в дБ + +//спектр вибрации +var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации +ausp.name = "AUSPd"; //присвоение имени спектра +ausp.color = 0x00008500; //цвет линии спектра +//ausp.frequency = 1600; //граничная частота спектра +ausp.lines = 1600; //разрешение спектра (количество линий) +ausp.average = 6; //количество усреднений +ausp.unit = gtl.spec.db; //отображение в дБ +ausp.smoothing_factor = 50; //коэффициент сглаживания спектра +ausp.smoothed_line_color = 0x000000ff; //цвет линии сглаживания (средней линии) +ausp.peak_level = 20; //порог обнаружения гармоник +ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/- + +//фильтр для формирования спектра огибающей +var n = 3; //количество долей октавного фильтра +var kf = (2 ** (1 / n) - 1) / ((2 ** (1 / n)) ** (1 / 2));//коэффициент для полосового фильтра +var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра +filter_spen.kind = gtl.filter_iir.butterworth; //тип окна +filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter_spen.order = 10; //порядок фильтра +filter_spen.frequency = 8000; //центральная частота полосового фильтра +//filter_spen.frequency = 6013.41 * Math.log(0.266935 * imp.FREQ() + 1.1201); //расчетная центральная частота полосового фильтра +filter_spen.color = 255; +filter_spen.width = kf * filter_spen.frequency; //ширина полосы фильтра + +//спектр огибающей +var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей +spen.name = "SPEN"; //присвоение имени спектра огибающей +spen.color = 0x00ff7373; //цвет линии спектра огибающей +//spen.frequency = spen_frequency(); //граничная частота спектра огибающей +//spen.lines = spen_lines(); //разрешение спектра огибающей (количество линий) +spen.average = 8; //количество усреднений +spen.unit = gtl.spec.db; //отображение в дБ +spen.window = gtl.spec.hann; //окно +spen.smoothing_factor = 100; //коэффициент сглаживания спектра +spen.smoothed_line_color = 0xff004dff; //цвет средней линии +spen.peak_level = 10; //порог обнаружения гармоник +spen.harm_tolerance = spen.resolution; //диапазон поиска гармоник +/- + +//RMS и Amplitude в диапазоне спектра огибающей (контроль работы сил трения) +var rms_spen = gtl.add_value_rms(filter_spen); //назначение переменной RMS (spen) +var ampl_spen = gtl.add_value_ampl(filter_spen); //назначение переменной Amplitude (spen) +rms_spen.name = "RMS (spen)" //присвоение имени RMS (spen) +rms_spen.time = 0.5; //интервал расчета RMS (spen) +ampl_spen.time = 0.5; //интервал расчета Amplitude (spen) +rms_spen.avg_cnt = 4; //количество усреднений RMS (spen) +ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen) + +//RMS и Amplitude в УВЧ диапазоне 10-25 кГц (контроль разрыва масляной пленки) +var filter_uhf = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный) +filter_uhf.kind = gtl.filter_iir.butterworth; //тип окна +filter_uhf.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter_uhf.order = 10; //порядок фильтра +filter_uhf.frequency = 17500; //центральная частота полосового фильтра +filter_uhf.width = 15000; //ширина полосы фильтра + +var rms_uhf = gtl.add_value_rms(filter_uhf); //назначение переменной RMS +var ampl_uhf = gtl.add_value_ampl(filter_uhf); //назначение переменной Amplitude +rms_uhf.name = "RMS (uhf)" //присвоение имени RMS (uhf) +rms_uhf.time = 0.5; //интервал расчета RMS (uhf) +ampl_uhf.time = 0.5; //интервал расчета Amplitude (uhf) +rms_uhf.avg_cnt = 4; //количество усреднений RMS (uhf) +ampl_uhf.avg_cnt = 4; //количество усреднений Amplitude (uhf) + +//Виброскорость в дипазоне 2-1000 Гц (вибромониторинг) +var filter2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный) +filter2_1000.kind = gtl.filter_iir.butterworth; //тип окна +filter2_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter2_1000.order = 10; //порядок фильтра +filter2_1000.frequency = 501; //центральная частота полосового фильтра +filter2_1000.width = 998; //ширина полосы фильтра +var filter2_1000v = gtl.add_intg(filter2_1000); // интегрирование +filter2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное) + +var rms_v2 = gtl.add_value_rms(filter2_1000v); //назначение переменной RMS(V) +rms_v2.name = "RMS(V) 2-1000 Гц" //присвоение имени RMS(V) +rms_v2.time = 0.5; //интервал расчета RMS(V) +rms_v2.avg_cnt = 4; //количество усреднений RMS(V) + +//Виброскорость в дипазоне 10-1000 Гц (вибромониторинг) +var filter10_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный) +filter10_1000.kind = gtl.filter_iir.butterworth; //тип окна +filter10_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter10_1000.order = 10; //порядок фильтра +filter10_1000.frequency = 505; //центральная частота полосового фильтра +filter10_1000.width = 990; //ширина полосы фильтра +var filter10_1000v = gtl.add_intg(filter10_1000); // интегрирование +filter10_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное) + +var rms_v10 = gtl.add_value_rms(filter10_1000v); //назначение переменной RMS(V) +rms_v10.name = "RMS(V) 10-1000 Гц" //присвоение имени RMS(V) +rms_v10.time = 0.5; //интервал расчета RMS(V) +rms_v10.avg_cnt = 4; //количество усреднений RMS(V) + +//[Диагностика] +gtl.diagnostic.interval = freq.time * freq.avg_cnt; +let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала +let acq_time = 0; + +function diagnose() { + switch (state) { + case 0: // считаем частоту вращения и настраиваем спектры + if (imp.INSTABILITY() > imp.tolerance()) { + gtl.log.info("Критическая нестабильность частоты вращения, %", imp.INSTABILITY() * 100); + gtl.log.info("Результат:", "Диагностика прервана"); + //gtl.diagnostic.stop(); //принудительная остановка диагностики + + let __result = { + Result: false + }; + gtl.results = __result; + }; + + //установка стандартной ширины спектра огибающей и количества линий спектра + spen.frequency = imp.standart_width(); + spen.lines = imp.standart_lines(); + filter_spen.frequency = 6013.41 * Math.log(0.266935 * imp.FREQ() + 1.1201); + ausp.frequency = imp.standart_width(); + //ausp.lines = imp.standart_lines(); + + //определение минимально необходимой длительности сигнала для проведения диагностики + var acq_times = []; + acq_times.push(ausp.acq_time); + acq_times.push(spen.acq_time); + acq_time = Math.max(...acq_times); + + gtl.diagnostic.interval = acq_time; + state = 3; + break; + + case 1: //частота вращения фиксированная + //установка стандартной ширины спектра огибающей и количества линий спектра + spen.frequency = imp.standart_width(); + spen.lines = imp.standart_lines(); + filter_spen.frequency = 6013.41 * Math.log(0.266935 * imp.FREQ() + 1.1201); + ausp.frequency = imp.standart_width(); + //ausp.lines = imp.standart_lines(); + + //определение минимально необходимой длительности сигнала для проведения диагностики + var acq_times = []; + acq_times.push(ausp.acq_time); + acq_times.push(spen.acq_time); + acq_time = Math.max(...acq_times); + + gtl.diagnostic.interval = acq_time; + state = 3; + break; + + case 2: //частота вращения из поля INFO (виброметр) + //установка стандартной ширины спектра огибающей и количества линий спектра + spen.frequency = imp.standart_width(); + spen.lines = imp.standart_lines(); + //filter_spen.frequency = 6013.41 * Math.log(0.266935 * imp.FREQ() + 1.1201); + ausp.frequency = imp.standart_width(); + //ausp.lines = imp.standart_lines(); + + //определение минимально необходимой длительности сигнала для проведения диагностики + var acq_times = []; + acq_times.push(ausp.acq_time); + acq_times.push(spen.acq_time); + acq_time = Math.max(...acq_times); + + gtl.diagnostic.interval = acq_time; + state = 3; + break; + + case 3: //выполняем анализ спектов + ausp.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре вибрации + spen.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре огибающей + + //[Блок настройки определения гармоник в спектрах] + //AUSP + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + var Nsat = options.pgN; + + var ausp_f1 = ausp.add_harms_set(imp.FREQ(), 10, 0xff004dff, 1); //биение ведущего вала + for (let i = 0; i <= 9; i++) { ausp_f1.harms[i].tolerance = (1 + i) * imp.FREQ() * imp.tolerance() }; //коридор обнаружения гармоник + ausp_f1.name = 'Биение ведущего вала'; + + var ausp_f2 = ausp.add_harms_set(imp.PGF2(), 10, 0xff004dff, 1); //биение ведомого вала + for (let i = 0; i <= 9; i++) { ausp_f2.harms[i].tolerance = (1 + i) * imp.PGF2() * imp.tolerance() }; + ausp_f2.name = 'Биение ведомого вала'; + + var ausp_fz1 = ausp.add_harms_set(Nsat * (imp.FREQ() - imp.PGF2()), 5, 0xff004dff, 1); //дефект ведущей шестерни + for (let i = 0; i <= 4; i++) { ausp_fz1.harms[i].tolerance = (1 + i) * Nsat * (imp.FREQ() - imp.PGF2()) * imp.tolerance() }; + ausp_fz1.name = 'Дефект ведущей шестерни'; + + var ausp_fsat = ausp.add_harms_set(2 * imp.PGFSAT(), 5, 0xff004dff, 1); //Дефекты сателлита + for (let i = 0; i <= 4; i++) { ausp_fsat.harms[i].tolerance = (1 + i) * imp.PGFSAT() * imp.tolerance() }; + ausp_fsat.name = 'Дефекты сателлита'; + + var ausp_fcrown = ausp.add_harms_set(Nsat * imp.PGF2(), 5, 0xff004dff, 1); //Дефекты короны + for (let i = 0; i <= 4; i++) { ausp_fcrown.harms[i].tolerance = (1 + i) * Nsat * imp.PGF2() * imp.tolerance() }; + ausp_fcrown.name = 'Дефекты короны'; + + var ausp_fz2 = ausp.add_harms_set(imp.PGFZ(), 5, 0xff004dff, 1); //Дефекты зубчатого зацепления + for (let i = 0; i <= 4; i++) { ausp_fz2.harms[i].tolerance = (1 + i) * imp.PGFZ() * imp.tolerance() }; + ausp_fz2.name = 'Дефекты зубчатого зацепления'; + + //добавляем модулирующие гармоники: частота, кол-во, цвет, вес + //ausp.harms_sets[2].modulate(imp.FREQ(), 2, 0x000000ff, 1); //модуляция Fн +/- Fвр1 + //ausp.harms_sets[3].modulate(imp.GTF2(), 2, 0x000000ff, 1); //модуляция Fн +/- Fвр2 + + //при необходимости можно изменить параметры каждой гармоники индивидуально + /* + ausp.harms_sets[0].harms[0].color = 0x0000ffff; + ausp.harms_sets[0].harms[0].weight = 1; + ausp.harms_sets[0].harms[2].color = 0x0000ff00; + ausp.harms_sets[0].harms[0].weight = 0.5; + ausp.harms_sets[0].modulating[0].harms[0].color = 0x00ffff00; + ausp.harms_sets[0].modulating[0].harms[0].weight = 5; + */ + + //SPEN + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + var spen_f1 = spen.add_harms_set(imp.FREQ(), 10, 0xff004dff, 1); //биение ведущего вала + for (let i = 0; i <= 9; i++) { spen_f1.harms[i].tolerance = (1 + i) * imp.FREQ() * imp.tolerance() }; //коридор обнаружения гармоник + spen_f1.name = 'Биение ведущего вала'; + + var spen_f2 = spen.add_harms_set(imp.PGF2(), 10, 0xff004dff, 1); //биение ведомого вала + for (let i = 0; i <= 9; i++) { spen_f2.harms[i].tolerance = (1 + i) * imp.PGF2() * imp.tolerance() }; + spen_f2.name = 'Биение ведомого вала'; + + var spen_fz1 = spen.add_harms_set(Nsat * (imp.FREQ() - imp.PGF2()), 5, 0xff004dff, 1); //дефект ведущей шестерни + for (let i = 0; i <= 4; i++) { spen_fz1.harms[i].tolerance = (1 + i) * Nsat * (imp.FREQ() - imp.PGF2()) * imp.tolerance() }; + spen_fz1.name = 'Дефект ведущей шестерни'; + + var spen_fsat = spen.add_harms_set(2 * imp.PGFSAT(), 5, 0xff004dff, 1); //Дефекты сателлита + for (let i = 0; i <= 4; i++) { spen_fsat.harms[i].tolerance = (1 + i) * imp.PGFSAT() * imp.tolerance() }; + spen_fsat.name = 'Дефекты сателлита'; + + var spen_fcrown = spen.add_harms_set(Nsat * imp.PGF2(), 5, 0xff004dff, 1); //Дефекты короны + for (let i = 0; i <= 4; i++) { spen_fcrown.harms[i].tolerance = (1 + i) * Nsat * imp.PGF2() * imp.tolerance() }; + spen_fcrown.name = 'Дефекты короны'; + + var spen_fz2 = spen.add_harms_set(imp.PGFZ(), 3, 0xff004dff, 1); //Дефекты зубчатого зацепления + for (let i = 0; i <= 2; i++) { spen_fz2.harms[i].tolerance = (1 + i) * imp.PGFZ() * imp.tolerance() }; + spen_fz2.name = 'Дефекты зубчатого зацепления'; + + //добавляем модулирующие гармоники: частота, кол-во, цвет, вес + //spen.harms_sets[2].modulate(imp.FREQ(), 2, 0x000000ff, 1); //модуляция Fн +/- Fвр1 + //spen.harms_sets[3].modulate(imp.GTF2(), 2, 0x000000ff, 1); //модуляция Fн +/- Fвр2 + + //при необходимости можно изменить параметры каждой гармоники индивидуально + /* + spen.harms_sets[0].harms[0].color = 0x0000ffff; + spen.harms_sets[0].harms[0].weight = 1; + spen.harms_sets[0].harms[2].color = 0x0000ff00; + spen.harms_sets[0].harms[0].weight = 0.5; + spen.harms_sets[0].modulating[0].harms[0].color = 0x00ffff00; + spen.harms_sets[0].modulating[0].harms[0].weight = 5; + */ + + //Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра + var AQ = imp.ausp_square(ausp2.data, 800, ausp2.frequency); + + //[Блок диагностики] + //вывод информации в лог + //gtl.log.info("description", function) + + gtl.log.info("Минимально необходимая длительность сигнала", acq_time); + gtl.log.info("FREQ", imp.FREQ()); + gtl.log.info("FZ", imp.PGFZ()); + gtl.log.info("F2", imp.PGF2()); + gtl.log.info("Граничная частота спектра", imp.spen_frequency()); + gtl.log.info("Расчетное разрешение спектра", imp.spen_resolution()); + gtl.log.info("Расчетное количество линий", imp.spen_lines()); + gtl.log.info("Расчетный коридор обнаружения, %", imp.tolerance() * 100); + gtl.log.info("spen.frequency", spen.frequency); + gtl.log.info("spen.lines", spen.lines); + gtl.log.info("СКЗ(A) ВЧ вибрации", rms_spen.value); + gtl.log.info("СКЗ(A) УВЧ вибрации", rms_uhf.value); + gtl.log.info("ПФ(A) в ВЧ диапазоне", ampl_spen.value / rms_spen.value); + gtl.log.info("ПФ(A) в УВЧ диапазоне", ampl_uhf.value / rms_uhf.value); + gtl.log.info("СКЗ(V) 2-1000 Гц", rms_v2.value); + gtl.log.info("СКЗ(V) 10-1000 Гц", rms_v10.value); + + //вывод количества гармоник + //ausp.harms_sets[0].get_count(1, 2, 1, true); + //1 - начало отсчета гармоники; + //2 - допуситмое количество пропущенных в ряду; + //3 - количество модулирующих с одной стороны; + //4 - модулирующие с двух сторон (true); + + //вывод параметров гармоник + //ausp_set0.harms[1].is_present); //гармоника есть (есть превышение на порогом) + //ausp_set0.harms[1].amplitude); //амплитуда + //ausp_set0.harms[1].level); //превышении над средней + //ausp_set0.harms[1].base); //уровень фона под гармоникой + //ausp_set0.harms[1].tolerance; //коридор обнаружения гармоники + + var Defect = false; + var Defect_type = []; + + //биение ведущего вала + if ( + spen.harms_sets[0].get_count(1, 2) >= 3 & + ausp.harms_sets[0].get_count(1, 2) >= 3 + ) { + Defect = true; + Defect_type.push("Биение ведущего вала"); + for (i = 0; i <= 9; i++) { + if (spen_f1.harms[i].is_present == true) + gtl.log.info("Биение ведущего вала. Признаки в ES " + (i + 1) + "Fвр1", imp.deep_factor(spen_f1.harms[i].amplitude, spen_f1.harms[i].base)); + } + for (i = 0; i <= 9; i++) { + if (ausp_f1.harms[i].is_present == true) + gtl.log.info("Биение ведущего вала. Признаки в AS " + (i + 1) + "Fвр1", ausp_f1.harms[i].amplitude); + } + } + else + gtl.log.info("Биение ведущего вала", "Признаков дефекта не обнаружено"); + + //биение ведомого вала + if ( + spen.harms_sets[1].get_count(1, 2) >= 3 & + ausp.harms_sets[1].get_count(1, 2) >= 3 + ) { + Defect = true; + Defect_type.push("Биение ведомого вала"); + for (i = 0; i <= 9; i++) { + if (spen_f2.harms[i].is_present == true) + gtl.log.info("Биение ведомого вала. Признаки в ES " + (i + 1) + "Fвр2", imp.deep_factor(spen_f2.harms[i].amplitude, spen_f2.harms[i].base)); + } + for (i = 0; i <= 9; i++) { + if (ausp_f2.harms[i].is_present == true) + gtl.log.info("Биение ведомого вала. Признаки в ES " + (i + 1) + "Fвр2", ausp_f2.harms[i].amplitude); + } + } else + gtl.log.info("Биение ведомого вала", "Признаков дефекта не обнаружено"); + + //дефект ведущей шестерни + if ( + spen.harms_sets[2].get_count(1, 1) > 2 & + ausp.harms_sets[2].get_count(1, 1) > 2 + ) { + Defect = true; + Defect_type.push("Дефект ведущей шестерни"); + for (i = 0; i <= 4; i++) { + if (spen_fz1.harms[i].is_present == true) + gtl.log.info("Дефект ведущей шестерни. Признаки в ES " + (i + 1) + "Fвр1", imp.deep_factor(spen_fz1.harms[i].amplitude, spen_fz1.harms[i].base)); + } + for (i = 0; i <= 4; i++) { + if (ausp_fz1.harms[i].is_present == true) + gtl.log.info("Дефект ведущей шестерни. Признаки в AS " + (i + 1) + "Fz1", ausp_fz1.harms[i].amplitude); + } + } + else + gtl.log.info("Дефект ведущей шестерни", "Признаков дефекта не обнаружено"); + + //дефект сателлита + if ( + spen.harms_sets[3].get_count(1, 1) > 2 & + ausp.harms_sets[3].get_count(1, 1) > 2 + ) { + Defect = true; + Defect_type.push("Дефект сателлита"); + for (i = 0; i <= 4; i++) { + if (spen_fsat.harms[i].is_present == true) + gtl.log.info("Дефект сателлита. Признаки в ES " + (i + 1) + "Fсат", imp.deep_factor(spen_fsat.harms[i].amplitude, spen_fsat.harms[i].base)); + } + for (i = 0; i <= 4; i++) { + if (ausp_fsat.harms[i].is_present == true) + gtl.log.info("Дефект сателлита. Признаки в AS " + (i + 1) + "Fсат", ausp_fsat.harms[i].amplitude); + } + } + else + gtl.log.info("Дефект сателлита", "Признаков дефекта не обнаружено"); + + //дефект короны + if ( + spen.harms_sets[4].get_count(1, 1) > 2 & + ausp.harms_sets[4].get_count(1, 1) > 2 + ) { + Defect = true; + Defect_type.push("Дефект короны"); + for (i = 0; i <= 4; i++) { + if (spen_fcrown.harms[i].is_present == true) + gtl.log.info("Дефект короны. Признаки в ES " + (i + 1) + "Fвр2", imp.deep_factor(spen_fcrown.harms[i].amplitude, spen_fcrown.harms[i].base)); + } + for (i = 0; i <= 4; i++) { + if (ausp_fcrown.harms[i].is_present == true) + gtl.log.info("Дефект короны. Признаки в AS " + (i + 1) + "Fвр2", ausp_fcrown.harms[i].amplitude); + } + } + else + gtl.log.info("Дефект короны", "Признаков дефекта не обнаружено"); + + //дефекты зубчатого зацепления + if ( + spen.harms_sets[5].get_count(1, 1) > 2 & + ausp.harms_sets[5].get_count(1, 1) > 2 + ) { + Defect = true; + Defect_type.push("Дефекты зубчатого зацепления"); + for (i = 0; i <= 4; i++) { + if (spen_fz2.harms[i].is_present == true) + gtl.log.info("Дефекты зубчатого зацепления. Признаки в ES " + (i + 1) + "Fz", imp.deep_factor(spen_fz2.harms[i].amplitude, spen_fz2.harms[i].base)); + } + for (i = 0; i <= 4; i++) { + if (ausp_fz2.harms[i].is_present == true) + gtl.log.info("Дефекты зубчатого зацепления. Признаки в AS " + (i + 1) + "Fz", ausp_fz2.harms[i].amplitude); + } + } + else + gtl.log.info("Дефекты зубчатого зацепления", "Признаков дефекта не обнаружено"); + + let __result = { + "Result": true, + "RMS(A)": rms_spen.value, + "RMS_UHF(A)": rms_uhf.value, + "PF(A)": ampl_spen.value / rms_spen.value, + "PF_UHF(A)": ampl_uhf.value / rms_uhf.value, + "RMS(V) 2-1000 Гц": rms_v2.value, + "RMS(V) 10-1000 Гц": rms_v10.value, + "Square": AQ, + "Defects": Defect, + "Types": Defect_type + }; + + gtl.results = __result; + gtl.diagnostic.stop(); + break; + + default: + break; + } +} \ No newline at end of file diff --git a/solid/rolling bearing.js b/solid/rolling bearing.js new file mode 100644 index 0000000..5b2fc1f --- /dev/null +++ b/solid/rolling bearing.js @@ -0,0 +1,521 @@ +"use strict"; +var signals = gtl.options.record.signalsModel; +var options = gtl.options; +var record = gtl.options.record; +var point = gtl.options.point; + +var imp = gtl.import("unimodule.js"); + +//настройки для датчика оборотов +var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра +filter_freq.kind = gtl.filter_iir.butterworth; //тип окна +filter_freq.type = gtl.filter_iir.lowpass; //тип фильтра (ФНЧ) +filter_freq.order = 8; //порядок фильтра +filter_freq.frequency = 10; //граничная частота фильтра + +//определение частоты вращения +var freq = gtl.add_value_freq(filter_freq); +freq.time = 1; +freq.avg_cnt = 6; +//gtl.diagnostic.interval = /*1*/10; + +//[Блок настройки параметров измерений] +//мониторинговый спектр вибрации +var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации +ausp2.name = "AUSPm"; //присвоение имени спектра +ausp2.color = 0x0000ffff; //цвет линии спектра +ausp2.frequency = 1600; //граничная частота спектра +ausp2.lines = 1600; //разрешение спектра (количество линий) +ausp2.average = 6; //количество усреднений +ausp2.unit = gtl.spec.db; //отображение в дБ + +//спектр вибрации +var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации +ausp.name = "AUSPd"; //присвоение имени спектра +ausp.color = 0x0000ff00; //цвет линии спектра +//ausp.frequency = 1600; //граничная частота спектра +ausp.lines = 1600; //разрешение спектра (количество линий) +ausp.average = 6; //количество усреднений +ausp.unit = gtl.spec.db; //отображение в дБ +ausp.smoothing_factor = 50; //коэффициент сглаживания спектра +ausp.smoothed_line_color = 0x000000ff; //цвет линии сглаживания (средней линии) +ausp.peak_level = 20; //порог обнаружения гармоник +ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/- + +//фильтр для формирования спектра огибающей +var n = 3; //количество долей октавного фильтра +var kf = (2 ** (1 / n) - 1) / ((2 ** (1 / n)) ** (1 / 2));//коэффициент для полосового фильтра +var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра +filter_spen.kind = gtl.filter_iir.butterworth; //тип окна +filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter_spen.order = 10; //порядок фильтра +filter_spen.frequency = 6400; //центральная частота полосового фильтра +//filter_spen.frequency = 6013.41 * Math.log(0.266935 * imp.FREQ() + 1.1201); //расчетная центральная частота полосового фильтра +filter_spen.color = 255; +filter_spen.width = kf * filter_spen.frequency; //ширина полосы фильтра + +//спектр огибающей +var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей +spen.name = "SPEN"; //присвоение имени спектра огибающей +spen.color = 0x00ff0000; //цвет линии спектра огибающей +//spen.frequency = spen_frequency(); //граничная частота спектра огибающей +//spen.lines = spen_lines(); //разрешение спектра огибающей (количество линий) +spen.average = 8; //количество усреднений +spen.unit = gtl.spec.db; //отображение в дБ +spen.window = gtl.spec.hann; //окно +spen.smoothing_factor = 100; //коэффициент сглаживания спектра +spen.smoothed_line_color = 0xff004dff; //цвет средней линии +spen.peak_level = 10; //порог обнаружения гармоник +spen.harm_tolerance = spen.resolution; //диапазон поиска гармоник +/- + +//RMS и Amplitude в диапазоне спектра огибающей (контроль работы сил трения) +var rms_spen = gtl.add_value_rms(filter_spen); //назначение переменной RMS (spen) +var ampl_spen = gtl.add_value_ampl(filter_spen); //назначение переменной Amplitude (spen) +rms_spen.name = "RMS (spen)" //присвоение имени RMS (spen) +rms_spen.time = 0.5; //интервал расчета RMS (spen) +ampl_spen.time = 0.5; //интервал расчета Amplitude (spen) +rms_spen.avg_cnt = 4; //количество усреднений RMS (spen) +ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen) + +//RMS и Amplitude в УВЧ диапазоне 10-25 кГц (контроль разрыва масляной пленки) +var filter_uhf = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный) +filter_uhf.kind = gtl.filter_iir.butterworth; //тип окна +filter_uhf.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter_uhf.order = 10; //порядок фильтра +filter_uhf.frequency = 17500; //центральная частота полосового фильтра +filter_uhf.width = 15000; //ширина полосы фильтра + +var rms_uhf = gtl.add_value_rms(filter_uhf); //назначение переменной RMS +var ampl_uhf = gtl.add_value_ampl(filter_uhf); //назначение переменной Amplitude +rms_uhf.name = "RMS (uhf)" //присвоение имени RMS (uhf) +rms_uhf.time = 0.5; //интервал расчета RMS (uhf) +ampl_uhf.time = 0.5; //интервал расчета Amplitude (uhf) +rms_uhf.avg_cnt = 4; //количество усреднений RMS (uhf) +ampl_uhf.avg_cnt = 4; //количество усреднений Amplitude (uhf) + +//Виброскорость в дипазоне 2-1000 Гц (вибромониторинг) +var filter2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный) +filter2_1000.kind = gtl.filter_iir.butterworth; //тип окна +filter2_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter2_1000.order = 10; //порядок фильтра +filter2_1000.frequency = 501; //центральная частота полосового фильтра +filter2_1000.width = 998; //ширина полосы фильтра +var filter2_1000v = gtl.add_intg(filter2_1000); // интегрирование +filter2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное) + +var rms_v2 = gtl.add_value_rms(filter2_1000v); //назначение переменной RMS(V) +rms_v2.name = "RMS(V) 2-1000 Гц" //присвоение имени RMS(V) +rms_v2.time = 0.5; //интервал расчета RMS(V) +rms_v2.avg_cnt = 4; //количество усреднений RMS(V) + +//Виброскорость в дипазоне 10-1000 Гц (вибромониторинг) +var filter10_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный) +filter10_1000.kind = gtl.filter_iir.butterworth; //тип окна +filter10_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter10_1000.order = 10; //порядок фильтра +filter10_1000.frequency = 505; //центральная частота полосового фильтра +filter10_1000.width = 990; //ширина полосы фильтра +var filter10_1000v = gtl.add_intg(filter10_1000); // интегрирование +filter10_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное) + +var rms_v10 = gtl.add_value_rms(filter10_1000v); //назначение переменной RMS(V) +rms_v10.name = "RMS(V) 10-1000 Гц" //присвоение имени RMS(V) +rms_v10.time = 0.5; //интервал расчета RMS(V) +rms_v10.avg_cnt = 4; //количество усреднений RMS(V) + +//[Диагностика] +gtl.diagnostic.interval = freq.time * freq.avg_cnt; +let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала +let acq_time = 0; + +function diagnose() { + switch (state) { + case 0: // считаем частоту вращения и настраиваем спектры + if (imp.INSTABILITY() > imp.tolerance()) { + gtl.log.info("Критическая нестабильность частоты вращения, %", imp.INSTABILITY() * 100); + gtl.log.info("Результат:", "Диагностика прервана"); + //gtl.diagnostic.stop(); //принудительная остановка диагностики + + let __result = { + Result: false + }; + gtl.results = __result; + }; + + if (imp.FREQ() <= imp.FREQNESS()) { + gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + imp.FREQNESS()); + }; + + //установка стандартной ширины спектра огибающей и количества линий спектра + spen.frequency = imp.standart_width(imp.spec_width().es); + spen.lines = imp.standart_lines(imp.spec_lines()); + filter_spen.frequency = imp.filter_frequency(); + ausp.frequency = imp.standart_width(imp.spec_width().as1); + //ausp.lines = imp.standart_lines(); + + //определение минимально необходимой длительности сигнала для проведения диагностики + var acq_times = []; + acq_times.push(ausp.acq_time); + acq_times.push(spen.acq_time); + acq_time = Math.max(...acq_times); + + gtl.diagnostic.interval = acq_time; + state = 3; + break; + + case 1: //частота вращения фиксированная + //установка стандартной ширины спектра огибающей и количества линий спектра + spen.frequency = imp.standart_width(imp.spec_width().es); + spen.lines = imp.standart_lines(imp.spec_lines()); + filter_spen.frequency = imp.filter_frequency(); + ausp.frequency = imp.standart_width(imp.spec_width().as1); + //ausp.lines = imp.standart_lines(); + + //определение минимально необходимой длительности сигнала для проведения диагностики + var acq_times = []; + acq_times.push(ausp.acq_time); + acq_times.push(spen.acq_time); + acq_time = Math.max(...acq_times); + + gtl.diagnostic.interval = acq_time; + state = 3; + break; + + case 2: //частота вращения из поля INFO (виброметр) + //установка стандартной ширины спектра огибающей и количества линий спектра + spen.frequency = imp.standart_width(imp.spec_width().es); + spen.lines = imp.standart_lines(imp.spec_lines()); + filter_spen.frequency = imp.filter_frequency(); + ausp.frequency = imp.standart_width(imp.spec_width().as1); + //ausp.lines = imp.standart_lines(); + + //определение минимально необходимой длительности сигнала для проведения диагностики + var acq_times = []; + acq_times.push(ausp.acq_time); + acq_times.push(spen.acq_time); + acq_time = Math.max(...acq_times); + + gtl.diagnostic.interval = acq_time; + state = 3; + break; + + case 3: //выполняем анализ спектов + ausp.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре вибрации + spen.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре огибающей + + //[Блок настройки определения гармоник в спектрах] + //AUSP + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + var ausp_f0 = ausp.add_harms_set(imp.FREQ(), 10, 0xff0000f0, 2); //биение вала "синий" + for (let i = 0; i <= 9; i++) { ausp_f0.harms[i].tolerance = (1 + i) * imp.FREQ() * imp.tolerance() }; //коридор обнаружения гармоник + ausp_f0.name = 'Биение вала'; + + var ausp_BPFO2 = ausp.add_harms_set(imp.BPFO(), 10, 0xff009000, 2); //раковины на наружном кольце "зелёный" + for (let i = 0; i <= 9; i++) { ausp_BPFO2.harms[i].tolerance = (1 + i) * imp.BPFO() * imp.tolerance() }; + ausp_BPFO2.name = 'Раковины на наружном кольце'; + + var ausp_BPFI2 = ausp.add_harms_set(imp.BPFI(), 10, 0xff990090, 2); //раковины на внутреннем кольце "фиолетовый" + for (let i = 0; i <= 9; i++) { ausp_BPFI2.harms[i].tolerance = (1 + i) * imp.BPFI() * imp.tolerance() }; + ausp_BPFI2.name = 'Раковины на внутреннем кольце'; + + var ausp_BSF0 = ausp.add_harms_set(imp.BSF(), 20, 0xff994000, 2); //раковины и сколы на телах качения "оранжевый" + for (let i = 0; i <= 19; i++) { ausp_BSF0.harms[i].tolerance = (1 + i) * imp.BSF() * imp.tolerance() }; + ausp_BSF0.name = 'Раковины и сколы на телах качения'; + + //добавляем модулирующие гармоники: частота, кол-во, цвет, вес + ausp.harms_sets[1].modulate(imp.FTF(), 2, 0xff009030, 1); //модуляция Fн +/- Fс "зелёный" + ausp.harms_sets[1].modulate(imp.FREQ(), 2, 0xff009030, 1); //модуляция Fн +/- Fвр "зелёный" + ausp.harms_sets[2].modulate(imp.FREQ(), 2, 0xff923090, 1); //модуляция Fв +/- Fвр "фиолетовый" + ausp.harms_sets[3].modulate(imp.FTF(), 2, 0xff996000, 1); //модуляция Fтк +/- Fс "горчичный" + + //при необходимости можно изменить параметры каждой гармоники индивидуально + /* + ausp.harms_sets[0].harms[0].color = 0x0000ffff; + ausp.harms_sets[0].harms[0].weight = 1; + ausp.harms_sets[0].harms[2].color = 0x0000ff00; + ausp.harms_sets[0].harms[0].weight = 0.5; + ausp.harms_sets[0].modulating[0].harms[0].color = 0x00ffff00; + ausp.harms_sets[0].modulating[0].harms[0].weight = 5; + */ + + //SPEN + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + var spen_f0 = spen.add_harms_set(imp.FREQ(), 10, 0xff0000f0, 1); //биение вала - "синий" + for (let i = 0; i <= 9; i++) { spen_f0.harms[i].tolerance = (1 + i) * imp.FREQ() * imp.tolerance() }; //коридор обнаружения гармоник + spen_f0.name = 'Биение вала'; + + var spen_f1 = spen.add_harms_set(2 * imp.FREQ(), 5, 0xff009ff0, 2); //неоднородный радиальный натяг "голубой" + for (let i = 0; i <= 4; i++) { spen_f1.harms[i].tolerance = 2 * (1 + i) * imp.FREQ() * imp.tolerance() }; + spen_f1.name = 'Неоднородный радиальный натяг'; + + var spen_BPFO0 = spen.add_harms_set(imp.BPFO(), 5, 0xff009000, 1); //износ дорожки качения наружного кольца "зелёный" + for (let i = 0; i <= 4; i++) { spen_BPFO0.harms[i].tolerance = (1 + i) * imp.BPFO() * imp.tolerance() }; + spen_BPFO0.name = 'Износ дорожки качения наружного кольца'; + + var spen_BPFO1 = spen.add_harms_set(2 * imp.BPFO(), spen.frequency / (2 * imp.BPFO()), 0xff009000, 2); //перекос наружного кольца "зелёный" + for (let i = 0; i <= (spen.frequency / (2 * imp.BPFO())) - 1; i++) { spen_BPFO1.harms[i].tolerance = 2 * (1 + i) * imp.BPFO() * imp.tolerance() }; + spen_BPFO1.name = 'Перекос наружного кольца'; + + var spen_BPFO2 = spen.add_harms_set(imp.BPFO(), spen.frequency / imp.BPFO(), 0xff009000, 1); //раковины на наружном кольце "зелёный" + for (let i = 0; i <= (spen.frequency / imp.BPFO()) - 1; i++) { spen_BPFO2.harms[i].tolerance = (1 + i) * imp.BPFO() * imp.tolerance() }; + spen_BPFO2.name = 'Раковины на наружном кольце'; + + var spen_BPFI0 = spen.add_harms_set(imp.FREQ(), 5, 0xff0000f0, 1); //износ дорожки качения внутреннего кольца "синий" + for (let i = 0; i <= 4; i++) { spen_BPFI0.harms[i].tolerance = (1 + i) * imp.FREQ() * imp.tolerance() }; + spen_BPFI0.name = 'Износ дорожки качения внутреннего кольца'; + + var spen_BPFI1 = spen.add_harms_set(imp.BPFI(), 5, 0xff990090, 1); //износ дорожки качения внутреннего кольца "фиолетовый" + for (let i = 0; i <= 4; i++) { spen_BPFI1.harms[i].tolerance = (1 + i) * imp.BPFI() * imp.tolerance() }; + spen_BPFI1.name = 'Износ дорожки качения внутреннего кольца (вторичный признак)'; + + var spen_BPFI2 = spen.add_harms_set(imp.BPFI(), spen.frequency / imp.BPFI(), 0xff990090, 1); //раковины на внутреннем кольце "фиолетовый" + for (let i = 0; i <= (spen.frequency / imp.BPFI()) - 1; i++) { spen_BPFI2.harms[i].tolerance = (1 + i) * imp.BPFI() * imp.tolerance() }; + spen_BPFI2.name = 'Раковины на внутреннем кольце'; + + var spen_FTF0 = spen.add_harms_set(imp.FTF(), 10, 0xffff0000, 2); //износ тел качения и сепаратора "красный" + for (let i = 0; i <= 9; i++) { spen_FTF0.harms[i].tolerance = (1 + i) * imp.FTF() * imp.tolerance() }; + spen_FTF0.name = 'Износ тел качения и сепаратора'; + + var spen_BSF0 = spen.add_harms_set(imp.BSF(), 10, 0xff994000, 1); //раковины и сколы на телах качения "оранжевый" + for (let i = 0; i <= 9; i++) { spen_BSF0.harms[i].tolerance = (1 + i) * imp.BSF() * imp.tolerance() }; + spen_BSF0.name = 'Раковины и сколы на телах качения'; + + //добавляем модулирующие гармоники: частота, кол-во, цвет, вес + spen.harms_sets[4].modulate(imp.FTF(), 2, 0xff009030, 1); //модуляция Fн +/- Fс "зелёный" + spen.harms_sets[4].modulate(imp.FREQ(), 2, 0xff009030, 1); //модуляция Fн +/- Fвр "зелёный" + spen.harms_sets[7].modulate(imp.FREQ(), 2, 0xff923090, 1); //модуляция Fв +/- Fвр "фиолетовый" + spen.harms_sets[9].modulate(imp.FTF(), 3, 0xff996000, 1); //модуляция Fтк +/- Fс "горчичный" + + //при необходимости можно изменить параметры каждой гармоники индивидуально + /* + spen.harms_sets[0].harms[0].color = 0x0000ffff; + spen.harms_sets[0].harms[0].weight = 1; + spen.harms_sets[0].harms[2].color = 0x0000ff00; + spen.harms_sets[0].harms[0].weight = 0.5; + spen.harms_sets[0].modulating[0].harms[0].color = 0x00ffff00; + spen.harms_sets[0].modulating[0].harms[0].weight = 5; + */ + + //Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра + var AQ = imp.spec_square(ausp2.data, 800, ausp2.frequency); + + //[Блок диагностики] + //вывод информации в лог + //gtl.log.info("description", function) + + gtl.log.info("Объект диагностики", "Подшипник качения " + options.rbModelName); + gtl.log.info("Минимально необходимая длительность сигнала", acq_time); + gtl.log.info("FREQ", imp.FREQ()); + gtl.log.info("Минимально необходимая частота вращения", imp.FREQNESS()); + gtl.log.info("Площадь спектра", AQ); + gtl.log.info("Нестабильность частоты вращения, %", imp.INSTABILITY() * 100); + gtl.log.info("FTF", imp.FTF()); + gtl.log.info("BPFO", imp.BPFO()); + gtl.log.info("BPFI", imp.BPFI()); + gtl.log.info("BSF", imp.BSF()); + gtl.log.info("Центральная частота полосового фильтра", filter_spen.frequency); + gtl.log.info("Количество долей октавного фильтра", n); + gtl.log.info("Коэффициент для октавного фильтра", kf); + gtl.log.info("Граничная частота спектра", imp.spec_width().es); + gtl.log.info("Расчетное количество линий", imp.spec_lines()); + gtl.log.info("Расчетное разрешение спектра", imp.spec_resolution()); + gtl.log.info("Расчетный коридор обнаружения, %", imp.tolerance() * 100); + gtl.log.info("Стандартная граничная частота", spen.frequency); + gtl.log.info("Стандартное кол-во линий", spen.lines); + gtl.log.info("СКЗ(A) ВЧ вибрации", rms_spen.value); + gtl.log.info("СКЗ(A) УВЧ вибрации", rms_uhf.value); + gtl.log.info("ПФ(A) в ВЧ диапазоне", ampl_spen.value / rms_spen.value); + gtl.log.info("ПФ(A) в УВЧ диапазоне", ampl_uhf.value / rms_uhf.value); + gtl.log.info("СКЗ(V) 2-1000 Гц", rms_v2.value); + gtl.log.info("СКЗ(V) 10-1000 Гц", rms_v10.value); + + //вывод количества гармоник + //ausp.harms_sets[0].get_count(1, 2, 1, true); + //1 - начало отсчета гармоники; + //2 - допуситмое количество пропущенных в ряду; + //3 - количество модулирующих с одной стороны; + //4 - модулирующие с двух сторон (true); + + //вывод параметров гармоник + //ausp_set0.harms[1].is_present); //гармоника есть (есть превышение на порогом) + //ausp_set0.harms[1].amplitude); //амплитуда + //ausp_set0.harms[1].level); //превышении над средней + //ausp_set0.harms[1].base); //уровень фона под гармоникой + //ausp_set0.harms[1].tolerance; //коридор обнаружения гармоники + + var Defect = false; + var Defect_type = []; + + //биение вала + if ( + spen.harms_sets[0].get_count(0, 2) >= 1 && spen.harms_sets[0].get_count(0, 2) <= 10 && + ausp.harms_sets[0].get_count(0, 2) >= 0 && ausp.harms_sets[0].get_count(0, 2) <= 10 + ) { + Defect = true; + Defect_type.push("Биение вала"); + for (let i = 0; i <= 9; i++) { + if (spen_f0.harms[i].is_present == true) + gtl.log.info("Биение вала. Признаки в ES " + (i + 1) + "Fвр", imp.deep_factor(spen_f0.harms[i].amplitude, spen_f0.harms[i].base)); + } + + for (let i = 0; i <= 9; i++) { + if (ausp_f0.harms[i].is_present == true) + gtl.log.info("Биение вала. Признаки в AS " + (i + 1) + "Fвр", ausp_f0.harms[i].amplitude); + } + } + else + gtl.log.info("Биение вала", "Признаков дефекта не обнаружено"); + + //неоднородный радиальный натяг + if ( + spen_f1.harms[0].level >= spen_f0.harms[0].level && + spen.harms_sets[1].get_count(0) >= 1 && spen.harms_sets[1].get_count(0) <= 5 + ) { + Defect = true; + Defect_type.push("Неоднородный радиальный натяг"); + for (let i = 0; i <= 4; i++) { + if (spen_f1.harms[i].is_present == true) + gtl.log.info("Неоднородный радиальный натяг. Признаки в ES " + (i + 1) + "Fвр[x2]", imp.deep_factor(spen_f1.harms[i].amplitude, spen_f1.harms[i].base)); + } + } + else + gtl.log.info("Неоднородный радиальный натяг", "Признаков дефекта не обнаружено"); + + //износ дорожки качения наружного кольца + if (spen.harms_sets[2].get_count(0, 1) >= 1 && spen.harms_sets[2].get_count(0, 1) <= 5) { + Defect = true; + Defect_type.push("Износ дорожки качения наружного кольца"); + for (let i = 0; i <= 4; i++) { + if (spen_BPFO0.harms[i].is_present == true) + gtl.log.info("Износ дорожки качения наружного кольца. Признаки в ES " + (i + 1) + "Fн", imp.deep_factor(spen_BPFO0.harms[i].amplitude, spen_BPFO0.harms[i].base)); + } + } + else + gtl.log.info("Износ дорожки качения наружного кольца", "Признаков дефекта не обнаружено"); + + //перекос наружного кольца + if ( + spen_BPFO1.harms[0].level >= spen_BPFO0.harms[0].level && + spen.harms_sets[3].get_count(0, 1) >= 1 && spen.harms_sets[3].get_count(0, 1) <= 3 + ) { + Defect = true; + Defect_type.push("Перекос наружного кольца"); + for (let i = 0; i <= spen.frequency / (2 * imp.BPFO()) - 1; i++) { + if (spen_BPFO1.harms[i].is_present == true) + gtl.log.info("Перекос наружного кольца. Признаки в ES " + (i + 1) + "Fн[x2]", imp.deep_factor(spen_BPFO1.harms[i].amplitude, spen_BPFO1.harms[i].base)); + } + } + else + gtl.log.info("Перекос наружного кольца", "Признаков дефекта не обнаружено"); + + //раковины на наружном кольце + if ( + spen.harms_sets[4].get_count(0, 1) >= 5 && + ausp.harms_sets[1].get_count(0, 3) >= 5 + ) { + Defect = true; + Defect_type.push("Раковины на наружном кольце"); + for (let i = 0; i <= (spen.frequency / imp.BPFO()) - 1; i++) { + if (spen_BPFO2.harms[i].is_present == true) + gtl.log.info("Раковины на наружном кольце. Признаки в ES " + (i + 1) + "Fн", imp.deep_factor(spen_BPFO2.harms[i].amplitude, spen_BPFO2.harms[i].base)); + } + + for (let i = 0; i <= (spen.frequency / imp.BPFO()) - 1; i++) { + if (ausp_BPFO2.harms[i].is_present == true) + gtl.log.info("Раковины на наружном кольце. Признаки в AS " + (i + 1) + "Fн", ausp_BPFO2.harms[i].amplitude); + } + } + else + gtl.log.info("Раковины на наружном кольце", "Признаков дефекта не обнаружено"); + + //износ дорожки качения внутреннего кольца + if ( + (spen.harms_sets[5].get_count(0, 1) >= 1 && spen.harms_sets[5].get_count(0, 1) <= 2) || + (spen.harms_sets[6].get_count(0, 1) >= 1 && spen.harms_sets[6].get_count(0, 1) <= 2) + ) { + Defect = true; + Defect_type.push("Износ дорожки качения внутреннего кольца"); + for (let i = 0; i <= 2; i++) { + if (spen_BPFI0.harms[i].is_present == true) + gtl.log.info("Износ дорожки качения внутреннего кольца. Признаки в ES " + (i + 1) + "Fвр", imp.deep_factor(spen_BPFI0.harms[i].amplitude, spen_BPFI0.harms[i].base)); + else if (spen_BPFI1.harms[i].is_present == true) + gtl.log.info("Износ дорожки качения внутреннего кольца. Признаки в ES " + (i + 1) + "Fв", imp.deep_factor(spen_BPFI1.harms[i].amplitude, spen_BPFI1.harms[i].base)); + } + } + else + gtl.log.info("Износ дорожки качения внутреннего кольца", "Признаков дефекта не обнаружено"); + + //раковины на внутреннем кольце + if ( + spen.harms_sets[7].get_count(0, 0, 1) >= 3 && + ausp.harms_sets[2].get_count(0, 1, 1) >= 3 + ) { + Defect = true; + Defect_type.push("Раковины на внутреннем кольце"); + for (let i = 0; i <= (spen.frequency / imp.BPFI()) - 1; i++) { + if (spen_BPFI2.harms[i].is_present == true) + gtl.log.info("Раковины на внутреннем кольце. Признаки в ES " + (i + 1) + "Fв +/- Fвр", imp.deep_factor(spen_BPFI2.harms[i].amplitude, spen_BPFI2.harms[i].base)); + } + + for (let i = 0; i <= (spen.frequency / imp.BPFI()) - 1; i++) { + if (ausp_BPFI2.harms[i].is_present == true) + gtl.log.info("Раковины на внутреннем кольце. Признаки в AS " + (i + 1) + "Fв +/- Fвр", ausp_BPFI2.harms[i].amplitude); + } + } + else + gtl.log.info("Раковины на внутреннем кольце", "Признаков дефекта не обнаружено"); + + //износ тел качения и сепаратора + if (spen.harms_sets[8].get_count(0, 1) >= 1) { + Defect = true; + Defect_type.push("Износ тел качения и сепаратора"); + for (let i = 0; i <= 9; i++) { + if (spen_FTF0.harms[i].is_present == true) + gtl.log.info("Износ тел качения и сепаратора. Признаки в ES " + (i + 1) + "Fс", imp.deep_factor(spen_FTF0.harms[i].amplitude, spen_FTF0.harms[i].base)); + } + } + else + gtl.log.info("Износ тел качения и сепаратора", "Признаков дефекта не обнаружено"); + + //раковины и сколы на телах качения + if ( + spen.harms_sets[9].get_count(0, 1, 1) >= 3 && + ausp.harms_sets[3].get_count(0, 3, 1) >= 3 + ) { + Defect = true; + Defect_type.push("Раковины и сколы на телах качения"); + for (let i = 0; i <= 9; i++) { + if (spen_BSF0.harms[i].is_present == true) + gtl.log.info("Раковины и сколы на телах качения. Признаки в ES " + (i + 1) + "Fтк +/- Fс", imp.deep_factor(spen_BSF0.harms[i].amplitude, spen_BSF0.harms[i].base)); + } + + for (let i = 0; i <= 29; i++) { + if (ausp_BSF0.harms[i].is_present == true) + gtl.log.info("Раковины и сколы на телах качения. Признаки в AS " + (i + 1) + "Fтк +/- Fс", ausp_BSF0.harms[i].amplitude); + } + } + + else + gtl.log.info("Раковины и сколы на телах качения", "Признаков дефекта не обнаружено"); + + let __result = { + "Result": true, + "RMS(A)": rms_spen.value, + "RMS_UHF(A)": rms_uhf.value, + "PF(A)": ampl_spen.value / rms_spen.value, + "PF_UHF(A)": ampl_uhf.value / rms_uhf.value, + "RMS(V) 2-1000 Гц": rms_v2.value, + "RMS(V) 10-1000 Гц": rms_v10.value, + "Square": AQ, + "Defects": Defect, + "Types": Defect_type + }; + + gtl.results = __result; + gtl.diagnostic.stop(); + break; + + default: + break; + } +} \ No newline at end of file diff --git a/solid/user-functions.js b/solid/user-functions.js new file mode 100644 index 0000000..dd1afca --- /dev/null +++ b/solid/user-functions.js @@ -0,0 +1,309 @@ +export function get_text() { + return "hello world"; +}; + +//параметры подшипника качения +var rbModelName = options.rbModelName || "No Name"; +var rbVendor = options.rbVendor || "No Vendor"; +var d_inner = options.rbInnerD || 0; //диаметр внутреннего кольца +var d_outer = options.rbOuterD || 0; //диаметр наружного кольца +var d_roller = options.rbRollerD || 0; //диаметр тела качения +var z = options.rbRollerCount || 0; //количество тел качения +var angle = (options.rbAngle * 3.1415926) / 180 || 0; //угол контакта тел качения (рад.) +var d_cage = (d_inner + d_outer) / 2; // диаметр сепаратора (средний диаметр) + +//параметры редуктора +var gtZ1 = options.gtZ1 || 0; //количество зубьев шестерни +var gtZ2 = options.gtZ2 || 0; //количество зубьев зубчатого колеса + +//параметры ременной передачи +var bdD1 = options.bdD1 || 0; //диаметр ведущего шкива +var bdD2 = options.bdD2 || 0; //диаметр ведомого шкива +var bdL = options.bdL || 0; //длинна ремня + +//параметры зубчатой ременной передачи +var cbdZ1 = options.cbdZ1 || 0; //количество зубьев ведущего шкива +var cbdZ2 = options.cbdZ2 || 0; //количество зубьев ведомого шкива +var cbdZ3 = options.cbdZ3 || 0; //количество зубьев ремня + +//параметры насоса +var pmBlades = options.pmBlades || 0; //количество лопастей насосного колеса + +//параметры планетарной передачи +var pgZ1 = options.pgZ1 || 0; //количество зубьев солнца +var pgZ2 = options.pgZ2 || 0; //количество зубьев саттелитов +var pgZ3 = options.pgZ3 || 0; //количество зубьев короны +var pgN = options.pgN || 0; //количество саттелитов + +//параметры турбины +var trBlades = options.trBlades || 0; //количество лопастей крыльчатки турбины + +//параметры электродвигателя +//var trBlades = options.trBlades || 0; //количество лопастей крыльчатки турбины + +export function FREQ() { + let FR = 0; + switch (record.tachoOptions.tachoState) { + case 0: + FR = freq.value * options.tachoRatio; + break; + case 1: + FR = record.tachoOptions.tachoValue * options.tachoRatio; + break; + case 2: + FR = record.tachoOptions.tachoFromInfo * options.tachoRatio; + break; + }; return FR; +}; //определение частоты вращения в зависимости от источника тахо сигнала (FREQ) + +export function INSTABILITY() { + let freq_max = Math.max(...freq.values); + let freq_min = Math.min(...freq.values); + let instability = (freq_max - freq_min) / freq.value; + return instability; +}; //нестабильность частоты вращения в % + +//определение вспомогательных коэффициентов k1 и k2 для подшипников качения +var k1 = 0.5 * (1 - (d_roller / d_cage) * Math.cos(angle)); +var k2 = 0.5 * (1 + (d_roller / d_cage) * Math.cos(angle)); + +export function FREQNESS() { + let R = (d_inner / 2) + (d_roller / 2); //расстояние до центра тяжести тела качения + let freqness = (Math.sqrt(9.81 / (4 * (Math.PI ** 2) * R / 1000))) / k1; + return freqness; +}; //минимально необходимая частота вращения для компенсации силы тяжести центробежной силой + +export function FTF() { return k1 * FREQ(); }; //частота вращения сепаратора (FTF) +export function BPFO() { return k1 * FREQ() * z; }; //частота перекатывания тел качения по наружному кольцу (BPFO) +export function BPFI() { return k2 * FREQ() * z; }; //частота перекатывания тел качения по внутреннему кольцу (BPFI) +export function BSF() { return 2 * FREQ() * (d_cage / d_roller) * k1 * k2; }; //частота вращения (контакта) тел качения (BSF) + +export function BDF2() { return FREQ() * (bdD1 / bdD2) }; //частота вращения ведомого шкива +export function BDFB() { return FREQ() * (Math.PI * bdD1 / bdL) }; //частота вращения ремня + +export function CBFZ() { return FREQ() * cbdZ1; }; //зубцовая частота +export function CBDF2() { return FREQ() * (cbdZ1 / cbdZ2) }; //частота вращения ведомого шкива +export function CBDFB() { return FREQ() * (cbdZ1 / cbdZ3) }; //частота вращения ремня + +export function PMFBLD() { return FREQ() * pmBlades; }; //лопастная частота + +export function GTFZ() { return FREQ() * gtZ1; }; //зубцовая частота +export function GTF2() { return FREQ() * (gtZ1 / gtZ2); }; //частота вращения второго вала редуктора + +export function PGF2() { return (0.5 * FREQ() * pgZ1) / (pgZ1 + pgZ2); }; //частота вращения выходного вала планетарной передачи +export function PGFSAT() { return (0.5 * FREQ()) * (pgZ1 / pgZ2) * ((pgZ1 + 2 * pgZ2) / (pgZ1 + pgZ2)); }; //частота вращения саттелита +export function PGFZ() { return pgZ2 * PGFSAT() }; //зубцовая частота + +export function TRFBLD() { return FREQ() * trBlades; }; //лопастная частота + +export function filter_frequency() { + let filter = 6013.41 * Math.log(0.266935 * imp.FREQ() + 1.1201); + return filter; +}; //расчетная центральная частота полосового фильтра для спектра огибающей + +export function filter_width(number) { + let n = 3; + if (number != null) {n = number}; + let kf = (2 ** (1 / n) - 1) / ((2 ** (1 / n)) ** (1 / 2)); //коэффициент для полосового фильтра + let width = kf * filter_frequency(); + return width; +}; //ширина фильтра спектра огибающей + +export function spec_width() { + let flim = {}; + switch (options.objectType) { + case 0: //объект не выбран + break; + case 1: //подшипник скольжения + flim = { + as0: 1600, + as1: 1600, + es: 20 * FREQ() + }; + break; + case 2: //подшипник качения + flim = { + as0: 1600, + as1: 1600, + es: 3 * BPFI() + 4 * FREQ() + }; + break; + case 3: //ШВП + break; + case 4: //редуктор + flim = { + as0: 1600, + as1: 1600, + es: 3 * GTFZ() + 4 * FREQ() + }; + break; + case 5: //ременная передача + break; + case 6: //зубчатый ремень + break; + case 7: //помпа + flim = { + as0: 1600, + as1: 1600, + es: 3 * PMFBLD() + 4 * FREQ() + }; + break; + case 8: //планетарый редуктор + flim = { + as0: 1600, + as1: 1600, + es: 3 * PGFZ() + 4 * FREQ() + }; + break; + case 9: //турбина + flim = { + as0: 1600, + as1: 1600, + es: 3 * TRFBLD() + 4 * FREQ() + }; + break; + case 10: //электродвигатель + break; + }; return flim; +}; //ширина спектров вибрации + +export function spec_resolution() { + let res = 0; + switch (options.objectType) { + case 0: //объект не выбран + break; + case 1: //подшипник скольжения + res = FREQ() / 8; + break; + case 2: //подшипник качения + res = FREQ() / 8; + break; + case 3: //ШВП + break; + case 4: //редуктор + res = FREQ() / 8; + break; + case 5: //ременная передача + res = BDFB() / 4; + break; + case 6: //зубчатый ремень + res = CBDFB() / 4; + break; + case 7: //помпа + res = FREQ() / 8; + break; + case 8: //планетарый редуктор + res = PGF2() / 8; + break; + case 9: //турбина + res = FREQ() / 8; + break; + case 10: //электродвигатель + break; + }; return res; +}; //частотное разрешение (разделение двух гармоник с минимальной частотой) + +export function spec_lines() { return spec_width().es / spec_resolution(); }; //минимальное количество линий спектра + +export function tolerance() { + let tol = 0; + switch (options.objectType) { + case 0: //объект не выбран + break; + case 1: //подшипник скольжения + break; + case 2: //подшипник качения + tol = (2 * FTF()) / (5 * BPFO()); + break; + case 3: //ШВП + break; + case 4: //редуктор + tol = (2 * FREQ()) / (5 * GTFZ()); + break; + case 5: //ременная передача + break; + case 6: //зубчатый ремень + break; + case 7: //помпа + break; + case 8: //планетарый редуктор + tol = (2 * PGF2()) / (5 * PGFZ()); + break; + case 9: //турбина + break; + case 10: //электродвигатель + break; + }; return tol; +}; //максимальный коридор обнаружения гармоник (tolerance) + +export function standart_width(width) { + let STFRQ = 0; + switch (true) { + case width <= 50: + STFRQ = 50; + break; + case width <= 100: + STFRQ = 100; + break; + case width <= 200: + STFRQ = 200; + break; + case width <= 400: + STFRQ = 400; + break; + case width <= 800: + STFRQ = 800; + break; + default: + STFRQ = 1600; + break; + }; return STFRQ; +}; //стандартная ширина спектра + +export function standart_lines(lines) { + let STLNS = 0; + switch (true) { + case lines <= 200: + STLNS = 200; + break; + case lines <= 400: + STLNS = 400; + break; + case lines <= 800: + STLNS = 800; + break; + case lines <= 1600: + STLNS = 1600; + break; + default: + STLNS = 3200; + break; + }; return STLNS; +}; //стандартное количество линий спектра + +export function spec_square(data, bnd, frq) { + let lines = data.length; //определение количества линий спектра вибрации + let res = frq / lines; //определение частотного разрешения спектра вибрации (основание прямоугольной трапеции) + let start = 1; //переменная для определения стартового индекса в массиве + let S = 0; //переменная расчетной площади спектра вибрации + if (bnd !== 0) { start = lines - Math.round((frq - bnd) / res) }; //начальная точка отсчета в массиве (стартовый индекс) + for (let i = start - 1; i <= lines - 2; i++) { S = S + res * ((data[i] + data[i + 1]) / 2) }; //вычисляем площадь спектра вибрации + return S; +}; //определение площади спектра + +export function mod_factor(ampl, base) { + let dl = (ampl - base); //разность уровней гармонической и случайной составляющей вибрации + let df = spec_resolution() / filter_width(); //отношение ширины фильтра к частотному разрешению спектра + let mod = Math.sqrt((10 ** (dl / 10) - 1) * df); + return mod; +}; //определение условной глубины модуляции + +export function deep_factor(ampl, base) { + let deep = (ampl - base) / (ampl + base) * 100; + return deep; +}; //определение условной глубины модуляции + +export function ampl_factor(ampl, base) { + let crest = ampl / base; + return crest; +}; //определение амплитудного коэффициента