Compare commits
No commits in common. "develop" and "main" have entirely different histories.
|
@ -1,52 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
export function bsDefs(mtx, isDeep) {
|
||||
var res = {}; //результат
|
||||
if (isDeep = true) { var key = "dp" } else { var key = "lv" };
|
||||
var des = {
|
||||
FTF: { ds: "тел качения и сепаратора", dp: 8, lv: 20 },
|
||||
FREQ: { ds: "винта", dp: 13, lv: 20 },
|
||||
BSF: { ds: "тел качения", dp: 10, lv: 20 },
|
||||
BPFO: { ds: "гайки", dp: 15, lv: 20 },
|
||||
BPFI: { ds: "винта", dp: 8, lv: 20 },
|
||||
}; //описание функциональных частот
|
||||
|
||||
function getNote(harmsArr) {
|
||||
let note = "Износ"; //описание характера колебаний
|
||||
let cnt = 0; //количество значений в массиве
|
||||
for (let i = 0; i <= harmsArr.length - 1; i++) { if (harmsArr[i] > 0) { cnt++ }; };
|
||||
if (cnt >= 5) { note = "Дефект" };
|
||||
if (harmsArr[1] > harmsArr[0]) { note = "Перекос" };
|
||||
if (cnt > 0 && harmsArr[0] == 0 && harmsArr[1] == 0) { note = "Неидентифицированные изменения вибрации" };
|
||||
return note;
|
||||
};
|
||||
|
||||
function getLevel(lvl, thres) {
|
||||
let level = "Сильный";
|
||||
switch (true) {
|
||||
case lvl < 0.5 * thres:
|
||||
level = "Слабый";
|
||||
break;
|
||||
case lvl < thres:
|
||||
level = "Средний";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}; return level;
|
||||
};
|
||||
|
||||
var rows = Object.keys(mtx); //массив ключей объекта (наборов гармоник)
|
||||
for (let i = 0; i <= rows.length - 1; i++) {
|
||||
let arr = mtx[rows[i]]; //массив гармоник
|
||||
let lvl = Math.max(...arr); //определяем максимальное значение параметра из массива
|
||||
let sum = arr.reduce(function (a, b) { return a + b }, 0); //сумма элементов массива
|
||||
if (sum > 0) {
|
||||
let note = getNote(arr);
|
||||
res[rows[i]] = note + ' ' + des[rows[i]].ds + ': ' + getLevel(lvl, des[rows[i]][key]) + ' (' + lvl + ')';
|
||||
};
|
||||
};
|
||||
return res;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
var ufc = gtl.import("userFunctions.js");
|
||||
|
||||
export function bsMTX(spec, filter, isDeep) {
|
||||
var num = 6; //глубина матрицы (количество гармоник)
|
||||
var level = 0; //уровень развития дефекта
|
||||
var res = {}; //результат
|
||||
|
||||
var set = {
|
||||
FTF: { nm: "Частота вращения сепаратора", fn: ufc.BSFTF(), md: 0, cl: 0xffff0000 },
|
||||
FREQ: { nm: "Частота вращения", fn: ufc.FREQ(), md: 0, cl: 0xff0000f0 },
|
||||
BSF: { nm: "Частота вращения (контакта) тел качения", fn: ufc.BSBAL(), md: 0, cl: 0xffFFB841 },
|
||||
BPFO: { nm: "Частота перекатывания тел качения по гайке", fn: ufc.BSNUT(), md: 0, cl: 0xffED3CCA },
|
||||
BPFI: { nm: "Частота перекатывания тел качения по винту", fn: ufc.BSSCR(), md: 0, cl: 0xff990090 }
|
||||
}; //набор функциональных частот
|
||||
|
||||
function modFactor(dSpec, dFilter, ampl, base) {
|
||||
let dl = (ampl - base); //разность уровней гармонической и случайной составляющей вибрации
|
||||
let df = dSpec.frequency / dFilter.width; //отношение частотному разрешению спектра к ширине фильтра
|
||||
let mod = Math.sqrt((10 ** (dl / 10) - 1) * df);
|
||||
return mod;
|
||||
}; //определение глубины модуляции ВЧ составляющих
|
||||
|
||||
var rows = Object.keys(set); //массив ключей объекта (наборов гармонических рядов)
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
for (let i = 0; i <= rows.length - 1; i++) {
|
||||
let lines = rows[i];
|
||||
let idx = 0; //индекс гармонического ряда
|
||||
let nms = set[lines].nm; //название гармонического ряда
|
||||
let frq = set[lines].fn; //расчетная частота
|
||||
let mod = set[lines].md; //модулирующая частота
|
||||
let clr = set[lines].cl; //предустановленный цвет
|
||||
let arr = []; //массив обнаруженных гармоник
|
||||
|
||||
lines = spec.add_harms_set(frq, num, clr, 2); //строим набор частот (гармонический ряд)
|
||||
lines.name = nms;
|
||||
idx = spec.index_of_harms_set(lines); //определяем индекс набора частот
|
||||
if (mod != 0) { spec.harms_sets[idx].modulate(mod, 2, clr, 0.5) }; //строим амплитудную модуляцию
|
||||
for (let j = 0; j <= num - 1; j++) {
|
||||
lines.harms[j].tolerance = (j + 1) * frq * ufc.tolerance(); //устанавливаем коридор обнаружения гармоники
|
||||
if (lines.harms[j].is_present == true) {
|
||||
switch (isDeep) {
|
||||
case true:
|
||||
level = Math.round(modFactor(spec, filter, lines.harms[j].amplitude, lines.harms[j].base));
|
||||
break;
|
||||
case false:
|
||||
level = Math.round(lines.harms[j].level);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
arr.push(level);
|
||||
} else { arr.push(0) };
|
||||
res[rows[i]] = arr;
|
||||
};
|
||||
};
|
||||
|
||||
return res;
|
||||
};
|
||||
|
|
@ -1,163 +0,0 @@
|
|||
export class maskClass {
|
||||
constructor(args) {
|
||||
this.spec = args.spec;
|
||||
this.set = args.set;
|
||||
this.filter = args.filter;
|
||||
this.tol = args.tol;
|
||||
this.color = args.color;
|
||||
this.visible = args.visible;
|
||||
this.canvas = NaN;
|
||||
if (this.visible == true) { this.canvas = gtl.plots.add("Model") };
|
||||
}
|
||||
|
||||
__getModel() {
|
||||
let __model = this.spec.base; //массив точек базовой линии
|
||||
let imin = 0; //левая граница коридора
|
||||
let imax = 0; //правая граница коридора
|
||||
for (let i = 0; i < this.spec.peaks.length; i++) {
|
||||
let freq = this.spec.peaks[i].freq; //получаем значение частоты гармоники из массива обнаруженных гармоник
|
||||
let level = this.spec.peaks[i].level; //получаем значение уровня гармоники из массива обнаруженных гармоник
|
||||
imin = Math.round((freq - freq * 0.5 * this.tol / 100) / this.spec.resolution);
|
||||
imax = Math.round((freq + freq * 0.5 * this.tol / 100) / this.spec.resolution);
|
||||
if (imax > this.spec.base.length) { imax = this.spec.base.length - 1 }; //проверяем выход границы за размер массива
|
||||
for (let j = imin; j <= imax; j++) { __model[j] = this.spec.base[j] + level };
|
||||
};
|
||||
|
||||
if (this.visible == true) {
|
||||
this.canvas.add({
|
||||
color: this.color,
|
||||
name: this.spec.name + "_model",
|
||||
x: this.spec.resolution,
|
||||
y: __model
|
||||
});
|
||||
}; //отрисовка модели спектра на plot
|
||||
|
||||
return __model;
|
||||
} //построение упрощенной модели спектра
|
||||
|
||||
__getMask(options) {
|
||||
let __model = options.model; //массив точек спектра для сравнения с портретом
|
||||
let __mask = options.mask.base; //массив точек базовой линии для построения портрета дефекта
|
||||
let harms = options.harms; //кол-во гармоник портрета
|
||||
if (options.freq * harms > options.mask.frequency) { harms = Math.trunc(options.mask.frequency / options.freq) }; //проверяем максимальное кол-во гармоник в портрете
|
||||
let df = 0; //отношение ширины фильтра частотному разрешению спектра
|
||||
let dl = options.lvl; //разность уровней гармонической и случайной составляющей вибрации
|
||||
if (options.filter != 0) {
|
||||
df = options.mask.frequency / options.filter.width;
|
||||
dl = 10 * Math.log10((options.lvl ** 2) / df + 1);
|
||||
};
|
||||
let k = options.coef; //коэффициент затухания
|
||||
let x = 0; //индекс элемента массива для гармоники
|
||||
let dx = 0; //коридор индексов
|
||||
let xmin = 0; //левая граница коридора
|
||||
let xmax = 0; //правая граница коридора
|
||||
let correlation = 0; //коэффициент корреляции
|
||||
|
||||
function corr(a, b) {
|
||||
let X = 0; //аргумент 1
|
||||
let Y = 0; //аргумент 2
|
||||
let Z = 0; //аргумент 3
|
||||
let a_avg = a.reduce((acc, item) => (acc + item)) / a.length; //среднее значение массива 1
|
||||
let b_avg = b.reduce((acc, item) => (acc + item)) / b.length; //среднее значение массива 2
|
||||
|
||||
for (let i = 0; i < a.length; i++) {
|
||||
X += (a[i] - a_avg) * (b[i] - b_avg);
|
||||
Y += (a[i] - a_avg) ** 2;
|
||||
Z += (b[i] - b_avg) ** 2;
|
||||
};
|
||||
|
||||
if (X <= 0) { return 0 } else { return X / (Math.sqrt(Y) * Math.sqrt(Z)) };
|
||||
};
|
||||
|
||||
let arr1 = [];
|
||||
let arr2 = [];
|
||||
switch (options.type) {
|
||||
case 0: //обычный ряд
|
||||
for (let i = 1; i <= harms; i++) {
|
||||
x = Math.trunc(i * options.freq / options.mask.resolution); //определяем инднекс элемента массива для гармоники
|
||||
dx = Math.trunc(i * (options.freq * options.tol / 100) / options.mask.resolution); //коридор индексов массива для гармоники
|
||||
xmin = x - Math.round(dx / 2); //определяем индекс левой границы коридора
|
||||
xmax = x + Math.round(dx / 2); //определяем индекс правой границы коридора
|
||||
|
||||
if (xmax > options.mask.base.length) { xmax = options.mask.base.length - 2 }; //проверяем выход границы за размер массива
|
||||
for (let j = xmin; j <= xmax; j++) { __mask[j] = options.mask.base[j] + dl }; //записываем значение глубины модуляции для коридора
|
||||
dl = dl - (k * dl); //снижаем глубину модуляции с коэффициентом затухания
|
||||
|
||||
for (let j = xmin - 2; j <= xmax + 2; j++) {
|
||||
arr1.push(__mask[j]);
|
||||
arr2.push(__model[j]);
|
||||
}; //формируем массивы портретной гармоники и спектра (модели) под портретом
|
||||
correlation += corr(arr1, arr2); //рассчитываем корреляцию данных из массивов
|
||||
};
|
||||
break;
|
||||
case 1: //четные составляющие
|
||||
for (let i = 1; i <= harms; i++) {
|
||||
x = Math.trunc(i * options.freq / options.mask.resolution); //инднекс элемента массива для гармоники
|
||||
dx = Math.trunc(i * (options.freq * options.tol / 100) / options.mask.resolution); //коридор индексов массива для гармоники
|
||||
xmin = x - Math.round(dx / 2); //определяем индекс левой границы коридора
|
||||
xmax = x + Math.round(dx / 2); //определяем индекс правой границы коридора
|
||||
|
||||
if (xmax > options.mask.base.length) { xmax = options.mask.base.length - 2 }; //проверяем выход границы за размер массива
|
||||
if (i % 2 > 0) {
|
||||
for (let j = xmin; j <= xmax; j++) { __mask[j] = options.mask.base[j] + k * dl }; //записываем значение глубины модуляции для коридора (нечетная гармоника)
|
||||
} else {
|
||||
for (let j = xmin; j <= xmax; j++) { __mask[j] = options.mask.base[j] + dl }; //записываем значение глубины модуляции для коридора (четная гармоника)
|
||||
dl = dl - (k * dl); //снижаем глубину модуляции с коэффициентом затухания
|
||||
};
|
||||
|
||||
for (let j = xmin - 2; j <= xmax + 2; j++) {
|
||||
arr1.push(__mask[j]);
|
||||
arr2.push(__model[j]);
|
||||
}; //формируем массивы портретной гармоники и спектра (модели) под портретом
|
||||
correlation += corr(arr1, arr2); //рассчитываем корреляцию данных из массивов
|
||||
};
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
|
||||
let __result = correlation / harms;
|
||||
|
||||
if (this.visible == true) {
|
||||
this.canvas.add({
|
||||
color: options.color,
|
||||
name: options.name + " (" + __result.toFixed(2) + ")",
|
||||
x: options.mask.resolution,
|
||||
y: __mask
|
||||
});
|
||||
}; //отрисовка маски дефекта на plot
|
||||
|
||||
return __result;
|
||||
} //построение маски дефекта
|
||||
|
||||
getResult() {
|
||||
let __result = {}; //результат
|
||||
let __model = this.__getModel(); //рисуем модель спектра и получаем массив его данных
|
||||
let __rows = Object.keys(this.set); //массив ключей объекта (наименование портретов)
|
||||
|
||||
for (let i = 0; i < __rows.length; i++) {
|
||||
let __name = __rows[i]; //имена портретов
|
||||
let __arr = this.set[__name]; //массив значений
|
||||
let __corr = this.__getMask(
|
||||
{
|
||||
name: __name, //имя маски дефекта
|
||||
model: __model, //модель спектра для анализа (объект)
|
||||
mask: this.spec, //базовый спектр для построения портрета (объект)
|
||||
filter: this.filter, //полосовой фильтр (для определения разницы амплитуд гармонической и случайной составляющей)
|
||||
tol: this.tol, //коридор обнаружения гармоники на портрете, %
|
||||
color: __arr[0], //цвет портрета в формате HEX
|
||||
freq: __arr[1], //функциональная частота, Гц
|
||||
harms: __arr[2], //кол-во гармоник в портрете, шт
|
||||
lvl: __arr[3], //глубина модуляции сильного дефекта для портрета, %
|
||||
type: __arr[4], //тип портрета (0 - обычный ряд, 1 - четные составляющие)
|
||||
coef: __arr[5] //коэффициент затухания гармоник портрета: дефект (0.05 - 0.10), износ (0.30 - 0.50)
|
||||
}
|
||||
); //рисуем маску дефекта и получаем значение корреляции
|
||||
|
||||
if (__corr >= 0.5) { __result[__name] = __corr }; //добавляем данные в результат
|
||||
gtl.log.info("Вероятность: " + __name, __corr); //выводим корреляцию гармоник в лог
|
||||
};
|
||||
|
||||
return __result;
|
||||
} //оценка состояния по маске дефекта
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
export class mtxClass {
|
||||
constructor(args) {
|
||||
this.spec = args.spec;
|
||||
this.filter = args.filter;
|
||||
this.set = args.set;
|
||||
if (this.tol != undefined) { this.spec.harm_tolerance = args.tol }
|
||||
}
|
||||
|
||||
__getModDeep(ampl, base) {
|
||||
let dl = (ampl - base); //разность уровней гармонической и случайной составляющей вибрации
|
||||
let df = this.spec.frequency / this.filter.width; //отношение частотному разрешению спектра к ширине фильтра
|
||||
let mod = Math.sqrt((10 ** (dl / 10) - 1) * df);
|
||||
return mod;
|
||||
}; //определение глубины модуляции ВЧ составляющих
|
||||
|
||||
getMatrix() {
|
||||
let __result = {}; //результат
|
||||
let __num = 6; //глубина матрицы (количество гармоник)
|
||||
let __lvl = 0; //уровень развития дефекта
|
||||
let __rows = Object.keys(this.set); //массив ключей объекта (наименование портретов)
|
||||
|
||||
for (let i = 0; i < __rows.length; i++) {
|
||||
let __name = __rows[i]; //имена портретов
|
||||
let __arr = this.set[__name]; //массив значений
|
||||
|
||||
let __color = __arr[0]; //предустановленный цвет
|
||||
let __freq = __arr[1]; //расчетная частота
|
||||
let __harms = []; //массив обнаруженных гармоник
|
||||
|
||||
let __harms_set = this.spec.add_harms_set(__freq, __num, __color, 2); //строим набор частот (гармонический ряд)
|
||||
__harms_set.name = __name;
|
||||
for (let j = 0; j < __num; j++) {
|
||||
//__harms_set.harms[j].tolerance = (j + 1) * __fValue * this.tol; //устанавливаем коридор обнаружения гармоники
|
||||
if (__harms_set.harms[j].is_present == true) {
|
||||
__lvl = Math.round(this.__getModDeep(__harms_set.harms[j].amplitude, __harms_set.harms[j].base));
|
||||
__harms.push(__lvl);
|
||||
} else { __harms.push(0) };
|
||||
__result[__name] = __harms;
|
||||
}
|
||||
}
|
||||
return __result
|
||||
}
|
||||
}
|
||||
|
|
@ -1,220 +0,0 @@
|
|||
export class peakClass {
|
||||
constructor(args) {
|
||||
this.wave = args.src;
|
||||
this.freq = args.freq;
|
||||
this.visible = args.visible;
|
||||
if (args.spec != undefined) { this.spec = args.spec };
|
||||
}
|
||||
|
||||
__getLevels(rpm = this.freq * 60) {
|
||||
let __allert = 0; //уровень предупреждения, g
|
||||
switch (true) {
|
||||
case rpm <= 900:
|
||||
__allert = 3.0 * (rpm / 900) ** 0.75; //1.5 => 3.0 для формы Peak-To-Peak
|
||||
break;
|
||||
case (rpm > 900) && (rpm <= 4000):
|
||||
__allert = 3.0; //1.5 => 3.0 для формы Peak-To-Peak
|
||||
break;
|
||||
case (rpm > 4000) && (rpm <= 10000):
|
||||
__allert = 3.0 * (rpm / 4000) ** 0.5; //1.5 => 3.0 для формы Peak-To-Peak
|
||||
break;
|
||||
case rpm > 10000:
|
||||
__allert = 5.0; //3.0 => 5.0 для формы Peak-To-Peak
|
||||
default:
|
||||
break;
|
||||
};
|
||||
return __allert
|
||||
}; //рассчет пороговых уровней
|
||||
|
||||
__getParams(rpm = this.freq * 60) {
|
||||
let __wdt = 0; //граничная частота ФВЧ
|
||||
let __frq = 40 * this.freq; //граничная частота спектра
|
||||
let __lns = 800; //количество линий спектра
|
||||
let __avg = 1; //количество усреднений спектра
|
||||
|
||||
switch (true) {
|
||||
case rpm <= 700:
|
||||
__wdt = 500;
|
||||
__lns = 800;
|
||||
break;
|
||||
case (rpm > 700) && (rpm <= 1500):
|
||||
__wdt = 1000;
|
||||
__lns = 800;
|
||||
break;
|
||||
case (rpm > 1500) && (rpm <= 3000):
|
||||
__wdt = 2000;
|
||||
__lns = 1600;
|
||||
break;
|
||||
case (rpm > 3000) && (rpm <= 4000):
|
||||
__wdt = 2000;
|
||||
__lns = 1600;
|
||||
case rpm > 4000:
|
||||
__wdt = 5000;
|
||||
__lns = 1600;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
return {
|
||||
filter: { frequency: __wdt },
|
||||
spec: {
|
||||
frequency: __frq,
|
||||
lines: __lns,
|
||||
resolution: __frq / __lns,
|
||||
avg: __avg
|
||||
}
|
||||
};
|
||||
}; //рассчет параметров спектра
|
||||
|
||||
__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 __fault = 2 * __allert;
|
||||
|
||||
if (this.visible == true) {
|
||||
let __canvas = gtl.plots.add("Waveform");
|
||||
let __alr = this.wave.values.map((item) => (item = __allert));
|
||||
let __flt = this.wave.values.map((item) => (item = __fault));
|
||||
|
||||
__canvas.add({
|
||||
color: this.wave.color,
|
||||
name: this.wave.name,
|
||||
x: this.wave.time,
|
||||
y: this.wave.values
|
||||
}); //рисуем форму сигнала
|
||||
|
||||
__canvas.add({
|
||||
color: 0xFFFF00,
|
||||
name: "allert",
|
||||
x: this.wave.time,
|
||||
y: __alr
|
||||
}); //рисуем порог предупреждения
|
||||
|
||||
__canvas.add({
|
||||
color: 0xFF0000,
|
||||
name: "fault",
|
||||
x: this.wave.time,
|
||||
y: __flt
|
||||
}); //рисуем порог опасности
|
||||
|
||||
}
|
||||
return __allert
|
||||
}
|
||||
|
||||
getCorr() {
|
||||
let __plot = []; //массив значений корреляции для графика
|
||||
let arr = this.wave.values;
|
||||
let arr2 = arr.concat(arr); //расширяем массив данных
|
||||
let lag = 0.5;
|
||||
let X = 0; //аргумент 1
|
||||
let Y = 0; //аргумент 2
|
||||
|
||||
let T = Math.floor(arr.length * lag); //определяем количество индексов (шагов) для смещения массива
|
||||
let avg = arr.reduce((acc, item) => (acc + item)) / arr.length; //среднее значение массива
|
||||
Y = arr.reduce((acc, item) => (acc + (item - avg) ** 2), 0); //рассчитываем знаменатель функции
|
||||
|
||||
for (let i = 0; i < T; i++) {
|
||||
X = 0;
|
||||
for (let j = 0; j < arr.length; j++) { X += (arr[j] - avg) * (arr2[j + i] - avg) };
|
||||
__plot.push(X / Y); //записываем значение в массив коэффициентов
|
||||
}; //смещение массива
|
||||
|
||||
let __plot0 = __plot.slice(Math.floor(0.01 * __plot.length)); //убираем из массива первый 1% значений коэффициента (т.к. в нуле всегда значение 1.0)
|
||||
let __max = Math.max(...__plot0); //определяем максимальное значение коэффициента
|
||||
|
||||
if (this.visible == true) {
|
||||
let __canvas = gtl.plots.add("Correlation");
|
||||
|
||||
__canvas.add({
|
||||
color: 0x00A550,
|
||||
name: "Корреляционная функция",
|
||||
x: this.wave.time,
|
||||
y: __plot
|
||||
});
|
||||
}; //отрисовка графика на plot
|
||||
|
||||
return __max;
|
||||
}; //рассчет автокорреляции
|
||||
|
||||
getResult() {
|
||||
let __result = {}; //результат
|
||||
let __mech = 0; //механические проблемы
|
||||
let __lubr = 0; //проблемы со смазкой
|
||||
|
||||
let __allert = this.getWave(); //рисуем пиковую форму сигнала и получаем порог предупреждения, g
|
||||
let __corr = this.getCorr(); //вычисляем автокорреляционную функцию (получаем максимум)
|
||||
|
||||
let MaxPK = Math.max(...this.wave.values); //максимальное значение амплитуды на пиковой форме, g
|
||||
let FaultLevel = 2 * __allert; //уровень аварии для пиковой формы (Fault = 2 * Allert)
|
||||
let EstPE = Math.sqrt(__corr) * 100; //расчетный процент периодической энергии
|
||||
|
||||
if (this.spec != undefined) {
|
||||
let GS = MaxPK / FaultLevel; //общая серьезность проблемы
|
||||
let SQpeak = this.__getSpecSquare().peak; //площадь обнаруженных гармонических составляющих
|
||||
let SQspec = this.__getSpecSquare().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 * 0.8, //нормализованное значение (для индикатора 0-100 единиц)
|
||||
lubrBS: __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
|
||||
};
|
||||
};
|
||||
|
||||
return __result;
|
||||
}; //оценка состояния методом PeakVM
|
||||
}
|
|
@ -1,157 +0,0 @@
|
|||
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
|
||||
} //оценка общего состояния
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.FREQ(); //функциональная чатота
|
||||
let num = 10; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff0000f0, 1); //биение шестерни - "синий"
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
spen_set.name = 'Биение шестерни';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
var ausp_set = ausp.add_harms_set(frq, num, 0xff0000f0, 2); //биение шестерни "синий"
|
||||
for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
ausp_set.name = 'Биение шестерни';
|
||||
var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектре огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//биение вала
|
||||
if (
|
||||
spen.harms_sets[spen_index].get_count(0, 2) >= 3 && spen.harms_sets[spen_index].get_count(0, 2) <= 5 &&
|
||||
ausp.harms_sets[ausp_index].get_count(0, 2) >= 3 && ausp.harms_sets[ausp_index].get_count(0, 2) <= 5
|
||||
) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Биение шестерни. Признаки в ES " + (i + 1) + "Fвр1", deep);
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (ausp_set.harms[i].is_present == true) {
|
||||
ampl = ausp_set.harms[i].amplitude;
|
||||
ausp_signs.push(ampl);
|
||||
gtl.log.info("Биение шестерни. Признаки в AS " + (i + 1) + "Fвр1", ampl);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Биение шестерни", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 12:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 20:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 20:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.GTFZ(); //функциональная чатота
|
||||
let num = 5; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff990090, 1); //дефект зубьев шестерни
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
spen_set.name = 'Дефект зубьев шестерни';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
|
||||
spen.harms_sets[spen_index].modulate(imp.FREQ(), 2, 0xff0000f0, 1); //модуляция Fz +/- Fвр
|
||||
|
||||
var ausp_set = ausp.add_harms_set(frq, num, 0xff990090, 2); //дефект зубьев шестерни
|
||||
for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
ausp_set.name = 'Дефект зубьев шестерни';
|
||||
var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации
|
||||
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
|
||||
ausp.harms_sets[ausp_index].modulate(imp.FREQ(), 2, 0xff0000f0, 1); //модуляция Fz +/- Fвр
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектре огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//биение вала
|
||||
if (
|
||||
spen.harms_sets[spen_index].get_count(0, 1, 1) >= 3 &&
|
||||
ausp.harms_sets[ausp_index].get_count(0, 1, 1) >= 3
|
||||
) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Дефект зубьев шестерни. Признаки в ES " + (i + 1) + "Fz", deep);
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (ausp_set.harms[i].is_present == true) {
|
||||
ampl = ausp_set.harms[i].amplitude;
|
||||
ausp_signs.push(ampl);
|
||||
gtl.log.info("Дефект зубьев шестерни. Признаки в AS " + (i + 1) + "Fz", ampl);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Дефект зубьев шестерни", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 12:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 20:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 20:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.GTF2(); //функциональная чатота
|
||||
let num = 10; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff009000, 1); //биение зубчатого колеса
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
spen_set.name = 'Биение зубчатого колеса';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
var ausp_set = ausp.add_harms_set(frq, num, 0xff009000, 2); //биение зубчатого колеса
|
||||
for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
ausp_set.name = 'Биение зубчатого колеса';
|
||||
var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектре огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//биение вала
|
||||
if (
|
||||
spen.harms_sets[spen_index].get_count(0, 2) >= 3 && spen.harms_sets[spen_index].get_count(0, 2) <= 5 &&
|
||||
ausp.harms_sets[ausp_index].get_count(0, 2) >= 3 && ausp.harms_sets[ausp_index].get_count(0, 2) <= 5
|
||||
) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Биение зубчатого колеса. Признаки в ES " + (i + 1) + "Fвр2", deep);
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (ausp_set.harms[i].is_present == true) {
|
||||
ampl = ausp_set.harms[i].amplitude;
|
||||
ausp_signs.push(ampl);
|
||||
gtl.log.info("Биение зубчатого колеса. Признаки в AS " + (i + 1) + "Fвр2", ampl);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Биение зубчатого колеса", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 12:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 20:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 20:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.GTFZ(); //функциональная чатота
|
||||
let num = 5; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff994000, 1); //дефект зубьев зубчатого колеса
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
spen_set.name = 'Дефект зубьев зубчатого колеса';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
|
||||
spen.harms_sets[spen_index].modulate(imp.GTF2(), 2, 0xff009000, 1); //модуляция Fz +/- Fвр
|
||||
|
||||
var ausp_set = ausp.add_harms_set(frq, num, 0xff994000, 2); //дефект зубьев зубчатого колеса
|
||||
for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
ausp_set.name = 'Дефект зубьев зубчатого колеса';
|
||||
var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации
|
||||
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
|
||||
ausp.harms_sets[ausp_index].modulate(imp.GTF2(), 2, 0xff009000, 1); //модуляция Fz +/- Fвр
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектре огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//биение вала
|
||||
if (
|
||||
spen.harms_sets[spen_index].get_count(0, 1, 1) >= 3 &&
|
||||
ausp.harms_sets[ausp_index].get_count(0, 1, 1) >= 3
|
||||
) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Дефект зубьев зубчатого колеса. Признаки в ES " + (i + 1) + "Fz", deep);
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (ausp_set.harms[i].is_present == true) {
|
||||
ampl = ausp_set.harms[i].amplitude;
|
||||
ausp_signs.push(ampl);
|
||||
gtl.log.info("Дефект зубьев зубчатого колеса. Признаки в AS " + (i + 1) + "Fz", ampl);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Дефект зубьев зубчатого колеса", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 12:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 20:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 20:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -4,9 +4,12 @@ var options = gtl.options;
|
|||
var record = gtl.options.record;
|
||||
var point = gtl.options.point;
|
||||
|
||||
var fnc = gtl.import("userFunctions.js");
|
||||
var mtx = gtl.import("gtMTX.js");
|
||||
var def = gtl.import("gtDefs.js");
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
var gear0 = gtl.import("gt-gear-beat.js");
|
||||
var wheel0 = gtl.import("gt-wheel-beat.js");
|
||||
var gear1 = gtl.import("gt-gear-fault.js");
|
||||
var wheel1 = gtl.import("gt-wheel-fault.js");
|
||||
|
||||
//настройки для датчика оборотов
|
||||
var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра
|
||||
|
@ -23,16 +26,16 @@ freq.avg_cnt = 6;
|
|||
|
||||
//[Блок настройки параметров измерений]
|
||||
//мониторинговый спектр вибрации
|
||||
var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации
|
||||
var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации
|
||||
ausp2.name = "AUSPm"; //присвоение имени спектра
|
||||
ausp2.color = 0x0000ffff; //цвет линии спектра
|
||||
ausp2.frequency = 25600; //граничная частота спектра
|
||||
ausp2.frequency = 1600; //граничная частота спектра
|
||||
ausp2.lines = 1600; //разрешение спектра (количество линий)
|
||||
ausp2.average = 6; //количество усреднений
|
||||
ausp2.unit = gtl.spec.db; //отображение в дБ
|
||||
|
||||
//спектр вибрации
|
||||
var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации
|
||||
var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации
|
||||
ausp.name = "AUSPd"; //присвоение имени спектра
|
||||
ausp.color = 0x0000ff00; //цвет линии спектра
|
||||
ausp.frequency = 800; //граничная частота спектра
|
||||
|
@ -45,7 +48,7 @@ ausp.peak_level = 20; //порог обнаружения гармоник
|
|||
ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/-
|
||||
|
||||
//фильтр для формирования спектра огибающей
|
||||
var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра
|
||||
var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра
|
||||
filter_spen.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter_spen.order = 10; //порядок фильтра
|
||||
|
@ -57,8 +60,8 @@ filter_spen.width = 1482; //ширина полосы фильтра
|
|||
var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей
|
||||
spen.name = "SPEN"; //присвоение имени спектра огибающей
|
||||
spen.color = 0x00ff0000; //цвет линии спектра огибающей
|
||||
spen.frequency = 200; //граничная частота спектра огибающей
|
||||
spen.lines = 200; //разрешение спектра огибающей (количество линий)
|
||||
spen.frequency = 400; //граничная частота спектра огибающей
|
||||
spen.lines = 400; //разрешение спектра огибающей (количество линий)
|
||||
spen.average = 8; //количество усреднений
|
||||
spen.unit = gtl.spec.db; //отображение в дБ
|
||||
spen.window = gtl.spec.hann; //окно
|
||||
|
@ -76,31 +79,62 @@ ampl_spen.time = 0.5; //интервал расчета Amplitude (spen)
|
|||
rms_spen.avg_cnt = 4; //количество усреднений RMS (spen)
|
||||
ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen)
|
||||
|
||||
//RMS виброскорости в диапазоне 10-1000 Гц.
|
||||
var int = gtl.add_intg(gtl.analog_inputs[signals[0].portNumber]); //интегрирование сигнала виброускорения
|
||||
int.taps = 1; //степень интегрирования (скорость из ускорения - 1-нарное интегрирование)
|
||||
//фильтрация сигнала в диапазоне
|
||||
var filter = gtl.add_filter_iir(int); //объявление переменной фильтра
|
||||
filter.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter.order = 10; //порядок фильтра
|
||||
filter.frequency = 505; //центральная частота полосового фильтра
|
||||
filter.width = 990; //ширина полосы фильтра
|
||||
//определение среднего квадратического значения виброскорости
|
||||
var rms_v = gtl.add_value_rms(filter); //объявление переменной СКЗ
|
||||
rms_v.time = 0.5; //время выборки
|
||||
rms_v.avg_cnt = 4; //количество усреднений
|
||||
//RMS и Amplitude в УВЧ диапазоне 10-25 кГц (контроль разрыва масляной пленки)
|
||||
var filter_uhf = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный)
|
||||
filter_uhf.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_uhf.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter_uhf.order = 10; //порядок фильтра
|
||||
filter_uhf.frequency = 17500; //центральная частота полосового фильтра
|
||||
filter_uhf.width = 15000; //ширина полосы фильтра
|
||||
|
||||
var rms_uhf = gtl.add_value_rms(filter_uhf); //назначение переменной RMS
|
||||
var ampl_uhf = gtl.add_value_ampl(filter_uhf); //назначение переменной Amplitude
|
||||
rms_uhf.name = "RMS (uhf)" //присвоение имени RMS (uhf)
|
||||
rms_uhf.time = 0.5; //интервал расчета RMS (uhf)
|
||||
ampl_uhf.time = 0.5; //интервал расчета Amplitude (uhf)
|
||||
rms_uhf.avg_cnt = 4; //количество усреднений RMS (uhf)
|
||||
ampl_uhf.avg_cnt = 4; //количество усреднений Amplitude (uhf)
|
||||
|
||||
//Виброскорость в дипазоне 2-1000 Гц (вибромониторинг)
|
||||
var filter2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный)
|
||||
filter2_1000.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter2_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter2_1000.order = 10; //порядок фильтра
|
||||
filter2_1000.frequency = 501; //центральная частота полосового фильтра
|
||||
filter2_1000.width = 998; //ширина полосы фильтра
|
||||
var filter2_1000v = gtl.add_intg(filter2_1000); // интегрирование
|
||||
filter2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
|
||||
|
||||
var rms_v2 = gtl.add_value_rms(filter2_1000v); //назначение переменной RMS(V)
|
||||
rms_v2.name = "RMS(V) 2-1000 Гц" //присвоение имени RMS(V)
|
||||
rms_v2.time = 0.5; //интервал расчета RMS(V)
|
||||
rms_v2.avg_cnt = 4; //количество усреднений RMS(V)
|
||||
|
||||
//Виброскорость в дипазоне 10-1000 Гц (вибромониторинг)
|
||||
var filter10_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный)
|
||||
filter10_1000.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter10_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter10_1000.order = 10; //порядок фильтра
|
||||
filter10_1000.frequency = 505; //центральная частота полосового фильтра
|
||||
filter10_1000.width = 990; //ширина полосы фильтра
|
||||
var filter10_1000v = gtl.add_intg(filter10_1000); // интегрирование
|
||||
filter10_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
|
||||
|
||||
var rms_v10 = gtl.add_value_rms(filter10_1000v); //назначение переменной RMS(V)
|
||||
rms_v10.name = "RMS(V) 10-1000 Гц" //присвоение имени RMS(V)
|
||||
rms_v10.time = 0.5; //интервал расчета RMS(V)
|
||||
rms_v10.avg_cnt = 4; //количество усреднений RMS(V)
|
||||
|
||||
//[Диагностика]
|
||||
gtl.diagnostic.interval = freq.time * freq.avg_cnt;
|
||||
let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала
|
||||
let acq_time = 0;
|
||||
|
||||
let canvas = gtl.plots.add("specs(A) dB");
|
||||
function diagnose() {
|
||||
switch (state) {
|
||||
case 0: // считаем частоту вращения и настраиваем спектры
|
||||
if (fnc.INSTABILITY() > fnc.tolerance()) {
|
||||
gtl.log.info("Критическая нестабильность частоты вращения, %", fnc.INSTABILITY() * 100);
|
||||
if (imp.INSTABILITY() > imp.tolerance()) {
|
||||
gtl.log.info("Критическая нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
|
||||
gtl.log.info("Результат:", "Диагностика прервана");
|
||||
//gtl.diagnostic.stop(); //принудительная остановка диагностики
|
||||
|
||||
|
@ -110,25 +144,60 @@ function diagnose() {
|
|||
gtl.results = __result;
|
||||
};
|
||||
|
||||
if (fnc.FREQ() <= fnc.FREQNESS()) {
|
||||
gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + fnc.FREQNESS());
|
||||
if (imp.FREQ() <= imp.FREQNESS()) {
|
||||
gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + imp.FREQNESS());
|
||||
};
|
||||
|
||||
case 1: //частота вращения фиксированная
|
||||
case 2: //частота вращения из поля INFO (виброметр)
|
||||
filter_spen.frequency = fnc.bpFreq(); //считаме фильтр для огибающей
|
||||
filter_spen.width = fnc.bpWidth(); //определяем ширину фильтра
|
||||
spen.frequency = fnc.specParams().frequency;
|
||||
spen.lines = fnc.specParams().lines;
|
||||
ausp.frequency = fnc.specParams().frequency;
|
||||
ausp.lines = fnc.specParams().lines;
|
||||
//установка стандартной ширины спектра огибающей и количества линий спектра
|
||||
spen.frequency = imp.standart_width(imp.spec_width().es);
|
||||
spen.lines = imp.standart_lines(imp.spec_lines());
|
||||
filter_spen.frequency = imp.filter_frequency();
|
||||
ausp.frequency = imp.standart_width(imp.spec_width().as1);
|
||||
//ausp.lines = imp.standart_lines();
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
let time = []; //массив по времени набора данных
|
||||
time.push(ausp.acq_time);
|
||||
time.push(spen.acq_time);
|
||||
let max_acq = Math.max(...time);
|
||||
gtl.diagnostic.interval = max_acq;
|
||||
var acq_times = [];
|
||||
acq_times.push(ausp.acq_time);
|
||||
acq_times.push(spen.acq_time);
|
||||
acq_time = Math.max(...acq_times);
|
||||
|
||||
gtl.diagnostic.interval = acq_time;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
case 1: //частота вращения фиксированная
|
||||
//установка стандартной ширины спектра огибающей и количества линий спектра
|
||||
spen.frequency = imp.standart_width(imp.spec_width().es);
|
||||
spen.lines = imp.standart_lines(imp.spec_lines());
|
||||
filter_spen.frequency = imp.filter_frequency();
|
||||
ausp.frequency = imp.standart_width(imp.spec_width().as1);
|
||||
//ausp.lines = imp.standart_lines();
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
var acq_times = [];
|
||||
acq_times.push(ausp.acq_time);
|
||||
acq_times.push(spen.acq_time);
|
||||
acq_time = Math.max(...acq_times);
|
||||
|
||||
gtl.diagnostic.interval = acq_time;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
case 2: //частота вращения из поля INFO (виброметр)
|
||||
//установка стандартной ширины спектра огибающей и количества линий спектра
|
||||
spen.frequency = imp.standart_width(imp.spec_width().es);
|
||||
spen.lines = imp.standart_lines(imp.spec_lines());
|
||||
filter_spen.frequency = imp.filter_frequency();
|
||||
ausp.frequency = imp.standart_width(imp.spec_width().as1);
|
||||
//ausp.lines = imp.standart_lines();
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
var acq_times = [];
|
||||
acq_times.push(ausp.acq_time);
|
||||
acq_times.push(spen.acq_time);
|
||||
acq_time = Math.max(...acq_times);
|
||||
|
||||
gtl.diagnostic.interval = acq_time;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
|
@ -138,49 +207,48 @@ function diagnose() {
|
|||
|
||||
//Вывод информации в лог
|
||||
//Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра
|
||||
var AQ = fnc.specSquare(ausp.data, ausp.frequency / 2, ausp.frequency);
|
||||
var AQ = imp.spec_square(ausp2.data, 800, ausp2.frequency);
|
||||
|
||||
gtl.log.info("Объект диагностики", options.rbModelName);
|
||||
gtl.log.info("FREQ", fnc.FREQ());
|
||||
gtl.log.info("FTF", fnc.GTF2());
|
||||
gtl.log.info("BPFO", fnc.GTFZ());
|
||||
gtl.log.info("Коридор обнаружения гармоники", fnc.tolerance());
|
||||
gtl.log.info("Полосовой фильтр (расчетный)", filter_spen.frequency);
|
||||
gtl.log.info("Ширина фильтра", filter_spen.width);
|
||||
gtl.log.info("Граничная частота SPEN", spen.frequency);
|
||||
gtl.log.info("Количество линий SPEN", spen.lines);
|
||||
gtl.log.info("Разрешение SPEN", spen.resolution);
|
||||
gtl.log.info("Ширина AUSP", ausp.frequency);
|
||||
gtl.log.info("Объект диагностики", "Подшипник качения " + options.rbModelName);
|
||||
gtl.log.info("Минимально необходимая длительность сигнала", acq_time);
|
||||
gtl.log.info("FREQ", imp.FREQ());
|
||||
gtl.log.info("Минимально необходимая частота вращения", imp.FREQNESS());
|
||||
gtl.log.info("Площадь спектра", AQ);
|
||||
gtl.log.info("Нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
|
||||
gtl.log.info("FTF", imp.FTF());
|
||||
gtl.log.info("BPFO", imp.BPFO());
|
||||
gtl.log.info("BPFI", imp.BPFI());
|
||||
gtl.log.info("BSF", imp.BSF());
|
||||
gtl.log.info("Центральная частота полосового фильтра", filter_spen.frequency);
|
||||
gtl.log.info("Количество долей октавного фильтра", n);
|
||||
gtl.log.info("Коэффициент для октавного фильтра", kf);
|
||||
gtl.log.info("Граничная частота спектра", imp.spec_width().es);
|
||||
gtl.log.info("Расчетное количество линий", imp.spec_lines());
|
||||
gtl.log.info("Расчетное разрешение спектра", imp.spec_resolution());
|
||||
gtl.log.info("Расчетный коридор обнаружения, %", imp.tolerance() * 100);
|
||||
gtl.log.info("Стандартная граничная частота", spen.frequency);
|
||||
gtl.log.info("Стандартное кол-во линий", spen.lines);
|
||||
gtl.log.info("СКЗ(A) ВЧ вибрации", rms_spen.value);
|
||||
gtl.log.info("СКЗ(A) УВЧ вибрации", rms_uhf.value);
|
||||
gtl.log.info("ПФ(A) в ВЧ диапазоне", ampl_spen.value / rms_spen.value);
|
||||
gtl.log.info("ПФ(A) в УВЧ диапазоне", ampl_uhf.value / rms_uhf.value);
|
||||
gtl.log.info("СКЗ(V) 2-1000 Гц", rms_v2.value);
|
||||
gtl.log.info("СКЗ(V) 10-1000 Гц", rms_v10.value);
|
||||
|
||||
let spen_mx = mtx.gtMTX(spen, filter_spen, true);
|
||||
let spen_df = def.gtDefs(spen_mx, true);
|
||||
let ausp_mx = mtx.gtMTX(ausp, 0, false);
|
||||
|
||||
canvas.add(
|
||||
{
|
||||
color: ausp.color,
|
||||
name: ausp.name,
|
||||
x: ausp.resolution,
|
||||
y: ausp.data
|
||||
}
|
||||
); //рисуем спектр вибрации на плоскости
|
||||
|
||||
canvas.add(
|
||||
{
|
||||
color: spen.color,
|
||||
name: spen.name,
|
||||
x: spen.resolution,
|
||||
y: spen.data
|
||||
}
|
||||
); //рисуем спектр огибающей на плоскости
|
||||
let def = {};
|
||||
//var indx = 0;
|
||||
def["Биение шестерни"] = gear0.defect(); //indx (spen = 0, ausp = 0)
|
||||
def["Биение зубчатого колеса"] = wheel0.defect(); //indx (spen = 1, ausp = 1)
|
||||
def["Дефект зубьев шестерни"] = gear1.defect(); //indx (spen = 2, ausp = 2)
|
||||
def["Дефект зубьев зубчатого колеса"] = wheel1.defect(); //indx (spen = 3, ausp = 3)
|
||||
|
||||
var res = {
|
||||
RMSA: rms_spen.value,
|
||||
RMSV: rms_v.value,
|
||||
PF: ampl_spen.value / rms_spen.value,
|
||||
RMS_V2: rms_v2.value,
|
||||
RMS_V10: rms_v10.value,
|
||||
SQR: AQ,
|
||||
matrix: spen_mx,
|
||||
defs: spen_df
|
||||
defects: def
|
||||
};
|
||||
|
||||
gtl.results = res;
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
export function gtDefs(mtx, isDeep) {
|
||||
var res = {}; //результат
|
||||
if (isDeep = true) { var key = "dp" } else { var key = "lv" };
|
||||
var des = {
|
||||
FREQ: { ds: "шестерни", dp: 20, lv: 20 },
|
||||
GTF2: { ds: "зубчатого колеса", dp: 20, lv: 20 },
|
||||
GTFZ: { ds: "зацепления шестерни", dp: 20, lv: 20 },
|
||||
GTFZ2: { ds: "зацепления зубчатого колеса", dp: 20, lv: 20 }
|
||||
}; //описание функциональных частот
|
||||
|
||||
function getNote(harmsArr) {
|
||||
let note = "Биение"; //описание характера колебаний
|
||||
let cnt = 0; //количество значений в массиве
|
||||
for (let i = 0; i <= harmsArr.length - 1; i++) { if (harmsArr[i] > 0) { cnt++ }; };
|
||||
if (cnt >= 5) { note = "Дефект" };
|
||||
if (harmsArr[1] > harmsArr[0]) { note = "Перекос" };
|
||||
if (cnt > 0 && harmsArr[0] == 0 && harmsArr[1] == 0) { note = "Неидентифицированные изменения вибрации" };
|
||||
return note;
|
||||
};
|
||||
|
||||
function getLevel(lvl, thres) {
|
||||
let level = "Сильный";
|
||||
switch (true) {
|
||||
case lvl < 0.5 * thres:
|
||||
level = "Слабый";
|
||||
break;
|
||||
case lvl < thres:
|
||||
level = "Средний";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}; return level;
|
||||
};
|
||||
|
||||
var rows = Object.keys(mtx); //массив ключей объекта (наборов гармоник)
|
||||
for (let i = 0; i <= rows.length - 1; i++) {
|
||||
let arr = mtx[rows[i]]; //массив гармоник
|
||||
let lvl = Math.max(...arr); //определяем максимальное значение параметра из массива
|
||||
let sum = arr.reduce(function (a, b) { return a + b }, 0); //сумма элементов массива
|
||||
if (sum > 0) {
|
||||
let note = getNote(arr);
|
||||
res[rows[i]] = note + ' ' + des[rows[i]].ds + ': ' + getLevel(lvl, des[rows[i]][key]) + ' (' + lvl + ')';
|
||||
};
|
||||
};
|
||||
return res;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
var ufc = gtl.import("userFunctions.js");
|
||||
|
||||
export function gtMTX(spec, filter, isDeep) {
|
||||
var num = 6; //глубина матрицы (количество гармоник)
|
||||
var level = 0; //уровень развития дефекта
|
||||
var res = {}; //результат
|
||||
|
||||
var set = {
|
||||
FREQ: { nm: "Частота вращения", fn: ufc.FREQ(), md: 0, cl: 0xff0000f0 },
|
||||
GTF2: { nm: "Частота вращения второго вала", fn: ufc.GTF2(), md: 0, cl: 0xffFFB841 },
|
||||
GTFZ: { nm: "Зубцовая частота по шестерне", fn: ufc.GTFZ(), md: ufc.FREQ(), cl: 0xffED3CCA },
|
||||
GTFZ2: { nm: "Зубцовая частота по второму валу", fn: ufc.GTFZ(), md: ufc.GTF2(), cl: 0xff990090 }
|
||||
}; //набор функциональных частот
|
||||
|
||||
function modFactor(dSpec, dFilter, ampl, base) {
|
||||
let dl = (ampl - base); //разность уровней гармонической и случайной составляющей вибрации
|
||||
let df = dSpec.frequency / dFilter.width; //отношение частотному разрешению спектра к ширине фильтра
|
||||
let mod = Math.sqrt((10 ** (dl / 10) - 1) * df);
|
||||
return mod;
|
||||
}; //определение глубины модуляции ВЧ составляющих
|
||||
|
||||
var rows = Object.keys(set); //массив ключей объекта (наборов гармонических рядов)
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
for (let i = 0; i <= rows.length - 1; i++) {
|
||||
let lines = rows[i];
|
||||
let idx = 0; //индекс гармонического ряда
|
||||
let nms = set[lines].nm; //название гармонического ряда
|
||||
let frq = set[lines].fn; //расчетная частота
|
||||
let mod = set[lines].md; //модулирующая частота
|
||||
let clr = set[lines].cl; //предустановленный цвет
|
||||
let arr = []; //массив обнаруженных гармоник
|
||||
|
||||
lines = spec.add_harms_set(frq, num, clr, 2); //строим набор частот (гармонический ряд)
|
||||
lines.name = nms;
|
||||
idx = spec.index_of_harms_set(lines); //определяем индекс набора частот
|
||||
if (mod != 0) { spec.harms_sets[idx].modulate(mod, 2, clr, 0.5) }; //строим амплитудную модуляцию
|
||||
for (let j = 0; j <= num - 1; j++) {
|
||||
lines.harms[j].tolerance = (j + 1) * frq * ufc.tolerance(); //устанавливаем коридор обнаружения гармоники
|
||||
if (lines.harms[j].is_present == true) {
|
||||
switch (isDeep) {
|
||||
case true:
|
||||
level = Math.round(modFactor(spec, filter, lines.harms[j].amplitude, lines.harms[j].base));
|
||||
break;
|
||||
case false:
|
||||
level = Math.round(lines.harms[j].level);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
arr.push(level);
|
||||
} else { arr.push(0) };
|
||||
res[rows[i]] = arr;
|
||||
};
|
||||
};
|
||||
|
||||
return res;
|
||||
};
|
||||
|
187
kNN/kNN.js
187
kNN/kNN.js
|
@ -1,187 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
var signals = gtl.options.record.signalsModel;
|
||||
var options = gtl.options;
|
||||
var record = gtl.options.record;
|
||||
var point = gtl.options.point;
|
||||
|
||||
var fnc = gtl.import("userFunctions.js");
|
||||
var mtx = gtl.import("knMTX.js");
|
||||
var def = gtl.import("knDefs.js");
|
||||
|
||||
//настройки для датчика оборотов
|
||||
var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра
|
||||
filter_freq.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_freq.type = gtl.filter_iir.lowpass; //тип фильтра (ФНЧ)
|
||||
filter_freq.order = 8; //порядок фильтра
|
||||
filter_freq.frequency = 10; //граничная частота фильтра
|
||||
|
||||
//определение частоты вращения
|
||||
var freq = gtl.add_value_freq(filter_freq);
|
||||
freq.time = 1;
|
||||
freq.avg_cnt = 6;
|
||||
//gtl.diagnostic.interval = /*1*/10;
|
||||
|
||||
//[Блок настройки параметров измерений]
|
||||
//спектр вибрации
|
||||
var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации
|
||||
ausp.name = "AUSP"; //присвоение имени спектра
|
||||
ausp.color = 0x0000ff00; //цвет линии спектра
|
||||
ausp.frequency = 800; //граничная частота спектра
|
||||
ausp.lines = 800; //разрешение спектра (количество линий)
|
||||
ausp.average = 6; //количество усреднений
|
||||
ausp.unit = gtl.spec.db; //отображение в дБ
|
||||
ausp.smoothing_factor = 50; //коэффициент сглаживания спектра
|
||||
ausp.smoothed_line_color = 0x000000ff; //цвет линии сглаживания (средней линии)
|
||||
ausp.peak_level = 20; //порог обнаружения гармоник
|
||||
ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/-
|
||||
|
||||
//фильтр для формирования спектра огибающей
|
||||
var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра
|
||||
filter_spen.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter_spen.order = 10; //порядок фильтра
|
||||
filter_spen.frequency = 6400; //центральная частота полосового фильтра
|
||||
filter_spen.width = 1482; //ширина полосы фильтра
|
||||
filter_spen.color = 255;
|
||||
|
||||
//спектр огибающей
|
||||
var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей
|
||||
spen.name = "SPEN"; //присвоение имени спектра огибающей
|
||||
spen.color = 0x00ff0000; //цвет линии спектра огибающей
|
||||
spen.frequency = 200; //граничная частота спектра огибающей
|
||||
spen.lines = 200; //разрешение спектра огибающей (количество линий)
|
||||
spen.average = 8; //количество усреднений
|
||||
spen.unit = gtl.spec.db; //отображение в дБ
|
||||
spen.window = gtl.spec.hann; //окно
|
||||
spen.smoothing_factor = 100; //коэффициент сглаживания спектра
|
||||
spen.smoothed_line_color = 0xff004dff; //цвет средней линии
|
||||
spen.peak_level = 10; //порог обнаружения гармоник
|
||||
spen.harm_tolerance = spen.resolution; //диапазон поиска гармоник +/-
|
||||
|
||||
//RMS и Amplitude в диапазоне спектра огибающей (контроль работы сил трения)
|
||||
var rms_spen = gtl.add_value_rms(filter_spen); //назначение переменной RMS (spen)
|
||||
var ampl_spen = gtl.add_value_ampl(filter_spen); //назначение переменной Amplitude (spen)
|
||||
rms_spen.name = "RMS (spen)" //присвоение имени RMS (spen)
|
||||
rms_spen.time = 0.5; //интервал расчета RMS (spen)
|
||||
ampl_spen.time = 0.5; //интервал расчета Amplitude (spen)
|
||||
rms_spen.avg_cnt = 4; //количество усреднений RMS (spen)
|
||||
ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen)
|
||||
|
||||
//RMS виброскорости в диапазоне 10-1000 Гц.
|
||||
var int = gtl.add_intg(gtl.analog_inputs[signals[0].portNumber]); //интегрирование сигнала виброускорения
|
||||
int.taps = 1; //степень интегрирования (скорость из ускорения - 1-нарное интегрирование)
|
||||
//фильтрация сигнала в диапазоне
|
||||
var filter = gtl.add_filter_iir(int); //объявление переменной фильтра
|
||||
filter.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter.order = 10; //порядок фильтра
|
||||
filter.frequency = 505; //центральная частота полосового фильтра
|
||||
filter.width = 990; //ширина полосы фильтра
|
||||
//определение среднего квадратического значения виброскорости
|
||||
var rms_v = gtl.add_value_rms(filter); //объявление переменной СКЗ
|
||||
rms_v.time = 0.5; //время выборки
|
||||
rms_v.avg_cnt = 4; //количество усреднений
|
||||
|
||||
//[Диагностика]
|
||||
gtl.diagnostic.interval = freq.time * freq.avg_cnt;
|
||||
let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала
|
||||
|
||||
let canvas = gtl.plots.add("specs(A) dB");
|
||||
function diagnose() {
|
||||
switch (state) {
|
||||
case 0: // считаем частоту вращения и настраиваем спектры
|
||||
if (fnc.INSTABILITY() > fnc.tolerance()) {
|
||||
gtl.log.info("Критическая нестабильность частоты вращения, %", fnc.INSTABILITY() * 100);
|
||||
gtl.log.info("Результат:", "Диагностика прервана");
|
||||
//gtl.diagnostic.stop(); //принудительная остановка диагностики
|
||||
|
||||
let __result = {
|
||||
Result: false
|
||||
};
|
||||
gtl.results = __result;
|
||||
};
|
||||
|
||||
if (fnc.FREQ() <= fnc.FREQNESS()) {
|
||||
gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + fnc.FREQNESS());
|
||||
};
|
||||
|
||||
case 1: //частота вращения фиксированная
|
||||
case 2: //частота вращения из поля INFO (виброметр)
|
||||
filter_spen.frequency = fnc.bpFreq(); //считаме фильтр для огибающей
|
||||
filter_spen.width = fnc.bpWidth(); //определяем ширину фильтра
|
||||
spen.frequency = fnc.specParams().frequency;
|
||||
spen.lines = fnc.specParams().lines;
|
||||
ausp.frequency = fnc.specParams().frequency;
|
||||
ausp.lines = fnc.specParams().lines;
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
let time = []; //массив по времени набора данных
|
||||
time.push(ausp.acq_time);
|
||||
time.push(spen.acq_time);
|
||||
let max_acq = Math.max(...time);
|
||||
gtl.diagnostic.interval = max_acq;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
case 3: //выполняем анализ спектов
|
||||
ausp.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре вибрации
|
||||
spen.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре огибающей
|
||||
|
||||
//Вывод информации в лог
|
||||
//Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра
|
||||
var AQ = fnc.specSquare(ausp.data, ausp.frequency / 2, ausp.frequency);
|
||||
|
||||
gtl.log.info("Объект диагностики", + options.rbModelName);
|
||||
gtl.log.info("Минимально необходимая частота вращения", fnc.FREQNESS());
|
||||
gtl.log.info("FREQ", fnc.FREQ());
|
||||
gtl.log.info("FTF", fnc.FTF());
|
||||
gtl.log.info("BPFO", fnc.BPFO());
|
||||
gtl.log.info("BPFI", fnc.BPFI());
|
||||
gtl.log.info("BSF", fnc.BSF());
|
||||
gtl.log.info("Коридор обнаружения гармоники", fnc.tolerance());
|
||||
gtl.log.info("Полосовой фильтр (расчетный)", filter_spen.frequency);
|
||||
gtl.log.info("Ширина фильтра", filter_spen.width);
|
||||
gtl.log.info("Граничная частота SPEN", spen.frequency);
|
||||
gtl.log.info("Количество линий SPEN", spen.lines);
|
||||
gtl.log.info("Разрешение SPEN", spen.resolution);
|
||||
gtl.log.info("Ширина AUSP", ausp.frequency);
|
||||
|
||||
let spen_mx = mtx.knMTX(spen, filter_spen, true);
|
||||
let spen_df = def.knDefs(spen_mx, true);
|
||||
|
||||
canvas.add(
|
||||
{
|
||||
color: ausp.color,
|
||||
name: ausp.name,
|
||||
x: ausp.resolution,
|
||||
y: ausp.data
|
||||
}
|
||||
); //рисуем спектр вибрации на плоскости
|
||||
|
||||
canvas.add(
|
||||
{
|
||||
color: spen.color,
|
||||
name: spen.name,
|
||||
x: spen.resolution,
|
||||
y: spen.data
|
||||
}
|
||||
); //рисуем спектр огибающей на плоскости
|
||||
|
||||
var res = {
|
||||
RMSA: rms_spen.value,
|
||||
RMSV: rms_v.value,
|
||||
PF: ampl_spen.value / rms_spen.value,
|
||||
SQR: AQ,
|
||||
matrix: spen_mx,
|
||||
defs: spen_df
|
||||
};
|
||||
|
||||
gtl.results = res;
|
||||
gtl.diagnostic.stop();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
export function knDefs(mtx, isDeep) {
|
||||
var res = {}; //результат
|
||||
if (isDeep = true) { var key = "dp" } else { var key = "lv" };
|
||||
var des = {
|
||||
FTF: { ds: "Износ тел качения и сепаратора", dp: 8, lv: 20 },
|
||||
FREQ: { ds: "Износ внутреннего кольца", dp: 13, lv: 20 },
|
||||
BSF: { ds: "Дефект тел качения", dp: 10, lv: 20 },
|
||||
BPFO: { ds: "Дефект наружного кольца", dp: 15, lv: 20 },
|
||||
BPFI: { ds: "Дефект внутреннего кольца", dp: 8, lv: 20 },
|
||||
}; //описание функциональных частот
|
||||
|
||||
var rows = Object.keys(mtx); //массив ключей объекта (наборов гармоник)
|
||||
for (let i = 0; i <= rows.length - 1; i++) {
|
||||
let arr = mtx[rows[i]]; //массив гармоник
|
||||
let delta = 0; //"расстояние" до дефекта
|
||||
for (let j = 0; j <= arr.length - 1; j++) {
|
||||
let limit = des[rows[i]][key]; //порог для гармоник
|
||||
if (arr[j] / limit >= 1) { limit = arr[j] };
|
||||
delta = delta + Math.pow(1 - arr[j] / limit, 2);
|
||||
};
|
||||
delta = Math.sqrt(delta);
|
||||
res[rows[i]] = delta;
|
||||
};
|
||||
|
||||
let values = Object.values(res); //собираем значения ключей объекта в массив
|
||||
let minValue = Math.min(...values); //определяем минимальное значение
|
||||
let minKey = Object.keys(res).find(minKey => res[minKey] === minValue); //определяем ключ по минимальному значению
|
||||
|
||||
return des[minKey].ds;
|
||||
};
|
||||
|
||||
|
||||
|
61
kNN/knMTX.js
61
kNN/knMTX.js
|
@ -1,61 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
var ufc = gtl.import("userFunctions.js");
|
||||
|
||||
export function knMTX(spec, filter, isDeep) {
|
||||
var num = 6; //глубина матрицы (количество гармоник)
|
||||
var level = 0; //уровень развития дефекта
|
||||
var res = {}; //результат
|
||||
|
||||
var set = {
|
||||
FTF: { nm: "Частота вращения сепаратора", fn: ufc.FTF(), md: 0, cl: 0xffff0000 },
|
||||
FREQ: { nm: "Частота вращения", fn: ufc.FREQ(), md: 0, cl: 0xff0000f0 },
|
||||
BSF: { nm: "Частота вращения (контакта) тел качения", fn: ufc.BSF(), md: ufc.FTF(), cl: 0xffFFB841 },
|
||||
BPFO: { nm: "Частота перекатывания тел качения по наружному кольцу", fn: ufc.BPFO(), md: ufc.FTF(), cl: 0xffED3CCA },
|
||||
BPFI: { nm: "Частота перекатывания тел качения по внутреннему кольцу", fn: ufc.BPFI(), md: ufc.FREQ(), cl: 0xff990090 }
|
||||
}; //набор функциональных частот
|
||||
|
||||
function modFactor(dSpec, dFilter, ampl, base) {
|
||||
let dl = (ampl - base); //разность уровней гармонической и случайной составляющей вибрации
|
||||
let df = dSpec.frequency / dFilter.width; //отношение частотному разрешению спектра к ширине фильтра
|
||||
let mod = Math.sqrt((10 ** (dl / 10) - 1) * df);
|
||||
return mod;
|
||||
}; //определение глубины модуляции ВЧ составляющих
|
||||
|
||||
var rows = Object.keys(set); //массив ключей объекта (наборов гармонических рядов)
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
for (let i = 0; i <= rows.length - 1; i++) {
|
||||
let lines = rows[i];
|
||||
let idx = 0; //индекс гармонического ряда
|
||||
let nms = set[lines].nm; //название гармонического ряда
|
||||
let frq = set[lines].fn; //расчетная частота
|
||||
let mod = set[lines].md; //модулирующая частота
|
||||
let clr = set[lines].cl; //предустановленный цвет
|
||||
let arr = []; //массив обнаруженных гармоник
|
||||
|
||||
lines = spec.add_harms_set(frq, num, clr, 2); //строим набор частот (гармонический ряд)
|
||||
lines.name = nms;
|
||||
idx = spec.index_of_harms_set(lines); //определяем индекс набора частот
|
||||
if (mod != 0) { spec.harms_sets[idx].modulate(mod, 2, clr, 0.5) }; //строим амплитудную модуляцию
|
||||
for (let j = 0; j <= num - 1; j++) {
|
||||
lines.harms[j].tolerance = (j + 1) * frq * ufc.tolerance(); //устанавливаем коридор обнаружения гармоники
|
||||
if (lines.harms[j].is_present == true) {
|
||||
switch (isDeep) {
|
||||
case true:
|
||||
level = Math.round(modFactor(spec, filter, lines.harms[j].amplitude, lines.harms[j].base));
|
||||
break;
|
||||
case false:
|
||||
level = Math.round(lines.harms[j].level);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
arr.push(level);
|
||||
} else { arr.push(0) };
|
||||
res[rows[i]] = arr;
|
||||
};
|
||||
};
|
||||
|
||||
return res;
|
||||
};
|
||||
|
145
maskMethod.js
145
maskMethod.js
|
@ -1,145 +0,0 @@
|
|||
"use strict";
|
||||
var signals = gtl.options.record.signalsModel;
|
||||
var options = gtl.options;
|
||||
var record = gtl.options.record;
|
||||
var point = gtl.options.point;
|
||||
|
||||
var fnc = gtl.import("userFunctions.js");
|
||||
let maskClass = gtl.import("maskClass.js").maskClass;
|
||||
|
||||
var __frq = fnc.getFreq(
|
||||
/*{
|
||||
src: gtl.analog_inputs[signals[0].portNumber], //источник сигнала частоты вращения
|
||||
freq: 10, //граничная частота фильтрации сигнала
|
||||
time: 1, //интервал измерения частоты вращения
|
||||
avg: 4, //количество отсчетов для усреднения
|
||||
dc: -0.05 //порог срабатывания счетчика
|
||||
}*/
|
||||
).value; //получаем частоту вращения
|
||||
|
||||
let canvas0 = gtl.plots.add("Мониторинговый спектр");
|
||||
let canvas1 = gtl.plots.add("Спектр вибраци");
|
||||
let canvas2 = gtl.plots.add("Спектр огибающей");
|
||||
|
||||
var ausp2 = fnc.getAusp(
|
||||
{
|
||||
src: gtl.analog_inputs[signals[0].portNumber], //источник сигнала
|
||||
name: "AUSPm", //имя спектра
|
||||
color: 0x001E90FF, //цвет в формате HEX
|
||||
frequency: 25600, //граничная частота
|
||||
resolution: 16, //частотное разрешение
|
||||
average: 6, //количество усреднений
|
||||
view: gtl.spec.db, //единицы отображения (дБ)
|
||||
}
|
||||
); //мониторинговый спектр
|
||||
|
||||
var ausp = fnc.getAusp(
|
||||
{
|
||||
src: gtl.analog_inputs[signals[0].portNumber], //источник сигнала
|
||||
name: "AUSPd", //имя спектра
|
||||
color: 0x0000FF00, //цвет в формате HEX
|
||||
frequency: 800, //граничная частота
|
||||
resolution: 1, //частотное разрешение
|
||||
average: 6, //количество усреднений
|
||||
view: gtl.spec.db, //единицы отображения (дБ)
|
||||
level: 20 //уровень обнаружения гармоник
|
||||
}
|
||||
); //диагностический спектр вибрации
|
||||
|
||||
//фильтр для формирования спектра огибающей
|
||||
var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра
|
||||
filter_spen.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter_spen.order = 10; //порядок фильтра
|
||||
filter_spen.frequency = 6400; //центральная частота полосового фильтра
|
||||
filter_spen.width = 1482; //ширина полосы фильтра
|
||||
|
||||
var spen = fnc.getSpen(
|
||||
{
|
||||
src: filter_spen, //источник сигнала
|
||||
name: "SPEN", //имя спектра
|
||||
color: 0x00ff0000, //цвет в формате HEX
|
||||
frequency: 200, //граничная частота
|
||||
resolution: 0.25, //частотное разрешение
|
||||
average: 8, //количество усреднений
|
||||
view: gtl.spec.db, //единицы отображения (дБ)
|
||||
level: 10 //уровень обнаружения гармоник
|
||||
}
|
||||
); //спектр огибающей
|
||||
|
||||
//[Диагностика]
|
||||
gtl.diagnostic.interval = gtl.acq_time;
|
||||
let __result = {}; //объект для формирования результата
|
||||
|
||||
function diagnose() {
|
||||
|
||||
var __set = {
|
||||
"Износ наружного кольца": [0x42AAFF, fnc.BPFO(__frq), 6, 13, 0, 0.3],
|
||||
"Перекос наружного кольца": [0x4285B4, fnc.BPFO(__frq), 4, 12, 1, 0.1],
|
||||
"Дефект наружного кольца": [0x6A5ACD, fnc.BPFO(__frq), 6, 13, 0, 0.07],
|
||||
"Износ внутреннего кольца": [0x89AC76, fnc.FREQ(__frq), 6, 13, 0, 0.3],
|
||||
"Перекос внутреннего кольца": [0x34C924, fnc.FREQ(__frq), 6, 12, 1, 0.1],
|
||||
"Дефект внутреннего кольца": [0x008000, fnc.BPFI(__frq), 6, 8, 0, 0.07],
|
||||
"Дефект тел качения": [0xFFA000, fnc.BSF(__frq), 5, 10, 0, 0.3],
|
||||
"Износ тел качения и сепаратора": [0xFF2400, fnc.FTF(__frq), 4, 6, 0, 0.5]
|
||||
}; //набор портретов предполагаемых дефектов [цвет, частота, кол-во, уровень, тип ряда, коэфф затухания]
|
||||
|
||||
canvas0.add(
|
||||
{
|
||||
color: ausp2.color,
|
||||
name: ausp2.name,
|
||||
x: ausp2.resolution,
|
||||
y: ausp2.data
|
||||
}
|
||||
); //рисуем мониторинговый спектр вибрации на plot
|
||||
|
||||
canvas1.add(
|
||||
{
|
||||
color: ausp.color,
|
||||
name: ausp.name,
|
||||
x: ausp.resolution,
|
||||
y: ausp.data
|
||||
}
|
||||
); //рисуем спектр вибрации на plot*/
|
||||
|
||||
let __spen_tools = fnc.createTools(
|
||||
{
|
||||
spec: spen, //спектр для построения модели (объект)
|
||||
set: __set, //источник данных для построения частотных линий
|
||||
tol: 1 //коридор обнаружения гармоники на портрете, %
|
||||
}
|
||||
); //формируем компоненты и частотные линии на спектре огибающей
|
||||
|
||||
canvas2.add(
|
||||
{
|
||||
color: spen.color,
|
||||
name: spen.name,
|
||||
x: spen.resolution,
|
||||
y: spen.data,
|
||||
spec_tools: __spen_tools.to_json()
|
||||
}
|
||||
); //рисуем спектр огибающей на plot
|
||||
|
||||
let __mask = new maskClass(
|
||||
{
|
||||
spec: spen, //спектр для построения модели (объект)
|
||||
set: __set, //источник данных для построения портретов дефектов
|
||||
filter: filter_spen, //полосовой фильтр (для определения разницы амплитуд гармонической и случайной составляющей)
|
||||
tol: 1, //коридор обнаружения гармоники на портрете, %
|
||||
color: 0xFF0000, //цвет отрисовки модели спектра в формате HEX
|
||||
visible: true //отображение графиков
|
||||
}
|
||||
)
|
||||
|
||||
gtl.log.info("FREQ", fnc.FREQ(__frq));
|
||||
gtl.log.info("FTF", fnc.FTF(__frq));
|
||||
gtl.log.info("BPFO", fnc.BPFO(__frq));
|
||||
gtl.log.info("BPFI", fnc.BPFI(__frq));
|
||||
gtl.log.info("BSF", fnc.BSF(__frq));
|
||||
|
||||
__result["Дефекты"] = __mask.getResult(); //обнаруженные дефекты
|
||||
__result["const"] = spen.data[0]; //постоянная составляющая спектра огибающей
|
||||
gtl.results = __result;
|
||||
|
||||
gtl.diagnostic.stop();
|
||||
};
|
140
mxtMethod.js
140
mxtMethod.js
|
@ -1,140 +0,0 @@
|
|||
"use strict";
|
||||
var signals = gtl.options.record.signalsModel;
|
||||
var options = gtl.options;
|
||||
var record = gtl.options.record;
|
||||
var point = gtl.options.point;
|
||||
|
||||
var fnc = gtl.import("userFunctions.js");
|
||||
let mtxClass = gtl.import("mtxClass.js").mtxClass;
|
||||
|
||||
var __frq = fnc.getFreq(
|
||||
/*{
|
||||
src: gtl.analog_inputs[signals[0].portNumber], //источник сигнала частоты вращения
|
||||
freq: 10, //граничная частота фильтрации сигнала
|
||||
time: 1, //интервал измерения частоты вращения
|
||||
avg: 4, //количество отсчетов для усреднения
|
||||
dc: -0.05 //порог срабатывания счетчика
|
||||
}*/
|
||||
).value; //получаем частоту вращения
|
||||
|
||||
let canvas0 = gtl.plots.add("Мониторинговый спектр");
|
||||
let canvas1 = gtl.plots.add("Спектр вибраци");
|
||||
let canvas2 = gtl.plots.add("Спектр огибающей");
|
||||
|
||||
var ausp2 = fnc.getAusp(
|
||||
{
|
||||
src: gtl.analog_inputs[signals[0].portNumber], //источник сигнала
|
||||
name: "AUSPm", //имя спектра
|
||||
color: 0x001E90FF, //цвет в формате HEX
|
||||
frequency: 25600, //граничная частота
|
||||
resolution: 16, //частотное разрешение
|
||||
average: 6, //количество усреднений
|
||||
view: gtl.spec.db, //единицы отображения (дБ)
|
||||
}
|
||||
); //мониторинговый спектр
|
||||
|
||||
var ausp = fnc.getAusp(
|
||||
{
|
||||
src: gtl.analog_inputs[signals[0].portNumber], //источник сигнала
|
||||
name: "AUSPd", //имя спектра
|
||||
color: 0x0000FF00, //цвет в формате HEX
|
||||
frequency: 800, //граничная частота
|
||||
resolution: 1, //частотное разрешение
|
||||
average: 6, //количество усреднений
|
||||
view: gtl.spec.db, //единицы отображения (дБ)
|
||||
level: 20 //уровень обнаружения гармоник
|
||||
}
|
||||
); //диагностический спектр вибрации
|
||||
|
||||
//фильтр для формирования спектра огибающей
|
||||
var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра
|
||||
filter_spen.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter_spen.order = 10; //порядок фильтра
|
||||
filter_spen.frequency = 6400; //центральная частота полосового фильтра
|
||||
filter_spen.width = 1482; //ширина полосы фильтра
|
||||
|
||||
var spen = fnc.getSpen(
|
||||
{
|
||||
src: filter_spen, //источник сигнала
|
||||
name: "SPEN", //имя спектра
|
||||
color: 0x00ff0000, //цвет в формате HEX
|
||||
frequency: 200, //граничная частота
|
||||
resolution: 0.25, //частотное разрешение
|
||||
average: 8, //количество усреднений
|
||||
view: gtl.spec.db, //единицы отображения (дБ)
|
||||
level: 10 //уровень обнаружения гармоник
|
||||
}
|
||||
); //спектр огибающей
|
||||
|
||||
//[Диагностика]
|
||||
gtl.diagnostic.interval = gtl.acq_time;
|
||||
let __result = {}; //объект для формирования результата
|
||||
|
||||
function diagnose() {
|
||||
|
||||
var __set = {
|
||||
"FREQ": [0x89AC76, fnc.FREQ(__frq), 6, 13, 0, 0.3],
|
||||
"BPFO": [0x6A5ACD, fnc.BPFO(__frq), 6, 13, 0, 0.07],
|
||||
"BPFI": [0x008000, fnc.BPFI(__frq), 6, 8, 0, 0.07],
|
||||
"BSF": [0xFFA000, fnc.BSF(__frq), 6, 10, 0, 0.3],
|
||||
"FTF": [0xFF2400, fnc.FTF(__frq), 6, 6, 0, 0.5]
|
||||
}; //набор портретов предполагаемых дефектов [цвет, частота, кол-во, уровень, тип ряда, коэфф затухания]
|
||||
|
||||
canvas0.add(
|
||||
{
|
||||
color: ausp2.color,
|
||||
name: ausp2.name,
|
||||
x: ausp2.resolution,
|
||||
y: ausp2.data
|
||||
}
|
||||
); //рисуем мониторинговый спектр вибрации на plot
|
||||
|
||||
canvas1.add(
|
||||
{
|
||||
color: ausp.color,
|
||||
name: ausp.name,
|
||||
x: ausp.resolution,
|
||||
y: ausp.data
|
||||
}
|
||||
); //рисуем спектр вибрации на plot*/
|
||||
|
||||
let __spen_tools = fnc.createTools(
|
||||
{
|
||||
spec: spen, //спектр для построения модели (объект)
|
||||
set: __set, //источник данных для построения частотных линий
|
||||
tol: 1 //коридор обнаружения гармоники на портрете, %
|
||||
}
|
||||
); //формируем компоненты и частотные линии на спектре огибающей
|
||||
|
||||
canvas2.add(
|
||||
{
|
||||
color: spen.color,
|
||||
name: spen.name,
|
||||
x: spen.resolution,
|
||||
y: spen.data,
|
||||
spec_tools: __spen_tools.to_json()
|
||||
}
|
||||
); //рисуем спектр огибающей на plot
|
||||
|
||||
let __mtx = new mtxClass(
|
||||
{
|
||||
spec: spen, //спектр для построения модели (объект)
|
||||
set: __set, //источник данных для построения портретов дефектов
|
||||
filter: filter_spen, //полосовой фильтр (для определения разницы амплитуд гармонической и случайной составляющей)
|
||||
tol: 1, //коридор обнаружения гармоники, %
|
||||
}
|
||||
)
|
||||
|
||||
gtl.log.info("FREQ", fnc.FREQ(__frq));
|
||||
gtl.log.info("FTF", fnc.FTF(__frq));
|
||||
gtl.log.info("BPFO", fnc.BPFO(__frq));
|
||||
gtl.log.info("BPFI", fnc.BPFI(__frq));
|
||||
gtl.log.info("BSF", fnc.BSF(__frq));
|
||||
|
||||
__result["Matrix"] = __mtx.getMatrix(); //обнаруженные дефекты
|
||||
__result["const"] = spen.data[0]; //постоянная составляющая спектра огибающей
|
||||
gtl.results = __result;
|
||||
|
||||
gtl.diagnostic.stop();
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function spen_mtx() {
|
||||
let num = 6; //глубина матрицы (количество гармоник)
|
||||
var res = {}; //результат
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
//var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
var ftf = spen.add_harms_set(imp.FTF(), num, 0xffff0000, 1); //частота вращения сепаратора
|
||||
for (let i = 0; i <= num - 1; i++) { ftf.harms[i].tolerance = (1 + i) * imp.FTF() * imp.tolerance(); };
|
||||
ftf.name = 'FTF';
|
||||
|
||||
var freq = spen.add_harms_set(imp.FREQ(), num, 0xff0000f0, 1); //частота вращения
|
||||
for (let i = 0; i <= num - 1; i++) { freq.harms[i].tolerance = (1 + i) * imp.FREQ() * imp.tolerance(); };
|
||||
freq.name = 'FREQ';
|
||||
|
||||
var bsf = spen.add_harms_set(imp.BSF(), num, 0xff994000, 1); //частота контакта тел качения
|
||||
for (let i = 0; i <= num - 1; i++) { bsf.harms[i].tolerance = (1 + i) * imp.BSF() * imp.tolerance(); };
|
||||
bsf.name = 'BSF';
|
||||
|
||||
var bpfo = spen.add_harms_set(imp.BPFO(), num, 0xff009000, 1); //частота перекатывания тел качения по наружному кольцу
|
||||
for (let i = 0; i <= num - 1; i++) { bpfo.harms[i].tolerance = (1 + i) * imp.BPFO() * imp.tolerance(); };
|
||||
bpfo.name = 'BPFO';
|
||||
|
||||
var bpfi = spen.add_harms_set(imp.BPFI(), num, 0xff990090, 1); //частота перекатывания тел качения по внутреннему кольцу
|
||||
for (let i = 0; i <= num - 1; i++) { bpfi.harms[i].tolerance = (1 + i) * imp.BPFI() * imp.tolerance(); }
|
||||
bpfi.name = 'BPFI';
|
||||
|
||||
//формируем результат
|
||||
var ftf_arr = [];
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (ftf.harms[i].is_present == true) {
|
||||
deep = Math.round(imp.mod_factor(ftf.harms[i].amplitude, ftf.harms[i].base) * 100);
|
||||
ftf_arr.push(deep);
|
||||
} else { ftf_arr.push(0) };
|
||||
};
|
||||
|
||||
var freq_arr = [];
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (freq.harms[i].is_present == true) {
|
||||
deep = Math.round(imp.mod_factor(freq.harms[i].amplitude, freq.harms[i].base) * 100);
|
||||
freq_arr.push(deep);
|
||||
} else { freq_arr.push(0) };
|
||||
};
|
||||
|
||||
var bsf_arr = [];
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (bsf.harms[i].is_present == true) {
|
||||
deep = Math.round(imp.mod_factor(bsf.harms[i].amplitude, bsf.harms[i].base) * 100);
|
||||
bsf_arr.push(deep);
|
||||
} else { bsf_arr.push(0) };
|
||||
};
|
||||
|
||||
var bpfo_arr = [];
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (bpfo.harms[i].is_present == true) {
|
||||
deep = Math.round(imp.mod_factor(bpfo.harms[i].amplitude, bpfo.harms[i].base) * 100);
|
||||
bpfo_arr.push(deep);
|
||||
} else { bpfo_arr.push(0) };
|
||||
};
|
||||
|
||||
var bpfi_arr = [];
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (bpfi.harms[i].is_present == true) {
|
||||
deep = Math.round(imp.mod_factor(bpfi.harms[i].amplitude, bpfi.harms[i].base) * 100);
|
||||
bpfi_arr.push(deep);
|
||||
} else { bpfi_arr.push(0) };
|
||||
};
|
||||
|
||||
//формируем объект
|
||||
res[ftf.name] = ftf_arr;
|
||||
res[freq.name] = freq_arr;
|
||||
res[bsf.name] = bsf_arr;
|
||||
res[bpfo.name] = bpfo_arr;
|
||||
res[bpfi.name] = bpfi_arr;
|
||||
|
||||
return res;
|
||||
};
|
||||
|
|
@ -4,9 +4,8 @@ var options = gtl.options;
|
|||
var record = gtl.options.record;
|
||||
var point = gtl.options.point;
|
||||
|
||||
var fnc = gtl.import("userFunctions.js");
|
||||
var mtx = gtl.import("bsMTX.js");
|
||||
var def = gtl.import("bsDefs.js");
|
||||
var imp = gtl.import("user-functions.js");
|
||||
var spen_mtx = gtl.import("spen_mtx.js");
|
||||
|
||||
//настройки для датчика оборотов
|
||||
var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра
|
||||
|
@ -23,16 +22,16 @@ freq.avg_cnt = 6;
|
|||
|
||||
//[Блок настройки параметров измерений]
|
||||
//мониторинговый спектр вибрации
|
||||
var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации
|
||||
var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации
|
||||
ausp2.name = "AUSPm"; //присвоение имени спектра
|
||||
ausp2.color = 0x0000ffff; //цвет линии спектра
|
||||
ausp2.frequency = 25600; //граничная частота спектра
|
||||
ausp2.frequency = 1600; //граничная частота спектра
|
||||
ausp2.lines = 1600; //разрешение спектра (количество линий)
|
||||
ausp2.average = 6; //количество усреднений
|
||||
ausp2.unit = gtl.spec.db; //отображение в дБ
|
||||
|
||||
//спектр вибрации
|
||||
var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации
|
||||
var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации
|
||||
ausp.name = "AUSPd"; //присвоение имени спектра
|
||||
ausp.color = 0x0000ff00; //цвет линии спектра
|
||||
ausp.frequency = 800; //граничная частота спектра
|
||||
|
@ -45,7 +44,7 @@ ausp.peak_level = 20; //порог обнаружения гармоник
|
|||
ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/-
|
||||
|
||||
//фильтр для формирования спектра огибающей
|
||||
var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра
|
||||
var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра
|
||||
filter_spen.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter_spen.order = 10; //порядок фильтра
|
||||
|
@ -57,8 +56,8 @@ filter_spen.width = 1482; //ширина полосы фильтра
|
|||
var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей
|
||||
spen.name = "SPEN"; //присвоение имени спектра огибающей
|
||||
spen.color = 0x00ff0000; //цвет линии спектра огибающей
|
||||
spen.frequency = 200; //граничная частота спектра огибающей
|
||||
spen.lines = 200; //разрешение спектра огибающей (количество линий)
|
||||
spen.frequency = 400; //граничная частота спектра огибающей
|
||||
spen.lines = 400; //разрешение спектра огибающей (количество линий)
|
||||
spen.average = 8; //количество усреднений
|
||||
spen.unit = gtl.spec.db; //отображение в дБ
|
||||
spen.window = gtl.spec.hann; //окно
|
||||
|
@ -76,31 +75,16 @@ ampl_spen.time = 0.5; //интервал расчета Amplitude (spen)
|
|||
rms_spen.avg_cnt = 4; //количество усреднений RMS (spen)
|
||||
ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen)
|
||||
|
||||
//RMS виброскорости в диапазоне 10-1000 Гц.
|
||||
var int = gtl.add_intg(gtl.analog_inputs[signals[0].portNumber]); //интегрирование сигнала виброускорения
|
||||
int.taps = 1; //степень интегрирования (скорость из ускорения - 1-нарное интегрирование)
|
||||
//фильтрация сигнала в диапазоне
|
||||
var filter = gtl.add_filter_iir(int); //объявление переменной фильтра
|
||||
filter.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter.order = 10; //порядок фильтра
|
||||
filter.frequency = 505; //центральная частота полосового фильтра
|
||||
filter.width = 990; //ширина полосы фильтра
|
||||
//определение среднего квадратического значения виброскорости
|
||||
var rms_v = gtl.add_value_rms(filter); //объявление переменной СКЗ
|
||||
rms_v.time = 0.5; //время выборки
|
||||
rms_v.avg_cnt = 4; //количество усреднений
|
||||
|
||||
//[Диагностика]
|
||||
gtl.diagnostic.interval = freq.time * freq.avg_cnt;
|
||||
let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала
|
||||
let acq_time = 0;
|
||||
|
||||
let canvas = gtl.plots.add("specs(A) dB");
|
||||
function diagnose() {
|
||||
switch (state) {
|
||||
case 0: // считаем частоту вращения и настраиваем спектры
|
||||
if (fnc.INSTABILITY() > fnc.tolerance()) {
|
||||
gtl.log.info("Критическая нестабильность частоты вращения, %", fnc.INSTABILITY() * 100);
|
||||
if (imp.INSTABILITY() > imp.tolerance()) {
|
||||
gtl.log.info("Критическая нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
|
||||
gtl.log.info("Результат:", "Диагностика прервана");
|
||||
//gtl.diagnostic.stop(); //принудительная остановка диагностики
|
||||
|
||||
|
@ -110,25 +94,60 @@ function diagnose() {
|
|||
gtl.results = __result;
|
||||
};
|
||||
|
||||
if (fnc.FREQ() <= fnc.FREQNESS()) {
|
||||
gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + fnc.FREQNESS());
|
||||
if (imp.FREQ() <= imp.FREQNESS()) {
|
||||
gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + imp.FREQNESS());
|
||||
};
|
||||
|
||||
case 1: //частота вращения фиксированная
|
||||
case 2: //частота вращения из поля INFO (виброметр)
|
||||
filter_spen.frequency = fnc.bpFreq(); //считаме фильтр для огибающей
|
||||
filter_spen.width = fnc.bpWidth(); //определяем ширину фильтра
|
||||
spen.frequency = fnc.specParams().frequency;
|
||||
spen.lines = fnc.specParams().lines;
|
||||
ausp.frequency = fnc.specParams().frequency;
|
||||
ausp.lines = fnc.specParams().lines;
|
||||
//установка стандартной ширины спектра огибающей и количества линий спектра
|
||||
spen.frequency = imp.standart_width(imp.spec_width().es);
|
||||
spen.lines = imp.standart_lines(imp.spec_lines());
|
||||
filter_spen.frequency = imp.filter_frequency();
|
||||
ausp.frequency = imp.standart_width(imp.spec_width().as1);
|
||||
//ausp.lines = imp.standart_lines();
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
let time = []; //массив по времени набора данных
|
||||
time.push(ausp.acq_time);
|
||||
time.push(spen.acq_time);
|
||||
let max_acq = Math.max(...time);
|
||||
gtl.diagnostic.interval = max_acq;
|
||||
var acq_times = [];
|
||||
acq_times.push(ausp.acq_time);
|
||||
acq_times.push(spen.acq_time);
|
||||
acq_time = Math.max(...acq_times);
|
||||
|
||||
gtl.diagnostic.interval = acq_time;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
case 1: //частота вращения фиксированная
|
||||
//установка стандартной ширины спектра огибающей и количества линий спектра
|
||||
spen.frequency = imp.standart_width(imp.spec_width().es);
|
||||
spen.lines = imp.standart_lines(imp.spec_lines());
|
||||
filter_spen.frequency = imp.filter_frequency();
|
||||
ausp.frequency = imp.standart_width(imp.spec_width().as1);
|
||||
//ausp.lines = imp.standart_lines();
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
var acq_times = [];
|
||||
acq_times.push(ausp.acq_time);
|
||||
acq_times.push(spen.acq_time);
|
||||
acq_time = Math.max(...acq_times);
|
||||
|
||||
gtl.diagnostic.interval = acq_time;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
case 2: //частота вращения из поля INFO (виброметр)
|
||||
//установка стандартной ширины спектра огибающей и количества линий спектра
|
||||
spen.frequency = imp.standart_width(imp.spec_width().es);
|
||||
spen.lines = imp.standart_lines(imp.spec_lines());
|
||||
filter_spen.frequency = imp.filter_frequency();
|
||||
ausp.frequency = imp.standart_width(imp.spec_width().as1);
|
||||
//ausp.lines = imp.standart_lines();
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
var acq_times = [];
|
||||
acq_times.push(ausp.acq_time);
|
||||
acq_times.push(spen.acq_time);
|
||||
acq_time = Math.max(...acq_times);
|
||||
|
||||
gtl.diagnostic.interval = acq_time;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
|
@ -138,51 +157,38 @@ function diagnose() {
|
|||
|
||||
//Вывод информации в лог
|
||||
//Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра
|
||||
var AQ = fnc.specSquare(ausp.data, ausp.frequency / 2, ausp.frequency);
|
||||
var AQ = imp.spec_square(ausp2.data, 800, ausp2.frequency);
|
||||
|
||||
gtl.log.info("Объект диагностики", options.rbModelName);
|
||||
gtl.log.info("FREQ", fnc.FREQ());
|
||||
gtl.log.info("FTF", fnc.BSFTF());
|
||||
gtl.log.info("BPFO", fnc.BSNUT());
|
||||
gtl.log.info("BPFI", fnc.BSSCR());
|
||||
gtl.log.info("BSF", fnc.BSBAL());
|
||||
gtl.log.info("Коридор обнаружения гармоники", fnc.tolerance());
|
||||
gtl.log.info("Полосовой фильтр (расчетный)", filter_spen.frequency);
|
||||
gtl.log.info("Ширина фильтра", filter_spen.width);
|
||||
gtl.log.info("Граничная частота SPEN", spen.frequency);
|
||||
gtl.log.info("Количество линий SPEN", spen.lines);
|
||||
gtl.log.info("Разрешение SPEN", spen.resolution);
|
||||
gtl.log.info("Ширина AUSP", ausp.frequency);
|
||||
gtl.log.info("Объект диагностики", "Подшипник качения " + options.rbModelName);
|
||||
gtl.log.info("Минимально необходимая длительность сигнала", acq_time);
|
||||
gtl.log.info("FREQ", imp.FREQ());
|
||||
gtl.log.info("Минимально необходимая частота вращения", imp.FREQNESS());
|
||||
gtl.log.info("Площадь спектра", AQ);
|
||||
gtl.log.info("Нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
|
||||
gtl.log.info("FTF", imp.FTF());
|
||||
gtl.log.info("BPFO", imp.BPFO());
|
||||
gtl.log.info("BPFI", imp.BPFI());
|
||||
gtl.log.info("BSF", imp.BSF());
|
||||
gtl.log.info("Центральная частота полосового фильтра", filter_spen.frequency);
|
||||
gtl.log.info("Количество долей октавного фильтра", n);
|
||||
gtl.log.info("Коэффициент для октавного фильтра", kf);
|
||||
gtl.log.info("Граничная частота спектра", imp.spec_width().es);
|
||||
gtl.log.info("Расчетное количество линий", imp.spec_lines());
|
||||
gtl.log.info("Расчетное разрешение спектра", imp.spec_resolution());
|
||||
gtl.log.info("Расчетный коридор обнаружения, %", imp.tolerance() * 100);
|
||||
gtl.log.info("Стандартная граничная частота", spen.frequency);
|
||||
gtl.log.info("Стандартное кол-во линий", spen.lines);
|
||||
gtl.log.info("СКЗ(A) ВЧ вибрации", rms_spen.value);
|
||||
gtl.log.info("ПФ(A) в ВЧ диапазоне", ampl_spen.value / rms_spen.value);
|
||||
|
||||
let spen_mx = mtx.bsMTX(spen, filter_spen, true);
|
||||
let spen_df = def.bsDefs(spen_mx, true);
|
||||
let ausp_mx = mtx.bsMTX(ausp, 0, false);
|
||||
|
||||
canvas.add(
|
||||
{
|
||||
color: ausp.color,
|
||||
name: ausp.name,
|
||||
x: ausp.resolution,
|
||||
y: ausp.data
|
||||
}
|
||||
); //рисуем спектр вибрации на плоскости
|
||||
|
||||
canvas.add(
|
||||
{
|
||||
color: spen.color,
|
||||
name: spen.name,
|
||||
x: spen.resolution,
|
||||
y: spen.data
|
||||
}
|
||||
); //рисуем спектр огибающей на плоскости
|
||||
let def = {};
|
||||
def["spen"] = spen_mtx.spen();
|
||||
|
||||
var res = {
|
||||
RMSA: rms_spen.value,
|
||||
RMSV: rms_v.value,
|
||||
PF: ampl_spen.value / rms_spen.value,
|
||||
SQR: AQ,
|
||||
matrix: spen_mx,
|
||||
defs: spen_df,
|
||||
matrix: def
|
||||
};
|
||||
|
||||
gtl.results = res;
|
|
@ -1,95 +0,0 @@
|
|||
"use strict";
|
||||
var signals = gtl.options.record.signalsModel;
|
||||
var options = gtl.options;
|
||||
var record = gtl.options.record;
|
||||
var point = gtl.options.point;
|
||||
|
||||
let __mes = gtl.import("userFunctions.js");
|
||||
let __pvm = gtl.import("peakVM.js");
|
||||
let peakClass = gtl.import("peakClass.js").peakClass;
|
||||
let __corr = gtl.import("corrVM.js");
|
||||
|
||||
|
||||
let __frq = __mes.getFreq(
|
||||
/*{
|
||||
src: gtl.analog_inputs[signals[0].portNumber], //источник сигнала частоты вращения
|
||||
freq: 10, //граничная частота фильтрации сигнала
|
||||
time: 1, //интервал измерения частоты вращения
|
||||
avg: 4, //количество отсчетов для усреднения
|
||||
dc: -0.05 //порог срабатывания счетчика
|
||||
}*/
|
||||
).value; //получаем частоту вращения
|
||||
|
||||
let __sets = __pvm.getParams(__frq); //получаем настройки парметров ФВЧ и спектра
|
||||
|
||||
//фильтр для формирования пиковой формы сигнала
|
||||
let __fltr = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
|
||||
__fltr.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
__fltr.type = gtl.filter_iir.highpass; //тип фильтра (ФНЧ)
|
||||
__fltr.order = 10; //порядок фильтра
|
||||
__fltr.frequency = __sets.filter.frequency; //граничная частота фильтра
|
||||
|
||||
//формирование амплитуд для построения пиковой формы сигнала
|
||||
let __ampl = gtl.add_value_peak_to_peak(__fltr);//gtl.add_value_ampl(__fltr);
|
||||
__ampl.name = "Пиковая форма";
|
||||
__ampl.color = 0x2B6CC4;
|
||||
__ampl.time = 0.001; //время выборки
|
||||
__ampl.avg_cnt = 7700; //количество отсчетов
|
||||
|
||||
let __max = gtl.create_moving_peak_to_peak(
|
||||
{
|
||||
src: __fltr,
|
||||
name: "max",
|
||||
time: 0.001
|
||||
}
|
||||
); //формируем сигнал максимальных амплитуд для построения спектра
|
||||
|
||||
let ausp = __mes.getAusp(
|
||||
{
|
||||
src: __max, //источник сигнала
|
||||
name: "Спектр пиковой формы", //имя спектра
|
||||
color: 0xF34723, //цвет в формате HEX
|
||||
frequency: __sets.spec.frequency, //граничная частота
|
||||
resolution: __sets.spec.resolution, //частотное разрешение
|
||||
average: __sets.spec.avg, //количество усреднений
|
||||
view: gtl.spec.unit, //единицы отображения (дБ)
|
||||
level: 0.002 //уровень обнаружения гармоник
|
||||
}
|
||||
); //вычисляем спектр пиковой формы
|
||||
|
||||
let __plots = gtl.plots.add("Spectral");
|
||||
|
||||
//[Диагностика]
|
||||
gtl.diagnostic.interval = gtl.acq_time;
|
||||
function diagnose() {
|
||||
|
||||
let __peak = new peakClass(
|
||||
{
|
||||
src: __ampl, //объект с массивом данных пиковой формы
|
||||
freq: __frq, //частота вращения, Гц
|
||||
spec: ausp, //спектр пиковой формы
|
||||
visible: true, //отображение графиков
|
||||
}
|
||||
)
|
||||
|
||||
let __ausp_tools = __mes.createTools(
|
||||
{
|
||||
spec: ausp, //спектр для построения модели (объект)
|
||||
//set: __set, //источник данных для построения частотных линий
|
||||
tol: 1 //коридор обнаружения гармоники на портрете, %
|
||||
}
|
||||
); //формируем компоненты и частотные линии на спектре
|
||||
|
||||
__plots.add(
|
||||
{
|
||||
color: ausp.color,
|
||||
name: ausp.name,
|
||||
x: ausp.resolution,
|
||||
y: ausp.data,
|
||||
spec_tools: __ausp_tools.to_json()
|
||||
}
|
||||
); //рисуем спектр пиковой формы
|
||||
|
||||
gtl.results = __peak.getResult();
|
||||
gtl.diagnostic.stop();
|
||||
};
|
|
@ -0,0 +1,79 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.FREQ(); //функциональная чатота
|
||||
let num = 10; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff0000f0, 1); //биение шестерни - "синий"
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
spen_set.name = 'Биение шестерни';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
var ausp_set = ausp.add_harms_set(frq, num, 0xff0000f0, 2); //биение шестерни "синий"
|
||||
for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
ausp_set.name = 'Биение шестерни';
|
||||
var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектре огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//биение вала
|
||||
if (
|
||||
spen.harms_sets[spen_index].get_count(0, 2) >= 3 && spen.harms_sets[spen_index].get_count(0, 2) <= 5 &&
|
||||
ausp.harms_sets[ausp_index].get_count(0, 2) >= 3 && ausp.harms_sets[ausp_index].get_count(0, 2) <= 5
|
||||
) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Биение шестерни. Признаки в ES " + (i + 1) + "Fвр1", deep);
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (ausp_set.harms[i].is_present == true) {
|
||||
ampl = ausp_set.harms[i].amplitude;
|
||||
ausp_signs.push(ampl);
|
||||
gtl.log.info("Биение шестерни. Признаки в AS " + (i + 1) + "Fвр1", ampl);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Биение шестерни", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 12:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 20:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 20:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.GTFZ(); //функциональная чатота
|
||||
let num = 5; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff990090, 1); //дефект зубьев шестерни
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
spen_set.name = 'Дефект зубьев шестерни';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
|
||||
spen.harms_sets[spen_index].modulate(imp.FREQ(), 2, 0xff0000f0, 1); //модуляция Fz +/- Fвр
|
||||
|
||||
var ausp_set = ausp.add_harms_set(frq, num, 0xff990090, 2); //дефект зубьев шестерни
|
||||
for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
ausp_set.name = 'Дефект зубьев шестерни';
|
||||
var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации
|
||||
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
|
||||
ausp.harms_sets[ausp_index].modulate(imp.FREQ(), 2, 0xff0000f0, 1); //модуляция Fz +/- Fвр
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектре огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//биение вала
|
||||
if (
|
||||
spen.harms_sets[spen_index].get_count(0, 1, 1) >= 3 &&
|
||||
ausp.harms_sets[ausp_index].get_count(0, 1, 1) >= 3
|
||||
) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Дефект зубьев шестерни. Признаки в ES " + (i + 1) + "Fz", deep);
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (ausp_set.harms[i].is_present == true) {
|
||||
ampl = ausp_set.harms[i].amplitude;
|
||||
ausp_signs.push(ampl);
|
||||
gtl.log.info("Дефект зубьев шестерни. Признаки в AS " + (i + 1) + "Fz", ampl);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Дефект зубьев шестерни", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 12:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 20:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 20:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -0,0 +1,261 @@
|
|||
"use strict";
|
||||
var signals = gtl.options.record.signalsModel;
|
||||
var options = gtl.options;
|
||||
var record = gtl.options.record;
|
||||
var point = gtl.options.point;
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
var gear0 = gtl.import("gt-gear-beat.js");
|
||||
var wheel0 = gtl.import("gt-wheel-beat.js");
|
||||
var gear1 = gtl.import("gt-gear-fault.js");
|
||||
var wheel1 = gtl.import("gt-wheel-fault.js");
|
||||
|
||||
//настройки для датчика оборотов
|
||||
var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра
|
||||
filter_freq.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_freq.type = gtl.filter_iir.lowpass; //тип фильтра (ФНЧ)
|
||||
filter_freq.order = 8; //порядок фильтра
|
||||
filter_freq.frequency = 10; //граничная частота фильтра
|
||||
|
||||
//определение частоты вращения
|
||||
var freq = gtl.add_value_freq(filter_freq);
|
||||
freq.time = 1;
|
||||
freq.avg_cnt = 6;
|
||||
//gtl.diagnostic.interval = /*1*/10;
|
||||
|
||||
//[Блок настройки параметров измерений]
|
||||
//мониторинговый спектр вибрации
|
||||
var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации
|
||||
ausp2.name = "AUSPm"; //присвоение имени спектра
|
||||
ausp2.color = 0x0000ffff; //цвет линии спектра
|
||||
ausp2.frequency = 1600; //граничная частота спектра
|
||||
ausp2.lines = 1600; //разрешение спектра (количество линий)
|
||||
ausp2.average = 6; //количество усреднений
|
||||
ausp2.unit = gtl.spec.db; //отображение в дБ
|
||||
|
||||
//спектр вибрации
|
||||
var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации
|
||||
ausp.name = "AUSPd"; //присвоение имени спектра
|
||||
ausp.color = 0x0000ff00; //цвет линии спектра
|
||||
ausp.frequency = 800; //граничная частота спектра
|
||||
ausp.lines = 800; //разрешение спектра (количество линий)
|
||||
ausp.average = 6; //количество усреднений
|
||||
ausp.unit = gtl.spec.db; //отображение в дБ
|
||||
ausp.smoothing_factor = 50; //коэффициент сглаживания спектра
|
||||
ausp.smoothed_line_color = 0x000000ff; //цвет линии сглаживания (средней линии)
|
||||
ausp.peak_level = 20; //порог обнаружения гармоник
|
||||
ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/-
|
||||
|
||||
//фильтр для формирования спектра огибающей
|
||||
var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра
|
||||
filter_spen.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter_spen.order = 10; //порядок фильтра
|
||||
filter_spen.frequency = 6400; //центральная частота полосового фильтра
|
||||
filter_spen.color = 255;
|
||||
filter_spen.width = 1482; //ширина полосы фильтра
|
||||
|
||||
//спектр огибающей
|
||||
var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей
|
||||
spen.name = "SPEN"; //присвоение имени спектра огибающей
|
||||
spen.color = 0x00ff0000; //цвет линии спектра огибающей
|
||||
spen.frequency = 400; //граничная частота спектра огибающей
|
||||
spen.lines = 400; //разрешение спектра огибающей (количество линий)
|
||||
spen.average = 8; //количество усреднений
|
||||
spen.unit = gtl.spec.db; //отображение в дБ
|
||||
spen.window = gtl.spec.hann; //окно
|
||||
spen.smoothing_factor = 100; //коэффициент сглаживания спектра
|
||||
spen.smoothed_line_color = 0xff004dff; //цвет средней линии
|
||||
spen.peak_level = 10; //порог обнаружения гармоник
|
||||
spen.harm_tolerance = spen.resolution; //диапазон поиска гармоник +/-
|
||||
|
||||
//RMS и Amplitude в диапазоне спектра огибающей (контроль работы сил трения)
|
||||
var rms_spen = gtl.add_value_rms(filter_spen); //назначение переменной RMS (spen)
|
||||
var ampl_spen = gtl.add_value_ampl(filter_spen); //назначение переменной Amplitude (spen)
|
||||
rms_spen.name = "RMS (spen)" //присвоение имени RMS (spen)
|
||||
rms_spen.time = 0.5; //интервал расчета RMS (spen)
|
||||
ampl_spen.time = 0.5; //интервал расчета Amplitude (spen)
|
||||
rms_spen.avg_cnt = 4; //количество усреднений RMS (spen)
|
||||
ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen)
|
||||
|
||||
//RMS и Amplitude в УВЧ диапазоне 10-25 кГц (контроль разрыва масляной пленки)
|
||||
var filter_uhf = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный)
|
||||
filter_uhf.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_uhf.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter_uhf.order = 10; //порядок фильтра
|
||||
filter_uhf.frequency = 17500; //центральная частота полосового фильтра
|
||||
filter_uhf.width = 15000; //ширина полосы фильтра
|
||||
|
||||
var rms_uhf = gtl.add_value_rms(filter_uhf); //назначение переменной RMS
|
||||
var ampl_uhf = gtl.add_value_ampl(filter_uhf); //назначение переменной Amplitude
|
||||
rms_uhf.name = "RMS (uhf)" //присвоение имени RMS (uhf)
|
||||
rms_uhf.time = 0.5; //интервал расчета RMS (uhf)
|
||||
ampl_uhf.time = 0.5; //интервал расчета Amplitude (uhf)
|
||||
rms_uhf.avg_cnt = 4; //количество усреднений RMS (uhf)
|
||||
ampl_uhf.avg_cnt = 4; //количество усреднений Amplitude (uhf)
|
||||
|
||||
//Виброскорость в дипазоне 2-1000 Гц (вибромониторинг)
|
||||
var filter2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный)
|
||||
filter2_1000.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter2_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter2_1000.order = 10; //порядок фильтра
|
||||
filter2_1000.frequency = 501; //центральная частота полосового фильтра
|
||||
filter2_1000.width = 998; //ширина полосы фильтра
|
||||
var filter2_1000v = gtl.add_intg(filter2_1000); // интегрирование
|
||||
filter2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
|
||||
|
||||
var rms_v2 = gtl.add_value_rms(filter2_1000v); //назначение переменной RMS(V)
|
||||
rms_v2.name = "RMS(V) 2-1000 Гц" //присвоение имени RMS(V)
|
||||
rms_v2.time = 0.5; //интервал расчета RMS(V)
|
||||
rms_v2.avg_cnt = 4; //количество усреднений RMS(V)
|
||||
|
||||
//Виброскорость в дипазоне 10-1000 Гц (вибромониторинг)
|
||||
var filter10_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный)
|
||||
filter10_1000.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter10_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter10_1000.order = 10; //порядок фильтра
|
||||
filter10_1000.frequency = 505; //центральная частота полосового фильтра
|
||||
filter10_1000.width = 990; //ширина полосы фильтра
|
||||
var filter10_1000v = gtl.add_intg(filter10_1000); // интегрирование
|
||||
filter10_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
|
||||
|
||||
var rms_v10 = gtl.add_value_rms(filter10_1000v); //назначение переменной RMS(V)
|
||||
rms_v10.name = "RMS(V) 10-1000 Гц" //присвоение имени RMS(V)
|
||||
rms_v10.time = 0.5; //интервал расчета RMS(V)
|
||||
rms_v10.avg_cnt = 4; //количество усреднений RMS(V)
|
||||
|
||||
//[Диагностика]
|
||||
gtl.diagnostic.interval = freq.time * freq.avg_cnt;
|
||||
let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала
|
||||
let acq_time = 0;
|
||||
|
||||
function diagnose() {
|
||||
switch (state) {
|
||||
case 0: // считаем частоту вращения и настраиваем спектры
|
||||
if (imp.INSTABILITY() > imp.tolerance()) {
|
||||
gtl.log.info("Критическая нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
|
||||
gtl.log.info("Результат:", "Диагностика прервана");
|
||||
//gtl.diagnostic.stop(); //принудительная остановка диагностики
|
||||
|
||||
let __result = {
|
||||
Result: false
|
||||
};
|
||||
gtl.results = __result;
|
||||
};
|
||||
|
||||
if (imp.FREQ() <= imp.FREQNESS()) {
|
||||
gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + imp.FREQNESS());
|
||||
};
|
||||
|
||||
//установка стандартной ширины спектра огибающей и количества линий спектра
|
||||
spen.frequency = imp.standart_width(imp.spec_width().es);
|
||||
spen.lines = imp.standart_lines(imp.spec_lines());
|
||||
filter_spen.frequency = imp.filter_frequency();
|
||||
ausp.frequency = imp.standart_width(imp.spec_width().as1);
|
||||
//ausp.lines = imp.standart_lines();
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
var acq_times = [];
|
||||
acq_times.push(ausp.acq_time);
|
||||
acq_times.push(spen.acq_time);
|
||||
acq_time = Math.max(...acq_times);
|
||||
|
||||
gtl.diagnostic.interval = acq_time;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
case 1: //частота вращения фиксированная
|
||||
//установка стандартной ширины спектра огибающей и количества линий спектра
|
||||
spen.frequency = imp.standart_width(imp.spec_width().es);
|
||||
spen.lines = imp.standart_lines(imp.spec_lines());
|
||||
filter_spen.frequency = imp.filter_frequency();
|
||||
ausp.frequency = imp.standart_width(imp.spec_width().as1);
|
||||
//ausp.lines = imp.standart_lines();
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
var acq_times = [];
|
||||
acq_times.push(ausp.acq_time);
|
||||
acq_times.push(spen.acq_time);
|
||||
acq_time = Math.max(...acq_times);
|
||||
|
||||
gtl.diagnostic.interval = acq_time;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
case 2: //частота вращения из поля INFO (виброметр)
|
||||
//установка стандартной ширины спектра огибающей и количества линий спектра
|
||||
spen.frequency = imp.standart_width(imp.spec_width().es);
|
||||
spen.lines = imp.standart_lines(imp.spec_lines());
|
||||
filter_spen.frequency = imp.filter_frequency();
|
||||
ausp.frequency = imp.standart_width(imp.spec_width().as1);
|
||||
//ausp.lines = imp.standart_lines();
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
var acq_times = [];
|
||||
acq_times.push(ausp.acq_time);
|
||||
acq_times.push(spen.acq_time);
|
||||
acq_time = Math.max(...acq_times);
|
||||
|
||||
gtl.diagnostic.interval = acq_time;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
case 3: //выполняем анализ спектов
|
||||
ausp.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре вибрации
|
||||
spen.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре огибающей
|
||||
|
||||
//Вывод информации в лог
|
||||
//Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра
|
||||
var AQ = imp.spec_square(ausp2.data, 800, ausp2.frequency);
|
||||
|
||||
gtl.log.info("Объект диагностики", "Подшипник качения " + options.rbModelName);
|
||||
gtl.log.info("Минимально необходимая длительность сигнала", acq_time);
|
||||
gtl.log.info("FREQ", imp.FREQ());
|
||||
gtl.log.info("Минимально необходимая частота вращения", imp.FREQNESS());
|
||||
gtl.log.info("Площадь спектра", AQ);
|
||||
gtl.log.info("Нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
|
||||
gtl.log.info("FTF", imp.FTF());
|
||||
gtl.log.info("BPFO", imp.BPFO());
|
||||
gtl.log.info("BPFI", imp.BPFI());
|
||||
gtl.log.info("BSF", imp.BSF());
|
||||
gtl.log.info("Центральная частота полосового фильтра", filter_spen.frequency);
|
||||
gtl.log.info("Количество долей октавного фильтра", n);
|
||||
gtl.log.info("Коэффициент для октавного фильтра", kf);
|
||||
gtl.log.info("Граничная частота спектра", imp.spec_width().es);
|
||||
gtl.log.info("Расчетное количество линий", imp.spec_lines());
|
||||
gtl.log.info("Расчетное разрешение спектра", imp.spec_resolution());
|
||||
gtl.log.info("Расчетный коридор обнаружения, %", imp.tolerance() * 100);
|
||||
gtl.log.info("Стандартная граничная частота", spen.frequency);
|
||||
gtl.log.info("Стандартное кол-во линий", spen.lines);
|
||||
gtl.log.info("СКЗ(A) ВЧ вибрации", rms_spen.value);
|
||||
gtl.log.info("СКЗ(A) УВЧ вибрации", rms_uhf.value);
|
||||
gtl.log.info("ПФ(A) в ВЧ диапазоне", ampl_spen.value / rms_spen.value);
|
||||
gtl.log.info("ПФ(A) в УВЧ диапазоне", ampl_uhf.value / rms_uhf.value);
|
||||
gtl.log.info("СКЗ(V) 2-1000 Гц", rms_v2.value);
|
||||
gtl.log.info("СКЗ(V) 10-1000 Гц", rms_v10.value);
|
||||
|
||||
let def = {};
|
||||
//var indx = 0;
|
||||
def["Биение шестерни"] = gear0.defect(); //indx (spen = 0, ausp = 0)
|
||||
def["Биение зубчатого колеса"] = wheel0.defect(); //indx (spen = 1, ausp = 1)
|
||||
def["Дефект зубьев шестерни"] = gear1.defect(); //indx (spen = 2, ausp = 2)
|
||||
def["Дефект зубьев зубчатого колеса"] = wheel1.defect(); //indx (spen = 3, ausp = 3)
|
||||
|
||||
var res = {
|
||||
RMSA: rms_spen.value,
|
||||
PF: ampl_spen.value / rms_spen.value,
|
||||
RMS_V2: rms_v2.value,
|
||||
RMS_V10: rms_v10.value,
|
||||
SQR: AQ,
|
||||
defects: def
|
||||
};
|
||||
|
||||
gtl.results = res;
|
||||
gtl.diagnostic.stop();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
|
@ -2,40 +2,24 @@
|
|||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defects() {
|
||||
let frq = imp.FREQ(); //функциональная чатота
|
||||
let num = 20; //количество отрисованных гармоник
|
||||
export function defect() {
|
||||
let frq = imp.BPFI(); //функциональная чатота
|
||||
let num = 5; //количество отрисованных гармоник
|
||||
|
||||
//строим гармонические ряды на SPEN[A].
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff990090, 1); //"фиолетовый"
|
||||
spen_set.name = 'Частота вращения';
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff990090, 1); //раковины на внутреннем кольце "фиолетовый"
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() };
|
||||
spen_set.name = 'Раковины на внутреннем кольце';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
|
||||
spen.harms_sets[spen_index].modulate(imp.FREQ(), 2, 0xff923090, 1); //модуляция Fв +/- Fвр "фиолетовый"
|
||||
|
||||
var spen_set1 = spen.add_harms_set(frq / 2, num, 0x30D5C8, 1); //"бирюзовый"
|
||||
spen_set1.name = 'Автоколебания';
|
||||
var spen_index1 = spen.index_of_harms_set(spen_set1); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
var spen_set2 = spen.add_harms_set(frq / 3, num, 0x34C924, 1); //"Вердепомовый"
|
||||
spen_set2.name = 'Автоколебания (треть)';
|
||||
var spen_index2 = spen.index_of_harms_set(spen_set2); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
//строим гармонические ряды на AUSP[A].
|
||||
var ausp_set = ausp.add_harms_set(frq, num, 0xff990090, 2); //"фиолетовый"
|
||||
ausp_set.name = 'Частота вращения';
|
||||
var ausp_set = ausp.add_harms_set(frq, num, 0xff990090, 2); //раковины на внутреннем кольце "фиолетовый"
|
||||
for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() };
|
||||
ausp_set.name = 'Раковины на внутреннем кольце';
|
||||
var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации
|
||||
|
||||
var ausp_set1 = ausp.add_harms_set(frq / 2, num, 0x30D5C8, 1); //"бирюзовый"
|
||||
ausp_set1.name = 'Автоколебания';
|
||||
var ausp_index1 = ausp.index_of_harms_set(ausp_set1); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
var ausp_set2 = ausp.add_harms_set(frq / 3, num, 0x34C924, 1); //"Вердепомовый"
|
||||
ausp_set2.name = 'Автоколебания (треть)';
|
||||
var ausp_index2 = ausp.index_of_harms_set(ausp_set2); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
//строим гармонические ряды на AUSP[V].
|
||||
var auspv_set = ausp_v.add_harms_set(frq, num, 0xff990090, 2); //"фиолетовый"
|
||||
auspv_set.name = 'Частота вращения';
|
||||
var auspv_index = ausp_v.index_of_harms_set(auspv_set); //индекс набора гармоник в спектре вибрации
|
||||
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
|
||||
ausp.harms_sets[ausp_index].modulate(imp.FREQ(), 2, 0xff923090, 1); //модуляция Fв +/- Fвр "фиолетовый"
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектрк огибающей
|
||||
|
@ -62,7 +46,7 @@ export function defects() {
|
|||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Дефекты подшипника скольжения. Признаки в ES " + (i + 1) + "Fв +/- Fвр", deep);
|
||||
gtl.log.info("Раковины на внутреннем кольце. Признаки в ES " + (i + 1) + "Fв +/- Fвр", deep);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -70,12 +54,12 @@ export function defects() {
|
|||
if (ausp_set.harms[i].is_present == true) {
|
||||
ampl = ausp_set.harms[i].amplitude;
|
||||
ausp_signs.push(ampl);
|
||||
gtl.log.info("Дефекты подшипника скольжения. Признаки в AS " + (i + 1) + "Fв +/- Fвр", ampl);
|
||||
gtl.log.info("Раковины на внутреннем кольце. Признаки в AS " + (i + 1) + "Fв +/- Fвр", ampl);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Дефекты подшипника скольжения", "Признаков дефекта не обнаружено");
|
||||
gtl.log.info("Раковины на внутреннем кольце", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
|
@ -0,0 +1,63 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.FREQ(); //функциональная чатота
|
||||
let num = 10; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff009ff0, 2); //неоднородный радиальный натяг "голубой"
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() };
|
||||
spen_set.name = 'Неоднородный радиальный натяг';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектрк огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//неоднородный радиальный натяг
|
||||
if (spen.harms_sets[spen_index].get_count(0) >= 1 && spen.harms_sets[spen_index].get_count(0) <= 5) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Неоднородный радиальный натяг. Признаки в ES " + (i + 1) + "Fвр[x2]", deep);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Неоднородный радиальный натяг", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 7:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 13:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 13:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.FREQ(); //функциональная чатота
|
||||
let num = 5; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff0000f0, 1); //износ дорожки качения внутреннего кольца "синий"
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() };
|
||||
spen_set.name = 'Износ внутреннего кольца';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектрк огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//износ дорожки качения внутреннего кольца
|
||||
if (spen.harms_sets[spen_index].get_count(0, 1) >= 1 && spen.harms_sets[spen_index].get_count(0, 1) <= 2) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Износ внутреннего кольца. Признаки в ES " + (i + 1) + "Fвр", deep);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Износ внутреннего кольца", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 7:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 13:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 13:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.BPFO(); //функциональная чатота
|
||||
let num = 6; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff009000, 2); //перекос наружного кольца "зелёный"
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() };
|
||||
spen_set.name = 'Перекос наружного кольца';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектрк огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//перекос наружного кольца
|
||||
if (spen.harms_sets[spen_index].get_count(0, 1) >= 1 && spen.harms_sets[spen_index].get_count(0, 1) <= 4) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Перекос наружного кольца. Признаки в ES " + (i + 1) + "Fн[x2]", deep);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Перекос наружного кольца", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 7:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 13:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 13:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.BPFO(); //функциональная чатота
|
||||
let num = 6; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff009000, 1); //раковины на наружном кольце "зелёный"
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() };
|
||||
spen_set.name = 'Раковины на наружном кольце';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
|
||||
spen.harms_sets[spen_index].modulate(imp.FTF(), 2, 0xff009030, 1); //модуляция Fн +/- Fс "зелёный"
|
||||
|
||||
var ausp_set = ausp.add_harms_set(frq, num, 0xff009000, 2); //раковины на наружном кольце "зелёный"
|
||||
for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() };
|
||||
ausp_set.name = 'Раковины на наружном кольце';
|
||||
var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации
|
||||
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
|
||||
ausp.harms_sets[ausp_index].modulate(imp.FTF(), 2, 0xff009030, 1); //модуляция Fн +/- Fс "зелёный"
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектрк огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//раковины на наружном кольце
|
||||
if (
|
||||
spen.harms_sets[spen_index].get_count(0, 1) >= 5 &&
|
||||
ausp.harms_sets[ausp_index].get_count(0, 3) >= 5
|
||||
) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Раковины на наружном кольце. Признаки в ES " + (i + 1) + "Fн", deep);
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (ausp_set.harms[i].is_present == true) {
|
||||
ampl = ausp_set.harms[i].amplitude;
|
||||
ausp_signs.push(ampl);
|
||||
gtl.log.info("Раковины на наружном кольце. Признаки в AS " + (i + 1) + "Fн", ampl);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Раковины на наружном кольце", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 7:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 13:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 13:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.BPFO(); //функциональная чатота
|
||||
let num = 5; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff009000, 1); //износ дорожки качения наружного кольца "зелёный"
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() };
|
||||
spen_set.name = 'Износ наружного кольца';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектрк огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//износ наружного кольца
|
||||
if (spen.harms_sets[spen_index].get_count(0, 1) >= 1 && spen.harms_sets[spen_index].get_count(0, 1) <= 5) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Износ наружного кольца. Признаки в ES " + (i + 1) + "Fн", deep);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Износ наружного кольца", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 7:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 13:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 13:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.BSF(); //функциональная чатота
|
||||
let num = 20; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff994000, 1); //раковины и сколы на телах качения "оранжевый"
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() };
|
||||
spen_set.name = 'Раковины и сколы на телах качения';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
|
||||
spen.harms_sets[spen_index].modulate(imp.FTF(), 2, 0xff996000, 1); //модуляция Fтк +/- Fс "горчичный"
|
||||
|
||||
var ausp_set = ausp.add_harms_set(frq, num, 0xff994000, 2); //раковины и сколы на телах качения "оранжевый"
|
||||
for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() };
|
||||
ausp_set.name = 'Раковины и сколы на телах качения';
|
||||
var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации
|
||||
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
|
||||
ausp.harms_sets[ausp_index].modulate(imp.FTF(), 2, 0xff996000, 1); //модуляция Fтк +/- Fс "горчичный"
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектрк огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//раковины и сколы на телах качения
|
||||
if (
|
||||
spen.harms_sets[spen_index].get_count(0, 1, 1) >= 3 &&
|
||||
ausp.harms_sets[ausp_index].get_count(0, 3, 1) >= 3
|
||||
) {
|
||||
defect = true;
|
||||
Defect_type.push("Раковины и сколы на телах качения");
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Раковины и сколы на телах качения. Признаки в ES " + (i + 1) + "Fтк +/- Fс", deep);
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (ausp_set.harms[i].is_present == true) {
|
||||
ampl = ausp_set.harms[i].amplitude;
|
||||
ausp_signs.push(ampl);
|
||||
gtl.log.info("Раковины и сколы на телах качения. Признаки в AS " + (i + 1) + "Fтк +/- Fс", ampl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
gtl.log.info("Раковины и сколы на телах качения", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 7:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 13:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 13:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.FTF(); //функциональная чатота
|
||||
let num = 10; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xffff0000, 2); //износ тел качения и сепаратора "красный"
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() };
|
||||
spen_set.name = 'Износ тел качения и сепаратора';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектрк огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//износ тел качения и сепаратора
|
||||
if (spen.harms_sets[spen_index].get_count(0, 1) >= 1) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Износ тел качения и сепаратора. Признаки в ES " + (i + 1) + "Fс", deep);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Износ тел качения и сепаратора", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 5:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 10:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 10:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
"use strict";
|
||||
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
export function defect() {
|
||||
let frq = imp.FREQ(); //функциональная чатота
|
||||
let num = 10; //количество отрисованных гармоник
|
||||
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
var spen_set = spen.add_harms_set(frq, num, 0xff0000f0, 1); //биение вала - "синий"
|
||||
for (let i = 0; i <= num - 1; i++) { spen_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
spen_set.name = 'Биение вала';
|
||||
var spen_index = spen.index_of_harms_set(spen_set); //индекс набора гармоник в спектре огибающей
|
||||
|
||||
var ausp_set = ausp.add_harms_set(frq, num, 0xff0000f0, 2); //биение вала "синий"
|
||||
for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() }; //коридор обнаружения гармоник
|
||||
ausp_set.name = 'Биение вала';
|
||||
var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации
|
||||
|
||||
var defect = false;
|
||||
var spen_signs = []; //массив признаков в спектрк огибающей
|
||||
var ausp_signs = []; //массив признаков в спектре вибрации
|
||||
var deep = 0; //глубина модуляции ВЧ составляющих
|
||||
var ampl = 0; //амплитуда составляющих НЧ вибрации
|
||||
var describe = ''; //описание степени развития дефекта
|
||||
var result = ''; //результат диагностики
|
||||
|
||||
//вывод количества гармоник
|
||||
//spen.harms_sets[0].get_count(1, 2, 1, true);
|
||||
//1 - начало отсчета гармоники;
|
||||
//2 - допуситмое количество пропущенных в ряду;
|
||||
//3 - количество модулирующих с одной стороны;
|
||||
//4 - модулирующие с двух сторон (true);
|
||||
|
||||
//биение вала
|
||||
if (
|
||||
spen.harms_sets[spen_index].get_count(0, 2) >= 1 && spen.harms_sets[spen_index].get_count(0, 2) <= 10 &&
|
||||
ausp.harms_sets[ausp_index].get_count(0, 2) >= 0 && ausp.harms_sets[ausp_index].get_count(0, 2) <= 10
|
||||
) {
|
||||
defect = true;
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (spen_set.harms[i].is_present == true) {
|
||||
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
|
||||
spen_signs.push(deep);
|
||||
gtl.log.info("Биение вала. Признаки в ES " + (i + 1) + "Fвр", deep);
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i <= num - 1; i++) {
|
||||
if (ausp_set.harms[i].is_present == true) {
|
||||
ampl = ausp_set.harms[i].amplitude;
|
||||
ausp_signs.push(ampl);
|
||||
gtl.log.info("Биение вала. Признаки в AS " + (i + 1) + "Fвр", ampl);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
gtl.log.info("Биение вала", "Признаков дефекта не обнаружено");
|
||||
|
||||
deep = Math.max(...spen_signs) * 100;
|
||||
switch (true) {
|
||||
case deep <= 7:
|
||||
describe = "Слабый";
|
||||
break;
|
||||
case deep < 13:
|
||||
describe = "Средний";
|
||||
break;
|
||||
case deep >= 13:
|
||||
describe = "Сильный";
|
||||
break;
|
||||
default:
|
||||
describe = "None";
|
||||
};
|
||||
|
||||
if (defect == true) { result = "(" + deep + "%; " + describe + ")" } else { result = false };
|
||||
|
||||
return result;
|
||||
};
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
export function rbDefs(mtx, isDeep) {
|
||||
var res = {}; //результат
|
||||
if (isDeep = true) { var key = "dp" } else { var key = "lv" };
|
||||
var des = {
|
||||
FTF: { ds: "тел качения и сепаратора", dp: 8, lv: 20 },
|
||||
FREQ: { ds: "внутреннего кольца", dp: 13, lv: 20 },
|
||||
BSF: { ds: "тел качения", dp: 10, lv: 20 },
|
||||
BPFO: { ds: "наружного кольца", dp: 15, lv: 20 },
|
||||
BPFI: { ds: "внутреннего кольца", dp: 8, lv: 20 },
|
||||
}; //описание функциональных частот
|
||||
|
||||
function getNote(harmsArr) {
|
||||
let note = "Износ"; //описание характера колебаний
|
||||
let cnt = 0; //количество значений в массиве
|
||||
for (let i = 0; i <= harmsArr.length - 1; i++) { if (harmsArr[i] > 0) { cnt++ }; };
|
||||
if (cnt >= 5) { note = "Дефект" };
|
||||
if (harmsArr[1] > harmsArr[0]) { note = "Перекос" };
|
||||
if (cnt > 0 && harmsArr[0] == 0 && harmsArr[1] == 0) { note = "Неидентифицированные изменения вибрации" };
|
||||
return note;
|
||||
};
|
||||
|
||||
function getLevel(lvl, thres) {
|
||||
let level = "Сильный";
|
||||
switch (true) {
|
||||
case lvl < 0.5 * thres:
|
||||
level = "Слабый";
|
||||
break;
|
||||
case lvl < thres:
|
||||
level = "Средний";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}; return level;
|
||||
};
|
||||
|
||||
var rows = Object.keys(mtx); //массив ключей объекта (наборов гармоник)
|
||||
for (let i = 0; i <= rows.length - 1; i++) {
|
||||
let arr = mtx[rows[i]]; //массив гармоник
|
||||
let lvl = Math.max(...arr); //определяем максимальное значение параметра из массива
|
||||
let sum = arr.reduce(function (a, b) { return a + b }, 0); //сумма элементов массива
|
||||
if (sum > 0) {
|
||||
let note = getNote(arr);
|
||||
res[rows[i]] = note + ' ' + des[rows[i]].ds + ': ' + getLevel(lvl, des[rows[i]][key]) + ' (' + lvl + ')';
|
||||
};
|
||||
};
|
||||
return res;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
var ufc = gtl.import("userFunctions.js");
|
||||
|
||||
export function rbMTX(spec, filter, isDeep) {
|
||||
var num = 6; //глубина матрицы (количество гармоник)
|
||||
var level = 0; //уровень развития дефекта
|
||||
var res = {}; //результат
|
||||
|
||||
var set = {
|
||||
FTF: { nm: "Частота вращения сепаратора", fn: ufc.FTF(), md: 0, cl: 0xffff0000 },
|
||||
FREQ: { nm: "Частота вращения", fn: ufc.FREQ(), md: 0, cl: 0xff0000f0 },
|
||||
BSF: { nm: "Частота вращения (контакта) тел качения", fn: ufc.BSF(), md: ufc.FTF(), cl: 0xffFFB841 },
|
||||
BPFO: { nm: "Частота перекатывания тел качения по наружному кольцу", fn: ufc.BPFO(), md: ufc.FTF(), cl: 0xffED3CCA },
|
||||
BPFI: { nm: "Частота перекатывания тел качения по внутреннему кольцу", fn: ufc.BPFI(), md: ufc.FREQ(), cl: 0xff990090 }
|
||||
}; //набор функциональных частот
|
||||
|
||||
function modFactor(dSpec, dFilter, ampl, base) {
|
||||
let dl = (ampl - base); //разность уровней гармонической и случайной составляющей вибрации
|
||||
let df = dSpec.frequency / dFilter.width; //отношение частотному разрешению спектра к ширине фильтра
|
||||
let mod = Math.sqrt((10 ** (dl / 10) - 1) * df);
|
||||
return mod;
|
||||
}; //определение глубины модуляции ВЧ составляющих
|
||||
|
||||
var rows = Object.keys(set); //массив ключей объекта (наборов гармонических рядов)
|
||||
//присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
|
||||
for (let i = 0; i <= rows.length - 1; i++) {
|
||||
let lines = rows[i];
|
||||
let idx = 0; //индекс гармонического ряда
|
||||
let nms = set[lines].nm; //название гармонического ряда
|
||||
let frq = set[lines].fn; //расчетная частота
|
||||
let mod = set[lines].md; //модулирующая частота
|
||||
let clr = set[lines].cl; //предустановленный цвет
|
||||
let arr = []; //массив обнаруженных гармоник
|
||||
|
||||
lines = spec.add_harms_set(frq, num, clr, 2); //строим набор частот (гармонический ряд)
|
||||
lines.name = nms;
|
||||
idx = spec.index_of_harms_set(lines); //определяем индекс набора частот
|
||||
if (mod != 0) { spec.harms_sets[idx].modulate(mod, 2, clr, 0.5) }; //строим амплитудную модуляцию
|
||||
for (let j = 0; j <= num - 1; j++) {
|
||||
lines.harms[j].tolerance = (j + 1) * frq * ufc.tolerance(); //устанавливаем коридор обнаружения гармоники
|
||||
if (lines.harms[j].is_present == true) {
|
||||
switch (isDeep) {
|
||||
case true:
|
||||
level = Math.round(modFactor(spec, filter, lines.harms[j].amplitude, lines.harms[j].base));
|
||||
break;
|
||||
case false:
|
||||
level = Math.round(lines.harms[j].level);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
arr.push(level);
|
||||
} else { arr.push(0) };
|
||||
res[rows[i]] = arr;
|
||||
};
|
||||
};
|
||||
|
||||
return res;
|
||||
};
|
||||
|
|
@ -4,9 +4,17 @@ var options = gtl.options;
|
|||
var record = gtl.options.record;
|
||||
var point = gtl.options.point;
|
||||
|
||||
var fnc = gtl.import("userFunctions.js");
|
||||
var mtx = gtl.import("rbMTX.js");
|
||||
var def = gtl.import("rbDefs.js");
|
||||
var imp = gtl.import("user-functions.js");
|
||||
|
||||
var val = gtl.import("rb-shaft.js");
|
||||
var in0 = gtl.import("rb-inring-tention.js");
|
||||
var out0 = gtl.import("rb-outring-wear.js");
|
||||
var out1 = gtl.import("rb-outring-bias.js");
|
||||
var out2 = gtl.import("rb-outring-fault.js");
|
||||
var in1 = gtl.import("rb-inring-wear.js");
|
||||
var in2 = gtl.import("rb-inring-fault.js");
|
||||
var sep = gtl.import("rb-separator-wear.js");
|
||||
var rol = gtl.import("rb-rollers-fault.js");
|
||||
|
||||
//настройки для датчика оборотов
|
||||
var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра
|
||||
|
@ -23,16 +31,16 @@ freq.avg_cnt = 6;
|
|||
|
||||
//[Блок настройки параметров измерений]
|
||||
//мониторинговый спектр вибрации
|
||||
var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации
|
||||
var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации
|
||||
ausp2.name = "AUSPm"; //присвоение имени спектра
|
||||
ausp2.color = 0x0000ffff; //цвет линии спектра
|
||||
ausp2.frequency = 25600; //граничная частота спектра
|
||||
ausp2.frequency = 1600; //граничная частота спектра
|
||||
ausp2.lines = 1600; //разрешение спектра (количество линий)
|
||||
ausp2.average = 6; //количество усреднений
|
||||
ausp2.unit = gtl.spec.db; //отображение в дБ
|
||||
|
||||
//спектр вибрации
|
||||
var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации
|
||||
var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной спектра вибрации
|
||||
ausp.name = "AUSPd"; //присвоение имени спектра
|
||||
ausp.color = 0x0000ff00; //цвет линии спектра
|
||||
ausp.frequency = 800; //граничная частота спектра
|
||||
|
@ -45,7 +53,7 @@ ausp.peak_level = 20; //порог обнаружения гармоник
|
|||
ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/-
|
||||
|
||||
//фильтр для формирования спектра огибающей
|
||||
var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра
|
||||
var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра
|
||||
filter_spen.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter_spen.order = 10; //порядок фильтра
|
||||
|
@ -57,8 +65,8 @@ filter_spen.width = 1482; //ширина полосы фильтра
|
|||
var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей
|
||||
spen.name = "SPEN"; //присвоение имени спектра огибающей
|
||||
spen.color = 0x00ff0000; //цвет линии спектра огибающей
|
||||
spen.frequency = 200; //граничная частота спектра огибающей
|
||||
spen.lines = 200; //разрешение спектра огибающей (количество линий)
|
||||
spen.frequency = 400; //граничная частота спектра огибающей
|
||||
spen.lines = 400; //разрешение спектра огибающей (количество линий)
|
||||
spen.average = 8; //количество усреднений
|
||||
spen.unit = gtl.spec.db; //отображение в дБ
|
||||
spen.window = gtl.spec.hann; //окно
|
||||
|
@ -76,31 +84,62 @@ ampl_spen.time = 0.5; //интервал расчета Amplitude (spen)
|
|||
rms_spen.avg_cnt = 4; //количество усреднений RMS (spen)
|
||||
ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen)
|
||||
|
||||
//RMS виброскорости в диапазоне 10-1000 Гц.
|
||||
var int = gtl.add_intg(gtl.analog_inputs[signals[0].portNumber]); //интегрирование сигнала виброускорения
|
||||
int.taps = 1; //степень интегрирования (скорость из ускорения - 1-нарное интегрирование)
|
||||
//фильтрация сигнала в диапазоне
|
||||
var filter = gtl.add_filter_iir(int); //объявление переменной фильтра
|
||||
filter.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter.order = 10; //порядок фильтра
|
||||
filter.frequency = 505; //центральная частота полосового фильтра
|
||||
filter.width = 990; //ширина полосы фильтра
|
||||
//определение среднего квадратического значения виброскорости
|
||||
var rms_v = gtl.add_value_rms(filter); //объявление переменной СКЗ
|
||||
rms_v.time = 0.5; //время выборки
|
||||
rms_v.avg_cnt = 4; //количество усреднений
|
||||
//RMS и Amplitude в УВЧ диапазоне 10-25 кГц (контроль разрыва масляной пленки)
|
||||
var filter_uhf = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный)
|
||||
filter_uhf.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_uhf.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter_uhf.order = 10; //порядок фильтра
|
||||
filter_uhf.frequency = 17500; //центральная частота полосового фильтра
|
||||
filter_uhf.width = 15000; //ширина полосы фильтра
|
||||
|
||||
var rms_uhf = gtl.add_value_rms(filter_uhf); //назначение переменной RMS
|
||||
var ampl_uhf = gtl.add_value_ampl(filter_uhf); //назначение переменной Amplitude
|
||||
rms_uhf.name = "RMS (uhf)" //присвоение имени RMS (uhf)
|
||||
rms_uhf.time = 0.5; //интервал расчета RMS (uhf)
|
||||
ampl_uhf.time = 0.5; //интервал расчета Amplitude (uhf)
|
||||
rms_uhf.avg_cnt = 4; //количество усреднений RMS (uhf)
|
||||
ampl_uhf.avg_cnt = 4; //количество усреднений Amplitude (uhf)
|
||||
|
||||
//Виброскорость в дипазоне 2-1000 Гц (вибромониторинг)
|
||||
var filter2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный)
|
||||
filter2_1000.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter2_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter2_1000.order = 10; //порядок фильтра
|
||||
filter2_1000.frequency = 501; //центральная частота полосового фильтра
|
||||
filter2_1000.width = 998; //ширина полосы фильтра
|
||||
var filter2_1000v = gtl.add_intg(filter2_1000); // интегрирование
|
||||
filter2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
|
||||
|
||||
var rms_v2 = gtl.add_value_rms(filter2_1000v); //назначение переменной RMS(V)
|
||||
rms_v2.name = "RMS(V) 2-1000 Гц" //присвоение имени RMS(V)
|
||||
rms_v2.time = 0.5; //интервал расчета RMS(V)
|
||||
rms_v2.avg_cnt = 4; //количество усреднений RMS(V)
|
||||
|
||||
//Виброскорость в дипазоне 10-1000 Гц (вибромониторинг)
|
||||
var filter10_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный)
|
||||
filter10_1000.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter10_1000.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter10_1000.order = 10; //порядок фильтра
|
||||
filter10_1000.frequency = 505; //центральная частота полосового фильтра
|
||||
filter10_1000.width = 990; //ширина полосы фильтра
|
||||
var filter10_1000v = gtl.add_intg(filter10_1000); // интегрирование
|
||||
filter10_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
|
||||
|
||||
var rms_v10 = gtl.add_value_rms(filter10_1000v); //назначение переменной RMS(V)
|
||||
rms_v10.name = "RMS(V) 10-1000 Гц" //присвоение имени RMS(V)
|
||||
rms_v10.time = 0.5; //интервал расчета RMS(V)
|
||||
rms_v10.avg_cnt = 4; //количество усреднений RMS(V)
|
||||
|
||||
//[Диагностика]
|
||||
gtl.diagnostic.interval = freq.time * freq.avg_cnt;
|
||||
let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала
|
||||
let acq_time = 0;
|
||||
|
||||
let canvas = gtl.plots.add("specs(A) dB");
|
||||
function diagnose() {
|
||||
switch (state) {
|
||||
case 0: // считаем частоту вращения и настраиваем спектры
|
||||
if (fnc.INSTABILITY() > fnc.tolerance()) {
|
||||
gtl.log.info("Критическая нестабильность частоты вращения, %", fnc.INSTABILITY() * 100);
|
||||
if (imp.INSTABILITY() > imp.tolerance()) {
|
||||
gtl.log.info("Критическая нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
|
||||
gtl.log.info("Результат:", "Диагностика прервана");
|
||||
//gtl.diagnostic.stop(); //принудительная остановка диагностики
|
||||
|
||||
|
@ -110,25 +149,60 @@ function diagnose() {
|
|||
gtl.results = __result;
|
||||
};
|
||||
|
||||
if (fnc.FREQ() <= fnc.FREQNESS()) {
|
||||
gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + fnc.FREQNESS());
|
||||
if (imp.FREQ() <= imp.FREQNESS()) {
|
||||
gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + imp.FREQNESS());
|
||||
};
|
||||
|
||||
case 1: //частота вращения фиксированная
|
||||
case 2: //частота вращения из поля INFO (виброметр)
|
||||
filter_spen.frequency = fnc.bpFreq(); //считаме фильтр для огибающей
|
||||
filter_spen.width = fnc.bpWidth(); //определяем ширину фильтра
|
||||
spen.frequency = fnc.specParams().frequency;
|
||||
spen.lines = fnc.specParams().lines;
|
||||
ausp.frequency = fnc.specParams().frequency;
|
||||
ausp.lines = fnc.specParams().lines;
|
||||
//установка стандартной ширины спектра огибающей и количества линий спектра
|
||||
spen.frequency = imp.standart_width(imp.spec_width().es);
|
||||
spen.lines = imp.standart_lines(imp.spec_lines());
|
||||
filter_spen.frequency = imp.filter_frequency();
|
||||
ausp.frequency = imp.standart_width(imp.spec_width().as1);
|
||||
//ausp.lines = imp.standart_lines();
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
let time = []; //массив времени набора данных
|
||||
time.push(ausp.acq_time);
|
||||
time.push(spen.acq_time);
|
||||
let max_acq = Math.max(...time);
|
||||
gtl.diagnostic.interval = max_acq;
|
||||
var acq_times = [];
|
||||
acq_times.push(ausp.acq_time);
|
||||
acq_times.push(spen.acq_time);
|
||||
acq_time = Math.max(...acq_times);
|
||||
|
||||
gtl.diagnostic.interval = acq_time;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
case 1: //частота вращения фиксированная
|
||||
//установка стандартной ширины спектра огибающей и количества линий спектра
|
||||
spen.frequency = imp.standart_width(imp.spec_width().es);
|
||||
spen.lines = imp.standart_lines(imp.spec_lines());
|
||||
filter_spen.frequency = imp.filter_frequency();
|
||||
ausp.frequency = imp.standart_width(imp.spec_width().as1);
|
||||
//ausp.lines = imp.standart_lines();
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
var acq_times = [];
|
||||
acq_times.push(ausp.acq_time);
|
||||
acq_times.push(spen.acq_time);
|
||||
acq_time = Math.max(...acq_times);
|
||||
|
||||
gtl.diagnostic.interval = acq_time;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
case 2: //частота вращения из поля INFO (виброметр)
|
||||
//установка стандартной ширины спектра огибающей и количества линий спектра
|
||||
spen.frequency = imp.standart_width(imp.spec_width().es);
|
||||
spen.lines = imp.standart_lines(imp.spec_lines());
|
||||
filter_spen.frequency = imp.filter_frequency();
|
||||
ausp.frequency = imp.standart_width(imp.spec_width().as1);
|
||||
//ausp.lines = imp.standart_lines();
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
var acq_times = [];
|
||||
acq_times.push(ausp.acq_time);
|
||||
acq_times.push(spen.acq_time);
|
||||
acq_time = Math.max(...acq_times);
|
||||
|
||||
gtl.diagnostic.interval = acq_time;
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
|
@ -138,52 +212,53 @@ function diagnose() {
|
|||
|
||||
//Вывод информации в лог
|
||||
//Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра
|
||||
var AQ = fnc.specSquare(ausp.data, ausp.frequency / 2, ausp.frequency);
|
||||
var AQ = imp.spec_square(ausp2.data, 800, ausp2.frequency);
|
||||
|
||||
gtl.log.info("Объект диагностики", options.rbModelName);
|
||||
gtl.log.info("Минимально необходимая частота вращения", fnc.FREQNESS());
|
||||
gtl.log.info("FREQ", fnc.FREQ());
|
||||
gtl.log.info("FTF", fnc.FTF());
|
||||
gtl.log.info("BPFO", fnc.BPFO());
|
||||
gtl.log.info("BPFI", fnc.BPFI());
|
||||
gtl.log.info("BSF", fnc.BSF());
|
||||
gtl.log.info("Коридор обнаружения гармоники", fnc.tolerance());
|
||||
gtl.log.info("Полосовой фильтр (расчетный)", filter_spen.frequency);
|
||||
gtl.log.info("Ширина фильтра", filter_spen.width);
|
||||
gtl.log.info("Граничная частота SPEN", spen.frequency);
|
||||
gtl.log.info("Количество линий SPEN", spen.lines);
|
||||
gtl.log.info("Разрешение SPEN", spen.resolution);
|
||||
gtl.log.info("Ширина AUSP", ausp.frequency);
|
||||
gtl.log.info("Объект диагностики", "Подшипник качения " + options.rbModelName);
|
||||
gtl.log.info("Минимально необходимая длительность сигнала", acq_time);
|
||||
gtl.log.info("FREQ", imp.FREQ());
|
||||
gtl.log.info("Минимально необходимая частота вращения", imp.FREQNESS());
|
||||
gtl.log.info("Площадь спектра", AQ);
|
||||
gtl.log.info("Нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
|
||||
gtl.log.info("FTF", imp.FTF());
|
||||
gtl.log.info("BPFO", imp.BPFO());
|
||||
gtl.log.info("BPFI", imp.BPFI());
|
||||
gtl.log.info("BSF", imp.BSF());
|
||||
gtl.log.info("Центральная частота полосового фильтра", filter_spen.frequency);
|
||||
gtl.log.info("Количество долей октавного фильтра", n);
|
||||
gtl.log.info("Коэффициент для октавного фильтра", kf);
|
||||
gtl.log.info("Граничная частота спектра", imp.spec_width().es);
|
||||
gtl.log.info("Расчетное количество линий", imp.spec_lines());
|
||||
gtl.log.info("Расчетное разрешение спектра", imp.spec_resolution());
|
||||
gtl.log.info("Расчетный коридор обнаружения, %", imp.tolerance() * 100);
|
||||
gtl.log.info("Стандартная граничная частота", spen.frequency);
|
||||
gtl.log.info("Стандартное кол-во линий", spen.lines);
|
||||
gtl.log.info("СКЗ(A) ВЧ вибрации", rms_spen.value);
|
||||
gtl.log.info("СКЗ(A) УВЧ вибрации", rms_uhf.value);
|
||||
gtl.log.info("ПФ(A) в ВЧ диапазоне", ampl_spen.value / rms_spen.value);
|
||||
gtl.log.info("ПФ(A) в УВЧ диапазоне", ampl_uhf.value / rms_uhf.value);
|
||||
gtl.log.info("СКЗ(V) 2-1000 Гц", rms_v2.value);
|
||||
gtl.log.info("СКЗ(V) 10-1000 Гц", rms_v10.value);
|
||||
|
||||
let spen_mx = mtx.rbMTX(spen, filter_spen, true);
|
||||
let spen_df = def.rbDefs(spen_mx, true);
|
||||
let ausp_mx = mtx.rbMTX(ausp, 0, true);
|
||||
|
||||
canvas.add(
|
||||
{
|
||||
color: ausp.color,
|
||||
name: ausp.name,
|
||||
x: ausp.resolution,
|
||||
y: ausp.data
|
||||
}
|
||||
); //рисуем спектр вибрации на плоскости
|
||||
|
||||
canvas.add(
|
||||
{
|
||||
color: spen.color,
|
||||
name: spen.name,
|
||||
x: spen.resolution,
|
||||
y: spen.data
|
||||
}
|
||||
); //рисуем спектр огибающей на плоскости
|
||||
let def = {};
|
||||
//var indx = 0;
|
||||
def["Биение вала"] = val.defect(); //indx (spen = 0, ausp = 0)
|
||||
def["Неоднородный радиальный натяг"] = in0.defect(); //indx (spen = 1, ausp = X)
|
||||
def["Износ наружного кольца"] = out0.defect(); //indx (spen = 2, ausp = X)
|
||||
def["Перекос наружного кольца"] = out1.defect(); //indx (spen = 3, ausp = X)
|
||||
def["Раковины на наружном кольце"] = out2.defect(); //indx (spen = 4, ausp = 1)
|
||||
def["Износ внутреннего кольца"] = in1.defect(); //indx (spen = 5, ausp = X)
|
||||
def["Раковины на внутреннем кольце"] = in2.defect(); //indx (spen = 6, ausp = 2)
|
||||
def["Износ тел качения и сепаратора"] = sep.defect(); //indx (spen = 7, ausp = X)
|
||||
def["Раковины и сколы на телах качения"] = rol.defect(); //indx (spen = 8, ausp = 3)
|
||||
|
||||
var res = {
|
||||
RMSA: rms_spen.value,
|
||||
RMSV: rms_v.value,
|
||||
PF: ampl_spen.value / rms_spen.value,
|
||||
RMS_V2: rms_v2.value,
|
||||
RMS_V10: rms_v10.value,
|
||||
SQR: AQ,
|
||||
matrix: spen_mx,
|
||||
defs: spen_df
|
||||
defects: def
|
||||
};
|
||||
|
||||
gtl.results = res;
|
||||
|
|
|
@ -1,266 +0,0 @@
|
|||
"use strict";
|
||||
var signals = gtl.options.record.signalsModel;
|
||||
var options = gtl.options;
|
||||
var record = gtl.options.record;
|
||||
var point = gtl.options.point;
|
||||
|
||||
var fnc = gtl.import("userFunctions.js");
|
||||
var def = gtl.import("sbDefs.js");
|
||||
|
||||
//настройки для датчика оборотов
|
||||
var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра
|
||||
filter_freq.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_freq.type = gtl.filter_iir.lowpass; //тип фильтра (ФНЧ)
|
||||
filter_freq.order = 8; //порядок фильтра
|
||||
filter_freq.frequency = 10; //граничная частота фильтра
|
||||
|
||||
//определение частоты вращения
|
||||
var freq = gtl.add_value_freq(filter_freq);
|
||||
freq.time = 1;
|
||||
freq.avg_cnt = 6;
|
||||
//gtl.diagnostic.interval = /*1*/10;
|
||||
|
||||
//[Блок настройки фильтрации]
|
||||
//фильтр для формирования спектра огибающей
|
||||
var filter_spen = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра
|
||||
filter_spen.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
filter_spen.order = 4; //порядок фильтра
|
||||
filter_spen.frequency = 8000; //центральная частота полосового фильтра
|
||||
filter_spen.width = 1840; //ширина полосы фильтра
|
||||
|
||||
//полосовой фильтр 10-10000 Гц
|
||||
var band10_10k = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра
|
||||
band10_10k.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
band10_10k.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
band10_10k.order = 10; //порядок фильтра
|
||||
band10_10k.frequency = 5005; //центральная частота полосового фильтра
|
||||
band10_10k.width = 9990; //ширина полосы фильтра
|
||||
|
||||
//полосовой фильтр 10-1000 Гц
|
||||
var band10_1k = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра
|
||||
band10_1k.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
band10_1k.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
|
||||
band10_1k.order = 10; //порядок фильтра
|
||||
band10_1k.frequency = 505; //центральная частота полосового фильтра
|
||||
band10_1k.width = 990; //ширина полосы фильтра
|
||||
|
||||
//интегратор
|
||||
var int = gtl.add_intg(band10_1k); //интегрирование сигнала виброускорения
|
||||
int.taps = 1; //степень интегрирования (скорость из ускорения - 1-нарное интегрирование)
|
||||
|
||||
//дополнительный ФВЧ от 10 Гц
|
||||
var hpf10 = gtl.add_filter_iir(int); //назначение переменной фильтра
|
||||
hpf10.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
hpf10.type = gtl.filter_iir.highpass; //тип фильтра (полосовой)
|
||||
hpf10.order = 10; //порядок фильтра
|
||||
hpf10.frequency = 10; //граничная частота полосового фильтра
|
||||
|
||||
//ФВЧ от 5000 Гц (эксцесс)
|
||||
var hpf5 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной фильтра
|
||||
hpf5.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
hpf5.type = gtl.filter_iir.highpass; //тип фильтра (полосовой)
|
||||
hpf5.order = 10; //порядок фильтра
|
||||
hpf5.frequency = 5000; //граничная частота полосового фильтра
|
||||
|
||||
//[Блок настройки спектров]
|
||||
//мониторинговый спектр виброускорения
|
||||
var ausp2 = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации
|
||||
ausp2.name = "AUSP[mon]"; //присвоение имени спектра
|
||||
ausp2.color = 0x0000ffff; //цвет линии спектра
|
||||
ausp2.frequency = 25600; //граничная частота спектра
|
||||
ausp2.lines = 1600; //разрешение спектра (количество линий)
|
||||
ausp2.average = 6; //количество усреднений
|
||||
//ausp2.overlap = 30; //коэффициент перекрытия
|
||||
ausp2.unit = gtl.spec.db; //отображение в дБ
|
||||
gtl.log.info("AUSP[mon]: время", ausp2.acq_time + " сек.");
|
||||
|
||||
//спектр виброускорения
|
||||
var ausp = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); //назначение переменной спектра вибрации
|
||||
ausp.name = "AUSP[A]"; //присвоение имени спектра
|
||||
ausp.color = 0x0000ff00; //цвет линии спектра
|
||||
ausp.frequency = 400; //граничная частота спектра
|
||||
ausp.lines = 400; //разрешение спектра (количество линий)
|
||||
ausp.average = 6; //количество усреднений
|
||||
ausp.overlap = .30; //коэффициент перекрытия
|
||||
ausp.unit = gtl.spec.db; //отображение в дБ
|
||||
ausp.smoothing_factor = 50; //коэффициент сглаживания (средней линии)
|
||||
ausp.smoothed_line_color = 0x000000ff; //цвет линии сглаживания (средней линии)
|
||||
ausp.peak_level = 20; //порог обнаружения гармоник
|
||||
ausp.harm_tolerance = ausp.resolution * 4; //диапазон поиска гармоник +/-
|
||||
gtl.log.info("AUSP[A]: время", ausp.acq_time + " сек.");
|
||||
|
||||
//спектр огибающей виброускорения
|
||||
var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей
|
||||
spen.name = "SPEN[A]"; //присвоение имени спектра огибающей
|
||||
spen.color = 0x00ff0000; //цвет линии спектра огибающей
|
||||
spen.frequency = 400; //граничная частота спектра огибающей
|
||||
spen.lines = 400; //разрешение спектра огибающей (количество линий)
|
||||
spen.average = 8; //количество усреднений
|
||||
spen.overlap = .30; //коэффициент перекрытия
|
||||
spen.unit = gtl.spec.db; //отображение в дБ
|
||||
spen.window = gtl.spec.hann; //окно
|
||||
spen.smoothing_factor = 50; //коэффициент сглаживания (средней линии)
|
||||
spen.smoothed_line_color = 0x000000ff; //цвет средней линии
|
||||
spen.peak_level = 10; //порог обнаружения гармоник
|
||||
spen.harm_tolerance = spen.resolution * 4; //диапазон поиска гармоник +/-
|
||||
gtl.log.info("SPEN[A]: время", spen.acq_time + " сек.");
|
||||
|
||||
//спектр виброскорости
|
||||
var ausp_v = gtl.add_ausp(hpf10); //назначение переменной спектра вибрации
|
||||
ausp_v.name = "AUSP[V]"; //присвоение имени спектра
|
||||
ausp_v.color = 0x6A5ACD; //цвет линии спектра
|
||||
ausp_v.frequency = 1000; //граничная частота спектра
|
||||
ausp_v.lines = 500; //разрешение спектра (количество линий)
|
||||
ausp_v.average = 6; //количество усреднений
|
||||
//ausp_v.overlap = 30; //коэффициент перекрытия
|
||||
ausp_v.unit = gtl.spec.unit; //отображение в дБ
|
||||
ausp_v.smoothing_factor = 50; //коэффициент сглаживания (средней линии)
|
||||
ausp_v.smoothed_line_color = 0x000000ff; //цвет линии сглаживания (средней линии)
|
||||
ausp_v.peak_level = 0.0005; //порог обнаружения гармоник
|
||||
ausp_v.harm_tolerance = ausp_v.resolution * 4; //диапазон поиска гармоник +/-
|
||||
gtl.log.info("AUSP[V]: время", ausp_v.acq_time + " сек.");
|
||||
|
||||
//RMS виброускорения в диапазоне спектра огибающей (контроль работы сил трения)
|
||||
var rms_spen = gtl.add_value_rms(filter_spen); //назначение переменной RMS (spen)
|
||||
rms_spen.name = "RMS (spen)" //присвоение имени RMS (spen)
|
||||
rms_spen.time = 0.5; //интервал расчета RMS (spen)
|
||||
rms_spen.avg_cnt = 4; //количество усреднений RMS (spen)
|
||||
|
||||
//RMS виброускорения в диапазоне 10-1000 Гц
|
||||
var rms_a = gtl.add_value_rms(band10_10k); //назначение переменной RMS (spen)
|
||||
rms_a.name = "RMS (a)" //присвоение имени RMS (spen)
|
||||
rms_a.time = 0.5; //интервал расчета RMS (spen)
|
||||
rms_a.avg_cnt = 4; //количество усреднений RMS (spen)
|
||||
|
||||
//RMS виброскорости в диапазоне 10-1000 Гц
|
||||
var rms_v = gtl.add_value_rms(hpf10); //объявление переменной СКЗ
|
||||
rms_v.time = 0.5; //время выборки
|
||||
rms_v.avg_cnt = 4; //количество усреднений
|
||||
|
||||
//коэффициент эксцесса в диапазоне от 5000 Гц
|
||||
var kurt = gtl.add_value_kurt(hpf5); //объявление переменной частоты вращения
|
||||
kurt.time = 0.5; //время выборки
|
||||
kurt.avg_cnt = 4; //количество усреднений
|
||||
|
||||
//коэффициент эксцесса огибающей сигнала
|
||||
var kurt_spen = gtl.get_kurt_value(spen.env);
|
||||
|
||||
//[Диагностика]
|
||||
gtl.diagnostic.interval = freq.time * freq.avg_cnt;
|
||||
let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала
|
||||
|
||||
let canvas = gtl.plots.add("specs(A) dB");
|
||||
let canvas2 = gtl.plots.add("specs(V) мм/с");
|
||||
function diagnose() {
|
||||
switch (state) {
|
||||
case 0: // считаем частоту вращения и настраиваем спектры
|
||||
if (fnc.INSTABILITY() > fnc.tolerance()) {
|
||||
gtl.log.info("Критическая нестабильность частоты вращения, %", fnc.INSTABILITY() * 100);
|
||||
gtl.log.info("Результат:", "Диагностика прервана");
|
||||
//gtl.diagnostic.stop(); //принудительная остановка диагностики
|
||||
|
||||
let __result = {
|
||||
Result: false
|
||||
};
|
||||
gtl.results = __result;
|
||||
};
|
||||
|
||||
if (fnc.FREQ() <= fnc.FREQNESS()) {
|
||||
gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + fnc.FREQNESS());
|
||||
};
|
||||
|
||||
case 1: //частота вращения фиксированная
|
||||
case 2: //частота вращения из поля INFO (виброметр)
|
||||
filter_spen.frequency = fnc.bpFreq(); //считаем фильтр для огибающей
|
||||
filter_spen.width = fnc.bpWidth(); //определяем ширину фильтра
|
||||
spen.frequency = fnc.specParams().frequency;
|
||||
spen.lines = fnc.specParams().lines * 2;
|
||||
ausp.frequency = fnc.specParams().frequency;
|
||||
ausp.lines = fnc.specParams().lines * 2;
|
||||
ausp_v.frequency = fnc.specParams().frequency;
|
||||
ausp_v.lines = fnc.specParams().lines * 2;
|
||||
|
||||
//определение минимально необходимой длительности сигнала для проведения диагностики
|
||||
let time = []; //массив времени набора данных
|
||||
time.push(ausp2.acq_time);
|
||||
time.push(ausp.acq_time);
|
||||
time.push(spen.acq_time);
|
||||
time.push(ausp_v.acq_time);
|
||||
let max_acq = Math.max(...time);
|
||||
gtl.diagnostic.interval = max_acq;
|
||||
gtl.log.info("Массив времени набора данных:", time);
|
||||
state = 3;
|
||||
break;
|
||||
|
||||
case 3: //выполняем анализ спектов
|
||||
ausp.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре вибрации
|
||||
spen.clear_harms_sets(); //сброс отрисовки набора гармоник в спектре огибающей
|
||||
|
||||
//Вывод информации в лог
|
||||
//Расчет площади спектра вибрации: спектр, начало отсчета в Гц, граничная частота спектра
|
||||
var SQR_spen = fnc.specSquare(spen.base, 0, spen.frequency);
|
||||
|
||||
gtl.log.info("Объект диагностики", options.rbModelName);
|
||||
gtl.log.info("SPEN: Расчетная частота полосового фильтра", filter_spen.frequency);
|
||||
gtl.log.info("SPEN: Ширина фильтра", filter_spen.width);
|
||||
gtl.log.info("SPEN: Граничная частота", spen.frequency);
|
||||
gtl.log.info("SPEN: Количество линий", spen.lines);
|
||||
gtl.log.info("SPEN: Разрешение", spen.resolution);
|
||||
gtl.log.info("AUSP: Граничная частота", ausp.frequency);
|
||||
gtl.log.info("AUSP: Количество линий", ausp.lines);
|
||||
gtl.log.info("AUSP: Разрешение", ausp.resolution);
|
||||
|
||||
gtl.log.info("RMS виброускорения в диапазоне огибающей", rms_spen.value);
|
||||
gtl.log.info("RMS виброускорения в диапазоне 10-10000 Гц", rms_a.value);
|
||||
gtl.log.info("RMS виброскорости в диапазоне 10-1000 Гц", 1000 * rms_v.value);
|
||||
gtl.log.info("Площадь под огибающей", SQR_spen);
|
||||
gtl.log.info("Эксцесс от 5 кГц", kurt.value);
|
||||
gtl.log.info("Эксцесс по огибающей сигнала", kurt_spen.value);
|
||||
|
||||
var defects = def.defects();
|
||||
|
||||
canvas.add(
|
||||
{
|
||||
color: ausp.color,
|
||||
name: ausp.name,
|
||||
x: ausp.resolution,
|
||||
y: ausp.data
|
||||
}
|
||||
); //рисуем спектр вибрации на плоскости
|
||||
|
||||
canvas.add(
|
||||
{
|
||||
color: spen.color,
|
||||
name: spen.name,
|
||||
x: spen.resolution,
|
||||
y: spen.data
|
||||
}
|
||||
); //рисуем спектр огибающей на плоскости
|
||||
|
||||
canvas2.add(
|
||||
{
|
||||
color: ausp_v.color,
|
||||
name: ausp_v.name,
|
||||
x: ausp_v.resolution,
|
||||
y: ausp_v.data
|
||||
}
|
||||
); //рисуем спектр виброскорости на плоскости
|
||||
|
||||
let __result = {
|
||||
RMS: rms_spen.value,
|
||||
RMSA: rms_a.value,
|
||||
RMSV: 1000 * rms_v.value,
|
||||
SQR: SQR_spen,
|
||||
Kurt: kurt.value,
|
||||
Kurt_spen: "Нет данных"
|
||||
};
|
||||
|
||||
gtl.results = __result;
|
||||
gtl.diagnostic.stop();
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
99
spmMethod.js
99
spmMethod.js
|
@ -1,99 +0,0 @@
|
|||
"use strict";
|
||||
var signals = gtl.options.record.signalsModel;
|
||||
var options = gtl.options;
|
||||
var record = gtl.options.record;
|
||||
var point = gtl.options.point;
|
||||
|
||||
let __mes = gtl.import("userFunctions.js");
|
||||
let spmClass = gtl.import("spmClass.js").spmClass;
|
||||
|
||||
let __frq = __mes.getFreq(
|
||||
/*{
|
||||
src: gtl.analog_inputs[signals[0].portNumber], //источник сигнала частоты вращения
|
||||
freq: 10, //граничная частота фильтрации сигнала
|
||||
time: 1, //интервал измерения частоты вращения
|
||||
avg: 4, //количество отсчетов для усреднения
|
||||
dc: -0.05 //порог срабатывания счетчика
|
||||
}*/
|
||||
).value; //получаем частоту вращения
|
||||
|
||||
//фильтр для формирования сигнала
|
||||
let __fltr = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
|
||||
__fltr.kind = gtl.filter_iir.butterworth; //тип окна
|
||||
__fltr.type = gtl.filter_iir.bandpass; //тип фильтра (ФНЧ)
|
||||
__fltr.order = 10; //порядок фильтра
|
||||
__fltr.frequency = 32000; //центральная частота полосового фильтра
|
||||
__fltr.width = 7360; //ширина полосового фильтра
|
||||
|
||||
//формирование амплитуд для расчета коврового уровня dBc (за 200 импульсов в сек)
|
||||
let __cpt = gtl.add_value_ampl(__fltr);
|
||||
__cpt.name = "Ковровый уровень";
|
||||
__cpt.color = 0x2B6CC4;
|
||||
__cpt.time = 0.005; //время выборки
|
||||
__cpt.avg_cnt = 200; //количество отсчетов
|
||||
|
||||
//формирование амплитуд для расчета максимального уровня dBm (максимум за 2 сек)
|
||||
let __max = gtl.add_value_ampl(__fltr);
|
||||
__max.name = "SPM импульсы";
|
||||
__max.color = 0x2B6CC4;
|
||||
__max.time = 0.001; //время выборки
|
||||
__max.avg_cnt = 2000; //количество отсчетов
|
||||
|
||||
let __imp = gtl.create_moving_max(
|
||||
{
|
||||
src: __fltr,
|
||||
name: "SPM форма",
|
||||
time: 0.001
|
||||
}
|
||||
); //формируем сигнал максимальных амплитуд для построения спектра
|
||||
|
||||
let spen = __mes.getSpen(
|
||||
{
|
||||
src: __imp, //источник сигнала
|
||||
name: "SPM спектр огибающей", //имя спектра
|
||||
color: 0x00ff0000, //цвет в формате HEX
|
||||
frequency: 200, //граничная частота
|
||||
resolution: 0.25, //частотное разрешение
|
||||
average: 8, //количество усреднений
|
||||
view: gtl.spec.db, //единицы отображения (дБ)
|
||||
level: 5 //уровень обнаружения гармоник в дБ
|
||||
}
|
||||
); //вычисляем спектр огибающей пиковой формы
|
||||
|
||||
let canvas1 = gtl.plots.add("Spectral");
|
||||
|
||||
//[Диагностика]
|
||||
gtl.diagnostic.interval = gtl.acq_time;
|
||||
function diagnose() {
|
||||
|
||||
let __spm = new spmClass(
|
||||
{
|
||||
src1: __cpt, //объект с массивом данных для расчета коврового уровня
|
||||
src2: __max, //объект с массивом данных определения маскимума импульсов
|
||||
freq: __frq, //частота вращения
|
||||
d_inner: options.rbInnerD, //диаметр внутреннего кольца подшипника
|
||||
visible: true
|
||||
}
|
||||
);
|
||||
|
||||
let __spen_tools = __mes.createTools(
|
||||
{
|
||||
spec: spen, //спектр для построения модели (объект)
|
||||
//set: __set, //источник данных для построения частотных линий
|
||||
tol: 1 //коридор обнаружения гармоники на портрете, %
|
||||
}
|
||||
); //формируем компоненты и частотные линии на спектре огибающей
|
||||
|
||||
canvas1.add(
|
||||
{
|
||||
color: spen.color,
|
||||
name: spen.name,
|
||||
x: spen.resolution,
|
||||
y: spen.data,
|
||||
spec_tools: __spen_tools.to_json()
|
||||
}
|
||||
); //рисуем спектр огибающей spm
|
||||
|
||||
gtl.results = __spm.getResult();
|
||||
gtl.diagnostic.stop();
|
||||
};
|
|
@ -0,0 +1,305 @@
|
|||
//параметры подшипника качения
|
||||
var rbModelName = options.rbModelName || "No Name";
|
||||
var rbVendor = options.rbVendor || "No Vendor";
|
||||
var d_inner = options.rbInnerD || 0; //диаметр внутреннего кольца
|
||||
var d_outer = options.rbOuterD || 0; //диаметр наружного кольца
|
||||
var d_roller = options.rbRollerD || 0; //диаметр тела качения
|
||||
var z = options.rbRollerCount || 0; //количество тел качения
|
||||
var angle = (options.rbAngle * 3.1415926) / 180 || 0; //угол контакта тел качения (рад.)
|
||||
var d_cage = (d_inner + d_outer) / 2; // диаметр сепаратора (средний диаметр)
|
||||
|
||||
//параметры редуктора
|
||||
var gtZ1 = options.gtZ1 || 0; //количество зубьев шестерни
|
||||
var gtZ2 = options.gtZ2 || 0; //количество зубьев зубчатого колеса
|
||||
|
||||
//параметры ременной передачи
|
||||
var bdD1 = options.bdD1 || 0; //диаметр ведущего шкива
|
||||
var bdD2 = options.bdD2 || 0; //диаметр ведомого шкива
|
||||
var bdL = options.bdL || 0; //длинна ремня
|
||||
|
||||
//параметры зубчатой ременной передачи
|
||||
var cbdZ1 = options.cbdZ1 || 0; //количество зубьев ведущего шкива
|
||||
var cbdZ2 = options.cbdZ2 || 0; //количество зубьев ведомого шкива
|
||||
var cbdZ3 = options.cbdZ3 || 0; //количество зубьев ремня
|
||||
|
||||
//параметры насоса
|
||||
var pmBlades = options.pmBlades || 0; //количество лопастей насосного колеса
|
||||
|
||||
//параметры планетарной передачи
|
||||
var pgZ1 = options.pgZ1 || 0; //количество зубьев солнца
|
||||
var pgZ2 = options.pgZ2 || 0; //количество зубьев саттелитов
|
||||
var pgZ3 = options.pgZ3 || 0; //количество зубьев короны
|
||||
var pgN = options.pgN || 0; //количество саттелитов
|
||||
|
||||
//параметры турбины
|
||||
var trBlades = options.trBlades || 0; //количество лопастей крыльчатки турбины
|
||||
|
||||
//параметры электродвигателя
|
||||
//var trBlades = options.trBlades || 0; //количество лопастей крыльчатки турбины
|
||||
|
||||
export function FREQ() {
|
||||
let FR = 0;
|
||||
switch (record.tachoOptions.tachoState) {
|
||||
case 0:
|
||||
FR = freq.value * options.tachoRatio;
|
||||
break;
|
||||
case 1:
|
||||
FR = record.tachoOptions.tachoValue * options.tachoRatio;
|
||||
break;
|
||||
case 2:
|
||||
FR = record.tachoOptions.tachoFromInfo * options.tachoRatio;
|
||||
break;
|
||||
}; return FR;
|
||||
}; //определение частоты вращения в зависимости от источника тахо сигнала (FREQ)
|
||||
|
||||
export function INSTABILITY() {
|
||||
let freq_max = Math.max(...freq.values);
|
||||
let freq_min = Math.min(...freq.values);
|
||||
let instability = (freq_max - freq_min) / freq.value;
|
||||
return instability;
|
||||
}; //нестабильность частоты вращения в %
|
||||
|
||||
//определение вспомогательных коэффициентов k1 и k2 для подшипников качения
|
||||
var k1 = 0.5 * (1 - (d_roller / d_cage) * Math.cos(angle));
|
||||
var k2 = 0.5 * (1 + (d_roller / d_cage) * Math.cos(angle));
|
||||
|
||||
export function FREQNESS() {
|
||||
let R = (d_inner / 2) + (d_roller / 2); //расстояние до центра тяжести тела качения
|
||||
let freqness = (Math.sqrt(9.81 / (4 * (Math.PI ** 2) * R / 1000))) / k1;
|
||||
return freqness;
|
||||
}; //минимально необходимая частота вращения для компенсации силы тяжести центробежной силой
|
||||
|
||||
export function FTF() { return k1 * FREQ(); }; //частота вращения сепаратора (FTF)
|
||||
export function BPFO() { return k1 * FREQ() * z; }; //частота перекатывания тел качения по наружному кольцу (BPFO)
|
||||
export function BPFI() { return k2 * FREQ() * z; }; //частота перекатывания тел качения по внутреннему кольцу (BPFI)
|
||||
export function BSF() { return 2 * FREQ() * (d_cage / d_roller) * k1 * k2; }; //частота вращения (контакта) тел качения (BSF)
|
||||
|
||||
export function BDF2() { return FREQ() * (bdD1 / bdD2) }; //частота вращения ведомого шкива
|
||||
export function BDFB() { return FREQ() * (Math.PI * bdD1 / bdL) }; //частота вращения ремня
|
||||
|
||||
export function CBFZ() { return FREQ() * cbdZ1; }; //зубцовая частота
|
||||
export function CBDF2() { return FREQ() * (cbdZ1 / cbdZ2) }; //частота вращения ведомого шкива
|
||||
export function CBDFB() { return FREQ() * (cbdZ1 / cbdZ3) }; //частота вращения ремня
|
||||
|
||||
export function PMFBLD() { return FREQ() * pmBlades; }; //лопастная частота
|
||||
|
||||
export function GTFZ() { return FREQ() * gtZ1; }; //зубцовая частота
|
||||
export function GTF2() { return FREQ() * (gtZ1 / gtZ2); }; //частота вращения второго вала редуктора
|
||||
|
||||
export function PGF2() { return (0.5 * FREQ() * pgZ1) / (pgZ1 + pgZ2); }; //частота вращения выходного вала планетарной передачи
|
||||
export function PGFSAT() { return (0.5 * FREQ()) * (pgZ1 / pgZ2) * ((pgZ1 + 2 * pgZ2) / (pgZ1 + pgZ2)); }; //частота вращения саттелита
|
||||
export function PGFZ() { return pgZ2 * PGFSAT() }; //зубцовая частота
|
||||
|
||||
export function TRFBLD() { return FREQ() * trBlades; }; //лопастная частота
|
||||
|
||||
export function filter_frequency() {
|
||||
let filter = 6013.41 * Math.log(0.266935 * imp.FREQ() + 1.1201);
|
||||
return filter;
|
||||
}; //расчетная центральная частота полосового фильтра для спектра огибающей
|
||||
|
||||
export function filter_width(number) {
|
||||
let n = 3;
|
||||
if (number != null) {n = number};
|
||||
let kf = (2 ** (1 / n) - 1) / ((2 ** (1 / n)) ** (1 / 2)); //коэффициент для полосового фильтра
|
||||
let width = kf * filter_frequency();
|
||||
return width;
|
||||
}; //ширина фильтра спектра огибающей
|
||||
|
||||
export function spec_width() {
|
||||
let flim = {};
|
||||
switch (options.objectType) {
|
||||
case 0: //объект не выбран
|
||||
break;
|
||||
case 1: //подшипник скольжения
|
||||
flim = {
|
||||
as0: 1600,
|
||||
as1: 800,
|
||||
es: 20 * FREQ()
|
||||
};
|
||||
break;
|
||||
case 2: //подшипник качения
|
||||
flim = {
|
||||
as0: 1600,
|
||||
as1: 800,
|
||||
es: 3 * BPFI() + 4 * FREQ()
|
||||
};
|
||||
break;
|
||||
case 3: //ШВП
|
||||
break;
|
||||
case 4: //редуктор
|
||||
flim = {
|
||||
as0: 1600,
|
||||
as1: 800,
|
||||
es: 3 * GTFZ() + 4 * FREQ()
|
||||
};
|
||||
break;
|
||||
case 5: //ременная передача
|
||||
break;
|
||||
case 6: //зубчатый ремень
|
||||
break;
|
||||
case 7: //помпа
|
||||
flim = {
|
||||
as0: 1600,
|
||||
as1: 800,
|
||||
es: 3 * PMFBLD() + 4 * FREQ()
|
||||
};
|
||||
break;
|
||||
case 8: //планетарый редуктор
|
||||
flim = {
|
||||
as0: 1600,
|
||||
as1: 800,
|
||||
es: 3 * PGFZ() + 4 * FREQ()
|
||||
};
|
||||
break;
|
||||
case 9: //турбина
|
||||
flim = {
|
||||
as0: 1600,
|
||||
as1: 800,
|
||||
es: 3 * TRFBLD() + 4 * FREQ()
|
||||
};
|
||||
break;
|
||||
case 10: //электродвигатель
|
||||
break;
|
||||
}; return flim;
|
||||
}; //ширина спектров вибрации
|
||||
|
||||
export function spec_resolution() {
|
||||
let res = 0;
|
||||
switch (options.objectType) {
|
||||
case 0: //объект не выбран
|
||||
break;
|
||||
case 1: //подшипник скольжения
|
||||
res = FREQ() / 8;
|
||||
break;
|
||||
case 2: //подшипник качения
|
||||
res = FREQ() / 8;
|
||||
break;
|
||||
case 3: //ШВП
|
||||
break;
|
||||
case 4: //редуктор
|
||||
res = FREQ() / 8;
|
||||
break;
|
||||
case 5: //ременная передача
|
||||
res = BDFB() / 4;
|
||||
break;
|
||||
case 6: //зубчатый ремень
|
||||
res = CBDFB() / 4;
|
||||
break;
|
||||
case 7: //помпа
|
||||
res = FREQ() / 8;
|
||||
break;
|
||||
case 8: //планетарый редуктор
|
||||
res = PGF2() / 8;
|
||||
break;
|
||||
case 9: //турбина
|
||||
res = FREQ() / 8;
|
||||
break;
|
||||
case 10: //электродвигатель
|
||||
break;
|
||||
}; return res;
|
||||
}; //частотное разрешение (разделение двух гармоник с минимальной частотой)
|
||||
|
||||
export function spec_lines() { return spec_width().es / spec_resolution(); }; //минимальное количество линий спектра
|
||||
|
||||
export function tolerance() {
|
||||
let tol = 0;
|
||||
switch (options.objectType) {
|
||||
case 0: //объект не выбран
|
||||
break;
|
||||
case 1: //подшипник скольжения
|
||||
break;
|
||||
case 2: //подшипник качения
|
||||
tol = (2 * FTF()) / (5 * BPFO());
|
||||
break;
|
||||
case 3: //ШВП
|
||||
break;
|
||||
case 4: //редуктор
|
||||
tol = (2 * FREQ()) / (5 * GTFZ());
|
||||
break;
|
||||
case 5: //ременная передача
|
||||
break;
|
||||
case 6: //зубчатый ремень
|
||||
break;
|
||||
case 7: //помпа
|
||||
break;
|
||||
case 8: //планетарый редуктор
|
||||
tol = (2 * PGF2()) / (5 * PGFZ());
|
||||
break;
|
||||
case 9: //турбина
|
||||
break;
|
||||
case 10: //электродвигатель
|
||||
break;
|
||||
}; return tol;
|
||||
}; //максимальный коридор обнаружения гармоник (tolerance)
|
||||
|
||||
export function standart_width(width) {
|
||||
let STFRQ = 0;
|
||||
switch (true) {
|
||||
case width <= 50:
|
||||
STFRQ = 50;
|
||||
break;
|
||||
case width <= 100:
|
||||
STFRQ = 100;
|
||||
break;
|
||||
case width <= 200:
|
||||
STFRQ = 200;
|
||||
break;
|
||||
case width <= 400:
|
||||
STFRQ = 400;
|
||||
break;
|
||||
case width <= 800:
|
||||
STFRQ = 800;
|
||||
break;
|
||||
default:
|
||||
STFRQ = 1600;
|
||||
break;
|
||||
}; return STFRQ;
|
||||
}; //стандартная ширина спектра
|
||||
|
||||
export function standart_lines(lines) {
|
||||
let STLNS = 0;
|
||||
switch (true) {
|
||||
case lines <= 200:
|
||||
STLNS = 200;
|
||||
break;
|
||||
case lines <= 400:
|
||||
STLNS = 400;
|
||||
break;
|
||||
case lines <= 800:
|
||||
STLNS = 800;
|
||||
break;
|
||||
case lines <= 1600:
|
||||
STLNS = 1600;
|
||||
break;
|
||||
default:
|
||||
STLNS = 3200;
|
||||
break;
|
||||
}; return STLNS;
|
||||
}; //стандартное количество линий спектра
|
||||
|
||||
export function spec_square(data, bnd, frq) {
|
||||
let lines = data.length; //определение количества линий спектра вибрации
|
||||
let res = frq / lines; //определение частотного разрешения спектра вибрации (основание прямоугольной трапеции)
|
||||
let start = 1; //переменная для определения стартового индекса в массиве
|
||||
let S = 0; //переменная расчетной площади спектра вибрации
|
||||
if (bnd !== 0) { start = lines - Math.round((frq - bnd) / res) }; //начальная точка отсчета в массиве (стартовый индекс)
|
||||
for (let i = start - 1; i <= lines - 2; i++) { S = S + res * ((data[i] + data[i + 1]) / 2) }; //вычисляем площадь спектра вибрации
|
||||
return S;
|
||||
}; //определение площади спектра
|
||||
|
||||
export function mod_factor(ampl, base) {
|
||||
let dl = (ampl - base); //разность уровней гармонической и случайной составляющей вибрации
|
||||
let df = spec_resolution() / filter_width(); //отношение ширины фильтра к частотному разрешению спектра
|
||||
let mod = Math.sqrt((10 ** (dl / 10) - 1) * df);
|
||||
return mod;
|
||||
}; //определение условной глубины модуляции
|
||||
|
||||
export function deep_factor(ampl, base) {
|
||||
let deep = (ampl - base) / (ampl + base) * 100;
|
||||
return deep;
|
||||
}; //определение условной глубины модуляции
|
||||
|
||||
export function ampl_factor(ampl, base) {
|
||||
let crest = ampl / base;
|
||||
return crest;
|
||||
}; //определение амплитудного коэффициента
|
576
userFunctions.js
576
userFunctions.js
|
@ -1,576 +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 freqIstab(src) {
|
||||
let __max = Math.max(...src.values);
|
||||
let __min = Math.min(...src.values);
|
||||
let __instab = (__max - __min) / src.value;
|
||||
return __instab;
|
||||
}; //нестабильность частоты вращения в %
|
||||
|
||||
//параметры подшипника качения
|
||||
var rbModelName = options.rbModelName || "No Name";
|
||||
var rbVendor = options.rbVendor || "No Vendor";
|
||||
var rb_inner = options.rbInnerD || 0; //диаметр внутреннего кольца
|
||||
var rb_outer = options.rbOuterD || 0; //диаметр наружного кольца
|
||||
var rb_roller = options.rbRollerD || 0; //диаметр тела качения
|
||||
var rb_rollerCount = options.rbRollerCount || 0; //количество тел качения
|
||||
var rb_angle = (options.rbAngle * Math.PI) / 180 || 0; //угол контакта тел качения (рад.)
|
||||
var rb_cage = (rb_inner + rb_outer) / 2; //диаметр сепаратора (средний диаметр)
|
||||
|
||||
//определение вспомогательных коэффициентов k1 и k2 для подшипников качения
|
||||
let rb_k1 = 0.5 * (1 - (rb_roller / rb_cage) * Math.cos(rb_angle));
|
||||
let rb_k2 = 0.5 * (1 + (rb_roller / rb_cage) * Math.cos(rb_angle));
|
||||
export function FREQ(freq) { return freq }; //частота вращения
|
||||
export function FTF(freq) { return rb_k1 * freq }; //частота вращения сепаратора (FTF)
|
||||
export function BPFO(freq) { return rb_k1 * freq * rb_rollerCount }; //частота перекатывания тел качения по наружному кольцу (BPFO)
|
||||
export function BPFI(freq) { return rb_k2 * freq * rb_rollerCount }; //частота перекатывания тел качения по внутреннему кольцу (BPFI)
|
||||
export function BSF(freq) { return 2 * freq * (rb_cage / rb_roller) * rb_k1 * rb_k2 }; //частота вращения (контакта) тел качения (BSF)
|
||||
export function freqNess() {
|
||||
let R = (rb_inner / 2) + (rb_roller / 2); //расстояние до центра тяжести тела качения
|
||||
let __fness = (Math.sqrt(9.81 / (4 * (Math.PI ** 2) * R / 1000))) / rb_k1;
|
||||
return __fness;
|
||||
}; //минимально необходимая частота вращения для компенсации силы тяжести центробежной силой
|
||||
|
||||
//параметры ШВП
|
||||
var bsModelName = options.bsModelName || "No Name";
|
||||
var bsVendor = options.bsVendor || "No Vendor";
|
||||
var bs_inner = options.bsInnerD || 0; //диаметр внутреннего кольца
|
||||
var bs_outer = options.bsOuterD || 0; //диаметр наружного кольца
|
||||
var bs_roller = options.bsRollerD || 0; //диаметр тела качения
|
||||
var bs_rollerCount = options.bsRollerCount || 0; //количество тел качения
|
||||
var bs_angle = (options.bsAngle * Math.PI) / 180 || 0; //угол контакта тел качения (рад.)
|
||||
var bs_cage = (bs_inner + bs_outer) / 2; //средний диаметр
|
||||
|
||||
//определение вспомогательных коэффициентов k1 и k2 для ШВП
|
||||
let bs_k1 = 0.5 * (1 - (bs_roller / bs_cage) * Math.cos(bs_angle));
|
||||
let bs_k2 = 0.5 * (1 + (bs_roller / bs_cage) * Math.cos(bs_angle));
|
||||
export function BSFTF(freq) { return bs_k1 * freq }; //частота вращения сепаратора (перемещения тел качения)
|
||||
export function BSNUT(freq) { return bs_k1 * freq * bs_rollerCount }; //частота перекатывания тел качения по гайке
|
||||
export function BSSCR(freq) { return bs_k2 * freq * bs_rollerCount }; //частота перекатывания тел качения по винту
|
||||
export function BSBAL(freq) { return 2 * freq * (bs_cage / bs_roller) * bs_k1 * bs_k2 }; //частота вращения (контакта) тел качения
|
||||
|
||||
//параметры редуктора
|
||||
var gtZ1 = options.gtZ1 || 0; //количество зубьев шестерни
|
||||
var gtZ2 = options.gtZ2 || 0; //количество зубьев зубчатого колеса
|
||||
export function GTFZ(freq) { return freq * gtZ1 }; //зубцовая частота
|
||||
export function GTF2(freq) { return freq * (gtZ1 / gtZ2) }; //частота вращения второго вала редуктора
|
||||
|
||||
//параметры ременной передачи
|
||||
var bdD1 = options.bdD1 || 0; //диаметр ведущего шкива
|
||||
var bdD2 = options.bdD2 || 0; //диаметр ведомого шкива
|
||||
var bdL = options.bdL || 0; //длинна ремня
|
||||
export function BDF2(freq) { return freq * (bdD1 / bdD2) }; //частота вращения ведомого шкива
|
||||
export function BDFB(freq) { return freq * (Math.PI * bdD1 / bdL) }; //частота вращения ремня
|
||||
|
||||
//параметры зубчатой ременной передачи
|
||||
var cbdZ1 = options.cbdZ1 || 0; //количество зубьев ведущего шкива
|
||||
var cbdZ2 = options.cbdZ2 || 0; //количество зубьев ведомого шкива
|
||||
var cbdZ3 = options.cbdZ3 || 0; //количество зубьев ремня
|
||||
export function CBFZ(freq) { return freq * cbdZ1 }; //зубцовая частота
|
||||
export function CBDF2(freq) { return freq * (cbdZ1 / cbdZ2) }; //частота вращения ведомого шкива
|
||||
export function CBDFB(freq) { return freq * (cbdZ1 / cbdZ3) }; //частота вращения ремня
|
||||
|
||||
//параметры насоса
|
||||
var pmBlades = options.pmBlades || 0; //количество лопастей насосного колеса
|
||||
export function PMFBLD(freq) { return freq * pmBlades }; //лопастная частота
|
||||
|
||||
//параметры планетарной передачи
|
||||
var pgZ1 = options.pgZ1 || 0; //количество зубьев солнца
|
||||
var pgZ2 = options.pgZ2 || 0; //количество зубьев саттелитов
|
||||
var pgZ3 = options.pgZ3 || 0; //количество зубьев короны
|
||||
var pgN = options.pgN || 0; //количество саттелитов
|
||||
export function PGF2(freq) { return (0.5 * freq * pgZ1) / (pgZ1 + pgZ2) }; //частота вращения выходного вала планетарной передачи
|
||||
export function PGFSAT(freq) { return (0.5 * freq) * (pgZ1 / pgZ2) * ((pgZ1 + 2 * pgZ2) / (pgZ1 + pgZ2)) }; //частота вращения саттелита
|
||||
export function PGFZ(freq) { return pgZ2 * PGFSAT(freq) }; //зубцовая частота
|
||||
|
||||
//параметры турбины
|
||||
var trBlades = options.trBlades || 0; //количество лопастей крыльчатки турбины
|
||||
export function TRFBLD(freq) { return freq * trBlades }; //лопастная частота
|
||||
|
||||
//параметры электродвигателя
|
||||
//var trBlades = options.trBlades || 0; //количество лопастей крыльчатки турбины
|
||||
|
||||
export function specParams(freq) {
|
||||
let __fltr = {}; //объект расчетных параметров полосового фильтра
|
||||
let __spec = {}; //объект расчетных параметров спектра
|
||||
let __tol = 0; //коридор обнаружения гармоники
|
||||
let __frq = 200; //граничная частота спектра
|
||||
let __lines = 400; //количество линий спектра
|
||||
|
||||
let __filter = bpfFreq(freq); //центральная частота полосового фильтра
|
||||
let __width = bpfWidth(3, __filter); //ширина полосового фильтра для спектра огибающей
|
||||
|
||||
function bpfFreq(rps) {
|
||||
let __filter = 1850 * Math.sqrt(rps);
|
||||
//let __filter = 6013.41 * Math.log(0.266935 * rps + 1.1201);
|
||||
return __filter;
|
||||
};
|
||||
|
||||
function bpfWidth(n, filter) {
|
||||
let kf = (2 ** (1 / n) - 1) / ((2 ** (1 / n)) ** 0.5); //коэффициент для полосового фильтра
|
||||
let __wdt = kf * filter;
|
||||
return __wdt;
|
||||
};
|
||||
|
||||
function getStandart(value) {
|
||||
let arr = [50, 100, 200, 400, 800, 1600, 3200, 6400, 12800];
|
||||
let __res = 0;
|
||||
arr.some((elem, i) => { if (value <= elem) { __res = arr[i]; return __res; }; });
|
||||
return __res;
|
||||
};
|
||||
|
||||
switch (options.objectType) {
|
||||
case 0: //объект не выбран
|
||||
break;
|
||||
case 1: //подшипник скольжения
|
||||
__tol = 0;
|
||||
__frq = 20 * freq;
|
||||
__lines = __frq / (freq / 8);
|
||||
break;
|
||||
case 2: //подшипник качения
|
||||
__tol = (2 * FTF(freq)) / (5 * BPFO(freq));
|
||||
__frq = getStandart(5 * BPFI(freq) + 4 * freq);
|
||||
__lines = getStandart(__frq / (freq / 8));
|
||||
break;
|
||||
case 3: //ШВП
|
||||
__tol = (2 * BSFTF(freq)) / (5 * BSNUT(freq));
|
||||
__frq = getStandart(5 * BSSCR(freq) + 4 * freq);
|
||||
__lines = getStandart(__frq / (freq / 8));
|
||||
break;
|
||||
case 4: //редуктор
|
||||
__tol = (2 * freq) / (5 * GTFZ(freq));
|
||||
__frq = getStandart(3 * GTFZ(freq) + 4 * freq);
|
||||
__lines = getStandart(__frq / (freq / 8));
|
||||
break;
|
||||
case 5: //ременная передача
|
||||
__tol = 0;
|
||||
__frq = getStandart(400);
|
||||
__lines = getStandart(__frq / (BDFB(freq) / 4));
|
||||
break;
|
||||
case 6: //зубчатый ремень
|
||||
__tol = 0;
|
||||
__frq = getStandart(400);
|
||||
__lines = getStandart(__frq / (CBDFB(freq) / 4));
|
||||
break;
|
||||
case 7: //помпа (насос)
|
||||
__tol = 0;
|
||||
__frq = getStandart(3 * PMFBLD(freq) + 4 * freq);
|
||||
__lines = getStandart(__frq / (freq / 8));
|
||||
break;
|
||||
case 8: //планетарый редуктор
|
||||
__tol = (2 * PGF2(freq)) / (5 * PGFZ(freq));
|
||||
__frq = getStandart(3 * PGFZ(freq) + 4 * freq);
|
||||
__lines = getStandart(__frq / (PGF2(freq) / 8));
|
||||
break;
|
||||
case 9: //турбина
|
||||
__tol = 0;
|
||||
__frq = getStandart(3 * TRFBLD(freq) + 4 * freq);
|
||||
__lines = getStandart(__frq / (freq / 8));
|
||||
break;
|
||||
case 10: //электродвигатель
|
||||
__tol = 0;
|
||||
__frq = getStandart(400);
|
||||
__lines = getStandart(__frq / (freq / 8));
|
||||
break;
|
||||
};
|
||||
|
||||
__fltr["frequency"] = __filter;
|
||||
__fltr["width"] = __width;
|
||||
__spec["frequency"] = __frq;
|
||||
__spec["lines"] = __lines;
|
||||
__spec["resolution"] = __frq / __lines;
|
||||
__spec["tolerance"] = __tol;
|
||||
|
||||
return {
|
||||
filter: __fltr,
|
||||
spec: __spec
|
||||
};
|
||||
}; //рассчетные параметры спектра вибрации
|
||||
|
||||
export function specSquare(spec, L, R) {
|
||||
let __base = spec.base; //массив значений средней линии
|
||||
let __data = spec.data; //массив значений амплитуд
|
||||
let __lines = spec.data.length; //количества линий спектра
|
||||
let __res = spec.resolution; //частотное разрешения спектра (высота прямоугольной трапеции)
|
||||
let __start = 0; //стартовый индекс в массиве
|
||||
let __end = __lines; //конечный индекс в массиве
|
||||
let s0 = 0; //площадь под базовой линией
|
||||
let s1 = 0; //площадь всего спектра
|
||||
let s2 = 0; //площадь над базовой линией
|
||||
let s3 = 0; //площадь обнаруженных гармоник
|
||||
if (L != undefined) { __start = Math.round(L / __res) };
|
||||
if (R != undefined) { __end = Math.round(R / __res) };
|
||||
|
||||
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 >= spec.peak_level) { s3 += __delta * __res };
|
||||
};
|
||||
|
||||
return {
|
||||
base: s0,
|
||||
spec: s1,
|
||||
harm: s2,
|
||||
peak: s3
|
||||
};
|
||||
}; //определение площадей спектра
|
||||
|
||||
export function modFactor(options) {
|
||||
let __dl = (options.ampl - options.base); //разность уровней гармонической и случайной составляющей вибрации
|
||||
let __df = options.spec.frequency / options.fltr.width; //отношение граничной частоты спектра к ширине фильтра
|
||||
let __mod = Math.sqrt((10 ** (__dl / 10) - 1) * __df);
|
||||
return __mod;
|
||||
}; //определение глубины модуляции ВЧ составляющих
|
||||
|
||||
export function deepFactor(ampl, base) {
|
||||
let __deep = (ampl - base) / (ampl + base) * 100;
|
||||
return __deep;
|
||||
}; //определение условной глубины модуляции
|
||||
|
||||
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 = 1; //диапазон поиска гармоник +/-
|
||||
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 = 1; //диапазон поиска гармоник +/-
|
||||
|
||||
return __spen;
|
||||
}; //построение спектра огибающей
|
||||
|
||||
export function getDefectsSet(freq) {
|
||||
//Название: [цвет, частота, кол-во гармоник, уровень сильного дефекта, тип ряда, коэфф затухания]
|
||||
let __set = {};
|
||||
|
||||
switch (options.objectType) {
|
||||
case 0: //объект не выбран
|
||||
break;
|
||||
case 1: //подшипник скольжения
|
||||
|
||||
break;
|
||||
case 2: //подшипник качения
|
||||
__set = {
|
||||
"Износ наружного кольца": [0x42AAFF, BPFO(freq), 6, 0.06, 0, 0.3],
|
||||
"Перекос наружного кольца": [0x4285B4, BPFO(freq), 4, 0.06, 1, 0.1],
|
||||
"Дефект наружного кольца": [0x6A5ACD, BPFO(freq), 6, 0.06, 0, 0.07],
|
||||
"Износ внутреннего кольца": [0x89AC76, FREQ(freq), 6, 0.06, 0, 0.3],
|
||||
"Перекос внутреннего кольца": [0x34C924, FREQ(freq), 6, 0.06, 1, 0.1],
|
||||
"Дефект внутреннего кольца": [0x008000, BPFI(freq), 6, 0.06, 0, 0.07],
|
||||
"Дефект тел качения": [0xFFA000, BSF(freq), 5, 0.06, 0, 0.3],
|
||||
"Износ тел качения и сепаратора": [0xFF2400, FTF(freq), 4, 0.06, 0, 0.5]
|
||||
};
|
||||
break;
|
||||
case 3: //ШВП
|
||||
|
||||
break;
|
||||
case 4: //редуктор
|
||||
|
||||
break;
|
||||
case 5: //ременная передача
|
||||
|
||||
break;
|
||||
case 6: //зубчатый ремень
|
||||
|
||||
break;
|
||||
case 7: //помпа (насос)
|
||||
|
||||
break;
|
||||
case 8: //планетарый редуктор
|
||||
|
||||
break;
|
||||
case 9: //турбина
|
||||
|
||||
break;
|
||||
case 10: //электродвигатель
|
||||
|
||||
break;
|
||||
};
|
||||
|
||||
return __set
|
||||
}; //набор предполагаемых дефектов
|
||||
|
||||
export function createTools(options) {
|
||||
let __spec = options.spec; //источник данных спектра
|
||||
let __set = {}; //источник данных для построения частотных линий
|
||||
if (options.set != undefined) { __set = options.set };
|
||||
|
||||
let __tools = gtl.create_spec_tools(
|
||||
{
|
||||
data: __spec.data, //массив значений амплитуд спектра
|
||||
df: __spec.resolution, //частотное разрешение спектра
|
||||
base: {
|
||||
factor: 100, //коэффициент сглаживания базовой линии
|
||||
visible: true, //отображение базовой линии
|
||||
color: 0xFFFF00 //цвет базовой линии в формате HEX
|
||||
},
|
||||
peaks: {
|
||||
color: __spec.color, //цвет маркеров обнаруженных гармоник
|
||||
visible: false, //отображение маркеров
|
||||
level: __spec.peak_level //уровень обнаружения гармоник в спектре
|
||||
},
|
||||
harms: {
|
||||
tolerance: options.tol //коридор обнаружения гармоник в спектре
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
let __rows = Object.keys(__set); //массив ключей объекта (наименование частот)
|
||||
for (let i = 0; i < __rows.length; i++) {
|
||||
let __name = __rows[i]; //название гармонического ряда
|
||||
let __arr = __set[__name]; //массив значений
|
||||
let __color = __arr[0]; //цвет ряда в формате HEX
|
||||
let __freq = __arr[1]; //расчетная частота
|
||||
let __count = __arr[2]; //количество гармоник
|
||||
let __lvl = __arr[3]; //пороговый уровень сильного дефекта
|
||||
let __mod = __arr[6]; //модулирующая частота
|
||||
|
||||
let __row = __tools.harms.add(
|
||||
{
|
||||
frequency: __freq, //функциональная частота
|
||||
count: __count, //количество гармоник
|
||||
color: __color, //цвет линий
|
||||
weight: 2, //толщина линий
|
||||
visible: false //отображение линий
|
||||
}
|
||||
);
|
||||
__row.name = __name;
|
||||
|
||||
if (__mod != undefined) {
|
||||
__row.modulate(
|
||||
{
|
||||
frequency: __mod, //частота амплитудной модуляции
|
||||
count: 2, //количество боковых составляющих слева и справа
|
||||
color: __color, //цвет линий в формате HEX
|
||||
weight: 0.5 //толщина линий
|
||||
}
|
||||
);
|
||||
};
|
||||
};
|
||||
|
||||
return __tools;
|
||||
}; //Построение компонентов и частотных линий на спектре
|
||||
|
||||
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.add_value_peak_to_peak(src);
|
||||
__ptp.time = __time;
|
||||
__ptp.avg_cnt = __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;
|
||||
}; //измерение стандартных параметров
|
Loading…
Reference in New Issue