252 lines
12 KiB
JavaScript
252 lines
12 KiB
JavaScript
"use strict";
|
||
let signals = gtl.options.record.signalsModel;
|
||
let options = gtl.options;
|
||
let record = gtl.options.record;
|
||
let point = gtl.options.point;
|
||
let getResponse = gtl.import("getResponse.js").getResponse;
|
||
let getAvgArray = gtl.import("getResponse.js").getAvgArray;
|
||
|
||
let plot_ausp = gtl.plots.add("Спектры по каналам"); // спектры по каналам вибрации
|
||
let plot_resp_ampl = gtl.plots.add("Частотный отклик по каналам (амплитуда)"); // амплитудные спектры по каналам вибрации
|
||
let plot_resp_phase = gtl.plots.add("Частотный отклик по каналам (фаза)"); // фазовые спектры по каналам вибрации
|
||
let plot_avg_resp = gtl.plots.add("Средний частотный отклик"); // средний частотный отклик
|
||
|
||
// Цвета
|
||
// #ff0000 - красный
|
||
// #00ff00 - зелёный
|
||
// #0000ff - синий
|
||
// #00ddff - голубой
|
||
// #ff3dcc - фиолетовый
|
||
// #ffff00 - жёлтый
|
||
|
||
// Настройки для спектров и АФЧХ
|
||
let frequency = gtl.options.customOptions.frequency; // граничная частота
|
||
let resolution = gtl.options.customOptions.resolution; // частотное разрешение
|
||
let lines = 1 / resolution; // количество линий
|
||
let average = gtl.options.customOptions.average; // количество усреднений
|
||
let overlap = gtl.options.customOptions.overlap; // наложение
|
||
let view_ = gtl.options.customOptions.view; // отображение амплитуды спектра unit/dB (0/1)
|
||
let view = gtl.spec.unit; // значение view по умолчанию
|
||
let view_freq_resp = gtl.options.customOptions.view_freq_resp; // отображение амплитуды спектра частотного отклика db / unit (1 / 0)
|
||
let variant_freq_resp = gtl.options.customOptions.variant_freq_resp; // вариант вычисления: 0 - через кросс, 1 - через автоспектр
|
||
let thresh_level = gtl.options.customOptions.thresh_level; // уровень удара для засчитывания импульса
|
||
let time_impulse_ = gtl.options.customOptions.time_impulse; // задание длины импульса из опций
|
||
let remove_resp_arr = gtl.options.customOptions.remove_resp_arr;
|
||
gtl.log.info("remove_resp_arr", remove_resp_arr);
|
||
|
||
// Задание диапазона сигнала для анализа
|
||
// let ranges = gtl.player.stored_ranges;
|
||
let ranges = gtl.options.customOptions.ranges;
|
||
gtl.player.custom_ranges = ranges; // задание диапазонов плеера
|
||
|
||
// Спектры каналов ускорения (каналы датчиков вибрации)
|
||
gtl.log.info("Количество сигналов", signals.length);
|
||
gtl.log.info("Граничная частота спектров", frequency);
|
||
gtl.log.info("Частотное разрешение спектров", resolution);
|
||
|
||
let spec_view = view_ == 0 ? gtl.spec.unit : gtl.spec.db; // условие отображения спектров в дБ или линейном виде
|
||
let src_force; // источник сигнала силы
|
||
let channel = 1; // номер первого канала вибрации
|
||
let window_spec_force = gtl.options.customOptions.window_spec_force; // окно спектра силы
|
||
let window_spec_vibr = gtl.options.customOptions.window_spec_vibr; // окно спектра вибрации
|
||
|
||
let signal_source = gtl.options.customOptions.signal_source; // выбор источника сигнала: 0 - сырой / 1 - фильтр
|
||
let left_bord_filt = gtl.options.customOptions.left_bord_filt; // левая граница фильтра
|
||
let right_bord_filt = gtl.options.customOptions.right_bord_filt; // правая граница фильтра
|
||
let order_filt = gtl.options.customOptions.order_filt; // порядок фильтра
|
||
let kind_filt = gtl.options.customOptions.kind_filt; // тип окна фильтра gtl.filter_iir.butterworth
|
||
let width_filt; // полоса пропускания фильтра
|
||
width_filt = right_bord_filt - left_bord_filt;
|
||
let freq_filt; // центральная частота фильтра
|
||
freq_filt = right_bord_filt - width_filt/2;
|
||
|
||
// СИГНАЛ СИЛЫ (молоток)
|
||
|
||
// Фильтрация
|
||
let filter_force = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
|
||
filter_force.kind = kind_filt;
|
||
filter_force.type = gtl.filter_iir.bandpass;
|
||
filter_force.order = order_filt;
|
||
filter_force.frequency = freq_filt; // центральная частота полосового фильтра
|
||
filter_force.width = width_filt; // ширина полосы фильтра
|
||
|
||
// Выбор источника сигнала силы: фильтр / сырой сигнал
|
||
if (signal_source == 1)
|
||
{
|
||
src_force = filter_force; // источник фильтр
|
||
}
|
||
else if (signal_source == 0)
|
||
{
|
||
src_force = gtl.analog_inputs[signals[0].portNumber]; // источник cырой сигнал
|
||
}
|
||
|
||
let force = gtl.create_ausp({
|
||
src: src_force,
|
||
frequency: frequency,
|
||
resolution: resolution,
|
||
average: average,
|
||
overlap: overlap,
|
||
window: window_spec_force,
|
||
view: view
|
||
});
|
||
|
||
|
||
|
||
// СИГНАЛЫ ВИБРАЦИИ (отклик)
|
||
|
||
// Спектр амплитудный для цикла по всем каналам вибрации
|
||
let srs_vibr; // источник сигнала вибрации
|
||
let ausps = []; //массив объектов спектров вибрации по каналам
|
||
let ausp_arr = [];
|
||
let phases = []; //массив объектов ФЧХ по каналам
|
||
let phase_arr
|
||
let ausps_data = []; //массив данных спектров после каждого удара
|
||
let resps_data = []; //массив данных откликов после каждого удара
|
||
|
||
// Цикл по каналам
|
||
for (let j = channel; j < signals.length; j++) {
|
||
|
||
// Фильтрация
|
||
let filter_vibr = gtl.add_filter_iir(gtl.analog_inputs[signals[j].portNumber]);
|
||
filter_vibr.kind = kind_filt;
|
||
filter_vibr.type = gtl.filter_iir.bandpass;
|
||
filter_vibr.order = order_filt;
|
||
filter_vibr.frequency = freq_filt; // центральная частота полосового фильтра
|
||
filter_vibr.width = width_filt; // ширина полосы фильтра
|
||
|
||
// Выбор источника сигнала вибрации: фильтр / сырой сигнал
|
||
if (signal_source == 1)
|
||
{
|
||
src_vibr = filter_vibr; // источник фильтр
|
||
}
|
||
else if (signal_source == 0)
|
||
{
|
||
src_vibr = gtl.analog_inputs[signals[j].portNumber]; // источник cырой сигнал
|
||
}
|
||
|
||
let ausp = gtl.create_ausp({
|
||
src: src_vibr, // сырой сигнал вибрации
|
||
frequency: frequency,
|
||
resolution: resolution,
|
||
average: average,
|
||
overlap: overlap,
|
||
window: window_spec_vibr,
|
||
view: spec_view
|
||
});
|
||
|
||
let phase_delta = gtl.create_pfc({
|
||
src0: src_force, // сигнал силы, относительно него вычисляем дельту фазы
|
||
src1: src_vibr, // сигнал вибрации
|
||
frequency: frequency,
|
||
resolution: resolution,
|
||
average: average,
|
||
overlap: overlap,
|
||
window: gtl.spec.rectangular,
|
||
view: gtl.phase.deg,
|
||
range: gtl.phase.positive,
|
||
is_single: false
|
||
});
|
||
|
||
};
|
||
// Запись массивовм спектров вибрации
|
||
ausp_arr.push(ausp);
|
||
phase_arr.push(phase_delta);
|
||
|
||
|
||
let time_window = 0.0001 // временное окно наблюдения
|
||
let time_impulse = time_impulse_ == 0 ? gtl.acq_time + 0.01 : time_impulse_; // условие выбора длительности импульса
|
||
// let time_pre = time_window / 2; // время предыстории
|
||
// let ranges = []; // массив диапазонов для импульсов
|
||
let tries = 0; // циклы диагностки
|
||
let is_ranges = false; // состояние готовности диапазонов
|
||
|
||
/* Функция диагностики.
|
||
Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера
|
||
После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера
|
||
Затем устанавливается интервал запуска функции диагностики, равный временному окну диапазона и запускается отсчет циклов (попыток) диагностики
|
||
Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается
|
||
*/
|
||
|
||
gtl.diagnostic.interval = time_impulse; // первичный интервал запуска функции диагностики
|
||
gtl.log.info('Время импульса', time_impulse);
|
||
|
||
function diagnose() {
|
||
|
||
if (!is_ranges) {
|
||
is_ranges = true; // пользовательские диапазоны готовы
|
||
gtl.log.info('creating ranges', true);
|
||
gtl.log.info('ranges', JSON.stringify(gtl.player.custom_ranges));
|
||
gtl.log.info("Количество диапазонов в плеере", ranges.length);
|
||
gtl.log.info("Установленный интервал запуска диагностики", time_impulse);
|
||
gtl.log.info("acq_time", gtl.acq_time);
|
||
}
|
||
|
||
if (tries > 0) {
|
||
gtl.log.info("Количество элементов массива force", force.data.length);
|
||
gtl.log.info("Количество спектров вибрации ausp_arr", ausp_arr.data.length);
|
||
gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`);
|
||
gtl.log.info('Диапазон плеера', JSON.stringify(gtl.player.custom_ranges));
|
||
|
||
// Отображаем спектр силы
|
||
plot_ausp.add({
|
||
color: 0xff00f7,
|
||
name: `Спектр силы - удар №${tries}, N`,
|
||
x: force.resolution,
|
||
y: force.data,
|
||
tags: [`Спектр силы, N`]
|
||
});
|
||
|
||
// Отображаем автоспектр вибрации
|
||
// по всем каналам
|
||
for (let j = 0; j < ausp_arr.length; j++) {
|
||
|
||
plot_ausp.add({
|
||
color: 0x34C924,
|
||
name: `Спектр канала ${j+1} - удар №${tries}, g`,
|
||
x: ausp_arr[j].resolution,
|
||
y: ausp_arr[j].data,
|
||
tags: ["Cпектр вибрации, g"]
|
||
});
|
||
|
||
// Вычисляем спектр отклика
|
||
let rsp = getResponse({
|
||
spec_force: force, //спектр силы
|
||
spec_vibro: ausp_arr[j], //спектр вибрации
|
||
type: variant_freq_resp, //способ вычисления отклика
|
||
view: 0 //способ отображения спектра в линейных единицах или дБ
|
||
});
|
||
|
||
// Отображаем спектр отклика
|
||
plot_resp_ampl.add({
|
||
color: 0x3b30b6,
|
||
name: `Амплитуда частотного отклика канала ${j+1} - удар №${tries}, g/N`,
|
||
x: resolution,
|
||
y: rsp.data,
|
||
tags: ["Амплитуда частотного отклика, g/N"]
|
||
});
|
||
|
||
ausps_data.push(ausp.data);
|
||
resps_data.push(rsp.data);
|
||
}
|
||
|
||
tries++;
|
||
if (tries > ranges.length) {
|
||
gtl.log.info('Вычисление среднего отклика', `processing...`);
|
||
|
||
const avgResponse = getAvgArray(resps_data, remove_resp_arr); //вычисляем средний отклик
|
||
|
||
// Отображаем средний спектр отклика
|
||
plot_avg_resp.add({
|
||
color: 0xff3dcc,
|
||
name: `Амплитуда среднего частотного отклика, g/N`,
|
||
x: resolution,
|
||
y: avgResponse,
|
||
tags: ["Амплитуда среднего частотного отклика, g/N"]
|
||
});
|
||
|
||
gtl.log.info('Вычисление среднего отклика', `done!`);
|
||
gtl.diagnostic.stop();
|
||
|
||
}; // останавливаем диагностику после окончания диапазонов
|
||
}
|