From ebc47e0ccead478ac1e8bf1ab2c70a6f3a424eb5 Mon Sep 17 00:00:00 2001 From: aleksey_k Date: Sun, 18 Feb 2024 17:15:35 +0900 Subject: [PATCH] planetary gear add --- planetary gear/defects/gt-gear-beat.js | 79 +++++++ planetary gear/defects/gt-gear-fault.js | 83 ++++++++ planetary gear/planetary gear.js | 261 ++++++++++++++++++++++++ 3 files changed, 423 insertions(+) create mode 100644 planetary gear/defects/gt-gear-beat.js create mode 100644 planetary gear/defects/gt-gear-fault.js create mode 100644 planetary gear/planetary gear.js diff --git a/planetary gear/defects/gt-gear-beat.js b/planetary gear/defects/gt-gear-beat.js new file mode 100644 index 0000000..4b5a3f0 --- /dev/null +++ b/planetary gear/defects/gt-gear-beat.js @@ -0,0 +1,79 @@ +"use strict"; + +var imp = gtl.import("user-functions.js"); + +export function defect() { + let frq = imp.FREQ(); //функциональная чатота + let num = 10; //количество отрисованных гармоник + + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + var spen_set = spen.add_harms_set(frq, num, 0xff0000f0, 1); //биение шестерни - "синий" + for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник + spen_set.name = 'Биение шестерни'; + var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей + + var ausp_set = ausp.add_harms_set(frq, num, 0xff0000f0, 2); //биение шестерни "синий" + for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник + ausp_set.name = 'Биение шестерни'; + var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации + + var defect = false; + var spen_signs = []; //массив признаков в спектре огибающей + var ausp_signs = []; //массив признаков в спектре вибрации + var deep = 0; //глубина модуляции ВЧ составляющих + var ampl = 0; //амплитуда составляющих НЧ вибрации + var describe = ''; //описание степени развития дефекта + var result = ''; //результат диагностики + + //вывод количества гармоник + //spen.harms_sets[0].get_count(1, 2, 1, true); + //1 - начало отсчета гармоники; + //2 - допуситмое количество пропущенных в ряду; + //3 - количество модулирующих с одной стороны; + //4 - модулирующие с двух сторон (true); + + //биение вала + if ( + spen.harms_sets[spen_index].get_count(0, 2) >= 3 && spen.harms_sets[spen_index].get_count(0, 2) <= 5 && + ausp.harms_sets[ausp_index].get_count(0, 2) >= 3 && ausp.harms_sets[ausp_index].get_count(0, 2) <= 5 + ) { + defect = true; + for (let i = 0; i <= num - 1; i++) { + if (spen_set.harms[i].is_present == true) { + deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base); + spen_signs.push(deep); + gtl.log.info("Биение шестерни. Признаки в ES " + (i + 1) + "Fвр1", deep); + } + } + + for (let i = 0; i <= num - 1; i++) { + if (ausp_set.harms[i].is_present == true) { + ampl = ausp_set.harms[i].amplitude; + ausp_signs.push(ampl); + gtl.log.info("Биение шестерни. Признаки в AS " + (i + 1) + "Fвр1", ampl); + } + } + } + else + gtl.log.info("Биение шестерни", "Признаков дефекта не обнаружено"); + + deep = Math.max(...spen_signs) * 100; + switch (true) { + case deep <= 12: + describe = "Слабый"; + break; + case deep < 20: + describe = "Средний"; + break; + case deep >= 20: + describe = "Сильный"; + break; + default: + describe = "None"; + }; + + if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false }; + + return result; +}; + diff --git a/planetary gear/defects/gt-gear-fault.js b/planetary gear/defects/gt-gear-fault.js new file mode 100644 index 0000000..c70d44d --- /dev/null +++ b/planetary gear/defects/gt-gear-fault.js @@ -0,0 +1,83 @@ +"use strict"; + +var imp = gtl.import("user-functions.js"); + +export function defect() { + let frq = imp.GTFZ(); //функциональная чатота + let num = 5; //количество отрисованных гармоник + + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + var spen_set = spen.add_harms_set(frq, num, 0xff990090, 1); //дефект зубьев шестерни + for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник + spen_set.name = 'Дефект зубьев шестерни'; + var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей + //добавляем модулирующие гармоники: частота, кол-во, цвет, вес + spen.harms_sets[spen_index].modulate(imp.FREQ(), 2, 0xff0000f0, 1); //модуляция Fz +/- Fвр + + var ausp_set = ausp.add_harms_set(frq, num, 0xff990090, 2); //дефект зубьев шестерни + for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник + ausp_set.name = 'Дефект зубьев шестерни'; + var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации + //добавляем модулирующие гармоники: частота, кол-во, цвет, вес + ausp.harms_sets[ausp_index].modulate(imp.FREQ(), 2, 0xff0000f0, 1); //модуляция Fz +/- Fвр + + var defect = false; + var spen_signs = []; //массив признаков в спектре огибающей + var ausp_signs = []; //массив признаков в спектре вибрации + var deep = 0; //глубина модуляции ВЧ составляющих + var ampl = 0; //амплитуда составляющих НЧ вибрации + var describe = ''; //описание степени развития дефекта + var result = ''; //результат диагностики + + //вывод количества гармоник + //spen.harms_sets[0].get_count(1, 2, 1, true); + //1 - начало отсчета гармоники; + //2 - допуситмое количество пропущенных в ряду; + //3 - количество модулирующих с одной стороны; + //4 - модулирующие с двух сторон (true); + + //биение вала + if ( + spen.harms_sets[spen_index].get_count(0, 1, 1) >= 3 && + ausp.harms_sets[ausp_index].get_count(0, 1, 1) >= 3 + ) { + defect = true; + for (let i = 0; i <= num - 1; i++) { + if (spen_set.harms[i].is_present == true) { + deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base); + spen_signs.push(deep); + gtl.log.info("Дефект зубьев шестерни. Признаки в ES " + (i + 1) + "Fz", deep); + } + } + + for (let i = 0; i <= num - 1; i++) { + if (ausp_set.harms[i].is_present == true) { + ampl = ausp_set.harms[i].amplitude; + ausp_signs.push(ampl); + gtl.log.info("Дефект зубьев шестерни. Признаки в AS " + (i + 1) + "Fz", ampl); + } + } + } + else + gtl.log.info("Дефект зубьев шестерни", "Признаков дефекта не обнаружено"); + + deep = Math.max(...spen_signs) * 100; + switch (true) { + case deep <= 12: + describe = "Слабый"; + break; + case deep < 20: + describe = "Средний"; + break; + case deep >= 20: + describe = "Сильный"; + break; + default: + describe = "None"; + }; + + if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false }; + + return result; +}; + diff --git a/planetary gear/planetary gear.js b/planetary gear/planetary gear.js new file mode 100644 index 0000000..35dec9d --- /dev/null +++ b/planetary gear/planetary gear.js @@ -0,0 +1,261 @@ +"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("user-functions.js"); + +var gear0 = gtl.import("gt-gear-beat.js"); +var wheel0 = gtl.import("gt-wheel-beat.js"); +var gear1 = gtl.import("gt-gear-fault.js"); +var wheel1 = gtl.import("gt-wheel-fault.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 = 800; //граничная частота спектра +ausp.lines = 800; //разрешение спектра (количество линий) +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 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.color = 255; +filter_spen.width = 1482; //ширина полосы фильтра + +//спектр огибающей +var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей +spen.name = "SPEN"; //присвоение имени спектра огибающей +spen.color = 0x00ff0000; //цвет линии спектра огибающей +spen.frequency = 400; //граничная частота спектра огибающей +spen.lines = 400; //разрешение спектра огибающей (количество линий) +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(); //сброс отрисовки набора гармоник в спектре огибающей + + //Вывод информации в лог + //Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра + var AQ = imp.spec_square(ausp2.data, 800, ausp2.frequency); + + 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); + + let def = {}; + //var indx = 0; + def["Биение шестерни"] = gear0.defect(); //indx (spen = 0, ausp = 0) + def["Биение зубчатого колеса"] = wheel0.defect(); //indx (spen = 1, ausp = 1) + def["Дефект зубьев шестерни"] = gear1.defect(); //indx (spen = 2, ausp = 2) + def["Дефект зубьев зубчатого колеса"] = wheel1.defect(); //indx (spen = 3, ausp = 3) + + var res = { + RMSA: rms_spen.value, + PF: ampl_spen.value / rms_spen.value, + RMS_V2: rms_v2.value, + RMS_V10: rms_v10.value, + SQR: AQ, + defects: def + }; + + gtl.results = res; + gtl.diagnostic.stop(); + break; + + default: + break; + } +} \ No newline at end of file