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 = { dBi: __dBi, dBc: __dBc, dBm: __dBm, dBn: __dBn, HR: __HR, LR: __LR, state: __state }; return __result; }; //оценка состояния методом spmVM 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; }; //перевод значений массива в дБ 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