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