432 lines
22 KiB
JavaScript
432 lines
22 KiB
JavaScript
"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("user-functions.js"); // используемые функции
|
||
|
||
var plot_0 = gtl.plots.add("Спектр ускорения (канал 0)"); // спектр ускорения канала 0
|
||
var plot_1 = gtl.plots.add("Спектр ускорения (канал 1)"); // спектр ускорения канала 1
|
||
var plot_2 = gtl.plots.add("Спектр ускорения (канал 2)"); // спектр ускорения канала 2
|
||
var plot_3 = gtl.plots.add("Спектр силы (канал 3)"); // спектр ускорения канала 3
|
||
var plot_0_3 = gtl.plots.add("Перекрёстный спектр (каналы 0 и 3)"); // перекрёстный спектр каналов 0 и 3
|
||
var plot_1_3 = gtl.plots.add("Перекрёстный спектр (каналы 1 и 3)"); // перекрёстный спектр каналов 1 и 3
|
||
var plot_2_3 = gtl.plots.add("Перекрёстный спектр (каналы 2 и 3)"); // перекрёстный спектр каналов 2 и 3
|
||
var plotSpecTransfer_0_3 = gtl.plots.add("Спектр передаточной функции (каналы 0 и 3)"); // спектр передаточной функции каналов 0 и 3
|
||
var plotSpecTransfer_1_3 = gtl.plots.add("Спектр передаточной функции (каналы 1 и 3)"); // спектр передаточной функции каналов 1 и 3
|
||
var plotSpecTransfer_2_3 = gtl.plots.add("Спектр передаточной функции (каналы 2 и 3)"); // спектр передаточной функции каналов 2 и 3
|
||
var plotTransfer_0_3 = gtl.plots.add("Передаточная функция (каналы 0 и 3)"); // передаточная функция каналов 0 и 3
|
||
var plotTransfer_1_3 = gtl.plots.add("Передаточная функция (каналы 1 и 3)"); // передаточная функция каналов 1 и 3
|
||
var plotTransfer_2_3 = gtl.plots.add("Передаточная функция (каналы 2 и 3)");; // передаточная функция каналов 2 и 3
|
||
|
||
// ***************************************************************
|
||
// ********** ВЫЧИСЛЕНИЕ ПЕРЕДАТОЧНОЙ ФУНКЦИИ (ВНИИЖТ) ***********
|
||
// ***************************************************************
|
||
|
||
// Алгоритм
|
||
// 1. Получить спектры ускорения и силы (вибропреобразователь и молоток).
|
||
// 2. Вычислить среднее значение по амплитудам (по обоим спектрам).
|
||
// 3. Поочерёдно вычесть из каждого элемента амплитудного спектра соответствующее среднее значение,
|
||
// записать массивы разниц.
|
||
// 4. Перемножить значения массивов разниц, записать массив произведений.
|
||
// 5. Разделить значения массива произведений на массив амплитудного спектра силы,
|
||
// записать массив передаточной функции.
|
||
|
||
|
||
// ОБРАБОТКА СИГНАЛОВ
|
||
// ФИЛЬТРЫ
|
||
// Входной сигнал - виброускорение
|
||
|
||
// Файл импорта функций
|
||
// var imp = gtl.import("...");
|
||
|
||
// ПАРАМЕТРЫ и их ПОРОГОВЫЕ ЗНАЧЕНИЯ (уставки)
|
||
|
||
// Настройки спектров
|
||
// Цвета
|
||
// #ff0000 - красный
|
||
// #00ff00 - зелёный
|
||
// #0000ff - синий
|
||
// #00ddff - голубой
|
||
// #ff3dcc - фиолетовый
|
||
// #ffff00 - жёлтый
|
||
|
||
// Пороги и прочие изменяемые параметры
|
||
var ausp_frequency = 1000; // граничная частота спектра
|
||
var ausp_average = 1; // количество усреднений спектра
|
||
var ausp_lines = 4; // множитель количества линий спектра (на 1 Гц)
|
||
var ausp_smoothing_factor = 100; // усреднение средней линии
|
||
var ausp_peak_level = 0.001 // порог обнаружения гармоник РЕДАКТИРОВАТЬ НА РЕАЛЬНЫХ СИГНАЛАХ
|
||
var ausp_tolerance = 1; // диапазон поиска гармоники по ширине +/- Гц
|
||
var average = 6; // количество усреднений объекта АФЧХ (когерентность и разница фаз)
|
||
// var ausp_unit = gtl.spec.db; // отображение амплитуды в дБ
|
||
var ausp_unit = gtl.spec.unit; // отображение амплитуды в м/с^2
|
||
|
||
// *** Формирование спектров сигналов ***
|
||
|
||
// Спектры каналов ускорения (каналы датчиков вибрации)
|
||
|
||
// Канал_0
|
||
var ausp_acсel_0 = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); // объявление переменной спектра
|
||
ausp_acсel_0.color = 0x04ff00; // цвет спектра
|
||
ausp_acсel_0.name = "Спектр ускорения (канал 0)"; // имя спектра
|
||
ausp_acсel_0.color = 0x000000ff; // синий цвет спектра
|
||
ausp_acсel_0.frequency = ausp_frequency;
|
||
ausp_acсel_0.lines = ausp_frequency * ausp_lines;
|
||
ausp_acсel_0.average = ausp_average;
|
||
ausp_acсel_0.unit = ausp_unit; // отображение амплитуды
|
||
ausp_acсel_0.smoothing_factor = ausp_smoothing_factor;
|
||
ausp_acсel_0.smoothed_line_color = 0xff004dff; // цвет средней линии
|
||
ausp_acсel_0.peak_level = ausp_peak_level;
|
||
ausp_acсel_0.tolerance = ausp_tolerance; // диапазон поиска гармоник +/-
|
||
|
||
// Канал_1
|
||
var ausp_acсel_1 = gtl.add_ausp(gtl.analog_inputs[signals[1].portNumber]); // объявление переменной спектра
|
||
ausp_acсel_1.color = 0xcad714; // цвет спектра
|
||
ausp_acсel_1.name = "Спектр ускорения (канал 1)"; // имя спектра
|
||
ausp_acсel_1.color = 0x000000ff; // синий цвет спектра
|
||
ausp_acсel_1.frequency = ausp_frequency;
|
||
ausp_acсel_1.lines = ausp_frequency * ausp_lines;
|
||
ausp_acсel_1.average = ausp_average;
|
||
ausp_acсel_1.unit = ausp_unit; // отображение амплитуды
|
||
ausp_acсel_1.smoothing_factor = ausp_smoothing_factor;
|
||
ausp_acсel_1.smoothed_line_color = 0xff004dff; // цвет средней линии
|
||
ausp_acсel_1.peak_level = ausp_peak_level;
|
||
ausp_acсel_1.tolerance = ausp_tolerance; // диапазон поиска гармоник +/-
|
||
|
||
// Канал_2
|
||
var ausp_acсel_2 = gtl.add_ausp(gtl.analog_inputs[signals[2].portNumber]); // объявление переменной спектра
|
||
ausp_acсel_2.color = 0xff8800; // цвет спектра
|
||
ausp_acсel_2.name = "Спектр ускорения (канал 2)"; // имя спектра
|
||
ausp_acсel_2.color = 0x000000ff; // синий цвет спектра
|
||
ausp_acсel_2.frequency = ausp_frequency;
|
||
ausp_acсel_2.lines = ausp_frequency * ausp_lines;
|
||
ausp_acсel_2.average = ausp_average;
|
||
ausp_acсel_2.unit = ausp_unit; // отображение амплитуды
|
||
ausp_acсel_2.smoothing_factor = ausp_smoothing_factor;
|
||
ausp_acсel_2.smoothed_line_color = 0xff004dff; // цвет средней линии
|
||
ausp_acсel_2.peak_level = ausp_peak_level;
|
||
ausp_acсel_2.tolerance = ausp_tolerance; // диапазон поиска гармоник +/-
|
||
|
||
// Спектр силы (канал сигнала молотка)
|
||
// Канал_3
|
||
var ausp_force_3 = gtl.add_ausp(gtl.analog_inputs[signals[3].portNumber]); // объявление переменной спектра
|
||
ausp_force_3.color = 0x000000ff; // цвет спектра
|
||
ausp_force_3.name = "Спектр силы (канал 3)"; // имя спектра
|
||
ausp_force_3.color = 0x00ff0000; // красный цвет спектра
|
||
ausp_force_3.frequency = ausp_frequency;
|
||
ausp_force_3.lines = ausp_frequency * ausp_lines;
|
||
ausp_force_3.average = ausp_average;
|
||
ausp_force_3.unit = ausp_unit; // отображение амплитуды
|
||
ausp_force_3.smoothing_factor = ausp_smoothing_factor;
|
||
ausp_force_3.smoothed_line_color = 0xff004dff; // цвет средней линии
|
||
ausp_force_3.peak_level = ausp_peak_level;
|
||
ausp_force_3.tolerance = ausp_tolerance; // диапазон поиска гармоник +/-
|
||
|
||
|
||
|
||
//*******************ДИАГНОСТИКА*********************
|
||
//***************************************************
|
||
|
||
// Задаем период проведения диагностики в секундах
|
||
var acq_time = Math.max(ausp_acсel_0.acq_time, ausp_acсel_1.acq_time, ausp_acсel_2.acq_time, ausp_force_3.acq_time) + 0.1;
|
||
gtl.diagnostic.interval = acq_time;
|
||
// gtl.diagnostic.interval = 20; // время в секундах (константа)
|
||
// примечание: наблюдается зависимость результатов АФЧХ от времени диагностики
|
||
|
||
function diagnose() {
|
||
|
||
// Массивы значений
|
||
var ausp_accel_0_data = ausp_acсel_0.data; // массив уровней спектра ускорения 0
|
||
var ausp_accel_1_data = ausp_acсel_1.data; // массив уровней спектра ускорения 1
|
||
var ausp_accel_2_data = ausp_acсel_2.data; // массив уровней спектра ускорения 2
|
||
var ausp_force_3_data = ausp_force_3.data; // массив уровней спектра силы 3
|
||
|
||
|
||
gtl.log.info("ausp_data.length", ausp_force_3_data.length);
|
||
gtl.log.info("Минимально необходимая длительность сигнала", gtl.diagnostic.interval);
|
||
gtl.log.info("ausp_frequency", ausp_frequency);
|
||
gtl.log.info("ausp_lines", ausp_lines);
|
||
gtl.log.info("-", "-");
|
||
|
||
|
||
// // Пример вычисления среднего по значениям массива
|
||
// var arr = [1, 1, 1, 1, 1, 2];
|
||
// var average = 0; // среднее значение массива
|
||
// let sum = 0; // сумма всех чисел массива
|
||
// for (let i = 0; i < arr.length; i += 1)
|
||
// {
|
||
// sum += arr[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива
|
||
// }
|
||
// average = sum / arr.length; // возвращаем среднее арифметическое
|
||
// gtl.log.info("average test array", average);
|
||
// gtl.log.info("summ test array", sum);
|
||
// gtl.log.info("length test array", arr.length);
|
||
|
||
|
||
// Получение массивов для формулы передаточной функции
|
||
|
||
// Канал_0 (ausp_accel_0_data)
|
||
// среднее и сумма
|
||
var aver_ausp_accel_0_data = 0; // среднее значение массива
|
||
var sum_ausp_accel_0_data = 0; // сумма всех чисел массива
|
||
for (let i = 0; i < ausp_accel_0_data.length; i += 1)
|
||
{
|
||
sum_ausp_accel_0_data += ausp_accel_0_data[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива
|
||
}
|
||
aver_ausp_accel_0_data = sum_ausp_accel_0_data / ausp_accel_0_data.length;
|
||
// запись массивов (Y_i - Y_average)
|
||
var delta_y_aver_ausp_accel_0_data = []; // массив
|
||
for (let i = 0; i < ausp_accel_0_data.length; i++)
|
||
{
|
||
delta_y_aver_ausp_accel_0_data.push(ausp_accel_0_data[i] - aver_ausp_accel_0_data);
|
||
}
|
||
|
||
// Канал_1 (ausp_accel_1_data)
|
||
// среднее и сумма
|
||
var aver_ausp_accel_1_data = 0; // среднее значение массива
|
||
var sum_ausp_accel_1_data = 0; // сумма всех чисел массива
|
||
for (let i = 0; i < ausp_accel_1_data.length; i += 1)
|
||
{
|
||
sum_ausp_accel_1_data += ausp_accel_1_data[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива
|
||
}
|
||
aver_ausp_accel_1_data = sum_ausp_accel_1_data / ausp_accel_1_data.length;
|
||
// запись массивов (Y_i - Y_average)
|
||
var delta_y_aver_ausp_accel_1_data = []; // массив
|
||
for (let i = 0; i < ausp_accel_1_data.length; i++)
|
||
{
|
||
delta_y_aver_ausp_accel_1_data.push(ausp_accel_1_data[i] - aver_ausp_accel_1_data);
|
||
}
|
||
|
||
// Канал_2 (ausp_accel_2_data)
|
||
// среднее и сумма
|
||
var aver_ausp_accel_2_data = 0; // среднее значение массива
|
||
var sum_ausp_accel_2_data = 0; // сумма всех чисел массива
|
||
for (let i = 0; i < ausp_accel_2_data.length; i += 1)
|
||
{
|
||
sum_ausp_accel_2_data += ausp_accel_2_data[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива
|
||
}
|
||
aver_ausp_accel_2_data = sum_ausp_accel_2_data / ausp_accel_2_data.length;
|
||
// запись массивов (Y_i - Y_average)
|
||
var delta_y_aver_ausp_accel_2_data = []; // массив
|
||
for (let i = 0; i < ausp_accel_2_data.length; i++)
|
||
{
|
||
delta_y_aver_ausp_accel_2_data.push(ausp_accel_2_data[i] - aver_ausp_accel_2_data);
|
||
}
|
||
|
||
// Канал_3 (ausp_force_3_data)
|
||
// среднее и сумма
|
||
var aver_ausp_force_3_data = 0; // среднее значение массива
|
||
var sum_ausp_force_3_data = 0; // сумма всех чисел массива
|
||
for (let i = 0; i < ausp_force_3_data.length; i += 1)
|
||
{
|
||
sum_ausp_force_3_data += ausp_force_3_data[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива
|
||
}
|
||
aver_ausp_force_3_data = sum_ausp_force_3_data / ausp_force_3_data.length;
|
||
// запись массивов (Y_i - Y_average)
|
||
var delta_y_aver_ausp_force_3_data = []; // массив
|
||
for (let i = 0; i < ausp_force_3_data.length; i++)
|
||
{
|
||
delta_y_aver_ausp_force_3_data.push(ausp_force_3_data[i] - aver_ausp_force_3_data);
|
||
}
|
||
|
||
|
||
// Получение передаточной функции (спектра передаточной функции)
|
||
|
||
// Канал_0 & Канал_3
|
||
var Saf_0_3 = []; // массив перекрёстного спектра ускорения каналов 0 и 3
|
||
for (let i = 0; i < ausp_accel_0_data.length; i++)
|
||
{
|
||
Saf_0_3.push(delta_y_aver_ausp_accel_0_data[i] * delta_y_aver_ausp_force_3_data[i]);
|
||
}
|
||
var sum_Saf_0_3 = 0; // сумма всех чисел массива перекрёстного спектра Saf_0_3
|
||
for (let i = 0; i < Saf_0_3.length; i += 1)
|
||
{
|
||
sum_Saf_0_3 += Saf_0_3[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива
|
||
}
|
||
var HaF_0_3 = []; // массив спектра передаточной функции
|
||
for (let i = 0; i < Saf_0_3.length; i++)
|
||
{
|
||
HaF_0_3.push(Saf_0_3[i] / ausp_force_3_data[i]);
|
||
}
|
||
var HaF_0_3_sum = []; // массив спектра передаточной функции
|
||
for (let i = 0; i < Saf_0_3.length; i++)
|
||
{
|
||
HaF_0_3_sum.push(sum_Saf_0_3 / ausp_force_3_data[i]);
|
||
}
|
||
|
||
// Канал_1 & Канал_3
|
||
var Saf_1_3 = []; // массив перекрёстного спектра ускорения каналов 1 и 3
|
||
for (let i = 0; i < ausp_accel_1_data.length; i++)
|
||
{
|
||
Saf_1_3.push(delta_y_aver_ausp_accel_1_data[i] * delta_y_aver_ausp_force_3_data[i]);
|
||
}
|
||
var sum_Saf_1_3 = 0; // сумма всех чисел массива перекрёстного спектра Saf_1_3
|
||
for (let i = 0; i < Saf_1_3.length; i += 1)
|
||
{
|
||
sum_Saf_1_3 += Saf_1_3[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива
|
||
}
|
||
var HaF_1_3 = []; // массив спектра передаточной функции
|
||
for (let i = 0; i < Saf_1_3.length; i++)
|
||
{
|
||
HaF_1_3.push(Saf_1_3[i] / ausp_force_3_data[i]);
|
||
}
|
||
var HaF_1_3_sum = []; // массив спектра передаточной функции
|
||
for (let i = 0; i < Saf_1_3.length; i++)
|
||
{
|
||
HaF_1_3_sum.push(sum_Saf_1_3 / ausp_force_3_data[i]);
|
||
}
|
||
|
||
// Канал_2 & Канал_3
|
||
var Saf_2_3 = []; // массив перекрёстного спектра ускорения каналов 2 и 3
|
||
for (let i = 0; i < ausp_accel_2_data.length; i++)
|
||
{
|
||
Saf_2_3.push(delta_y_aver_ausp_accel_2_data[i] * delta_y_aver_ausp_force_3_data[i]);
|
||
}
|
||
var sum_Saf_2_3 = 0; // сумма всех чисел массива перекрёстного спектра Saf_2_3
|
||
for (let i = 0; i < Saf_2_3.length; i += 1)
|
||
{
|
||
sum_Saf_2_3 += Saf_2_3[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива
|
||
}
|
||
var HaF_2_3 = []; // массив спектра передаточной функции
|
||
for (let i = 0; i < Saf_2_3.length; i++)
|
||
{
|
||
HaF_2_3.push(Saf_2_3[i] / ausp_force_3_data[i]);
|
||
}
|
||
var HaF_2_3_sum = []; // массив спектра передаточной функции
|
||
for (let i = 0; i < Saf_2_3.length; i++)
|
||
{
|
||
HaF_2_3_sum.push(sum_Saf_2_3 / ausp_force_3_data[i]);
|
||
}
|
||
|
||
|
||
gtl.log.info("---", "---");
|
||
gtl.log.info("average ausp_force_3_data", aver_ausp_force_3_data);
|
||
gtl.log.info("summ ausp_force_3_data", sum_ausp_force_3_data);
|
||
gtl.log.info("length ausp_force_3_data", ausp_force_3_data.length);
|
||
gtl.log.info("sum_Saf_0_3", sum_Saf_0_3);
|
||
gtl.log.info("---", "---");
|
||
gtl.log.info("average ausp_accel_2_data", aver_ausp_accel_2_data);
|
||
gtl.log.info("summ ausp_accel_2_data", sum_ausp_accel_2_data);
|
||
gtl.log.info("length ausp_accel_2_data", ausp_accel_2_data.length);
|
||
gtl.log.info("---", "---");
|
||
gtl.log.info("average ausp_accel_1_data", aver_ausp_accel_1_data);
|
||
gtl.log.info("summ ausp_accel_1_data", sum_ausp_accel_1_data);
|
||
gtl.log.info("length ausp_accel_1_data", ausp_accel_1_data.length);
|
||
gtl.log.info("---", "---");
|
||
gtl.log.info("average ausp_accel_0_data", aver_ausp_accel_0_data);
|
||
gtl.log.info("summ ausp_accel_0_data", sum_ausp_accel_0_data);
|
||
gtl.log.info("length ausp_accel_0_data", ausp_accel_0_data.length);
|
||
|
||
|
||
// Построение пользовательских графиков
|
||
|
||
plot_0.add(
|
||
{
|
||
color: 0x04ff00,
|
||
name: "Спектр ускорения (канал 0)",
|
||
x: 1/ausp_lines,
|
||
y: ausp_accel_0_data
|
||
});
|
||
|
||
plot_1.add(
|
||
{
|
||
color: 0xcad714,
|
||
name: "Спектр ускорения (канал 1)",
|
||
x: 1/ausp_lines,
|
||
y: ausp_accel_1_data
|
||
});
|
||
|
||
plot_2.add(
|
||
{
|
||
color: 0xff8800,
|
||
name: "Спектр ускорения (канал 2)",
|
||
x: 1/ausp_lines,
|
||
y: ausp_accel_2_data
|
||
});
|
||
|
||
plot_3.add(
|
||
{
|
||
color: 0xff00f7,
|
||
name: "Спектр силы (канал 3)",
|
||
x: 1/ausp_lines,
|
||
y: ausp_force_3_data
|
||
});
|
||
|
||
plot_0_3.add(
|
||
{
|
||
color: 0xff00ff,
|
||
name: "Перекрёстный спектр (каналы 0 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: Saf_0_3
|
||
});
|
||
|
||
plot_1_3.add(
|
||
{
|
||
color: 0xED3CCA,
|
||
name: "Перекрёстный спектр (каналы 1 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: Saf_1_3
|
||
});
|
||
|
||
plot_2_3.add(
|
||
{
|
||
color: 0x9966CC,
|
||
name: "Перекрёстный спектр (каналы 2 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: Saf_2_3
|
||
});
|
||
|
||
plotSpecTransfer_0_3.add(
|
||
{
|
||
color: 0x78DBE2,
|
||
name: "Спектр передаточной функции (каналы 0 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: HaF_0_3
|
||
});
|
||
|
||
plotSpecTransfer_1_3.add(
|
||
{
|
||
color: 0x349a32,
|
||
name: "Спектр передаточной функции (каналы 1 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: HaF_1_3
|
||
});
|
||
|
||
plotSpecTransfer_2_3.add(
|
||
{
|
||
color: 0x6dd08c,
|
||
name: "Спектр передаточной функции (каналы 2 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: HaF_2_3
|
||
});
|
||
|
||
plotTransfer_0_3.add(
|
||
{
|
||
color: 0xedc887,
|
||
name: "Передаточная функция (каналы 0 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: HaF_0_3_sum
|
||
});
|
||
|
||
plotTransfer_1_3.add(
|
||
{
|
||
color: 0x99f0b7,
|
||
name: "Передаточная функция (каналы 1 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: HaF_1_3_sum
|
||
});
|
||
|
||
plotTransfer_2_3.add(
|
||
{
|
||
color: 0xe8e463,
|
||
name: "Передаточная функция (каналы 2 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: HaF_2_3_sum
|
||
});
|
||
|
||
|
||
gtl.diagnostic.stop();
|
||
} |