157 lines
5.5 KiB
JavaScript
157 lines
5.5 KiB
JavaScript
export class spmClass {
|
||
constructor(args) {
|
||
this.src1 = args.src1;
|
||
this.src2 = args.src2;
|
||
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); //переводим значения массива в дБ
|
||
}
|
||
|
||
__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;
|
||
};
|
||
};
|
||
|
||
return arr.map((item) => (item = 20 * Math.log10(item / __limit)));
|
||
} //перевод линейных величин в дБ
|
||
|
||
__getdBi(d = this.d, rpm = this.frq * 60) {
|
||
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
|
||
|
||
__getdBc() {
|
||
return Math.sqrt(this.cpt.reduce((acc, item) => (acc + item ** 2), 0) / this.cpt.length);
|
||
} //вычисляем ковровый уровень (СКЗ) в дБ
|
||
|
||
__getdBm() {
|
||
return Math.max(...this.max);
|
||
} //вычисляем максимальную амплитуду импульсов в дБ
|
||
|
||
__getdBn() {
|
||
return this.__getdBm() - this.__getdBi()
|
||
} //нормализованное значение амплитуды в дБ
|
||
|
||
__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() {
|
||
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();
|
||
|
||
if (this.visible == true) {
|
||
let __canvas = gtl.plots.add("Impulseform");
|
||
|
||
__canvas.add({
|
||
color: this.src2.color,
|
||
name: this.src2.name,
|
||
x: this.src2.time,
|
||
y: this.max
|
||
}); //рисуем форму импульсов SPM
|
||
|
||
__canvas.add({
|
||
color: 0xFFFF00,
|
||
name: "dBc",
|
||
x: this.src2.time,
|
||
y: this.max.map((item) => (item = __dBc))
|
||
}); //рисуем уровень dBc
|
||
|
||
__canvas.add({
|
||
color: 0xFF0000,
|
||
name: "dBm",
|
||
x: this.src2.time,
|
||
y: this.max.map((item) => (item = __dBm))
|
||
}); //рисуем уровень dBm
|
||
|
||
__canvas.add({
|
||
color: 0xFFA500,
|
||
name: "HR",
|
||
x: this.src2.time,
|
||
y: this.max.map((item) => (item = __HR))
|
||
}); //рисуем уровень HR
|
||
|
||
__canvas.add({
|
||
color: 0xFF00CC,
|
||
name: "LR",
|
||
x: this.src2.time,
|
||
y: this.max.map((item) => (item = __LR))
|
||
}); //рисуем уровень LR
|
||
}
|
||
|
||
return {
|
||
dBm: __dBm,
|
||
dBc: __dBc,
|
||
LR: __LR,
|
||
HR: __HR
|
||
}
|
||
}
|
||
|
||
getResult() {
|
||
let __result = {}; //результат
|
||
let __state = "Норма"; //общее состояние
|
||
let __dBn = this.__getdBn();
|
||
let __wav = this.getWave(); //рисуем форму сигнала и получаем пороги
|
||
|
||
switch (true) {
|
||
case (__dBn > 20) && (__dBn < 35):
|
||
__state = "Предупреждение";
|
||
break;
|
||
case __dBn >= 35:
|
||
__state = "Опасность";
|
||
break;
|
||
default:
|
||
break;
|
||
};
|
||
|
||
__result = {
|
||
dBm: __wav.dBm,
|
||
dBc: __wav.dBc,
|
||
LR: __wav.LR,
|
||
HR: __wav.HR,
|
||
state: __state
|
||
};
|
||
|
||
return __result
|
||
} //оценка общего состояния
|
||
} |