diff --git a/classes/peakClass.js b/classes/peakClass.js index 1e49df1..ee64ffc 100644 --- a/classes/peakClass.js +++ b/classes/peakClass.js @@ -6,7 +6,7 @@ export class peakClass { if (args.spec != undefined) { this.spec = args.spec }; } - getLevels(rpm = this.freq * 60) { + __getLevels(rpm = this.freq * 60) { let __allert = 0; //уровень предупреждения, g switch (true) { case rpm <= 900: @@ -26,7 +26,7 @@ export class peakClass { return __allert }; //рассчет пороговых уровней - getParams(rpm = this.freq * 60) { + __getParams(rpm = this.freq * 60) { let __wdt = 0; //граничная частота ФВЧ let __frq = 40 * this.freq; //граничная частота спектра let __lns = 800; //количество линий спектра @@ -65,8 +65,38 @@ export class peakClass { }; }; //рассчет параметров спектра + __getSpecSquare() { + if (this.spec != undefined) { + let __base = this.spec.base; //массив значений средней линии + let __data = this.spec.data; //массив значений амплитуд + let __lines = this.spec.data.length; //количества линий спектра + let __res = this.spec.resolution; //частотное разрешения спектра (высота прямоугольной трапеции) + let __start = 0; //стартовый индекс в массиве + let __end = __lines; //конечный индекс в массиве + let s0 = 0; //площадь под базовой линией + let s1 = 0; //площадь всего спектра + let s2 = 0; //площадь над базовой линией + let s3 = 0; //площадь обнаруженных гармоник + + for (let i = __start; i <= __end - 1; i++) { + s0 += __base[i] * __res; + s1 += __data[i] * __res; + let __delta = __data[i] - __base[i]; + if (__delta >= 0) { s2 += __delta * __res }; + if (__delta >= this.spec.peak_level) { s3 += __delta * __res }; + }; + + return { + base: s0, + spec: s1, + harm: s2, + peak: s3 + }; + }; //определение площадей спектра + } + getWave() { - let __allert = this.getLevels(); + let __allert = this.__getLevels(); let __fault = 2 * __allert; if (this.visible == true) { @@ -134,36 +164,6 @@ export class peakClass { return __max; }; //рассчет автокорреляции - getSpecSquare() { - if (this.spec != undefined) { - let __base = this.spec.base; //массив значений средней линии - let __data = this.spec.data; //массив значений амплитуд - let __lines = this.spec.data.length; //количества линий спектра - let __res = this.spec.resolution; //частотное разрешения спектра (высота прямоугольной трапеции) - let __start = 0; //стартовый индекс в массиве - let __end = __lines; //конечный индекс в массиве - let s0 = 0; //площадь под базовой линией - let s1 = 0; //площадь всего спектра - let s2 = 0; //площадь над базовой линией - let s3 = 0; //площадь обнаруженных гармоник - - for (let i = __start; i <= __end - 1; i++) { - s0 += __base[i] * __res; - s1 += __data[i] * __res; - let __delta = __data[i] - __base[i]; - if (__delta >= 0) { s2 += __delta * __res }; - if (__delta >= this.spec.peak_level) { s3 += __delta * __res }; - }; - - return { - base: s0, - spec: s1, - harm: s2, - peak: s3 - }; - }; //определение площадей спектра - } - getResult() { let __result = {}; //результат let __mech = 0; //механические проблемы @@ -178,8 +178,8 @@ export class peakClass { if (this.spec != undefined) { let GS = MaxPK / FaultLevel; //общая серьезность проблемы - let SQpeak = this.getSpecSquare().peak; //площадь обнаруженных гармонических составляющих - let SQspec = this.getSpecSquare().harm; //площадь над базовой линией + let SQpeak = this.__getSpecSquare().peak; //площадь обнаруженных гармонических составляющих + let SQspec = this.__getSpecSquare().harm; //площадь над базовой линией let PE = (SQpeak ** 2 / SQspec ** 2); //доля периодической энергии let NPE = (SQspec ** 2 - SQpeak ** 2) / SQspec ** 2; //доля непериодической энергии diff --git a/classes/spmClass.js b/classes/spmClass.js index b52b94c..df829dd 100644 --- a/classes/spmClass.js +++ b/classes/spmClass.js @@ -5,11 +5,11 @@ export class spmClass { this.frq = args.freq; this.d = args.d_inner; this.visible = args.visible; - this.cpt = this.todB(this.src1.values); //переводим значения массива в дБ - this.max = this.todB(this.src2.values); //переводим значения массива в дБ + this.cpt = this.__todB(this.src1.values); //переводим значения массива в дБ + this.max = this.__todB(this.src2.values); //переводим значения массива в дБ } - todB(arr, type) { + __todB(arr, type) { let __limit = 3e-4; //пороговое значение if (type != undefined) { switch (type) { @@ -24,7 +24,7 @@ export class spmClass { return arr.map((item) => (item = 20 * Math.log10(item / __limit))); } //перевод линейных величин в дБ - getdBi(d = this.d, rpm = this.frq * 60) { + __getdBi(d = this.d, rpm = this.frq * 60) { const a = 3.135283064375708; const b = 4.999746694992378; const k = -58.16048390995372; @@ -50,35 +50,35 @@ export class spmClass { return a * getDLogUnitValue(d) + b * getRpmLogUnitValue(rpm) + k; } //расчет естественного уровня вибрации dBi - getdBc() { + __getdBc() { return Math.sqrt(this.cpt.reduce((acc, item) => (acc + item ** 2), 0) / this.cpt.length); } //вычисляем ковровый уровень (СКЗ) в дБ - getdBm() { + __getdBm() { return Math.max(...this.max); } //вычисляем максимальную амплитуду импульсов в дБ - getdBn() { - return this.getdBm() - this.getdBi() + __getdBn() { + return this.__getdBm() - this.__getdBi() } //нормализованное значение амплитуды в дБ - getLR() { + __getLR() { let __max0 = this.max.slice(0) //делаем копию массива для сортировки let __maxSort = __max0.sort((a, b) => (b - a)); //сортируем массив по убыванию let __max40 = __maxSort.slice(0, 40); //выделяем 40 первых (максимальных) значений из массива return __max40.reduce((acc, item) => (acc + item), 0) / __max40.length; } //определяем LR (среднее из 40 импульсов) - getHR() { + __getHR() { let __max1000 = this.max.slice(0, this.max.length / 2); //выделяем 1000 значений из массива return Math.sqrt(__max1000.reduce((acc, item) => (acc + item ** 2), 0) / __max1000.length); //вычисляем HR (СКЗ) в дБ } //вычисляем HR (СКЗ) в дБ getWave() { - let __dBm = this.getdBm(); - let __dBc = this.getdBc(); - let __LR = this.getLR(); - let __HR = this.getHR(); + let __dBm = this.__getdBm(); + let __dBc = this.__getdBc(); + let __LR = this.__getLR(); + let __HR = this.__getHR(); if (this.visible == true) { let __canvas = gtl.plots.add("Impulseform"); @@ -130,7 +130,7 @@ export class spmClass { getResult() { let __result = {}; //результат let __state = "Норма"; //общее состояние - let __dBn = this.getdBn(); + let __dBn = this.__getdBn(); let __wav = this.getWave(); //рисуем форму сигнала и получаем пороги switch (true) { diff --git a/userFunctions.js b/userFunctions.js index 31cf7a7..921d0ea 100644 --- a/userFunctions.js +++ b/userFunctions.js @@ -306,7 +306,7 @@ export function getAusp(args) { __ausp.window = gtl.spec.rectangular; //тип окна __ausp.smoothing_factor = 100; //коэффициент сглаживания спектра __ausp.smoothed_line_color = 0xFFFF00; //цвет средней линии - __ausp.harm_tolerance = __ausp.resolution; //диапазон поиска гармоник +/- + __ausp.harm_tolerance = 1; //диапазон поиска гармоник +/- return __ausp; }; //построение спектра вибрации @@ -324,7 +324,7 @@ export function getSpen(args) { __spen.window = gtl.spec.rectangular; //тип окна __spen.smoothing_factor = 100; //коэффициент сглаживания спектра __spen.smoothed_line_color = 0xFFFF00; //цвет средней линии - __spen.harm_tolerance = __spen.resolution; //диапазон поиска гармоник +/- + __spen.harm_tolerance = 1; //диапазон поиска гармоник +/- return __spen; }; //построение спектра огибающей