Compare commits

..

No commits in common. "develop" and "main" have entirely different histories.

40 changed files with 2099 additions and 2795 deletions

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
} //оценка состояния по маске дефекта
}

View File

@ -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
}
}

View File

@ -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
}

View File

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

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -4,9 +4,12 @@ var options = gtl.options;
var record = gtl.options.record; var record = gtl.options.record;
var point = gtl.options.point; var point = gtl.options.point;
var fnc = gtl.import("userFunctions.js"); var imp = gtl.import("user-functions.js");
var mtx = gtl.import("gtMTX.js");
var def = gtl.import("gtDefs.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]); //объявление переменной фильтра 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.name = "AUSPm"; //присвоение имени спектра
ausp2.color = 0x0000ffff; //цвет линии спектра ausp2.color = 0x0000ffff; //цвет линии спектра
ausp2.frequency = 25600; //граничная частота спектра ausp2.frequency = 1600; //граничная частота спектра
ausp2.lines = 1600; //разрешение спектра (количество линий) ausp2.lines = 1600; //разрешение спектра (количество линий)
ausp2.average = 6; //количество усреднений ausp2.average = 6; //количество усреднений
ausp2.unit = gtl.spec.db; //отображение в дБ 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.name = "AUSPd"; //присвоение имени спектра
ausp.color = 0x0000ff00; //цвет линии спектра ausp.color = 0x0000ff00; //цвет линии спектра
ausp.frequency = 800; //граничная частота спектра ausp.frequency = 800; //граничная частота спектра
@ -45,7 +48,7 @@ ausp.peak_level = 20; //порог обнаружения гармоник
ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/- 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.kind = gtl.filter_iir.butterworth; //тип окна
filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
filter_spen.order = 10; //порядок фильтра filter_spen.order = 10; //порядок фильтра
@ -57,8 +60,8 @@ filter_spen.width = 1482; //ширина полосы фильтра
var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей
spen.name = "SPEN"; //присвоение имени спектра огибающей spen.name = "SPEN"; //присвоение имени спектра огибающей
spen.color = 0x00ff0000; //цвет линии спектра огибающей spen.color = 0x00ff0000; //цвет линии спектра огибающей
spen.frequency = 200; //граничная частота спектра огибающей spen.frequency = 400; //граничная частота спектра огибающей
spen.lines = 200; //разрешение спектра огибающей (количество линий) spen.lines = 400; //разрешение спектра огибающей (количество линий)
spen.average = 8; //количество усреднений spen.average = 8; //количество усреднений
spen.unit = gtl.spec.db; //отображение в дБ spen.unit = gtl.spec.db; //отображение в дБ
spen.window = gtl.spec.hann; //окно spen.window = gtl.spec.hann; //окно
@ -76,31 +79,62 @@ ampl_spen.time = 0.5; //интервал расчета Amplitude (spen)
rms_spen.avg_cnt = 4; //количество усреднений RMS (spen) rms_spen.avg_cnt = 4; //количество усреднений RMS (spen)
ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen) ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen)
//RMS виброскорости в диапазоне 10-1000 Гц. //RMS и Amplitude в УВЧ диапазоне 10-25 кГц (контроль разрыва масляной пленки)
var int = gtl.add_intg(gtl.analog_inputs[signals[0].portNumber]); //интегрирование сигнала виброускорения var filter_uhf = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный)
int.taps = 1; //степень интегрирования (скорость из ускорения - 1-нарное интегрирование) filter_uhf.kind = gtl.filter_iir.butterworth; //тип окна
//фильтрация сигнала в диапазоне filter_uhf.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
var filter = gtl.add_filter_iir(int); //объявление переменной фильтра filter_uhf.order = 10; //порядок фильтра
filter.kind = gtl.filter_iir.butterworth; //тип окна filter_uhf.frequency = 17500; //центральная частота полосового фильтра
filter.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) filter_uhf.width = 15000; //ширина полосы фильтра
filter.order = 10; //порядок фильтра
filter.frequency = 505; //центральная частота полосового фильтра var rms_uhf = gtl.add_value_rms(filter_uhf); //назначение переменной RMS
filter.width = 990; //ширина полосы фильтра var ampl_uhf = gtl.add_value_ampl(filter_uhf); //назначение переменной Amplitude
//определение среднего квадратического значения виброскорости rms_uhf.name = "RMS (uhf)" //присвоение имени RMS (uhf)
var rms_v = gtl.add_value_rms(filter); //объявление переменной СКЗ rms_uhf.time = 0.5; //интервал расчета RMS (uhf)
rms_v.time = 0.5; //время выборки ampl_uhf.time = 0.5; //интервал расчета Amplitude (uhf)
rms_v.avg_cnt = 4; //количество усреднений 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; gtl.diagnostic.interval = freq.time * freq.avg_cnt;
let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала
let acq_time = 0;
let canvas = gtl.plots.add("specs(A) dB");
function diagnose() { function diagnose() {
switch (state) { switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры case 0: // считаем частоту вращения и настраиваем спектры
if (fnc.INSTABILITY() > fnc.tolerance()) { if (imp.INSTABILITY() > imp.tolerance()) {
gtl.log.info("Критическая нестабильность частоты вращения, %", fnc.INSTABILITY() * 100); gtl.log.info("Критическая нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
gtl.log.info("Результат:", "Диагностика прервана"); gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики //gtl.diagnostic.stop(); //принудительная остановка диагностики
@ -110,25 +144,60 @@ function diagnose() {
gtl.results = __result; gtl.results = __result;
}; };
if (fnc.FREQ() <= fnc.FREQNESS()) { if (imp.FREQ() <= imp.FREQNESS()) {
gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + fnc.FREQNESS()); gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + imp.FREQNESS());
}; };
case 1: //частота вращения фиксированная //установка стандартной ширины спектра огибающей и количества линий спектра
case 2: //частота вращения из поля INFO (виброметр) spen.frequency = imp.standart_width(imp.spec_width().es);
filter_spen.frequency = fnc.bpFreq(); //считаме фильтр для огибающей spen.lines = imp.standart_lines(imp.spec_lines());
filter_spen.width = fnc.bpWidth(); //определяем ширину фильтра filter_spen.frequency = imp.filter_frequency();
spen.frequency = fnc.specParams().frequency; ausp.frequency = imp.standart_width(imp.spec_width().as1);
spen.lines = fnc.specParams().lines; //ausp.lines = imp.standart_lines();
ausp.frequency = fnc.specParams().frequency;
ausp.lines = fnc.specParams().lines;
//определение минимально необходимой длительности сигнала для проведения диагностики //определение минимально необходимой длительности сигнала для проведения диагностики
let time = []; //массив по времени набора данных var acq_times = [];
time.push(ausp.acq_time); acq_times.push(ausp.acq_time);
time.push(spen.acq_time); acq_times.push(spen.acq_time);
let max_acq = Math.max(...time); acq_time = Math.max(...acq_times);
gtl.diagnostic.interval = max_acq;
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; state = 3;
break; 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("Объект диагностики", "Подшипник качения " + options.rbModelName);
gtl.log.info("FREQ", fnc.FREQ()); gtl.log.info("Минимально необходимая длительность сигнала", acq_time);
gtl.log.info("FTF", fnc.GTF2()); gtl.log.info("FREQ", imp.FREQ());
gtl.log.info("BPFO", fnc.GTFZ()); gtl.log.info("Минимально необходимая частота вращения", imp.FREQNESS());
gtl.log.info("Коридор обнаружения гармоники", fnc.tolerance()); gtl.log.info("Площадь спектра", AQ);
gtl.log.info("Полосовой фильтр (расчетный)", filter_spen.frequency); gtl.log.info("Нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
gtl.log.info("Ширина фильтра", filter_spen.width); gtl.log.info("FTF", imp.FTF());
gtl.log.info("Граничная частота SPEN", spen.frequency); gtl.log.info("BPFO", imp.BPFO());
gtl.log.info("Количество линий SPEN", spen.lines); gtl.log.info("BPFI", imp.BPFI());
gtl.log.info("Разрешение SPEN", spen.resolution); gtl.log.info("BSF", imp.BSF());
gtl.log.info("Ширина AUSP", ausp.frequency); 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 def = {};
let spen_df = def.gtDefs(spen_mx, true); //var indx = 0;
let ausp_mx = mtx.gtMTX(ausp, 0, false); def["Биение шестерни"] = gear0.defect(); //indx (spen = 0, ausp = 0)
def["Биение зубчатого колеса"] = wheel0.defect(); //indx (spen = 1, ausp = 1)
canvas.add( def["Дефект зубьев шестерни"] = gear1.defect(); //indx (spen = 2, ausp = 2)
{ def["Дефект зубьев зубчатого колеса"] = wheel1.defect(); //indx (spen = 3, ausp = 3)
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 = { var res = {
RMSA: rms_spen.value, RMSA: rms_spen.value,
RMSV: rms_v.value,
PF: ampl_spen.value / rms_spen.value, PF: ampl_spen.value / rms_spen.value,
RMS_V2: rms_v2.value,
RMS_V10: rms_v10.value,
SQR: AQ, SQR: AQ,
matrix: spen_mx, defects: def
defs: spen_df
}; };
gtl.results = res; gtl.results = res;

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
}
}

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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();
};

View File

@ -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();
}

View File

@ -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;
};

View File

@ -4,9 +4,8 @@ var options = gtl.options;
var record = gtl.options.record; var record = gtl.options.record;
var point = gtl.options.point; var point = gtl.options.point;
var fnc = gtl.import("userFunctions.js"); var imp = gtl.import("user-functions.js");
var mtx = gtl.import("bsMTX.js"); var spen_mtx = gtl.import("spen_mtx.js");
var def = gtl.import("bsDefs.js");
//настройки для датчика оборотов //настройки для датчика оборотов
var filter_freq = gtl.add_filter_iir(gtl.analog_inputs[record.tachoOptions.tachoChannel]); //объявление переменной фильтра 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.name = "AUSPm"; //присвоение имени спектра
ausp2.color = 0x0000ffff; //цвет линии спектра ausp2.color = 0x0000ffff; //цвет линии спектра
ausp2.frequency = 25600; //граничная частота спектра ausp2.frequency = 1600; //граничная частота спектра
ausp2.lines = 1600; //разрешение спектра (количество линий) ausp2.lines = 1600; //разрешение спектра (количество линий)
ausp2.average = 6; //количество усреднений ausp2.average = 6; //количество усреднений
ausp2.unit = gtl.spec.db; //отображение в дБ 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.name = "AUSPd"; //присвоение имени спектра
ausp.color = 0x0000ff00; //цвет линии спектра ausp.color = 0x0000ff00; //цвет линии спектра
ausp.frequency = 800; //граничная частота спектра ausp.frequency = 800; //граничная частота спектра
@ -45,7 +44,7 @@ ausp.peak_level = 20; //порог обнаружения гармоник
ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/- 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.kind = gtl.filter_iir.butterworth; //тип окна
filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
filter_spen.order = 10; //порядок фильтра filter_spen.order = 10; //порядок фильтра
@ -57,8 +56,8 @@ filter_spen.width = 1482; //ширина полосы фильтра
var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей
spen.name = "SPEN"; //присвоение имени спектра огибающей spen.name = "SPEN"; //присвоение имени спектра огибающей
spen.color = 0x00ff0000; //цвет линии спектра огибающей spen.color = 0x00ff0000; //цвет линии спектра огибающей
spen.frequency = 200; //граничная частота спектра огибающей spen.frequency = 400; //граничная частота спектра огибающей
spen.lines = 200; //разрешение спектра огибающей (количество линий) spen.lines = 400; //разрешение спектра огибающей (количество линий)
spen.average = 8; //количество усреднений spen.average = 8; //количество усреднений
spen.unit = gtl.spec.db; //отображение в дБ spen.unit = gtl.spec.db; //отображение в дБ
spen.window = gtl.spec.hann; //окно spen.window = gtl.spec.hann; //окно
@ -76,31 +75,16 @@ ampl_spen.time = 0.5; //интервал расчета Amplitude (spen)
rms_spen.avg_cnt = 4; //количество усреднений RMS (spen) rms_spen.avg_cnt = 4; //количество усреднений RMS (spen)
ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (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; gtl.diagnostic.interval = freq.time * freq.avg_cnt;
let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала
let acq_time = 0;
let canvas = gtl.plots.add("specs(A) dB");
function diagnose() { function diagnose() {
switch (state) { switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры case 0: // считаем частоту вращения и настраиваем спектры
if (fnc.INSTABILITY() > fnc.tolerance()) { if (imp.INSTABILITY() > imp.tolerance()) {
gtl.log.info("Критическая нестабильность частоты вращения, %", fnc.INSTABILITY() * 100); gtl.log.info("Критическая нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
gtl.log.info("Результат:", "Диагностика прервана"); gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики //gtl.diagnostic.stop(); //принудительная остановка диагностики
@ -110,25 +94,60 @@ function diagnose() {
gtl.results = __result; gtl.results = __result;
}; };
if (fnc.FREQ() <= fnc.FREQNESS()) { if (imp.FREQ() <= imp.FREQNESS()) {
gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + fnc.FREQNESS()); gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + imp.FREQNESS());
}; };
case 1: //частота вращения фиксированная //установка стандартной ширины спектра огибающей и количества линий спектра
case 2: //частота вращения из поля INFO (виброметр) spen.frequency = imp.standart_width(imp.spec_width().es);
filter_spen.frequency = fnc.bpFreq(); //считаме фильтр для огибающей spen.lines = imp.standart_lines(imp.spec_lines());
filter_spen.width = fnc.bpWidth(); //определяем ширину фильтра filter_spen.frequency = imp.filter_frequency();
spen.frequency = fnc.specParams().frequency; ausp.frequency = imp.standart_width(imp.spec_width().as1);
spen.lines = fnc.specParams().lines; //ausp.lines = imp.standart_lines();
ausp.frequency = fnc.specParams().frequency;
ausp.lines = fnc.specParams().lines;
//определение минимально необходимой длительности сигнала для проведения диагностики //определение минимально необходимой длительности сигнала для проведения диагностики
let time = []; //массив по времени набора данных var acq_times = [];
time.push(ausp.acq_time); acq_times.push(ausp.acq_time);
time.push(spen.acq_time); acq_times.push(spen.acq_time);
let max_acq = Math.max(...time); acq_time = Math.max(...acq_times);
gtl.diagnostic.interval = max_acq;
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; state = 3;
break; 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("Объект диагностики", "Подшипник качения " + options.rbModelName);
gtl.log.info("FREQ", fnc.FREQ()); gtl.log.info("Минимально необходимая длительность сигнала", acq_time);
gtl.log.info("FTF", fnc.BSFTF()); gtl.log.info("FREQ", imp.FREQ());
gtl.log.info("BPFO", fnc.BSNUT()); gtl.log.info("Минимально необходимая частота вращения", imp.FREQNESS());
gtl.log.info("BPFI", fnc.BSSCR()); gtl.log.info("Площадь спектра", AQ);
gtl.log.info("BSF", fnc.BSBAL()); gtl.log.info("Нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
gtl.log.info("Коридор обнаружения гармоники", fnc.tolerance()); gtl.log.info("FTF", imp.FTF());
gtl.log.info("Полосовой фильтр (расчетный)", filter_spen.frequency); gtl.log.info("BPFO", imp.BPFO());
gtl.log.info("Ширина фильтра", filter_spen.width); gtl.log.info("BPFI", imp.BPFI());
gtl.log.info("Граничная частота SPEN", spen.frequency); gtl.log.info("BSF", imp.BSF());
gtl.log.info("Количество линий SPEN", spen.lines); gtl.log.info("Центральная частота полосового фильтра", filter_spen.frequency);
gtl.log.info("Разрешение SPEN", spen.resolution); gtl.log.info("Количество долей октавного фильтра", n);
gtl.log.info("Ширина AUSP", ausp.frequency); 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 def = {};
let spen_df = def.bsDefs(spen_mx, true); def["spen"] = spen_mtx.spen();
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
}
); //рисуем спектр огибающей на плоскости
var res = { var res = {
RMSA: rms_spen.value, RMSA: rms_spen.value,
RMSV: rms_v.value,
PF: ampl_spen.value / rms_spen.value, PF: ampl_spen.value / rms_spen.value,
SQR: AQ, SQR: AQ,
matrix: spen_mx, matrix: def
defs: spen_df,
}; };
gtl.results = res; gtl.results = res;

View File

@ -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();
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
}
}

View File

@ -2,40 +2,24 @@
var imp = gtl.import("user-functions.js"); var imp = gtl.import("user-functions.js");
export function defects() { export function defect() {
let frq = imp.FREQ(); //функциональная чатота let frq = imp.BPFI(); //функциональная чатота
let num = 20; //количество отрисованных гармоник let num = 5; //количество отрисованных гармоник
//строим гармонические ряды на SPEN[A]. //присваиваем набору гармоник переменную, добавляем гармоники: частота, кол-во (default = 10), цвет, вес.
var spen_set = spen.add_harms_set(frq, num, 0xff990090, 1); //"фиолетовый" var spen_set = spen.add_harms_set(frq, num, 0xff990090, 1); //раковины на внутреннем кольце "фиолетовый"
spen_set.name = 'Частота вращения'; 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 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); //"бирюзовый" var ausp_set = ausp.add_harms_set(frq, num, 0xff990090, 2); //раковины на внутреннем кольце "фиолетовый"
spen_set1.name = 'Автоколебания'; for (let i = 0; i <= num - 1; i++) { ausp_set.harms[i].tolerance = (1 + i) * frq * imp.tolerance() };
var spen_index1 = spen.index_of_harms_set(spen_set1); //индекс набора гармоник в спектре огибающей ausp_set.name = 'Раковины на внутреннем кольце';
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_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации var ausp_index = ausp.index_of_harms_set(ausp_set); //индекс набора гармоник в спектре вибрации
//добавляем модулирующие гармоники: частота, кол-во, цвет, вес
var ausp_set1 = ausp.add_harms_set(frq / 2, num, 0x30D5C8, 1); //"бирюзовый" ausp.harms_sets[ausp_index].modulate(imp.FREQ(), 2, 0xff923090, 1); //модуляция Fв +/- Fвр "фиолетовый"
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); //индекс набора гармоник в спектре вибрации
var defect = false; var defect = false;
var spen_signs = []; //массив признаков в спектрк огибающей var spen_signs = []; //массив признаков в спектрк огибающей
@ -62,7 +46,7 @@ export function defects() {
if (spen_set.harms[i].is_present == true) { if (spen_set.harms[i].is_present == true) {
deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base); deep = imp.mod_factor(spen_set.harms[i].amplitude, spen_set.harms[i].base);
spen_signs.push(deep); 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) { if (ausp_set.harms[i].is_present == true) {
ampl = ausp_set.harms[i].amplitude; ampl = ausp_set.harms[i].amplitude;
ausp_signs.push(ampl); ausp_signs.push(ampl);
gtl.log.info("Дефекты подшипника скольжения. Признаки в AS " + (i + 1) + "Fв +/- Fвр", ampl); gtl.log.info("Раковины на внутреннем кольце. Признаки в AS " + (i + 1) + "Fв +/- Fвр", ampl);
} }
} }
} }
else else
gtl.log.info("Дефекты подшипника скольжения", "Признаков дефекта не обнаружено"); gtl.log.info("Раковины на внутреннем кольце", "Признаков дефекта не обнаружено");
deep = Math.max(...spen_signs) * 100; deep = Math.max(...spen_signs) * 100;
switch (true) { switch (true) {

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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;
};

View File

@ -4,9 +4,17 @@ var options = gtl.options;
var record = gtl.options.record; var record = gtl.options.record;
var point = gtl.options.point; var point = gtl.options.point;
var fnc = gtl.import("userFunctions.js"); var imp = gtl.import("user-functions.js");
var mtx = gtl.import("rbMTX.js");
var def = gtl.import("rbDefs.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]); //объявление переменной фильтра 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.name = "AUSPm"; //присвоение имени спектра
ausp2.color = 0x0000ffff; //цвет линии спектра ausp2.color = 0x0000ffff; //цвет линии спектра
ausp2.frequency = 25600; //граничная частота спектра ausp2.frequency = 1600; //граничная частота спектра
ausp2.lines = 1600; //разрешение спектра (количество линий) ausp2.lines = 1600; //разрешение спектра (количество линий)
ausp2.average = 6; //количество усреднений ausp2.average = 6; //количество усреднений
ausp2.unit = gtl.spec.db; //отображение в дБ 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.name = "AUSPd"; //присвоение имени спектра
ausp.color = 0x0000ff00; //цвет линии спектра ausp.color = 0x0000ff00; //цвет линии спектра
ausp.frequency = 800; //граничная частота спектра ausp.frequency = 800; //граничная частота спектра
@ -45,7 +53,7 @@ ausp.peak_level = 20; //порог обнаружения гармоник
ausp.harm_tolerance = ausp.resolution; //диапазон поиска гармоник +/- 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.kind = gtl.filter_iir.butterworth; //тип окна
filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) filter_spen.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
filter_spen.order = 10; //порядок фильтра filter_spen.order = 10; //порядок фильтра
@ -57,8 +65,8 @@ filter_spen.width = 1482; //ширина полосы фильтра
var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей var spen = gtl.add_spen(filter_spen); //назначение переменной спектра огибающей
spen.name = "SPEN"; //присвоение имени спектра огибающей spen.name = "SPEN"; //присвоение имени спектра огибающей
spen.color = 0x00ff0000; //цвет линии спектра огибающей spen.color = 0x00ff0000; //цвет линии спектра огибающей
spen.frequency = 200; //граничная частота спектра огибающей spen.frequency = 400; //граничная частота спектра огибающей
spen.lines = 200; //разрешение спектра огибающей (количество линий) spen.lines = 400; //разрешение спектра огибающей (количество линий)
spen.average = 8; //количество усреднений spen.average = 8; //количество усреднений
spen.unit = gtl.spec.db; //отображение в дБ spen.unit = gtl.spec.db; //отображение в дБ
spen.window = gtl.spec.hann; //окно spen.window = gtl.spec.hann; //окно
@ -76,31 +84,62 @@ ampl_spen.time = 0.5; //интервал расчета Amplitude (spen)
rms_spen.avg_cnt = 4; //количество усреднений RMS (spen) rms_spen.avg_cnt = 4; //количество усреднений RMS (spen)
ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen) ampl_spen.avg_cnt = 4; //количество усреднений Amplitude (spen)
//RMS виброскорости в диапазоне 10-1000 Гц. //RMS и Amplitude в УВЧ диапазоне 10-25 кГц (контроль разрыва масляной пленки)
var int = gtl.add_intg(gtl.analog_inputs[signals[0].portNumber]); //интегрирование сигнала виброускорения var filter_uhf = gtl.add_filter_iir(gtl.analog_inputs[signals[0].signalChannel]); //назначение переменной фильтра (предварительный)
int.taps = 1; //степень интегрирования (скорость из ускорения - 1-нарное интегрирование) filter_uhf.kind = gtl.filter_iir.butterworth; //тип окна
//фильтрация сигнала в диапазоне filter_uhf.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой)
var filter = gtl.add_filter_iir(int); //объявление переменной фильтра filter_uhf.order = 10; //порядок фильтра
filter.kind = gtl.filter_iir.butterworth; //тип окна filter_uhf.frequency = 17500; //центральная частота полосового фильтра
filter.type = gtl.filter_iir.bandpass; //тип фильтра (полосовой) filter_uhf.width = 15000; //ширина полосы фильтра
filter.order = 10; //порядок фильтра
filter.frequency = 505; //центральная частота полосового фильтра var rms_uhf = gtl.add_value_rms(filter_uhf); //назначение переменной RMS
filter.width = 990; //ширина полосы фильтра var ampl_uhf = gtl.add_value_ampl(filter_uhf); //назначение переменной Amplitude
//определение среднего квадратического значения виброскорости rms_uhf.name = "RMS (uhf)" //присвоение имени RMS (uhf)
var rms_v = gtl.add_value_rms(filter); //объявление переменной СКЗ rms_uhf.time = 0.5; //интервал расчета RMS (uhf)
rms_v.time = 0.5; //время выборки ampl_uhf.time = 0.5; //интервал расчета Amplitude (uhf)
rms_v.avg_cnt = 4; //количество усреднений 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; gtl.diagnostic.interval = freq.time * freq.avg_cnt;
let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала let state = record.tachoOptions.tachoState; //начальное состояние после выбора источника тахо сигнала
let acq_time = 0;
let canvas = gtl.plots.add("specs(A) dB");
function diagnose() { function diagnose() {
switch (state) { switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры case 0: // считаем частоту вращения и настраиваем спектры
if (fnc.INSTABILITY() > fnc.tolerance()) { if (imp.INSTABILITY() > imp.tolerance()) {
gtl.log.info("Критическая нестабильность частоты вращения, %", fnc.INSTABILITY() * 100); gtl.log.info("Критическая нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
gtl.log.info("Результат:", "Диагностика прервана"); gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики //gtl.diagnostic.stop(); //принудительная остановка диагностики
@ -110,25 +149,60 @@ function diagnose() {
gtl.results = __result; gtl.results = __result;
}; };
if (fnc.FREQ() <= fnc.FREQNESS()) { if (imp.FREQ() <= imp.FREQNESS()) {
gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + fnc.FREQNESS()); gtl.log.info("Частота вращения меньше минимально рекомендуемой", "Минимально рекомендуемая частота: " + imp.FREQNESS());
}; };
case 1: //частота вращения фиксированная //установка стандартной ширины спектра огибающей и количества линий спектра
case 2: //частота вращения из поля INFO (виброметр) spen.frequency = imp.standart_width(imp.spec_width().es);
filter_spen.frequency = fnc.bpFreq(); //считаме фильтр для огибающей spen.lines = imp.standart_lines(imp.spec_lines());
filter_spen.width = fnc.bpWidth(); //определяем ширину фильтра filter_spen.frequency = imp.filter_frequency();
spen.frequency = fnc.specParams().frequency; ausp.frequency = imp.standart_width(imp.spec_width().as1);
spen.lines = fnc.specParams().lines; //ausp.lines = imp.standart_lines();
ausp.frequency = fnc.specParams().frequency;
ausp.lines = fnc.specParams().lines;
//определение минимально необходимой длительности сигнала для проведения диагностики //определение минимально необходимой длительности сигнала для проведения диагностики
let time = []; //массив времени набора данных var acq_times = [];
time.push(ausp.acq_time); acq_times.push(ausp.acq_time);
time.push(spen.acq_time); acq_times.push(spen.acq_time);
let max_acq = Math.max(...time); acq_time = Math.max(...acq_times);
gtl.diagnostic.interval = max_acq;
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; state = 3;
break; 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("Объект диагностики", "Подшипник качения " + options.rbModelName);
gtl.log.info("Минимально необходимая частота вращения", fnc.FREQNESS()); gtl.log.info("Минимально необходимая длительность сигнала", acq_time);
gtl.log.info("FREQ", fnc.FREQ()); gtl.log.info("FREQ", imp.FREQ());
gtl.log.info("FTF", fnc.FTF()); gtl.log.info("Минимально необходимая частота вращения", imp.FREQNESS());
gtl.log.info("BPFO", fnc.BPFO()); gtl.log.info("Площадь спектра", AQ);
gtl.log.info("BPFI", fnc.BPFI()); gtl.log.info("Нестабильность частоты вращения, %", imp.INSTABILITY() * 100);
gtl.log.info("BSF", fnc.BSF()); gtl.log.info("FTF", imp.FTF());
gtl.log.info("Коридор обнаружения гармоники", fnc.tolerance()); gtl.log.info("BPFO", imp.BPFO());
gtl.log.info("Полосовой фильтр (расчетный)", filter_spen.frequency); gtl.log.info("BPFI", imp.BPFI());
gtl.log.info("Ширина фильтра", filter_spen.width); gtl.log.info("BSF", imp.BSF());
gtl.log.info("Граничная частота SPEN", spen.frequency); gtl.log.info("Центральная частота полосового фильтра", filter_spen.frequency);
gtl.log.info("Количество линий SPEN", spen.lines); gtl.log.info("Количество долей октавного фильтра", n);
gtl.log.info("Разрешение SPEN", spen.resolution); gtl.log.info("Коэффициент для октавного фильтра", kf);
gtl.log.info("Ширина AUSP", ausp.frequency); 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 def = {};
let spen_df = def.rbDefs(spen_mx, true); //var indx = 0;
let ausp_mx = mtx.rbMTX(ausp, 0, true); def["Биение вала"] = val.defect(); //indx (spen = 0, ausp = 0)
def["Неоднородный радиальный натяг"] = in0.defect(); //indx (spen = 1, ausp = X)
canvas.add( def["Износ наружного кольца"] = out0.defect(); //indx (spen = 2, ausp = X)
{ def["Перекос наружного кольца"] = out1.defect(); //indx (spen = 3, ausp = X)
color: ausp.color, def["Раковины на наружном кольце"] = out2.defect(); //indx (spen = 4, ausp = 1)
name: ausp.name, def["Износ внутреннего кольца"] = in1.defect(); //indx (spen = 5, ausp = X)
x: ausp.resolution, def["Раковины на внутреннем кольце"] = in2.defect(); //indx (spen = 6, ausp = 2)
y: ausp.data def["Износ тел качения и сепаратора"] = sep.defect(); //indx (spen = 7, ausp = X)
} def["Раковины и сколы на телах качения"] = rol.defect(); //indx (spen = 8, ausp = 3)
); //рисуем спектр вибрации на плоскости
canvas.add(
{
color: spen.color,
name: spen.name,
x: spen.resolution,
y: spen.data
}
); //рисуем спектр огибающей на плоскости
var res = { var res = {
RMSA: rms_spen.value, RMSA: rms_spen.value,
RMSV: rms_v.value,
PF: ampl_spen.value / rms_spen.value, PF: ampl_spen.value / rms_spen.value,
RMS_V2: rms_v2.value,
RMS_V10: rms_v10.value,
SQR: AQ, SQR: AQ,
matrix: spen_mx, defects: def
defs: spen_df
}; };
gtl.results = res; gtl.results = res;

View File

@ -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;
}
}

View File

@ -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();
};

305
user-functions.js 100644
View File

@ -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;
}; //определение амплитудного коэффициента

View File

@ -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;
}; //измерение стандартных параметров