405 lines
21 KiB
JavaScript
405 lines
21 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_FreqResp_ampl_0_3 = gtl.plots.add("Частотный отклик (каналы 0 и 3)"); // частотный отклик между каналами 0 и 3 (действительная часть)
|
||
var plot_FreqResp_ampl_1_3 = gtl.plots.add("Частотный отклик (каналы 1 и 3)"); // частотный отклик между каналами 1 и 3 (действительная часть)
|
||
var plot_FreqResp_ampl_2_3 = gtl.plots.add("Частотный отклик (каналы 2 и 3)"); // частотный отклик между каналами 2 и 3 (действительная часть)
|
||
var plot_FreqResp_phase_0_3 = gtl.plots.add("Фаза частотного отклика (каналы 0 и 3)"); // частотный отклик между каналами 0 и 3 (мнимая часть)
|
||
var plot_FreqResp_phase_1_3 = gtl.plots.add("Фаза частотного отклика (каналы 1 и 3)"); // частотный отклик между каналами 1 и 3 (мнимая часть)
|
||
var plot_FreqResp_phase_2_3 = gtl.plots.add("Фаза частотного отклика (каналы 2 и 3)");; // частотный отклик между каналами 2 и 3 (мнимая часть)
|
||
|
||
// ***************************************************************
|
||
// ********** ВЫЧИСЛЕНИЕ ЧАСТОТНОГО ОТКЛИКА (ВНИИЖТ) ***********
|
||
// ***************************************************************
|
||
|
||
// Алгоритм
|
||
// 1. Получить спектры ускорения и силы в комплексном виде (вибропреобразователь и молоток).
|
||
// 2. Преобразовать спектр силы (молотка) в комплексно-сопряжённый вид.
|
||
// 3. Получить кросс-спектр (перекрёстный) между ускорением и силой.
|
||
// 4. Вычислить деление кросс-спектра на спектр силы.
|
||
|
||
|
||
// ОБРАБОТКА СИГНАЛОВ
|
||
// ФИЛЬТРЫ
|
||
// Входной сигнал - виброускорение
|
||
|
||
// Файл импорта функций
|
||
// 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; // диапазон поиска гармоник +/-
|
||
|
||
|
||
// Спектры для комплексного представления
|
||
|
||
// Канал 0
|
||
var ausp_0 = gtl.create_ausp(
|
||
{
|
||
"src" : gtl.analog_inputs[signals[0].portNumber],
|
||
"frequency" : 1000,
|
||
"resolution" : 0.25,
|
||
"average" : 6,
|
||
"overlap" : .5,
|
||
"window" : gtl.spec.rectangular
|
||
}
|
||
);
|
||
|
||
// Канал 1
|
||
var ausp_1 = gtl.create_ausp(
|
||
{
|
||
"src" : gtl.analog_inputs[signals[1].portNumber],
|
||
"frequency" : 1000,
|
||
"resolution" : 0.25,
|
||
"average" : 6,
|
||
"overlap" : .5,
|
||
"window" : gtl.spec.rectangular
|
||
}
|
||
);
|
||
|
||
// Канал 2
|
||
var ausp_2 = gtl.create_ausp(
|
||
{
|
||
"src" : gtl.analog_inputs[signals[2].portNumber],
|
||
"frequency" : 1000,
|
||
"resolution" : 0.25,
|
||
"average" : 6,
|
||
"overlap" : .5,
|
||
"window" : gtl.spec.rectangular
|
||
}
|
||
);
|
||
|
||
// Канал 3
|
||
var ausp_3 = gtl.create_ausp(
|
||
{
|
||
"src" : gtl.analog_inputs[signals[3].portNumber],
|
||
"frequency" : 1000,
|
||
"resolution" : 0.25,
|
||
"average" : 6,
|
||
"overlap" : .5,
|
||
"window" : gtl.spec.rectangular
|
||
}
|
||
);
|
||
|
||
//*******************ДИАГНОСТИКА*********************
|
||
//***************************************************
|
||
|
||
// Задаем период проведения диагностики в секундах
|
||
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, ausp_0.acq_time, ausp_1.acq_time, ausp_2.acq_time, ausp_3.acq_time) + 0.3;
|
||
gtl.diagnostic.interval = acq_time;
|
||
// gtl.diagnostic.interval = 10; // время в секундах (константа)
|
||
// примечание: наблюдается зависимость результатов АФЧХ от времени диагностики
|
||
|
||
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
|
||
|
||
// Комплексные числа
|
||
var ausp_accel_0_real = ausp_0.real; // действительная часть спектра ускорения 0
|
||
var ausp_accel_0_imag = ausp_0.imag; // мнимая часть спектра ускорения 0
|
||
var ausp_accel_1_real = ausp_1.real; // действительная часть спектра ускорения 1
|
||
var ausp_accel_1_imag = ausp_1.imag; // мнимая часть спектра ускорения 1
|
||
var ausp_accel_2_real = ausp_2.real; // действительная часть спектра ускорения 2
|
||
var ausp_accel_2_imag = ausp_2.imag; // мнимая часть спектра ускорения 2
|
||
var ausp_force_3_real = ausp_3.real; // действительная часть спектра силы 3
|
||
var ausp_force_3_imag = ausp_3.imag; // мнимая часть спектра силы 3
|
||
|
||
var n = ausp_force_3_data.length; // переменная для цикла
|
||
|
||
gtl.log.info("n (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("Math.PI", Math.PI);
|
||
|
||
|
||
// Получение массивов для формулы определения частотного отклика
|
||
|
||
// Канал_3 (ausp_force_3) - комплексно-сопряжённый вид
|
||
// меняется знак мнимой части на противоположный
|
||
// действительная часть без изменений
|
||
var ausp_force_3_imag_anti = []; // мнимая часть с противоположным знаком
|
||
for (let i = 0; i < n; i += 1)
|
||
{
|
||
ausp_force_3_imag_anti.push(ausp_force_3_imag[i] * (-1));
|
||
}
|
||
// Кросс-спектры
|
||
// Канал_0 & Канал_3
|
||
var ausp_cross_0_3_real = []; // действительная часть кросс-спектра 0 & 3
|
||
var ausp_cross_0_3_imag = []; // мнимая часть кросс-спектра 0 & 3
|
||
for (let i = 0; i < n; i += 1)
|
||
{
|
||
ausp_cross_0_3_real.push(ausp_accel_0_real[i] * ausp_force_3_real[i] -
|
||
(ausp_accel_0_imag[i] * ausp_force_3_imag_anti[i]));
|
||
ausp_cross_0_3_imag.push(ausp_accel_0_real[i] * ausp_force_3_imag_anti[i] +
|
||
ausp_accel_0_imag[i] * ausp_force_3_real[i]);
|
||
}
|
||
// Канал_1 & Канал_3
|
||
var ausp_cross_1_3_real = []; // действительная часть кросс-спектра 1 & 3
|
||
var ausp_cross_1_3_imag = []; // мнимая часть кросс-спектра 1 & 3
|
||
for (let i = 0; i < n; i += 1)
|
||
{
|
||
ausp_cross_1_3_real.push(ausp_accel_1_real[i] * ausp_force_3_real[i] -
|
||
(ausp_accel_1_imag[i] * ausp_force_3_imag_anti[i]));
|
||
ausp_cross_1_3_imag.push(ausp_accel_1_real[i] * ausp_force_3_imag_anti[i] +
|
||
ausp_accel_1_imag[i] * ausp_force_3_real[i]);
|
||
}
|
||
// Канал_2 & Канал_3
|
||
var ausp_cross_2_3_real = []; // действительная часть кросс-спектра 2 & 3
|
||
var ausp_cross_2_3_imag = []; // мнимая часть кросс-спектра 2 & 3
|
||
for (let i = 0; i < n; i += 1)
|
||
{
|
||
ausp_cross_2_3_real.push(ausp_accel_2_real[i] * ausp_force_3_real[i] -
|
||
(ausp_accel_2_imag[i] * ausp_force_3_imag_anti[i]));
|
||
ausp_cross_2_3_imag.push(ausp_accel_2_real[i] * ausp_force_3_imag_anti[i] +
|
||
ausp_accel_2_imag[i] * ausp_force_3_real[i]);
|
||
}
|
||
|
||
// Частотный отклик (деление кросс-спектра на спектр силы)
|
||
// (Канал_0 & Канал_3) / Канал_3
|
||
var freq_resp_0_3_real = []; // действительная часть частотного отклика между 0 и 3
|
||
var freq_resp_0_3_imag = []; // мнимая часть частотного отклика между 0 и 3
|
||
var freq_resp_0_3_ampl = []; // амплитуда частотного отклика между 0 и 3
|
||
var freq_resp_0_3_phase = []; // фаза частотного отклика между 0 и 3
|
||
|
||
for (let i = 0; i < n; i += 1)
|
||
{
|
||
freq_resp_0_3_real.push((ausp_cross_0_3_real[i] * ausp_force_3_real[i] +
|
||
ausp_cross_0_3_imag[i] * ausp_force_3_imag[i]) /
|
||
(Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2)));
|
||
|
||
freq_resp_0_3_imag.push((ausp_force_3_real[i] * ausp_cross_0_3_imag[i] -
|
||
ausp_cross_0_3_real[i] * ausp_force_3_imag[i]) /
|
||
(Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2)));
|
||
}
|
||
// запись массива амплитуды и фазы
|
||
for (let i = 0; i < n; i += 1)
|
||
{
|
||
freq_resp_0_3_ampl.push(Math.sqrt(Math.pow(freq_resp_0_3_real[i],2) + Math.pow(freq_resp_0_3_imag[i],2)));
|
||
freq_resp_0_3_phase.push(Math.atan(freq_resp_0_3_imag[i] / freq_resp_0_3_real[i]) * 180 / Math.PI);
|
||
}
|
||
|
||
// (Канал_1 & Канал_3) / Канал_3
|
||
var freq_resp_1_3_real = []; // действительная часть частотного отклика между 0 и 3
|
||
var freq_resp_1_3_imag = []; // мнимая часть частотного отклика между 0 и 3
|
||
var freq_resp_1_3_ampl = []; // амплитуда частотного отклика между 0 и 3
|
||
var freq_resp_1_3_phase = []; // фаза частотного отклика между 0 и 3
|
||
|
||
for (let i = 0; i < n; i += 1)
|
||
{
|
||
freq_resp_1_3_real.push((ausp_cross_1_3_real[i] * ausp_force_3_real[i] +
|
||
ausp_cross_1_3_imag[i] * ausp_force_3_imag[i]) /
|
||
(Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2)));
|
||
|
||
freq_resp_1_3_imag.push((ausp_force_3_real[i] * ausp_cross_1_3_imag[i] -
|
||
ausp_cross_1_3_real[i] * ausp_force_3_imag[i]) /
|
||
(Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2)));
|
||
}
|
||
// запись массива амплитуды и фазы
|
||
for (let i = 0; i < n; i += 1)
|
||
{
|
||
freq_resp_1_3_ampl.push(Math.sqrt(Math.pow(freq_resp_1_3_real[i],2) + Math.pow(freq_resp_1_3_imag[i],2)));
|
||
freq_resp_1_3_phase.push(Math.atan(freq_resp_1_3_imag[i] / freq_resp_1_3_real[i]) * 180 / Math.PI);
|
||
}
|
||
|
||
// (Канал_2 & Канал_3) / Канал_3
|
||
var freq_resp_2_3_real = []; // действительная часть частотного отклика между 2 и 3
|
||
var freq_resp_2_3_imag = []; // мнимая часть частотного отклика между 2 и 3
|
||
var freq_resp_2_3_ampl = []; // амплитуда частотного отклика между 2 и 3
|
||
var freq_resp_2_3_phase = []; // фаза частотного отклика между 2 и 3
|
||
|
||
for (let i = 0; i < n; i += 1)
|
||
{
|
||
freq_resp_2_3_real.push((ausp_cross_2_3_real[i] * ausp_force_3_real[i] +
|
||
ausp_cross_2_3_imag[i] * ausp_force_3_imag[i]) /
|
||
(Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2)));
|
||
|
||
freq_resp_2_3_imag.push((ausp_force_3_real[i] * ausp_cross_2_3_imag[i] -
|
||
ausp_cross_2_3_real[i] * ausp_force_3_imag[i]) /
|
||
(Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2)));
|
||
}
|
||
// запись массива амплитуды и фазы
|
||
for (let i = 0; i < n; i += 1)
|
||
{
|
||
freq_resp_2_3_ampl.push(Math.sqrt(Math.pow(freq_resp_2_3_real[i],2) + Math.pow(freq_resp_2_3_imag[i],2)));
|
||
freq_resp_2_3_phase.push(Math.atan(freq_resp_2_3_imag[i] / freq_resp_2_3_real[i]) * 180 / Math.PI);
|
||
}
|
||
|
||
// Построение пользовательских графиков
|
||
|
||
plot_0.add(
|
||
{
|
||
color: 0x04ff00,
|
||
name: "Спектр ускорения (канал 0)",
|
||
x: 1/ausp_lines,
|
||
y: ausp_acсel_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_FreqResp_ampl_0_3.add(
|
||
{
|
||
color: 0xedc887,
|
||
name: "Частотный отклик (каналы 0 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: freq_resp_0_3_real
|
||
});
|
||
plot_FreqResp_phase_0_3.add(
|
||
{
|
||
color: 0xedc887,
|
||
name: "Фаза частотного отклика (каналы 0 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: freq_resp_0_3_phase
|
||
});
|
||
|
||
plot_FreqResp_ampl_1_3.add(
|
||
{
|
||
color: 0xedc887,
|
||
name: "Частотный отклик (каналы 1 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: freq_resp_1_3_real
|
||
});
|
||
plot_FreqResp_phase_1_3.add(
|
||
{
|
||
color: 0xedc887,
|
||
name: "Фаза частотного отклика (каналы 1 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: freq_resp_1_3_phase
|
||
});
|
||
|
||
plot_FreqResp_ampl_2_3.add(
|
||
{
|
||
color: 0xedc887,
|
||
name: "Частотный отклик (каналы 2 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: freq_resp_2_3_real
|
||
});
|
||
plot_FreqResp_phase_2_3.add(
|
||
{
|
||
color: 0xedc887,
|
||
name: "Фаза частотного отклика (каналы 2 и 3)",
|
||
x: 1/ausp_lines,
|
||
y: freq_resp_2_3_phase
|
||
});
|
||
|
||
|
||
|
||
gtl.diagnostic.stop();
|
||
} |