From b0b1c30badee336f7632b4ea4d15a2797d15a380 Mon Sep 17 00:00:00 2001 From: aleksey_k Date: Thu, 20 Jun 2024 21:09:29 +0900 Subject: [PATCH] all scropts were changed --- ballscrew/ballscrew.js | 19 ++ gear transmission/gear_transmission.js | 19 ++ kNN/kNN.js | 21 ++ rolling bearing/rolling_bearing.js | 19 ++ sliding bearing/sbDefs.js | 99 +++++++++ sliding bearing/sliding_bearing.js | 266 +++++++++++++++++++++++++ 6 files changed, 443 insertions(+) create mode 100644 sliding bearing/sbDefs.js create mode 100644 sliding bearing/sliding_bearing.js diff --git a/ballscrew/ballscrew.js b/ballscrew/ballscrew.js index 389f313..73e3b8d 100644 --- a/ballscrew/ballscrew.js +++ b/ballscrew/ballscrew.js @@ -95,6 +95,7 @@ rms_v.avg_cnt = 4; //количество усреднений gtl.diagnostic.interval = freq.time * freq.avg_cnt; let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала +let canvas = gtl.plots.add("specs(A) dB"); function diagnose() { switch (state) { case 0: // считаем частоту вращения и настраиваем спектры @@ -157,6 +158,24 @@ function diagnose() { let spen_df = def.bsDefs(spen_mx, true); let ausp_mx = mtx.bsMTX(ausp, 0, false); + canvas.add( + { + color: ausp.color, + name: ausp.name, + x: ausp.resolution, + y: ausp.data + } + ); //рисуем спектр вибрации на плоскости + + canvas.add( + { + color: spen.color, + name: spen.name, + x: spen.resolution, + y: spen.data + } + ); //рисуем спектр огибающей на плоскости + var res = { RMSA: rms_spen.value, RMSV: rms_v.value, diff --git a/gear transmission/gear_transmission.js b/gear transmission/gear_transmission.js index 2e8f360..2592645 100644 --- a/gear transmission/gear_transmission.js +++ b/gear transmission/gear_transmission.js @@ -95,6 +95,7 @@ rms_v.avg_cnt = 4; //количество усреднений gtl.diagnostic.interval = freq.time * freq.avg_cnt; let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала +let canvas = gtl.plots.add("specs(A) dB"); function diagnose() { switch (state) { case 0: // считаем частоту вращения и настраиваем спектры @@ -155,6 +156,24 @@ function diagnose() { let spen_df = def.gtDefs(spen_mx, true); let ausp_mx = mtx.gtMTX(ausp, 0, false); + canvas.add( + { + color: ausp.color, + name: ausp.name, + x: ausp.resolution, + y: ausp.data + } + ); //рисуем спектр вибрации на плоскости + + canvas.add( + { + color: spen.color, + name: spen.name, + x: spen.resolution, + y: spen.data + } + ); //рисуем спектр огибающей на плоскости + var res = { RMSA: rms_spen.value, RMSV: rms_v.value, diff --git a/kNN/kNN.js b/kNN/kNN.js index 3f1bc6f..94106cb 100644 --- a/kNN/kNN.js +++ b/kNN/kNN.js @@ -87,6 +87,7 @@ rms_v.avg_cnt = 4; //количество усреднений gtl.diagnostic.interval = freq.time * freq.avg_cnt; let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала +let canvas = gtl.plots.add("specs(A) dB"); function diagnose() { switch (state) { case 0: // считаем частоту вращения и настраиваем спектры @@ -111,6 +112,8 @@ function diagnose() { filter_spen.width = fnc.bpWidth(); //определяем ширину фильтра spen.frequency = fnc.specParams().frequency; spen.lines = fnc.specParams().lines; + ausp.frequency = fnc.specParams().frequency; + ausp.lines = fnc.specParams().lines; //определение минимально необходимой длительности сигнала для проведения диагностики let time = []; //массив по времени набора данных @@ -147,6 +150,24 @@ function diagnose() { let spen_mx = mtx.knMTX(spen, filter_spen, true); let spen_df = def.knDefs(spen_mx, true); + canvas.add( + { + color: ausp.color, + name: ausp.name, + x: ausp.resolution, + y: ausp.data + } + ); //рисуем спектр вибрации на плоскости + + canvas.add( + { + color: spen.color, + name: spen.name, + x: spen.resolution, + y: spen.data + } + ); //рисуем спектр огибающей на плоскости + var res = { RMSA: rms_spen.value, RMSV: rms_v.value, diff --git a/rolling bearing/rolling_bearing.js b/rolling bearing/rolling_bearing.js index 598ab90..e808b64 100644 --- a/rolling bearing/rolling_bearing.js +++ b/rolling bearing/rolling_bearing.js @@ -95,6 +95,7 @@ rms_v.avg_cnt = 4; //количество усреднений gtl.diagnostic.interval = freq.time * freq.avg_cnt; let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала +let canvas = gtl.plots.add("specs(A) dB"); function diagnose() { switch (state) { case 0: // считаем частоту вращения и настраиваем спектры @@ -158,6 +159,24 @@ function diagnose() { let spen_df = def.rbDefs(spen_mx, true); let ausp_mx = mtx.rbMTX(ausp, 0, true); + canvas.add( + { + color: ausp.color, + name: ausp.name, + x: ausp.resolution, + y: ausp.data + } + ); //рисуем спектр вибрации на плоскости + + canvas.add( + { + color: spen.color, + name: spen.name, + x: spen.resolution, + y: spen.data + } + ); //рисуем спектр огибающей на плоскости + var res = { RMSA: rms_spen.value, RMSV: rms_v.value, diff --git a/sliding bearing/sbDefs.js b/sliding bearing/sbDefs.js new file mode 100644 index 0000000..fd14f3a --- /dev/null +++ b/sliding bearing/sbDefs.js @@ -0,0 +1,99 @@ +"use strict"; + +var imp = gtl.import("user-functions.js"); + +export function defects() { + let frq = imp.FREQ(); //функциональная чатота + let num = 20; //количество отрисованных гармоник + + //строим гармонические ряды на SPEN[A]. + var spen_set = spen.add_harms_set(frq, num, 0xff990090, 1); //"фиолетовый" + spen_set.name = 'Частота вращения'; + var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей + + var spen_set1 = spen.add_harms_set(frq / 2, num, 0x30D5C8, 1); //"бирюзовый" + spen_set1.name = 'Автоколебания'; + var spen_index1 = spen.index_of_harms_set(spen_set1); //индекс набора гармоник в спектре огибающей + + var spen_set2 = spen.add_harms_set(frq / 3, num, 0x34C924, 1); //"Вердепомовый" + spen_set2.name = 'Автоколебания (треть)'; + var spen_index2 = spen.index_of_harms_set(spen_set2); //индекс набора гармоник в спектре огибающей + + //строим гармонические ряды на AUSP[A]. + var ausp_set = ausp.add_harms_set(frq, num, 0xff990090, 2); //"фиолетовый" + ausp_set.name = 'Частота вращения'; + var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации + + var ausp_set1 = ausp.add_harms_set(frq / 2, num, 0x30D5C8, 1); //"бирюзовый" + ausp_set1.name = 'Автоколебания'; + var ausp_index1 = ausp.index_of_harms_set(ausp_set1); //индекс набора гармоник в спектре огибающей + + var ausp_set2 = ausp.add_harms_set(frq / 3, num, 0x34C924, 1); //"Вердепомовый" + ausp_set2.name = 'Автоколебания (треть)'; + var ausp_index2 = ausp.index_of_harms_set(ausp_set2); //индекс набора гармоник в спектре огибающей + + //строим гармонические ряды на AUSP[V]. + var auspv_set = ausp_v.add_harms_set(frq, num, 0xff990090, 2); //"фиолетовый" + auspv_set.name = 'Частота вращения'; + var auspv_index = ausp_v.index_of_harms_set(auspv_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, 0, 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) + "Fв +/- Fвр", 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в +/- Fвр", ampl); + } + } + } + else + gtl.log.info("Дефекты подшипника скольжения", "Признаков дефекта не обнаружено"); + + deep = Math.max(...spen_signs) * 100; + switch (true) { + case deep <= 4: + describe = "Слабый"; + break; + case deep < 8: + describe = "Средний"; + break; + case deep >= 8: + describe = "Сильный"; + break; + default: + describe = "None"; + }; + + if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false }; + + return result; +}; + diff --git a/sliding bearing/sliding_bearing.js b/sliding bearing/sliding_bearing.js new file mode 100644 index 0000000..9baab8f --- /dev/null +++ b/sliding bearing/sliding_bearing.js @@ -0,0 +1,266 @@ +"use strict"; +var signals = gtl.options.record.signalsModel; +var options = gtl.options; +var record = gtl.options.record; +var point = gtl.options.point; + +var fnc = gtl.import("userFunctions.js"); +var def = gtl.import("sbDefs.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 filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра +filter_spen.kind = gtl.filter_iir.butterworth; //тип окна +filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter_spen.order = 4; //порядок фильтра +filter_spen.frequency = 8000; //центральная частота полосового фильтра +filter_spen.width = 1840; //ширина полосы фильтра + +//полосовой фильтр 10-10000 Гц +var band10_10k = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра +band10_10k.kind = gtl.filter_iir.butterworth; //тип окна +band10_10k.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +band10_10k.order = 10; //порядок фильтра +band10_10k.frequency = 5005; //центральная частота полосового фильтра +band10_10k.width = 9990; //ширина полосы фильтра + +//полосовой фильтр 10-1000 Гц +var band10_1k = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра +band10_1k.kind = gtl.filter_iir.butterworth; //тип окна +band10_1k.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +band10_1k.order = 10; //порядок фильтра +band10_1k.frequency = 505; //центральная частота полосового фильтра +band10_1k.width = 990; //ширина полосы фильтра + +//интегратор +var int = gtl.add_intg(band10_1k); //интегрирование сигнала виброускорения +int.taps = 1; //степень интегрирования (скорость из ускорения - 1-нарное интегрирование) + +//дополнительный ФВЧ от 10 Гц +var hpf10 = gtl.add_filter_iir(int); //назначение переменной фильтра +hpf10.kind = gtl.filter_iir.butterworth; //тип окна +hpf10.type = gtl.filter_iir.highpass; //тип фильтра (полосовой) +hpf10.order = 10; //порядок фильтра +hpf10.frequency = 10; //граничная частота полосового фильтра + +//ФВЧ от 5000 Гц (эксцесс) +var hpf5 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра +hpf5.kind = gtl.filter_iir.butterworth; //тип окна +hpf5.type = gtl.filter_iir.highpass; //тип фильтра (полосовой) +hpf5.order = 10; //порядок фильтра +hpf5.frequency = 5000; //граничная частота полосового фильтра + +//[Блок настройки спектров] +//мониторинговый спектр виброускорения +var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации +ausp2.name = "AUSP[mon]"; //присвоение имени спектра +ausp2.color = 0x0000ffff; //цвет линии спектра +ausp2.frequency = 25600; //граничная частота спектра +ausp2.lines = 1600; //разрешение спектра (количество линий) +ausp2.average = 6; //количество усреднений +//ausp2.overlap = 30; //коэффициент перекрытия +ausp2.unit = gtl.spec.db; //отображение в дБ +gtl.log.info("AUSP[mon]: время", ausp2.acq_time + " сек."); + +//спектр виброускорения +var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации +ausp.name = "AUSP[A]"; //присвоение имени спектра +ausp.color = 0x0000ff00; //цвет линии спектра +ausp.frequency = 400; //граничная частота спектра +ausp.lines = 400; //разрешение спектра (количество линий) +ausp.average = 6; //количество усреднений +ausp.overlap = .30; //коэффициент перекрытия +ausp.unit = gtl.spec.db; //отображение в дБ +ausp.smoothing_factor = 50; //коэффициент сглаживания (средней линии) +ausp.smoothed_line_color = 0x000000ff; //цвет линии сглаживания (средней линии) +ausp.peak_level = 20; //порог обнаружения гармоник +ausp.harm_tolerance = ausp.resolution * 4; //диапазон поиска гармоник +/- +gtl.log.info("AUSP[A]: время", ausp.acq_time + " сек."); + +//спектр огибающей виброускорения +var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей +spen.name = "SPEN[A]"; //присвоение имени спектра огибающей +spen.color = 0x00ff0000; //цвет линии спектра огибающей +spen.frequency = 400; //граничная частота спектра огибающей +spen.lines = 400; //разрешение спектра огибающей (количество линий) +spen.average = 8; //количество усреднений +spen.overlap = .30; //коэффициент перекрытия +spen.unit = gtl.spec.db; //отображение в дБ +spen.window = gtl.spec.hann; //окно +spen.smoothing_factor = 50; //коэффициент сглаживания (средней линии) +spen.smoothed_line_color = 0x000000ff; //цвет средней линии +spen.peak_level = 10; //порог обнаружения гармоник +spen.harm_tolerance = spen.resolution * 4; //диапазон поиска гармоник +/- +gtl.log.info("SPEN[A]: время", spen.acq_time + " сек."); + +//спектр виброскорости +var ausp_v = gtl.add_ausp(hpf10); //назначение переменной спектра вибрации +ausp_v.name = "AUSP[V]"; //присвоение имени спектра +ausp_v.color = 0x6A5ACD; //цвет линии спектра +ausp_v.frequency = 1000; //граничная частота спектра +ausp_v.lines = 500; //разрешение спектра (количество линий) +ausp_v.average = 6; //количество усреднений +//ausp_v.overlap = 30; //коэффициент перекрытия +ausp_v.unit = gtl.spec.unit; //отображение в дБ +ausp_v.smoothing_factor = 50; //коэффициент сглаживания (средней линии) +ausp_v.smoothed_line_color = 0x000000ff; //цвет линии сглаживания (средней линии) +ausp_v.peak_level = 0.0005; //порог обнаружения гармоник +ausp_v.harm_tolerance = ausp_v.resolution * 4; //диапазон поиска гармоник +/- +gtl.log.info("AUSP[V]: время", ausp_v.acq_time + " сек."); + +//RMS виброускорения в диапазоне спектра огибающей (контроль работы сил трения) +var rms_spen = gtl.add_value_rms(filter_spen); //назначение переменной RMS (spen) +rms_spen.name = "RMS (spen)" //присвоение имени RMS (spen) +rms_spen.time = 0.5; //интервал расчета RMS (spen) +rms_spen.avg_cnt = 4; //количество усреднений RMS (spen) + +//RMS виброускорения в диапазоне 10-1000 Гц +var rms_a = gtl.add_value_rms(band10_10k); //назначение переменной RMS (spen) +rms_a.name = "RMS (a)" //присвоение имени RMS (spen) +rms_a.time = 0.5; //интервал расчета RMS (spen) +rms_a.avg_cnt = 4; //количество усреднений RMS (spen) + +//RMS виброскорости в диапазоне 10-1000 Гц +var rms_v = gtl.add_value_rms(hpf10); //объявление переменной СКЗ +rms_v.time = 0.5; //время выборки +rms_v.avg_cnt = 4; //количество усреднений + +//коэффициент эксцесса в диапазоне от 5000 Гц +var kurt = gtl.add_value_kurt(hpf5); //объявление переменной частоты вращения +kurt.time = 0.5; //время выборки +kurt.avg_cnt = 4; //количество усреднений + +//коэффициент эксцесса огибающей сигнала +var kurt_spen = gtl.get_kurt_value(spen.env); + +//[Диагностика] +gtl.diagnostic.interval = freq.time * freq.avg_cnt; +let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала + +let canvas = gtl.plots.add("specs(A) dB"); +let canvas2 = gtl.plots.add("specs(V) мм/с"); +function diagnose() { + switch (state) { + case 0: // считаем частоту вращения и настраиваем спектры + if (fnc.INSTABILITY() > fnc.tolerance()) { + gtl.log.info("Критическая нестабильность частоты вращения, %", fnc.INSTABILITY() * 100); + gtl.log.info("Результат:", "Диагностика прервана"); + //gtl.diagnostic.stop(); //принудительная остановка диагностики + + let __result = { + Result: false + }; + gtl.results = __result; + }; + + if (fnc.FREQ() <= fnc.FREQNESS()) { + gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + fnc.FREQNESS()); + }; + + case 1: //частота вращения фиксированная + case 2: //частота вращения из поля INFO (виброметр) + filter_spen.frequency = fnc.bpFreq(); //считаем фильтр для огибающей + filter_spen.width = fnc.bpWidth(); //определяем ширину фильтра + spen.frequency = fnc.specParams().frequency; + spen.lines = fnc.specParams().lines * 2; + ausp.frequency = fnc.specParams().frequency; + ausp.lines = fnc.specParams().lines * 2; + ausp_v.frequency = fnc.specParams().frequency; + ausp_v.lines = fnc.specParams().lines * 2; + + //определение минимально необходимой длительности сигнала для проведения диагностики + let time = []; //массив времени набора данных + time.push(ausp2.acq_time); + time.push(ausp.acq_time); + time.push(spen.acq_time); + time.push(ausp_v.acq_time); + let max_acq = Math.max(...time); + gtl.diagnostic.interval = max_acq; + gtl.log.info("Массив времени набора данных:", time); + state = 3; + break; + + case 3: //выполняем анализ спектов + ausp.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре вибрации + spen.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре огибающей + + //Вывод информации в лог + //Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра + var SQR_spen = fnc.specSquare(spen.base, 0, spen.frequency); + + gtl.log.info("Объект диагностики", options.rbModelName); + gtl.log.info("SPEN: Расчетная частота полосового фильтра", filter_spen.frequency); + gtl.log.info("SPEN: Ширина фильтра", filter_spen.width); + gtl.log.info("SPEN: Граничная частота", spen.frequency); + gtl.log.info("SPEN: Количество линий", spen.lines); + gtl.log.info("SPEN: Разрешение", spen.resolution); + gtl.log.info("AUSP: Граничная частота", ausp.frequency); + gtl.log.info("AUSP: Количество линий", ausp.lines); + gtl.log.info("AUSP: Разрешение", ausp.resolution); + + gtl.log.info("RMS виброускорения в диапазоне огибающей", rms_spen.value); + gtl.log.info("RMS виброускорения в диапазоне 10-10000 Гц", rms_a.value); + gtl.log.info("RMS виброскорости в диапазоне 10-1000 Гц", 1000 * rms_v.value); + gtl.log.info("Площадь под огибающей", SQR_spen); + gtl.log.info("Эксцесс от 5 кГц", kurt.value); + gtl.log.info("Эксцесс по огибающей сигнала", kurt_spen.value); + + var defects = def.defects(); + + canvas.add( + { + color: ausp.color, + name: ausp.name, + x: ausp.resolution, + y: ausp.data + } + ); //рисуем спектр вибрации на плоскости + + canvas.add( + { + color: spen.color, + name: spen.name, + x: spen.resolution, + y: spen.data + } + ); //рисуем спектр огибающей на плоскости + + canvas2.add( + { + color: ausp_v.color, + name: ausp_v.name, + x: ausp_v.resolution, + y: ausp_v.data + } + ); //рисуем спектр виброскорости на плоскости + + let __result = { + RMS: rms_spen.value, + RMSA: rms_a.value, + RMSV: 1000 * rms_v.value, + SQR: SQR_spen, + Kurt: kurt.value, + Kurt_spen: "Нет данных" + }; + + gtl.results = __result; + gtl.diagnostic.stop(); + break; + + default: + break; + } +} \ No newline at end of file