From feca9870bcbaa2d3752c66fd638d124a62d8aa8c Mon Sep 17 00:00:00 2001 From: Aleksey_K Date: Tue, 23 Apr 2024 16:55:10 +0900 Subject: [PATCH] new version --- ballscrew/ballscrew.js | 172 ++++++++++++ ballscrew/bs_defs.js | 52 ++++ ballscrew/bs_mtx.js | 54 ++++ gear transmission/defects/gt-gear-beat.js | 79 ------ gear transmission/defects/gt-gear-fault.js | 83 ------ gear transmission/defects/gt-wheel-beat.js | 79 ------ gear transmission/defects/gt-wheel-fault.js | 83 ------ gear transmission/gear_transmission.js | 193 ++++---------- gear transmission/gt_defs.js | 51 ++++ gear transmission/gt_mtx.js | 53 ++++ kNN/kNN.js | 164 ++++++++++++ kNN/kn_defs.js | 35 +++ kNN/kn_mtx.js | 54 ++++ planetary gear/defects/gt-gear-beat.js | 79 ------ planetary gear/defects/gt-gear-fault.js | 83 ------ planetary gear/planetary_gear.js | 261 ------------------- rolling bearing/defects/rb-inring-fault.js | 83 ------ rolling bearing/defects/rb-inring-tention.js | 63 ----- rolling bearing/defects/rb-inring-wear.js | 63 ----- rolling bearing/defects/rb-outring-bias.js | 63 ----- rolling bearing/defects/rb-outring-fault.js | 83 ------ rolling bearing/defects/rb-outring-wear.js | 63 ----- rolling bearing/defects/rb-rollers-fault.js | 85 ------ rolling bearing/defects/rb-separator-wear.js | 63 ----- rolling bearing/defects/rb-shaft.js | 79 ------ rolling bearing/rb_defs.js | 52 ++++ rolling bearing/rb_mtx.js | 54 ++++ rolling bearing/rolling_bearing.js | 206 ++++----------- 28 files changed, 846 insertions(+), 1686 deletions(-) create mode 100644 ballscrew/ballscrew.js create mode 100644 ballscrew/bs_defs.js create mode 100644 ballscrew/bs_mtx.js delete mode 100644 gear transmission/defects/gt-gear-beat.js delete mode 100644 gear transmission/defects/gt-gear-fault.js delete mode 100644 gear transmission/defects/gt-wheel-beat.js delete mode 100644 gear transmission/defects/gt-wheel-fault.js create mode 100644 gear transmission/gt_defs.js create mode 100644 gear transmission/gt_mtx.js create mode 100644 kNN/kNN.js create mode 100644 kNN/kn_defs.js create mode 100644 kNN/kn_mtx.js delete mode 100644 planetary gear/defects/gt-gear-beat.js delete mode 100644 planetary gear/defects/gt-gear-fault.js delete mode 100644 planetary gear/planetary_gear.js delete mode 100644 rolling bearing/defects/rb-inring-fault.js delete mode 100644 rolling bearing/defects/rb-inring-tention.js delete mode 100644 rolling bearing/defects/rb-inring-wear.js delete mode 100644 rolling bearing/defects/rb-outring-bias.js delete mode 100644 rolling bearing/defects/rb-outring-fault.js delete mode 100644 rolling bearing/defects/rb-outring-wear.js delete mode 100644 rolling bearing/defects/rb-rollers-fault.js delete mode 100644 rolling bearing/defects/rb-separator-wear.js delete mode 100644 rolling bearing/defects/rb-shaft.js create mode 100644 rolling bearing/rb_defs.js create mode 100644 rolling bearing/rb_mtx.js diff --git a/ballscrew/ballscrew.js b/ballscrew/ballscrew.js new file mode 100644 index 0000000..f279318 --- /dev/null +++ b/ballscrew/ballscrew.js @@ -0,0 +1,172 @@ +"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("user-functions.js"); +var mtx = gtl.import("bs_mtx.js"); +var def = gtl.import("bs_defs.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].portNumber]); //назначение переменной спектра вибрации +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].portNumber]); //назначение переменной спектра вибрации +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].portNumber]); //назначение переменной фильтра +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 = 200; //граничная частота спектра огибающей +spen.lines = 200; //разрешение спектра огибающей (количество линий) +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 виброскорости в диапазоне 10-1000 Гц. +var int = gtl.add_intg(gtl.analog_inputs[signals[0].portNumber]); //интегрирование сигнала виброускорения +int.taps = 1; //степень интегрирования (скорость из ускорения - 1-нарное интегрирование) +//фильтрация сигнала в диапазоне +var filter = gtl.add_filter_iir(int); //объявление переменной фильтра +filter.kind = gtl.filter_iir.butterworth; //тип окна +filter.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter.order = 10; //порядок фильтра +filter.frequency = 505; //центральная частота полосового фильтра +filter.width = 990; //ширина полосы фильтра +//определение среднего квадратического значения виброскорости +var rms_v = gtl.add_value_rms(filter); //объявление переменной СКЗ +rms_v.time = 0.5; //время выборки +rms_v.avg_cnt = 4; //количество усреднений + +//[Диагностика] +gtl.diagnostic.interval = freq.time * freq.avg_cnt; +let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала + +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.filter_frequency(); //считаме фильтр для огибающей + filter_spen.width = fnc.filter_width(); //определяем ширину фильтра + spen.frequency = fnc.spec_params().frequency; + spen.lines = fnc.spec_params().lines; + + //определение минимально необходимой длительности сигнала для проведения диагностики + let time = []; //массив по времени набора данных + time.push(ausp.acq_time); + time.push(spen.acq_time); + let max_acq = Math.max(...time); + gtl.diagnostic.interval = max_acq; + state = 3; + break; + + case 3: //выполняем анализ спектов + ausp.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре вибрации + spen.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре огибающей + + //Вывод информации в лог + //Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра + var AQ = fnc.spec_square(ausp.data, ausp.frequency / 2, ausp.frequency); + + gtl.log.info("Объект диагностики", options.rbModelName); + gtl.log.info("FREQ", fnc.FREQ()); + gtl.log.info("FTF", fnc.BSFTF()); + gtl.log.info("BPFO", fnc.BSNUT()); + gtl.log.info("BPFI", fnc.BSSCR()); + gtl.log.info("BSF", fnc.BSBAL()); + gtl.log.info("Коридор обнаружения гармоники", fnc.tolerance()); + gtl.log.info("Полосовой фильтр (расчетный)", filter_spen.frequency); + gtl.log.info("Граничная частота SPEN", spen.frequency); + gtl.log.info("Количество линий SPEN", spen.lines); + gtl.log.info("Ширина AUSP", ausp.frequency); + + let spen_mx = mtx.bs_mtx(spen, true); + let spen_df = def.bs_defs(spen_mx, true); + let ausp_mx = mtx.bs_mtx(ausp, false); + + var res = { + RMSA: rms_spen.value, + RMSV: rms_v.value, + PF: ampl_spen.value / rms_spen.value, + SQR: AQ, + matrix: spen_mx, + defs: spen_df, + }; + + gtl.results = res; + gtl.diagnostic.stop(); + break; + + default: + break; + } +} \ No newline at end of file diff --git a/ballscrew/bs_defs.js b/ballscrew/bs_defs.js new file mode 100644 index 0000000..9de300b --- /dev/null +++ b/ballscrew/bs_defs.js @@ -0,0 +1,52 @@ +"use strict"; + +export function bs_defs(mtx, isDeep) { + var res = {}; //результат + if (isDeep = true) { var key = "dp" } else { var key = "lv" }; + var des = { + FTF: { ds: "тел качения и сепаратора", dp: 8, lv: 20 }, + FREQ: { ds: "винта", dp: 13, lv: 20 }, + BSF: { ds: "тел качения", dp: 10, lv: 20 }, + BPFO: { ds: "гайки", dp: 15, lv: 20 }, + BPFI: { ds: "винта", dp: 8, lv: 20 }, + }; //описание функциональных частот + + function get_note(harmsArr) { + let note = "Износ"; //описание характера колебаний + let cnt = 0; //количество значений в массиве + for (let i = 0; i <= harmsArr.length - 1; i++) { if (harmsArr[i] > 0) { cnt++ }; }; + if (cnt >= 5) { note = "Дефект" }; + if (harmsArr[1] > harmsArr[0]) { note = "Перекос" }; + if (cnt > 0 && harmsArr[0] == 0 && harmsArr[1] == 0) { note = "Неидентифицированные изменения вибрации" }; + return note; + }; + + function get_level(lvl, thres) { + let level = "Сильный"; + switch (true) { + case lvl < 0.5 * thres: + level = "Слабый"; + break; + case lvl < thres: + level = "Средний"; + break; + default: + break; + }; return level; + }; + + var rows = Object.keys(mtx); //массив ключей объекта (наборов гармоник) + for (let i = 0; i <= rows.length - 1; i++) { + let arr = mtx[rows[i]]; //массив гармоник + let lvl = Math.max(...arr); //определяем максимальное значение параметра из массива + let sum = arr.reduce(function (a, b) { return a + b }, 0); //сумма элементов массива + if (sum > 0) { + let note = get_note(arr); + res[rows[i]] = note + ' ' + des[rows[i]].ds + ': ' + get_level(lvl, des[rows[i]][key]) + ' (' + lvl + ')'; + }; + }; + return res; +}; + + + diff --git a/ballscrew/bs_mtx.js b/ballscrew/bs_mtx.js new file mode 100644 index 0000000..c41ef00 --- /dev/null +++ b/ballscrew/bs_mtx.js @@ -0,0 +1,54 @@ +"use strict"; + +var ufc = gtl.import("user-functions.js"); + +export function bs_mtx(spec, isDeep) { + var num = 6; //глубина матрицы (количество гармоник) + var level = 0; //уровень развития дефекта + var res = {}; //результат + + var set = { + FTF: { nm: "Частота вращения сепаратора", fn: ufc.BSFTF(), md: 0, cl: 0xffff0000 }, + FREQ: { nm: "Частота вращения", fn: ufc.FREQ(), md: 0, cl: 0xff0000f0 }, + BSF: { nm: "Частота вращения (контакта) тел качения", fn: ufc.BSBAL(), md: 0, cl: 0xffFFB841 }, + BPFO: { nm: "Частота перекатывания тел качения по гайке", fn: ufc.BSNUT(), md: 0, cl: 0xffED3CCA }, + BPFI: { nm: "Частота перекатывания тел качения по винту", fn: ufc.BSSCR(), md: 0, cl: 0xff990090 } + }; //набор функциональных частот + + var rows = Object.keys(set); //массив ключей объекта (наборов гармонических рядов) + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + for (let i = 0; i <= rows.length - 1; i++) { + let lines = rows[i]; + let idx = 0; //индекс гармонического ряда + let nms = set[lines].nm; //название гармонического ряда + let frq = set[lines].fn; //расчетная частота + let mod = set[lines].md; //модулирующая частота + let clr = set[lines].cl; //предустановленный цвет + let arr = []; //массив обнаруженных гармоник + + lines = spec.add_harms_set(frq, num, clr, 2); //строим набор частот (гармонический ряд) + lines.name = nms; + idx = spec.index_of_harms_set(lines); //определяем индекс набора частот + if (mod != 0) { spec.harms_sets[idx].modulate(mod, 2, clr, 0.5) }; //строим амплитудную модуляцию + for (let j = 0; j <= num - 1; j++) { + lines.harms[j].tolerance = (j + 1) * frq * ufc.tolerance(); //устанавливаем коридор обнаружения гармоники + if (lines.harms[j].is_present == true) { + switch (isDeep) { + case true: + level = Math.round(ufc.mod_factor(lines.harms[j].amplitude, lines.harms[j].base)); + break; + case false: + level = Math.round(lines.harms[j].amplitude); + break; + default: + break; + }; + arr.push(level); + } else { arr.push(0) }; + res[rows[i]] = arr; + }; + }; + + return res; +}; + diff --git a/gear transmission/defects/gt-gear-beat.js b/gear transmission/defects/gt-gear-beat.js deleted file mode 100644 index 4b5a3f0..0000000 --- a/gear transmission/defects/gt-gear-beat.js +++ /dev/null @@ -1,79 +0,0 @@ -"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/gear transmission/defects/gt-gear-fault.js b/gear transmission/defects/gt-gear-fault.js deleted file mode 100644 index c70d44d..0000000 --- a/gear transmission/defects/gt-gear-fault.js +++ /dev/null @@ -1,83 +0,0 @@ -"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/gear transmission/defects/gt-wheel-beat.js b/gear transmission/defects/gt-wheel-beat.js deleted file mode 100644 index 49291bb..0000000 --- a/gear transmission/defects/gt-wheel-beat.js +++ /dev/null @@ -1,79 +0,0 @@ -"use strict"; - -var imp = gtl.import("user-functions.js"); - -export function defect() { - let frq = imp.GTF2(); //функциональная чатота - let num = 10; //количество отрисованных гармоник - - //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. - var spen_set = spen.add_harms_set(frq, num, 0xff009000, 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, 0xff009000, 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вр2", 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вр2", 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/gear transmission/defects/gt-wheel-fault.js b/gear transmission/defects/gt-wheel-fault.js deleted file mode 100644 index acb0253..0000000 --- a/gear transmission/defects/gt-wheel-fault.js +++ /dev/null @@ -1,83 +0,0 @@ -"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, 0xff994000, 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.GTF2(), 2, 0xff009000, 1); //модуляция Fz +/- Fвр - - var ausp_set = ausp.add_harms_set(frq, num, 0xff994000, 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.GTF2(), 2, 0xff009000, 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/gear transmission/gear_transmission.js b/gear transmission/gear_transmission.js index 35dec9d..be648cc 100644 --- a/gear transmission/gear_transmission.js +++ b/gear transmission/gear_transmission.js @@ -4,12 +4,9 @@ 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 fnc = gtl.import("user-functions.js"); +var mtx = gtl.import("gt_mtx.js"); +var def = gtl.import("gt_defs.js"); //настройки для датчика оборотов var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра @@ -26,7 +23,7 @@ freq.avg_cnt = 6; //[Блок настройки параметров измерений] //мониторинговый спектр вибрации -var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации +var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации ausp2.name = "AUSPm"; //присвоение имени спектра ausp2.color = 0x0000ffff; //цвет линии спектра ausp2.frequency = 1600; //граничная частота спектра @@ -35,7 +32,7 @@ ausp2.average = 6; //количество усреднений ausp2.unit = gtl.spec.db; //отображение в дБ //спектр вибрации -var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации +var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации ausp.name = "AUSPd"; //присвоение имени спектра ausp.color = 0x0000ff00; //цвет линии спектра ausp.frequency = 800; //граничная частота спектра @@ -48,7 +45,7 @@ ausp.peak_level = 20; //порог обнаружения гармоник ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/- //фильтр для формирования спектра огибающей -var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра +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 = 10; //порядок фильтра @@ -60,8 +57,8 @@ filter_spen.width = 1482; //ширина полосы фильтра var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей spen.name = "SPEN"; //присвоение имени спектра огибающей spen.color = 0x00ff0000; //цвет линии спектра огибающей -spen.frequency = 400; //граничная частота спектра огибающей -spen.lines = 400; //разрешение спектра огибающей (количество линий) +spen.frequency = 200; //граничная частота спектра огибающей +spen.lines = 200; //разрешение спектра огибающей (количество линий) spen.average = 8; //количество усреднений spen.unit = gtl.spec.db; //отображение в дБ spen.window = gtl.spec.hann; //окно @@ -79,62 +76,30 @@ 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) +//RMS виброскорости в диапазоне 10-1000 Гц. +var int = gtl.add_intg(gtl.analog_inputs[signals[0].portNumber]); //интегрирование сигнала виброускорения +int.taps = 1; //степень интегрирования (скорость из ускорения - 1-нарное интегрирование) +//фильтрация сигнала в диапазоне +var filter = gtl.add_filter_iir(int); //объявление переменной фильтра +filter.kind = gtl.filter_iir.butterworth; //тип окна +filter.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter.order = 10; //порядок фильтра +filter.frequency = 505; //центральная частота полосового фильтра +filter.width = 990; //ширина полосы фильтра +//определение среднего квадратического значения виброскорости +var rms_v = gtl.add_value_rms(filter); //объявление переменной СКЗ +rms_v.time = 0.5; //время выборки +rms_v.avg_cnt = 4; //количество усреднений //[Диагностика] 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); + if (fnc.INSTABILITY() > fnc.tolerance()) { + gtl.log.info("Критическая нестабильность частоты вращения, %", fnc.INSTABILITY() * 100); gtl.log.info("Результат:", "Диагностика прервана"); //gtl.diagnostic.stop(); //принудительная остановка диагностики @@ -144,60 +109,23 @@ function diagnose() { gtl.results = __result; }; - if (imp.FREQ() <= imp.FREQNESS()) { - gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + imp.FREQNESS()); + if (fnc.FREQ() <= fnc.FREQNESS()) { + gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + fnc.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(); + filter_spen.frequency = fnc.filter_frequency(); //считаме фильтр для огибающей + filter_spen.width = fnc.filter_width(); //определяем ширину фильтра + spen.frequency = fnc.spec_params().frequency; + spen.lines = fnc.spec_params().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; + let time = []; //массив по времени набора данных + time.push(ausp.acq_time); + time.push(spen.acq_time); + let max_acq = Math.max(...time); + gtl.diagnostic.interval = max_acq; state = 3; break; @@ -207,48 +135,29 @@ function diagnose() { //Вывод информации в лог //Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра - var AQ = imp.spec_square(ausp2.data, 800, ausp2.frequency); + var AQ = fnc.spec_square(ausp.data, ausp.frequency / 2, ausp.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); + gtl.log.info("Объект диагностики", options.rbModelName); + gtl.log.info("FREQ", fnc.FREQ()); + gtl.log.info("FTF", fnc.GTF2()); + gtl.log.info("BPFO", fnc.GTFZ()); + gtl.log.info("Коридор обнаружения гармоники", fnc.tolerance()); + gtl.log.info("Полосовой фильтр (расчетный)", filter_spen.frequency); + gtl.log.info("Граничная частота SPEN", spen.frequency); + gtl.log.info("Количество линий SPEN", spen.lines); + gtl.log.info("Ширина AUSP", ausp.frequency); - 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) + let spen_mx = mtx.gt_mtx(spen, true); + let spen_df = def.gt_defs(spen_mx, true); + let ausp_mx = mtx.gt_mtx(ausp, false); var res = { RMSA: rms_spen.value, + RMSV: rms_v.value, PF: ampl_spen.value / rms_spen.value, - RMS_V2: rms_v2.value, - RMS_V10: rms_v10.value, SQR: AQ, - defects: def + matrix: spen_mx, + defs: spen_df }; gtl.results = res; diff --git a/gear transmission/gt_defs.js b/gear transmission/gt_defs.js new file mode 100644 index 0000000..9635e2f --- /dev/null +++ b/gear transmission/gt_defs.js @@ -0,0 +1,51 @@ +"use strict"; + +export function gt_defs(mtx, isDeep) { + var res = {}; //результат + if (isDeep = true) { var key = "dp" } else { var key = "lv" }; + var des = { + FREQ: { ds: "шестерни", dp: 20, lv: 20 }, + GTF2: { ds: "зубчатого колеса", dp: 20, lv: 20 }, + GTFZ: { ds: "зацепления шестерни", dp: 20, lv: 20 }, + GTFZ2: { ds: "зацепления зубчатого колеса", dp: 20, lv: 20 } + }; //описание функциональных частот + + function get_note(harmsArr) { + let note = "Биение"; //описание характера колебаний + let cnt = 0; //количество значений в массиве + for (let i = 0; i <= harmsArr.length - 1; i++) { if (harmsArr[i] > 0) { cnt++ }; }; + if (cnt >= 5) { note = "Дефект" }; + if (harmsArr[1] > harmsArr[0]) { note = "Перекос" }; + if (cnt > 0 && harmsArr[0] == 0 && harmsArr[1] == 0) { note = "Неидентифицированные изменения вибрации" }; + return note; + }; + + function get_level(lvl, thres) { + let level = "Сильный"; + switch (true) { + case lvl < 0.5 * thres: + level = "Слабый"; + break; + case lvl < thres: + level = "Средний"; + break; + default: + break; + }; return level; + }; + + var rows = Object.keys(mtx); //массив ключей объекта (наборов гармоник) + for (let i = 0; i <= rows.length - 1; i++) { + let arr = mtx[rows[i]]; //массив гармоник + let lvl = Math.max(...arr); //определяем максимальное значение параметра из массива + let sum = arr.reduce(function (a, b) { return a + b }, 0); //сумма элементов массива + if (sum > 0) { + let note = get_note(arr); + res[rows[i]] = note + ' ' + des[rows[i]].ds + ': ' + get_level(lvl, des[rows[i]][key]) + ' (' + lvl + ')'; + }; + }; + return res; +}; + + + diff --git a/gear transmission/gt_mtx.js b/gear transmission/gt_mtx.js new file mode 100644 index 0000000..439c63e --- /dev/null +++ b/gear transmission/gt_mtx.js @@ -0,0 +1,53 @@ +"use strict"; + +var ufc = gtl.import("user-functions.js"); + +export function gt_mtx(spec, isDeep) { + var num = 6; //глубина матрицы (количество гармоник) + var level = 0; //уровень развития дефекта + var res = {}; //результат + + var set = { + FREQ: { nm: "Частота вращения", fn: ufc.FREQ(), md: 0, cl: 0xff0000f0 }, + GTF2: { nm: "Частота вращения второго вала", fn: ufc.GTF2(), md: 0, cl: 0xffFFB841 }, + GTFZ: { nm: "Зубцовая частота по шестерне", fn: ufc.GTFZ(), md: ufc.FREQ(), cl: 0xffED3CCA }, + GTFZ2: { nm: "Зубцовая частота по второму валу", fn: ufc.GTFZ(), md: ufc.GTF2(), cl: 0xff990090 } + }; //набор функциональных частот + + var rows = Object.keys(set); //массив ключей объекта (наборов гармонических рядов) + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + for (let i = 0; i <= rows.length - 1; i++) { + let lines = rows[i]; + let idx = 0; //индекс гармонического ряда + let nms = set[lines].nm; //название гармонического ряда + let frq = set[lines].fn; //расчетная частота + let mod = set[lines].md; //модулирующая частота + let clr = set[lines].cl; //предустановленный цвет + let arr = []; //массив обнаруженных гармоник + + lines = spec.add_harms_set(frq, num, clr, 2); //строим набор частот (гармонический ряд) + lines.name = nms; + idx = spec.index_of_harms_set(lines); //определяем индекс набора частот + if (mod != 0) { spec.harms_sets[idx].modulate(mod, 2, clr, 0.5) }; //строим амплитудную модуляцию + for (let j = 0; j <= num - 1; j++) { + lines.harms[j].tolerance = (j + 1) * frq * ufc.tolerance(); //устанавливаем коридор обнаружения гармоники + if (lines.harms[j].is_present == true) { + switch (isDeep) { + case true: + level = Math.round(ufc.mod_factor(lines.harms[j].amplitude, lines.harms[j].base)); + break; + case false: + level = Math.round(lines.harms[j].amplitude); + break; + default: + break; + }; + arr.push(level); + } else { arr.push(0) }; + res[rows[i]] = arr; + }; + }; + + return res; +}; + diff --git a/kNN/kNN.js b/kNN/kNN.js new file mode 100644 index 0000000..ebe6e95 --- /dev/null +++ b/kNN/kNN.js @@ -0,0 +1,164 @@ +"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("user-functions.js"); +var mtx = gtl.import("kn_mtx.js"); +var def = gtl.import("kn_defs.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 ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации +ausp.name = "AUSP"; //присвоение имени спектра +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].portNumber]); //назначение переменной фильтра +filter_spen.kind = gtl.filter_iir.butterworth; //тип окна +filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter_spen.order = 10; //порядок фильтра +filter_spen.frequency = 6400; //центральная частота полосового фильтра +filter_spen.width = 1482; //ширина полосы фильтра +filter_spen.color = 255; + +//спектр огибающей +var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей +spen.name = "SPEN"; //присвоение имени спектра огибающей +spen.color = 0x00ff0000; //цвет линии спектра огибающей +spen.frequency = 200; //граничная частота спектра огибающей +spen.lines = 200; //разрешение спектра огибающей (количество линий) +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 виброскорости в диапазоне 10-1000 Гц. +var int = gtl.add_intg(gtl.analog_inputs[signals[0].portNumber]); //интегрирование сигнала виброускорения +int.taps = 1; //степень интегрирования (скорость из ускорения - 1-нарное интегрирование) +//фильтрация сигнала в диапазоне +var filter = gtl.add_filter_iir(int); //объявление переменной фильтра +filter.kind = gtl.filter_iir.butterworth; //тип окна +filter.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter.order = 10; //порядок фильтра +filter.frequency = 505; //центральная частота полосового фильтра +filter.width = 990; //ширина полосы фильтра +//определение среднего квадратического значения виброскорости +var rms_v = gtl.add_value_rms(filter); //объявление переменной СКЗ +rms_v.time = 0.5; //время выборки +rms_v.avg_cnt = 4; //количество усреднений + +//[Диагностика] +gtl.diagnostic.interval = freq.time * freq.avg_cnt; +let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала + +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.filter_frequency(); //считаме фильтр для огибающей + filter_spen.width = fnc.filter_width(); //определяем ширину фильтра + spen.frequency = fnc.spec_params().frequency; + spen.lines = fnc.spec_params().lines; + + //определение минимально необходимой длительности сигнала для проведения диагностики + let time = []; //массив по времени набора данных + time.push(ausp.acq_time); + time.push(spen.acq_time); + let max_acq = Math.max(...time); + gtl.diagnostic.interval = max_acq; + state = 3; + break; + + case 3: //выполняем анализ спектов + ausp.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре вибрации + spen.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре огибающей + + //Вывод информации в лог + //Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра + var AQ = fnc.spec_square(ausp.data, ausp.frequency / 2, ausp.frequency); + + gtl.log.info("Объект диагностики", + options.rbModelName); + gtl.log.info("Минимально необходимая частота вращения", fnc.FREQNESS()); + gtl.log.info("FREQ", fnc.FREQ()); + gtl.log.info("FTF", fnc.FTF()); + gtl.log.info("BPFO", fnc.BPFO()); + gtl.log.info("BPFI", fnc.BPFI()); + gtl.log.info("BSF", fnc.BSF()); + gtl.log.info("Коридор обнаружения гармоники", fnc.tolerance()); + gtl.log.info("Полосовой фильтр (расчетный)", filter_spen.frequency); + gtl.log.info("Граничная частота SPEN", spen.frequency); + gtl.log.info("Количество линий SPEN", spen.lines); + gtl.log.info("Ширина AUSP", ausp.frequency); + + let spen_mx = mtx.kn_mtx(spen, true); + let spen_df = def.kn_defs(spen_mx, true); + + var res = { + RMSA: rms_spen.value, + RMSV: rms_v.value, + PF: ampl_spen.value / rms_spen.value, + SQR: AQ, + matrix: spen_mx, + defs: spen_df + }; + + gtl.results = res; + gtl.diagnostic.stop(); + break; + + default: + break; + } +} \ No newline at end of file diff --git a/kNN/kn_defs.js b/kNN/kn_defs.js new file mode 100644 index 0000000..54b4484 --- /dev/null +++ b/kNN/kn_defs.js @@ -0,0 +1,35 @@ +"use strict"; + +export function kn_defs(mtx, isDeep) { + var res = {}; //результат + if (isDeep = true) { var key = "dp" } else { var key = "lv" }; + var des = { + FTF: { ds: "Износ тел качения и сепаратора", dp: 8, lv: 20 }, + FREQ: { ds: "Износ внутреннего кольца", dp: 13, lv: 20 }, + BSF: { ds: "Дефект тел качения", dp: 10, lv: 20 }, + BPFO: { ds: "Дефект наружного кольца", dp: 15, lv: 20 }, + BPFI: { ds: "Дефект внутреннего кольца", dp: 8, lv: 20 }, + }; //описание функциональных частот + + var rows = Object.keys(mtx); //массив ключей объекта (наборов гармоник) + for (let i = 0; i <= rows.length - 1; i++) { + let arr = mtx[rows[i]]; //массив гармоник + let delta = 0; //"расстояние" до дефекта + for (let j = 0; j <= arr.length - 1; j++) { + let limit = des[rows[i]][key]; //порог для гармоник + if (arr[j] / limit >= 1) { limit = arr[j] }; + delta = delta + Math.pow(1 - arr[j] / limit, 2); + }; + delta = Math.sqrt(delta); + res[rows[i]] = delta; + }; + + let values = Object.values(res); //собираем значения ключей объекта в массив + let minValue = Math.min(...values); //определяем минимальное значение + let minKey = Object.keys(res).find(minKey => res[minKey] === minValue); //определяем ключ по минимальному значению + + return des[minKey].ds; +}; + + + diff --git a/kNN/kn_mtx.js b/kNN/kn_mtx.js new file mode 100644 index 0000000..685bd4b --- /dev/null +++ b/kNN/kn_mtx.js @@ -0,0 +1,54 @@ +"use strict"; + +var ufc = gtl.import("user-functions.js"); + +export function kn_mtx(spec, isDeep) { + var num = 6; //глубина матрицы (количество гармоник) + var level = 0; //уровень развития дефекта + var res = {}; //результат + + var set = { + FTF: { nm: "Частота вращения сепаратора", fn: ufc.FTF(), md: 0, cl: 0xffff0000 }, + FREQ: { nm: "Частота вращения", fn: ufc.FREQ(), md: 0, cl: 0xff0000f0 }, + BSF: { nm: "Частота вращения (контакта) тел качения", fn: ufc.BSF(), md: ufc.FTF(), cl: 0xffFFB841 }, + BPFO: { nm: "Частота перекатывания тел качения по наружному кольцу", fn: ufc.BPFO(), md: ufc.FTF(), cl: 0xffED3CCA }, + BPFI: { nm: "Частота перекатывания тел качения по внутреннему кольцу", fn: ufc.BPFI(), md: ufc.FREQ(), cl: 0xff990090 } + }; //набор функциональных частот + + var rows = Object.keys(set); //массив ключей объекта (наборов гармонических рядов) + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + for (let i = 0; i <= rows.length - 1; i++) { + let lines = rows[i]; + let idx = 0; //индекс гармонического ряда + let nms = set[lines].nm; //название гармонического ряда + let frq = set[lines].fn; //расчетная частота + let mod = set[lines].md; //модулирующая частота + let clr = set[lines].cl; //предустановленный цвет + let arr = []; //массив обнаруженных гармоник + + lines = spec.add_harms_set(frq, num, clr, 2); //строим набор частот (гармонический ряд) + lines.name = nms; + idx = spec.index_of_harms_set(lines); //определяем индекс набора частот + if (mod != 0) { spec.harms_sets[idx].modulate(mod, 2, clr, 0.5) }; //строим амплитудную модуляцию + for (let j = 0; j <= num - 1; j++) { + lines.harms[j].tolerance = (j + 1) * frq * ufc.tolerance(); //устанавливаем коридор обнаружения гармоники + if (lines.harms[j].is_present == true) { + switch (isDeep) { + case true: + level = Math.round(ufc.mod_factor(lines.harms[j].amplitude, lines.harms[j].base)); + break; + case false: + level = Math.round(lines.harms[j].amplitude); + break; + default: + break; + }; + arr.push(level); + } else { arr.push(0) }; + res[rows[i]] = arr; + }; + }; + + return res; +}; + diff --git a/planetary gear/defects/gt-gear-beat.js b/planetary gear/defects/gt-gear-beat.js deleted file mode 100644 index 4b5a3f0..0000000 --- a/planetary gear/defects/gt-gear-beat.js +++ /dev/null @@ -1,79 +0,0 @@ -"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 deleted file mode 100644 index c70d44d..0000000 --- a/planetary gear/defects/gt-gear-fault.js +++ /dev/null @@ -1,83 +0,0 @@ -"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 deleted file mode 100644 index 35dec9d..0000000 --- a/planetary gear/planetary_gear.js +++ /dev/null @@ -1,261 +0,0 @@ -"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 diff --git a/rolling bearing/defects/rb-inring-fault.js b/rolling bearing/defects/rb-inring-fault.js deleted file mode 100644 index 36d1173..0000000 --- a/rolling bearing/defects/rb-inring-fault.js +++ /dev/null @@ -1,83 +0,0 @@ -"use strict"; - -var imp = gtl.import("user-functions.js"); - -export function defect() { - let frq = imp.BPFI(); //функциональная чатота - 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, 0xff923090, 1); //модуляция Fв +/- 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, 0xff923090, 1); //модуляция Fв +/- 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, 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/rolling bearing/defects/rb-inring-tention.js b/rolling bearing/defects/rb-inring-tention.js deleted file mode 100644 index a43bc0f..0000000 --- a/rolling bearing/defects/rb-inring-tention.js +++ /dev/null @@ -1,63 +0,0 @@ -"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, 0xff009ff0, 2); //неоднородный радиальный натяг "голубой" - 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 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 && spen.harms_sets[spen_index].get_count(0) <= 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вр[x2]", deep); - } - } - } - else - gtl.log.info("Неоднородный радиальный натяг", "Признаков дефекта не обнаружено"); - - deep = Math.max(...spen_signs) * 100; - switch (true) { - case deep <= 7: - describe = "Слабый"; - break; - case deep < 13: - describe = "Средний"; - break; - case deep >= 13: - describe = "Сильный"; - break; - default: - describe = "None"; - }; - - if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false }; - - return result; -}; - diff --git a/rolling bearing/defects/rb-inring-wear.js b/rolling bearing/defects/rb-inring-wear.js deleted file mode 100644 index fc680c6..0000000 --- a/rolling bearing/defects/rb-inring-wear.js +++ /dev/null @@ -1,63 +0,0 @@ -"use strict"; - -var imp = gtl.import("user-functions.js"); - -export function defect() { - let frq = imp.FREQ(); //функциональная чатота - let num = 5; //количество отрисованных гармоник - - //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (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 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 && spen.harms_sets[spen_index].get_count(0, 1) <= 2) { - 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вр", deep); - } - } - } - else - gtl.log.info("Износ внутреннего кольца", "Признаков дефекта не обнаружено"); - - deep = Math.max(...spen_signs) * 100; - switch (true) { - case deep <= 7: - describe = "Слабый"; - break; - case deep < 13: - describe = "Средний"; - break; - case deep >= 13: - describe = "Сильный"; - break; - default: - describe = "None"; - }; - - if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false }; - - return result; -}; - diff --git a/rolling bearing/defects/rb-outring-bias.js b/rolling bearing/defects/rb-outring-bias.js deleted file mode 100644 index d03b6f2..0000000 --- a/rolling bearing/defects/rb-outring-bias.js +++ /dev/null @@ -1,63 +0,0 @@ -"use strict"; - -var imp = gtl.import("user-functions.js"); - -export function defect() { - let frq = imp.BPFO(); //функциональная чатота - let num = 6; //количество отрисованных гармоник - - //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. - var spen_set = spen.add_harms_set(frq, num, 0xff009000, 2); //перекос наружного кольца "зелёный" - 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 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 && spen.harms_sets[spen_index].get_count(0, 1) <= 4) { - 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н[x2]", deep); - } - } - } - else - gtl.log.info("Перекос наружного кольца", "Признаков дефекта не обнаружено"); - - deep = Math.max(...spen_signs) * 100; - switch (true) { - case deep <= 7: - describe = "Слабый"; - break; - case deep < 13: - describe = "Средний"; - break; - case deep >= 13: - describe = "Сильный"; - break; - default: - describe = "None"; - }; - - if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false }; - - return result; -}; - diff --git a/rolling bearing/defects/rb-outring-fault.js b/rolling bearing/defects/rb-outring-fault.js deleted file mode 100644 index 3ebb30b..0000000 --- a/rolling bearing/defects/rb-outring-fault.js +++ /dev/null @@ -1,83 +0,0 @@ -"use strict"; - -var imp = gtl.import("user-functions.js"); - -export function defect() { - let frq = imp.BPFO(); //функциональная чатота - let num = 6; //количество отрисованных гармоник - - //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. - var spen_set = spen.add_harms_set(frq, num, 0xff009000, 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.FTF(), 2, 0xff009030, 1); //модуляция Fн +/- Fс "зелёный" - - var ausp_set = ausp.add_harms_set(frq, num, 0xff009000, 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.FTF(), 2, 0xff009030, 1); //модуляция Fн +/- 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) >= 5 && - ausp.harms_sets[ausp_index].get_count(0, 3) >= 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н", 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н", ampl); - } - } - } - else - gtl.log.info("Раковины на наружном кольце", "Признаков дефекта не обнаружено"); - - deep = Math.max(...spen_signs) * 100; - switch (true) { - case deep <= 7: - describe = "Слабый"; - break; - case deep < 13: - describe = "Средний"; - break; - case deep >= 13: - describe = "Сильный"; - break; - default: - describe = "None"; - }; - - if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false }; - - return result; -}; - diff --git a/rolling bearing/defects/rb-outring-wear.js b/rolling bearing/defects/rb-outring-wear.js deleted file mode 100644 index 3b7ca36..0000000 --- a/rolling bearing/defects/rb-outring-wear.js +++ /dev/null @@ -1,63 +0,0 @@ -"use strict"; - -var imp = gtl.import("user-functions.js"); - -export function defect() { - let frq = imp.BPFO(); //функциональная чатота - let num = 5; //количество отрисованных гармоник - - //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. - var spen_set = spen.add_harms_set(frq, num, 0xff009000, 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 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 && spen.harms_sets[spen_index].get_count(0, 1) <= 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н", deep); - } - } - } - else - gtl.log.info("Износ наружного кольца", "Признаков дефекта не обнаружено"); - - deep = Math.max(...spen_signs) * 100; - switch (true) { - case deep <= 7: - describe = "Слабый"; - break; - case deep < 13: - describe = "Средний"; - break; - case deep >= 13: - describe = "Сильный"; - break; - default: - describe = "None"; - }; - - if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false }; - - return result; -}; - diff --git a/rolling bearing/defects/rb-rollers-fault.js b/rolling bearing/defects/rb-rollers-fault.js deleted file mode 100644 index f0f5cae..0000000 --- a/rolling bearing/defects/rb-rollers-fault.js +++ /dev/null @@ -1,85 +0,0 @@ -"use strict"; - -var imp = gtl.import("user-functions.js"); - -export function defect() { - let frq = imp.BSF(); //функциональная чатота - let num = 20; //количество отрисованных гармоник - - //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. - var spen_set = spen.add_harms_set(frq, num, 0xff994000, 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.FTF(), 2, 0xff996000, 1); //модуляция Fтк +/- Fс "горчичный" - - var ausp_set = ausp.add_harms_set(frq, num, 0xff994000, 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.FTF(), 2, 0xff996000, 1); //модуляция Fтк +/- 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, 3, 1) >= 3 - ) { - defect = true; - Defect_type.push("Раковины и сколы на телах качения"); - 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 <= 7: - describe = "Слабый"; - break; - case deep < 13: - describe = "Средний"; - break; - case deep >= 13: - describe = "Сильный"; - break; - default: - describe = "None"; - }; - - if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false }; - - return result; -}; - diff --git a/rolling bearing/defects/rb-separator-wear.js b/rolling bearing/defects/rb-separator-wear.js deleted file mode 100644 index 07b77ef..0000000 --- a/rolling bearing/defects/rb-separator-wear.js +++ /dev/null @@ -1,63 +0,0 @@ -"use strict"; - -var imp = gtl.import("user-functions.js"); - -export function defect() { - let frq = imp.FTF(); //функциональная чатота - let num = 10; //количество отрисованных гармоник - - //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. - var spen_set = spen.add_harms_set(frq, num, 0xffff0000, 2); //износ тел качения и сепаратора "красный" - 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 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) { - 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с", deep); - } - } - } - else - gtl.log.info("Износ тел качения и сепаратора", "Признаков дефекта не обнаружено"); - - deep = Math.max(...spen_signs) * 100; - switch (true) { - case deep <= 5: - describe = "Слабый"; - break; - case deep < 10: - describe = "Средний"; - break; - case deep >= 10: - describe = "Сильный"; - break; - default: - describe = "None"; - }; - - if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false }; - - return result; -}; - diff --git a/rolling bearing/defects/rb-shaft.js b/rolling bearing/defects/rb-shaft.js deleted file mode 100644 index f297799..0000000 --- a/rolling bearing/defects/rb-shaft.js +++ /dev/null @@ -1,79 +0,0 @@ -"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) >= 1 && spen.harms_sets[spen_index].get_count(0, 2) <= 10 && - ausp.harms_sets[ausp_index].get_count(0, 2) >= 0 && ausp.harms_sets[ausp_index].get_count(0, 2) <= 10 - ) { - 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вр", 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вр", ampl); - } - } - } - else - gtl.log.info("Биение вала", "Признаков дефекта не обнаружено"); - - deep = Math.max(...spen_signs) * 100; - switch (true) { - case deep <= 7: - describe = "Слабый"; - break; - case deep < 13: - describe = "Средний"; - break; - case deep >= 13: - describe = "Сильный"; - break; - default: - describe = "None"; - }; - - if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false }; - - return result; -}; - diff --git a/rolling bearing/rb_defs.js b/rolling bearing/rb_defs.js new file mode 100644 index 0000000..3706d8d --- /dev/null +++ b/rolling bearing/rb_defs.js @@ -0,0 +1,52 @@ +"use strict"; + +export function rb_defs(mtx, isDeep) { + var res = {}; //результат + if (isDeep = true) { var key = "dp" } else { var key = "lv" }; + var des = { + FTF: { ds: "тел качения и сепаратора", dp: 8, lv: 20 }, + FREQ: { ds: "внутреннего кольца", dp: 13, lv: 20 }, + BSF: { ds: "тел качения", dp: 10, lv: 20 }, + BPFO: { ds: "наружного кольца", dp: 15, lv: 20 }, + BPFI: { ds: "внутреннего кольца", dp: 8, lv: 20 }, + }; //описание функциональных частот + + function get_note(harmsArr) { + let note = "Износ"; //описание характера колебаний + let cnt = 0; //количество значений в массиве + for (let i = 0; i <= harmsArr.length - 1; i++) { if (harmsArr[i] > 0) { cnt++ }; }; + if (cnt >= 5) { note = "Дефект" }; + if (harmsArr[1] > harmsArr[0]) { note = "Перекос" }; + if (cnt > 0 && harmsArr[0] == 0 && harmsArr[1] == 0) { note = "Неидентифицированные изменения вибрации" }; + return note; + }; + + function get_level(lvl, thres) { + let level = "Сильный"; + switch (true) { + case lvl < 0.5 * thres: + level = "Слабый"; + break; + case lvl < thres: + level = "Средний"; + break; + default: + break; + }; return level; + }; + + var rows = Object.keys(mtx); //массив ключей объекта (наборов гармоник) + for (let i = 0; i <= rows.length - 1; i++) { + let arr = mtx[rows[i]]; //массив гармоник + let lvl = Math.max(...arr); //определяем максимальное значение параметра из массива + let sum = arr.reduce(function (a, b) { return a + b }, 0); //сумма элементов массива + if (sum > 0) { + let note = get_note(arr); + res[rows[i]] = note + ' ' + des[rows[i]].ds + ': ' + get_level(lvl, des[rows[i]][key]) + ' (' + lvl + ')'; + }; + }; + return res; +}; + + + diff --git a/rolling bearing/rb_mtx.js b/rolling bearing/rb_mtx.js new file mode 100644 index 0000000..61e99bb --- /dev/null +++ b/rolling bearing/rb_mtx.js @@ -0,0 +1,54 @@ +"use strict"; + +var ufc = gtl.import("user-functions.js"); + +export function rb_mtx(spec, isDeep) { + var num = 6; //глубина матрицы (количество гармоник) + var level = 0; //уровень развития дефекта + var res = {}; //результат + + var set = { + FTF: { nm: "Частота вращения сепаратора", fn: ufc.FTF(), md: 0, cl: 0xffff0000 }, + FREQ: { nm: "Частота вращения", fn: ufc.FREQ(), md: 0, cl: 0xff0000f0 }, + BSF: { nm: "Частота вращения (контакта) тел качения", fn: ufc.BSF(), md: ufc.FTF(), cl: 0xffFFB841 }, + BPFO: { nm: "Частота перекатывания тел качения по наружному кольцу", fn: ufc.BPFO(), md: ufc.FTF(), cl: 0xffED3CCA }, + BPFI: { nm: "Частота перекатывания тел качения по внутреннему кольцу", fn: ufc.BPFI(), md: ufc.FREQ(), cl: 0xff990090 } + }; //набор функциональных частот + + var rows = Object.keys(set); //массив ключей объекта (наборов гармонических рядов) + //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес. + for (let i = 0; i <= rows.length - 1; i++) { + let lines = rows[i]; + let idx = 0; //индекс гармонического ряда + let nms = set[lines].nm; //название гармонического ряда + let frq = set[lines].fn; //расчетная частота + let mod = set[lines].md; //модулирующая частота + let clr = set[lines].cl; //предустановленный цвет + let arr = []; //массив обнаруженных гармоник + + lines = spec.add_harms_set(frq, num, clr, 2); //строим набор частот (гармонический ряд) + lines.name = nms; + idx = spec.index_of_harms_set(lines); //определяем индекс набора частот + if (mod != 0) { spec.harms_sets[idx].modulate(mod, 2, clr, 0.5) }; //строим амплитудную модуляцию + for (let j = 0; j <= num - 1; j++) { + lines.harms[j].tolerance = (j + 1) * frq * ufc.tolerance(); //устанавливаем коридор обнаружения гармоники + if (lines.harms[j].is_present == true) { + switch (isDeep) { + case true: + level = Math.round(ufc.mod_factor(lines.harms[j].amplitude, lines.harms[j].base)); + break; + case false: + level = Math.round(lines.harms[j].amplitude); + break; + default: + break; + }; + arr.push(level); + } else { arr.push(0) }; + res[rows[i]] = arr; + }; + }; + + return res; +}; + diff --git a/rolling bearing/rolling_bearing.js b/rolling bearing/rolling_bearing.js index 9e86a07..ed2b0e9 100644 --- a/rolling bearing/rolling_bearing.js +++ b/rolling bearing/rolling_bearing.js @@ -4,17 +4,9 @@ var options = gtl.options; var record = gtl.options.record; var point = gtl.options.point; -var imp = gtl.import("user-functions.js"); - -var val = gtl.import("rb-shaft.js"); -var in0 = gtl.import("rb-inring-tention.js"); -var out0 = gtl.import("rb-outring-wear.js"); -var out1 = gtl.import("rb-outring-bias.js"); -var out2 = gtl.import("rb-outring-fault.js"); -var in1 = gtl.import("rb-inring-wear.js"); -var in2 = gtl.import("rb-inring-fault.js"); -var sep = gtl.import("rb-separator-wear.js"); -var rol = gtl.import("rb-rollers-fault.js"); +var fnc = gtl.import("user-functions.js"); +var mtx = gtl.import("rb_mtx.js"); +var def = gtl.import("rb_defs.js"); //настройки для датчика оборотов var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра @@ -31,7 +23,7 @@ freq.avg_cnt = 6; //[Блок настройки параметров измерений] //мониторинговый спектр вибрации -var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации +var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации ausp2.name = "AUSPm"; //присвоение имени спектра ausp2.color = 0x0000ffff; //цвет линии спектра ausp2.frequency = 1600; //граничная частота спектра @@ -40,7 +32,7 @@ ausp2.average = 6; //количество усреднений ausp2.unit = gtl.spec.db; //отображение в дБ //спектр вибрации -var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации +var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации ausp.name = "AUSPd"; //присвоение имени спектра ausp.color = 0x0000ff00; //цвет линии спектра ausp.frequency = 800; //граничная частота спектра @@ -53,7 +45,7 @@ ausp.peak_level = 20; //порог обнаружения гармоник ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/- //фильтр для формирования спектра огибающей -var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра +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 = 10; //порядок фильтра @@ -65,8 +57,8 @@ filter_spen.width = 1482; //ширина полосы фильтра var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей spen.name = "SPEN"; //присвоение имени спектра огибающей spen.color = 0x00ff0000; //цвет линии спектра огибающей -spen.frequency = 400; //граничная частота спектра огибающей -spen.lines = 400; //разрешение спектра огибающей (количество линий) +spen.frequency = 200; //граничная частота спектра огибающей +spen.lines = 200; //разрешение спектра огибающей (количество линий) spen.average = 8; //количество усреднений spen.unit = gtl.spec.db; //отображение в дБ spen.window = gtl.spec.hann; //окно @@ -84,62 +76,30 @@ 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) +//RMS виброскорости в диапазоне 10-1000 Гц. +var int = gtl.add_intg(gtl.analog_inputs[signals[0].portNumber]); //интегрирование сигнала виброускорения +int.taps = 1; //степень интегрирования (скорость из ускорения - 1-нарное интегрирование) +//фильтрация сигнала в диапазоне +var filter = gtl.add_filter_iir(int); //объявление переменной фильтра +filter.kind = gtl.filter_iir.butterworth; //тип окна +filter.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) +filter.order = 10; //порядок фильтра +filter.frequency = 505; //центральная частота полосового фильтра +filter.width = 990; //ширина полосы фильтра +//определение среднего квадратического значения виброскорости +var rms_v = gtl.add_value_rms(filter); //объявление переменной СКЗ +rms_v.time = 0.5; //время выборки +rms_v.avg_cnt = 4; //количество усреднений //[Диагностика] 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); + if (fnc.INSTABILITY() > fnc.tolerance()) { + gtl.log.info("Критическая нестабильность частоты вращения, %", fnc.INSTABILITY() * 100); gtl.log.info("Результат:", "Диагностика прервана"); //gtl.diagnostic.stop(); //принудительная остановка диагностики @@ -149,60 +109,23 @@ function diagnose() { gtl.results = __result; }; - if (imp.FREQ() <= imp.FREQNESS()) { - gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + imp.FREQNESS()); + if (fnc.FREQ() <= fnc.FREQNESS()) { + gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + fnc.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(); + filter_spen.frequency = fnc.filter_frequency(); //считаме фильтр для огибающей + filter_spen.width = fnc.filter_width(); //определяем ширину фильтра + spen.frequency = fnc.spec_params().frequency; + spen.lines = fnc.spec_params().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; + let time = []; //массив времени набора данных + time.push(ausp.acq_time); + time.push(spen.acq_time); + let max_acq = Math.max(...time); + gtl.diagnostic.interval = max_acq; state = 3; break; @@ -212,53 +135,32 @@ function diagnose() { //Вывод информации в лог //Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра - var AQ = imp.spec_square(ausp2.data, 800, ausp2.frequency); + var AQ = fnc.spec_square(ausp.data, ausp.frequency / 2, ausp.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); + gtl.log.info("Объект диагностики", options.rbModelName); + gtl.log.info("Минимально необходимая частота вращения", fnc.FREQNESS()); + gtl.log.info("FREQ", fnc.FREQ()); + gtl.log.info("FTF", fnc.FTF()); + gtl.log.info("BPFO", fnc.BPFO()); + gtl.log.info("BPFI", fnc.BPFI()); + gtl.log.info("BSF", fnc.BSF()); + gtl.log.info("Коридор обнаружения гармоники", fnc.tolerance()); + gtl.log.info("Полосовой фильтр (расчетный)", filter_spen.frequency); + gtl.log.info("Граничная частота SPEN", spen.frequency); + gtl.log.info("Количество линий SPEN", spen.lines); + gtl.log.info("Ширина AUSP", ausp.frequency); - let def = {}; - //var indx = 0; - def["Биение вала"] = val.defect(); //indx (spen = 0, ausp = 0) - def["Неоднородный радиальный натяг"] = in0.defect(); //indx (spen = 1, ausp = X) - def["Износ наружного кольца"] = out0.defect(); //indx (spen = 2, ausp = X) - def["Перекос наружного кольца"] = out1.defect(); //indx (spen = 3, ausp = X) - def["Раковины на наружном кольце"] = out2.defect(); //indx (spen = 4, ausp = 1) - def["Износ внутреннего кольца"] = in1.defect(); //indx (spen = 5, ausp = X) - def["Раковины на внутреннем кольце"] = in2.defect(); //indx (spen = 6, ausp = 2) - def["Износ тел качения и сепаратора"] = sep.defect(); //indx (spen = 7, ausp = X) - def["Раковины и сколы на телах качения"] = rol.defect(); //indx (spen = 8, ausp = 3) + let spen_mx = mtx.rb_mtx(spen, true); + let spen_df = def.rb_defs(spen_mx, true); + let ausp_mx = mtx.rb_mtx(ausp, true); var res = { RMSA: rms_spen.value, + RMSV: rms_v.value, PF: ampl_spen.value / rms_spen.value, - RMS_V2: rms_v2.value, - RMS_V10: rms_v10.value, SQR: AQ, - defects: def + matrix: spen_mx, + defs: spen_df }; gtl.results = res;