diff --git a/getMeasures.js b/getMeasures.js deleted file mode 100644 index 16a8fce..0000000 --- a/getMeasures.js +++ /dev/null @@ -1,220 +0,0 @@ -export function getFreq(args) { - let FR = {}; //объект данных по частоте вращения - switch (record.tachoOptions.tachoState) { - case 0: - if (args != undefined) { - let __src = args.src; //источник сигнала частоты вращения - let __frq = args.freq; //граничная частота фильтрации сигнала - let __time = args.time; //интервал измерения частоты вращения - let __avg = args.avg; //количество отсчетов для усреднения - let __dc = 0; //порог срабатывания счетчика - if (args.dc != undefined) { __dc = args.dc }; - - let __fltr = gtl.add_filter_iir(__src); - __fltr.kind = gtl.filter_iir.butterworth; - __fltr.type = gtl.filter_iir.lowpass; - __fltr.order = 10; - __fltr.frequency = __frq; - - let __freq = gtl.add_value_freq(__fltr); - __freq.time = __time; - __freq.avg_cnt = __avg; - __freq.dc = __dc; - FR["value"] = __freq.value * options.tachoRatio; - FR["values"] = __freq.values; - FR["time"] = args.time * args.avg; - } else { - FR["value"] = 0; - FR["values"] = [0]; - FR["time"] = 0; - }; - break; - case 1: - FR["value"] = record.tachoOptions.tachoValue * options.tachoRatio; - FR["values"] = [0]; - FR["time"] = 0; - break; - case 2: - FR["value"] = record.tachoOptions.tachoFromInfo * options.tachoRatio; - FR["values"] = [0]; - FR["time"] = 0; - break; - }; - return FR; -}; //определение частоты вращения в зависимости от источника тахо сигнала - -export function getAusp(args) { - let __ausp = gtl.add_ausp(args.src); - __ausp.name = args.name; - __ausp.color = args.color; - __ausp.frequency = args.frequency; - __ausp.resolution = args.resolution; - __ausp.average = args.average; - __ausp.unit = args.view; - if (args.level != undefined) { __ausp.peak_level = args.level }; //порог обнаружения гармоник - - __ausp.overlap = 0.5; //коэффициент перекрытия - __ausp.window = gtl.spec.rectangular; //тип окна - __ausp.smoothing_factor = 100; //коэффициент сглаживания спектра - __ausp.smoothed_line_color = 0xFFFF00; //цвет средней линии - __ausp.harm_tolerance = __ausp.resolution; //диапазон поиска гармоник +/- - return __ausp; -}; //построение спектра вибрации - -export function getSpen(args) { - let __spen = gtl.add_spen(args.src); - __spen.name = args.name; - __spen.color = args.color; - __spen.frequency = args.frequency; - __spen.resolution = args.resolution; - __spen.average = args.average; - __spen.unit = args.view; - if (args.level != undefined) { __spen.peak_level = args.level }; //порог обнаружения гармоник - - __spen.overlap = 0.5; //коэффициент перекрытия - __spen.window = gtl.spec.rectangular; //тип окна - __spen.smoothing_factor = 100; //коэффициент сглаживания спектра - __spen.smoothed_line_color = 0xFFFF00; //цвет средней линии - __spen.harm_tolerance = __spen.resolution; //диапазон поиска гармоник +/- - - return __spen; -}; //построение спектра огибающей - -export function getStdMeasures(options) { - let __source = options.src; - let __time = 0.1; - let __avg = 5; - - if (options.time != undefined) { __time = options.time }; - if (options.avg != undefined) { __avg = options.avg }; - - function getFilter(L, R) { - let __filter = gtl.add_filter_iir(__source); - __filter.kind = gtl.filter_iir.butterworth; - __filter.order = 10; - - switch (L) { - case "lowpass": - __filter.type = gtl.filter_iir.lowpass; - __filter.frequency = R; - break; - - case "highpass": - __filter.type = gtl.filter_iir.highpass; - __filter.frequency = R; - break; - - default: - __filter.type = gtl.filter_iir.bandpass; - __filter.frequency = (R - L) / 2 + L; - __filter.width = R - L; - break; - }; - - return __filter; - }; //формирование фильтра - - function getIntg(src, taps, scale) { - let __intg = gtl.add_intg(src); - __intg.taps = taps; - __intg.scale = scale; - - return __intg; - }; //интегрирование сигнала - - function getRMS(src) { - let __rms = gtl.add_value_rms(src); - __rms.time = __time; - __rms.avg_cnt = __avg; - - return __rms; - }; //получение СКЗ - - function getAmpl(src) { - let __ampl = gtl.add_value_ampl(src); - __ampl.time = __time; - __ampl.avg_cnt = __avg; - - return __ampl; - }; //получение амплитуды - - function getPtP(src) { - let __ptp = gtl.create_moving_peak_to_peak( - { - src: src, - name: "peak_to_peak", - time: __time - } - ); - __ptp.history = __time * __avg; - - return __ptp; - }; //получение размаха - - function getKurt(src) { - let __kurt = gtl.add_value_kurt(src); - __kurt.time = __time; - __kurt.avg_cnt = __avg; - - return __kurt; - }; //получение эксцесса - - //[Набор фильтров] - let __filter_2_200 = getFilter(2, 200); - let __filter_2_1000 = getFilter(2, 1000); - let __filter_10_1000 = getFilter(10, 1000); - let __filter_2_3000 = getFilter(2, 3000); - let __filter_2_10000 = getFilter(2, 10000); - let __filter_100_10000 = getFilter(100, 10000); - let __filter_2_5k = getFilter(2500, 5000); - let __filter_5_10k = getFilter(5000, 10000); - let __filter_10_20k = getFilter(10000, 20000); - let __filter_30_40k = getFilter(30000, 40000); - let __filter_40_80k = getFilter(40000, 80000); - - //[Набор интеграторов] - let __pre_int1 = getIntg(__filter_2_1000, 1, 1000); - let __pre_int2 = getIntg(__filter_10_1000, 1, 1000); - let __pre_int3 = getIntg(__filter_2_200, 2, 1); - - //[Расчет набора параметров] - let __rms_A2_3000 = getRMS(__filter_2_3000); //СКЗ виброускорения в диапазоне 2-3000 Гц - let __rms_A2_10000 = getRMS(__filter_2_10000); //СКЗ виброускорения в диапазоне 2-10000 Гц - let __rms_A100_10000 = getRMS(__filter_100_10000); //СКЗ виброускорения в диапазоне 100-10000 Гц - - let __ampl_A100_10000 = getAmpl(__filter_100_10000); //амплитуда виброускорения в диапазоне 100-10000 Гц - let __ampl_full = getAmpl(__source); //амплитуда виброускорения во всем диапазоне измерения - - let __rms_V2_1000 = getRMS(__pre_int1); //СКЗ виброскорости в диапазоне 2-1000 Гц - let __rms_V10_1000 = getRMS(__pre_int2); //СКЗ виброскорости в диапазоне 10-1000 Гц - let __rms_S2_200 = getRMS(__pre_int3); //СКЗ виброперемещения в диапазоне 2-200 Гц - - let __ptp_S2_200 = getPtP(__pre_int3); //размах виброперемещения в диапазоне 2-200 Гц - - let __kurt_full = getKurt(__source); //эксцесс во всем диапазоне измерения - let __kurt_2_5k = getKurt(__filter_2_5k); //эксцесс в полосе 2.5-5 кГц - let __kurt_5_10k = getKurt(__filter_5_10k); //эксцесс в полосе 5-10 кГц - let __kurt_10_20k = getKurt(__filter_10_20k); //эксцесс в полосе 10-20 кГц - let __kurt_30_40k = getKurt(__filter_30_40k); //эксцесс в полосе 30-40 кГц - let __kurt_40_80k = getKurt(__filter_40_80k); //эксцесс в полосе 40-80 кГц - - let __result = { - rms_A2_3000: __rms_A2_3000, - rms_A2_10000: __rms_A2_10000, - rms_A100_10000: __rms_A100_10000, - ampl_A100_10000: __ampl_A100_10000, - ampl_full: __ampl_full, - rms_V2_1000: __rms_V2_1000, - rms_V10_1000: __rms_V10_1000, - rms_S2_200: __rms_S2_200, - ptp_S2_200: __ptp_S2_200, - kurt_full: __kurt_full, - kurt_2_5k: __kurt_2_5k, - kurt_5_10k: __kurt_5_10k, - kurt_10_20k: __kurt_10_20k, - kurt_30_40k: __kurt_30_40k, - kurt_40_80k: __kurt_40_80k, - }; - - return __result; -}; //измерение стандартных параметров diff --git a/peakVM.js b/peakVM.js index 1d51f13..51a63b7 100644 --- a/peakVM.js +++ b/peakVM.js @@ -17,7 +17,7 @@ export function getCorr(src1, src2) { export function getAutoCorr(options) { let result = {}; //результат let plot = []; //массив значений корреляции для графика - let arr = options.src; + let arr = options.src.values; let arr2 = arr.concat(arr); //расширяем массив данных let lag = 0.5; let X = 0; //аргумент 1 @@ -45,24 +45,23 @@ export function getAutoCorr(options) { result["ampl"] = akf_max; result["data"] = plot; - //отрисовка графика на plot + if (options.canvas != undefined) { options.canvas.add( { color: options.color, name: options.name, - x: options.time, + x: options.src.time, y: plot } ); - }; + }; //отрисовка графика на plot return result; }; //рассчет автокорреляции export function getWave(options) { let __src = options.src; //источник данных - let __canvas = options.canvas; //координатная плоскость для отрисовки let __allert = 0; let __fault = 0; if (options.lvl != undefined) { @@ -70,36 +69,38 @@ export function getWave(options) { __fault = 2 * __allert; }; - __canvas.add( - { - color: __src.color, - name: __src.name, - x: __src.time, - y: __src.values - } - ); //рисуем Waveform - - if (__allert != 0) { - let __alr = __src.values.map((item) => (item = __allert)); - let __flt = __src.values.map((item) => (item = __fault)); - - __canvas.add( + if (options.canvas != undefined) { + options.canvas.add( { - color: 0xFFFF00, - name: "allert", + color: __src.color, + name: __src.name, x: __src.time, - y: __alr + y: __src.values } - ); //рисуем линию предупреждения + ); //рисуем Waveform - __canvas.add( - { - color: 0xFF0000, - name: "fault", - x: __src.time, - y: __flt - } - ); //рисуем линию опасности + if (__allert != 0) { + let __alr = __src.values.map((item) => (item = __allert)); + let __flt = __src.values.map((item) => (item = __fault)); + + options.canvas.add( + { + color: 0xFFFF00, + name: "allert", + x: __src.time, + y: __alr + } + ); //рисуем линию предупреждения + + options.canvas.add( + { + color: 0xFF0000, + name: "fault", + x: __src.time, + y: __flt + } + ); //рисуем линию опасности + }; }; return { @@ -155,16 +156,16 @@ export function getLevels(freq) { let alr = 0; //уровень предупреждения, g switch (true) { case rpm <= 900: - alr = 3.0 * (rpm / 900) ** 0.75; + alr = 1.5 * (rpm / 900) ** 0.75; //1.5 => 3.0 для формы Peak-To-Peak break; case (rpm > 900) && (rpm <= 4000): - alr = 3.0; + alr = 1.5; //1.5 => 3.0 для формы Peak-To-Peak break; case (rpm > 4000) && (rpm <= 10000): - alr = 3.0 * (rpm / 4000) ** 0.5; + alr = 1.5 * (rpm / 4000) ** 0.5; //1.5 => 3.0 для формы Peak-To-Peak break; case rpm > 10000: - alr = 5.0; + alr = 3.0; //3.0 => 5.0 для формы Peak-To-Peak default: break; }; @@ -176,7 +177,6 @@ export function specSquare(spec, L, R) { let __data = spec.data; //массив значений амплитуд let __lines = spec.data.length; //количества линий спектра let __res = spec.resolution; //частотное разрешения спектра (высота прямоугольной трапеции) - let __peaks = spec.peaks; //массив обнаруженных гармоник (объекты) let __start = 0; //стартовый индекс в массиве let __end = __lines; //конечный индекс в массиве let s0 = 0; //площадь под базовой линией @@ -187,10 +187,11 @@ export function specSquare(spec, L, R) { if (R != undefined) { __end = Math.round(R / __res) }; for (let i = __start; i <= __end - 1; i++) { - s0 += 0.5 * (__base[i] + __base[i + 1]) * __res; - s1 += 0.5 * (__data[i] + __data[i + 1]) * __res; - if ((s1 - s0) >= 0) { s2 += s1 - s0 }; - if (i <= __peaks.length - 1) { s3 += __peaks[i].level * __res }; + s0 += __base[i] * __res; + s1 += __data[i] * __res; + let __delta = __data[i] - __base[i]; + if (__delta >= 0) { s2 += __delta * __res }; + if (__delta >= spec.peak_level) { s3 += __delta * __res }; }; return { @@ -201,77 +202,77 @@ export function specSquare(spec, L, R) { }; }; //определение площадей спектра -export function getPeakVue(options) { - let wav = options.src; //массив данных пиковой формы - let crr = options.corr; //результат расчета автокорреляции - let mech = 0; //механические проблемы - let lubr = 0; //проблемы со смазкой - let allert = getLevels(options.freq); //определяем уровень предупреждения, g +export function getPeak(options) { + let __result = {}; //результат + let __wav = options.src; //массив данных пиковой формы + let __freq = options.freq; //частота вращения + let __mech = 0; //механические проблемы + let __lubr = 0; //проблемы со смазкой + let __allert = getLevels(__freq); //определяем уровень предупреждения, g + + let __form = getWave( + { + src: __wav, //объект с данными максимальных амплитуд + lvl: __allert, //пороговый уровень предупреждения, g + canvas: options.canvas1 //координатная плоскость для отрисовки графика + } + ); //получаем пиковую форму сигнала с порогами - let MaxPK = Math.max(...wav); //максимальное значение амплитуды на пиковой форме, g - let FaultLevel = 2 * allert; //уровень аварии для пиковой формы (Fault = 2 * Allert) - let EstPE = Math.sqrt(crr.ampl) * 100; //расчетный процент периодической энергии + let __crr = getAutoCorr( + { + name: "Корреляционная функция", //имя для графика + src: __wav, //объект с данными максимальных амплитуд + lag: 0.5, //коэффициент смещения сигнала + color: 0x00A550, //цвет отрисовки графика в формате HEX + canvas: options.canvas2 //координатная плоскость для отрисовки графика + } + ); //вычисляем автокорреляционную функцию - switch (true) { - case EstPE >= 50: - mech = EstPE * MaxPK / FaultLevel; - lubr = (100 - EstPE) * MaxPK / FaultLevel; - break; - case (EstPE <= 50) && (EstPE > 30): - EstPE = EstPE / 2; - mech = EstPE * MaxPK / FaultLevel; - lubr = (100 - EstPE) * MaxPK / FaultLevel; - break; - case EstPE < 30: - mech = 0 - lubr = MaxPK / FaultLevel; - break; - default: - break; - }; //определяем действительный расчетный процент периодической энергии + let MaxPK = Math.max(...__wav.values); //максимальное значение амплитуды на пиковой форме, g + let FaultLevel = 2 * __allert; //уровень аварии для пиковой формы (Fault = 2 * Allert) + let EstPE = Math.sqrt(__crr.ampl) * 100; //расчетный процент периодической энергии - return { - mechBS: mech, - lubrBS: lubr + if (options.spec != undefined) { + let __spc = options.spec; //объект спектра пиковой формы + let GS = MaxPK / FaultLevel; //общая серьезность проблемы + let SQpeak = specSquare(__spc).peak; //площадь обнаруженных гармонических составляющих + let SQspec = specSquare(__spc).harm; //площадь над базовой линией + let PE = (SQpeak ** 2 / SQspec ** 2); //доля периодической энергии + let NPE = (SQspec ** 2 - SQpeak ** 2) / SQspec ** 2; //доля непериодической энергии + + __mech = GS * PE * 100; + __lubr = GS * NPE * 100; + + __result = { + mechBS: __mech, + lubrBS: __lubr, + //mechInd: __mech * 0.8, //нормализованное значение (для индикатора 0-100 единиц) + //lubrInd: __lubr * 0.8 //нормализованное значение (для индикатора 0-100 единиц) + }; + } else { + switch (true) { + case EstPE >= 50: + __mech = EstPE * MaxPK / FaultLevel; + __lubr = (100 - EstPE) * MaxPK / FaultLevel; + break; + case (EstPE <= 50) && (EstPE > 30): + EstPE = EstPE / 2; + __mech = EstPE * MaxPK / FaultLevel; + __lubr = (100 - EstPE) * MaxPK / FaultLevel; + break; + case EstPE < 30: + __mech = 0 + __lubr = MaxPK / FaultLevel; + break; + default: + break; + }; //определяем действительный расчетный процент периодической энергии + + __result = { + mechBS: __mech, + lubrBS: __lubr + }; }; -}; //оценка состояния методом PeakVue -export function getPeakVuePlus(options) { - let wav = options.src; //массив данных пиковой формы - let spc = options.spec; //объект спектра пиковой формы - let crr = options.corr; //результат расчета автокорреляции - let mech = 0; //механические проблемы - let lubr = 0; //проблемы со смазкой - let allert = getLevels(options.freq); //определяем уровень предупреждения, g - - let MaxPK = Math.max(...wav); //максимальное значение амплитуды на пиковой форме, g - let FaultLevel = 2 * allert; //уровень аварии для пиковой формы (Fault = 2 * Allert) - let EstPE = Math.sqrt(crr.ampl) * 100; //расчетный процент периодической энергии - - /*switch (true) { - case (EstPE <= 50) && (EstPE > 30): - EstPE = EstPE / 2; - break; - case EstPE < 30: - EstPE = 0; - break; - default: - break; - }; //определяем действительный расчетный процент периодической энергии*/ - - let GS = MaxPK / FaultLevel; //общая серьезность проблемы - let SQpeak = specSquare(spc).peak; //площадь обнаруженных гармонических составляющих - let SQspec = specSquare(spc).harm; //площадь над базовой линией - let PE = (SQpeak ** 2 / SQspec ** 2); //доля периодической энергии - let NPE = (SQspec ** 2 - SQpeak ** 2) / SQspec ** 2; //доля непериодической энергии - - mech = GS * PE * 100; - lubr = GS * NPE * 100; - - return { - mechBS: mech, - lubrBS: lubr, - mechInd: mech * 0.8, //нормализованное значение (для индикатора 0-100 единиц) - lubrInd: lubr * 0.8 //нормализованное значение (для индикатора 0-100 единиц) - }; -}; //оценка состояния методом PeakVuePlus + return __result; +}; //оценка состояния методом PeakVM diff --git a/spmVM.js b/spmVM.js new file mode 100644 index 0000000..6b88d0d --- /dev/null +++ b/spmVM.js @@ -0,0 +1,134 @@ +export function getdBi(d, rpm) { + const a = 3.135283064375708; + const b = 4.999746694992378; + const k = -58.16048390995372; + + function getLogUnitValue(lin_unit_value, base, k, c) { + return c * Math.log(lin_unit_value) / Math.log(base) + k; + }; + + function getDLogUnitValue(d) { + const base = 0.5921510231527015; + const k = -3.015055963296224; + const c = -0.9111115009540; + return getLogUnitValue(d, base, k, c); + }; + + function getRpmLogUnitValue(rpm) { + const base = 6.69896278136537; + const k = -0.008927920952982967; + const c = 3.3041976536011; + return getLogUnitValue(rpm, base, k, c); + }; + + return a * getDLogUnitValue(d) + b * getRpmLogUnitValue(rpm) + k; +}; //расчет естественного уровня вибрации dBi + +export function todB(arr, type) { + let __limit = 3e-4; //пороговое значение + if (type != undefined) { + switch (type) { + case 0: __limit = 1e-6; break; + case 1: __limit = 1e-9; break; + case 2: __limit = 1e-12; break; + default: + break; + }; + }; + + let __result = arr.map((item) => (item = 20 * Math.log10(item / __limit))); + return __result; +}; //перевод значений массива в дБ + +export function getSpm(args) { + let __src1 = args.src1.values; //массив данных амплитуд импульсов для расчета коврового уровня + let __src2 = args.src2.values; //массив данных амплитуд импульсов для определения максимума + let __frq = args.freq; //частота вращения + let __d = args.d_inner; //диаметр внутреннего кольца подшипника + + let __cpt = todB(__src1); //переводим значения массива в дБ + let __max = todB(__src2); //переводим значения массива в дБ + + let __dBi = getdBi(__d, __frq * 60); //вычисляем естественный уровень вибрации нового подшипника + let __dBc = Math.sqrt(__cpt.reduce((acc, item) => (acc + item ** 2), 0) / __cpt.length); //вычисляем ковровый уровень (СКЗ) в дБ + let __dBm = Math.max(...__max); //вычисляем максимальную амплитуду импульсов в дБ + let __dBn = __dBm - __dBi; //нормализованное значение амплитуды + + let __max0 = __max.slice(0); //делаем копию массива для сортировки + let __maxSort = __max0.sort((a, b) => (b - a)); //сортируем массив по убыванию + let __max40 = __maxSort.slice(0, 40); //выделяем 40 первых (максимальных) значений из массива + let __LR = __max40.reduce((acc, item) => (acc + item), 0) / __max40.length; //определяем LR (среднее из 40 импульсов) + + let __max1000 = __max.slice(0, __max.length / 2); //выделяем 1000 значений из массива + let __HR = Math.sqrt(__max1000.reduce((acc, item) => (acc + item ** 2), 0) / __max1000.length); //вычисляем HR (СКЗ) в дБ + + let __state = "Норма"; //общее состояние + switch (true) { + case (__dBn > 20) && (__dBn < 35): + __state = "Предупреждение"; + break; + case __dBn >= 35: + __state = "Опасность"; + break; + default: + break; + }; + + args.canvas.add( + { + color: args.src2.color, + name: args.src2.name, + x: args.src2.time, + y: __max + } + ); //рисуем форму импульсов SPM + + args.canvas.add( + { + color: 0xFFFF00, + name: "dBc", + x: args.src2.time, + y: __max.map((item) => (item = __dBc)) + } + ); //рисуем уровень dBc + + args.canvas.add( + { + color: 0xFF0000, + name: "dBm", + x: args.src2.time, + y: __max.map((item) => (item = __dBm)) + } + ); //рисуем уровень dBm + + args.canvas.add( + { + color: 0xFFA500, + name: "HR", + x: args.src2.time, + y: __max.map((item) => (item = __HR)) + } + ); //рисуем уровень HR + + args.canvas.add( + { + color: 0xFF00CC, + name: "LR", + x: args.src2.time, + y: __max.map((item) => (item = __LR)) + } + ); //рисуем уровень LR + + let __result = { + values: __max, + dBi: __dBi, + dBc: __dBc, + dBm: __dBm, + dBn: __dBn, + HR: __HR, + LR: __LR, + state: __state + }; + + return __result; +}; //перевод значений массива в дБ diff --git a/userFunctions.js b/userFunctions.js index b8b6cb0..49a759d 100644 --- a/userFunctions.js +++ b/userFunctions.js @@ -235,7 +235,6 @@ export function specSquare(spec, L, R) { let __data = spec.data; //массив значений амплитуд let __lines = spec.data.length; //количества линий спектра let __res = spec.resolution; //частотное разрешения спектра (высота прямоугольной трапеции) - let __peaks = spec.peaks; //массив обнаруженных гармоник (объекты) let __start = 0; //стартовый индекс в массиве let __end = __lines; //конечный индекс в массиве let s0 = 0; //площадь под базовой линией @@ -246,10 +245,11 @@ export function specSquare(spec, L, R) { if (R != undefined) { __end = Math.round(R / __res) }; for (let i = __start; i <= __end - 1; i++) { - s0 += 0.5 * (__base[i] + __base[i + 1]) * __res; - s1 += 0.5 * (__data[i] + __data[i + 1]) * __res; - if ((s1 - s0) >= 0) { s2 += s1 - s0 }; - if (i <= __peaks.length - 1) { s3 += __res * __peaks[i].level }; + s0 += __base[i] * __res; + s1 += __data[i] * __res; + let __delta = __data[i] - __base[i]; + if (__delta >= 0) { s2 += __delta * __res }; + if (__delta >= spec.peak_level) { s3 += __delta * __res }; }; return { @@ -276,3 +276,194 @@ export function amplFactor(ampl, base) { let __crest = (ampl / base); return __crest; }; //определение амплитудного коэффициента + +export function todB(arr, type) { + let __limit = 3e-4; //пороговое значение + if (type != undefined) { + switch (type) { + case 0: __limit = 1e-6; break; + case 1: __limit = 1e-9; break; + case 2: __limit = 1e-12; break; + default: break; + }; + }; + + let __result = arr.map((item) => (item = 20 * Math.log10(item / __limit))); + return __result; +}; //перевод значений массива в дБ + +export function getAusp(args) { + let __ausp = gtl.add_ausp(args.src); + __ausp.name = args.name; + __ausp.color = args.color; + __ausp.frequency = args.frequency; + __ausp.resolution = args.resolution; + __ausp.average = args.average; + __ausp.unit = args.view; + if (args.level != undefined) { __ausp.peak_level = args.level }; //порог обнаружения гармоник + + __ausp.overlap = 0.5; //коэффициент перекрытия + __ausp.window = gtl.spec.rectangular; //тип окна + __ausp.smoothing_factor = 100; //коэффициент сглаживания спектра + __ausp.smoothed_line_color = 0xFFFF00; //цвет средней линии + __ausp.harm_tolerance = __ausp.resolution; //диапазон поиска гармоник +/- + return __ausp; +}; //построение спектра вибрации + +export function getSpen(args) { + let __spen = gtl.add_spen(args.src); + __spen.name = args.name; + __spen.color = args.color; + __spen.frequency = args.frequency; + __spen.resolution = args.resolution; + __spen.average = args.average; + __spen.unit = args.view; + if (args.level != undefined) { __spen.peak_level = args.level }; //порог обнаружения гармоник + + __spen.overlap = 0.5; //коэффициент перекрытия + __spen.window = gtl.spec.rectangular; //тип окна + __spen.smoothing_factor = 100; //коэффициент сглаживания спектра + __spen.smoothed_line_color = 0xFFFF00; //цвет средней линии + __spen.harm_tolerance = __spen.resolution; //диапазон поиска гармоник +/- + + return __spen; +}; //построение спектра огибающей + +export function getStdMeasures(options) { + let __source = options.src; + let __time = 0.1; + let __avg = 5; + + if (options.time != undefined) { __time = options.time }; + if (options.avg != undefined) { __avg = options.avg }; + + function getFilter(L, R) { + let __filter = gtl.add_filter_iir(__source); + __filter.kind = gtl.filter_iir.butterworth; + __filter.order = 10; + + switch (L) { + case "lowpass": + __filter.type = gtl.filter_iir.lowpass; + __filter.frequency = R; + break; + + case "highpass": + __filter.type = gtl.filter_iir.highpass; + __filter.frequency = R; + break; + + default: + __filter.type = gtl.filter_iir.bandpass; + __filter.frequency = (R - L) / 2 + L; + __filter.width = R - L; + break; + }; + + return __filter; + }; //формирование фильтра + + function getIntg(src, taps, scale) { + let __intg = gtl.add_intg(src); + __intg.taps = taps; + __intg.scale = scale; + + return __intg; + }; //интегрирование сигнала + + function getRMS(src) { + let __rms = gtl.add_value_rms(src); + __rms.time = __time; + __rms.avg_cnt = __avg; + + return __rms; + }; //получение СКЗ + + function getAmpl(src) { + let __ampl = gtl.add_value_ampl(src); + __ampl.time = __time; + __ampl.avg_cnt = __avg; + + return __ampl; + }; //получение амплитуды + + function getPtP(src) { + let __ptp = gtl.create_moving_peak_to_peak( + { + src: src, + name: "peak_to_peak", + time: __time + } + ); + __ptp.history = __time * __avg; + + return __ptp; + }; //получение размаха + + function getKurt(src) { + let __kurt = gtl.add_value_kurt(src); + __kurt.time = __time; + __kurt.avg_cnt = __avg; + + return __kurt; + }; //получение эксцесса + + //[Набор фильтров] + let __filter_2_200 = getFilter(2, 200); + let __filter_2_1000 = getFilter(2, 1000); + let __filter_10_1000 = getFilter(10, 1000); + let __filter_2_3000 = getFilter(2, 3000); + let __filter_2_10000 = getFilter(2, 10000); + let __filter_100_10000 = getFilter(100, 10000); + let __filter_2_5k = getFilter(2500, 5000); + let __filter_5_10k = getFilter(5000, 10000); + let __filter_10_20k = getFilter(10000, 20000); + let __filter_30_40k = getFilter(30000, 40000); + let __filter_40_80k = getFilter(40000, 80000); + + //[Набор интеграторов] + let __pre_int1 = getIntg(__filter_2_1000, 1, 1000); + let __pre_int2 = getIntg(__filter_10_1000, 1, 1000); + let __pre_int3 = getIntg(__filter_2_200, 2, 1); + + //[Расчет набора параметров] + let __rms_A2_3000 = getRMS(__filter_2_3000); //СКЗ виброускорения в диапазоне 2-3000 Гц + let __rms_A2_10000 = getRMS(__filter_2_10000); //СКЗ виброускорения в диапазоне 2-10000 Гц + let __rms_A100_10000 = getRMS(__filter_100_10000); //СКЗ виброускорения в диапазоне 100-10000 Гц + + let __ampl_A100_10000 = getAmpl(__filter_100_10000); //амплитуда виброускорения в диапазоне 100-10000 Гц + let __ampl_full = getAmpl(__source); //амплитуда виброускорения во всем диапазоне измерения + + let __rms_V2_1000 = getRMS(__pre_int1); //СКЗ виброскорости в диапазоне 2-1000 Гц + let __rms_V10_1000 = getRMS(__pre_int2); //СКЗ виброскорости в диапазоне 10-1000 Гц + let __rms_S2_200 = getRMS(__pre_int3); //СКЗ виброперемещения в диапазоне 2-200 Гц + + let __ptp_S2_200 = getPtP(__pre_int3); //размах виброперемещения в диапазоне 2-200 Гц + + let __kurt_full = getKurt(__source); //эксцесс во всем диапазоне измерения + let __kurt_2_5k = getKurt(__filter_2_5k); //эксцесс в полосе 2.5-5 кГц + let __kurt_5_10k = getKurt(__filter_5_10k); //эксцесс в полосе 5-10 кГц + let __kurt_10_20k = getKurt(__filter_10_20k); //эксцесс в полосе 10-20 кГц + let __kurt_30_40k = getKurt(__filter_30_40k); //эксцесс в полосе 30-40 кГц + let __kurt_40_80k = getKurt(__filter_40_80k); //эксцесс в полосе 40-80 кГц + + let __result = { + rms_A2_3000: __rms_A2_3000, + rms_A2_10000: __rms_A2_10000, + rms_A100_10000: __rms_A100_10000, + ampl_A100_10000: __ampl_A100_10000, + ampl_full: __ampl_full, + rms_V2_1000: __rms_V2_1000, + rms_V10_1000: __rms_V10_1000, + rms_S2_200: __rms_S2_200, + ptp_S2_200: __ptp_S2_200, + kurt_full: __kurt_full, + kurt_2_5k: __kurt_2_5k, + kurt_5_10k: __kurt_5_10k, + kurt_10_20k: __kurt_10_20k, + kurt_30_40k: __kurt_30_40k, + kurt_40_80k: __kurt_40_80k, + }; + + return __result; +}; //измерение стандартных параметров \ No newline at end of file