gtld2-diag-scripts/classes/spmClass.js

157 lines
5.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
} //оценка общего состояния
}