freq_responce/scripts/freq_response_multichannel.js

193 lines
9.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"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 plot_ausp = gtl.plots.add("Спектры по каналам"); // спектры по каналам вибрации
let plot_resp_ampl = gtl.plots.add("Частотный отклик по каналам (амплитуда)"); // амплитудные спектры по каналам вибрации
let plot_resp_phase = 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 ranges = gtl.player.stored_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 = gtl.analog_inputs[signals[0].portNumber]; // источник сигнала силы
let channel = 1; //номер первого канала вибрации
let force = gtl.create_ausp({
src: src_force, // сигнал силы
frequency: frequency,
resolution: resolution,
average: average,
overlap: overlap,
window: gtl.spec.rectangular,
view: view
});
// Спектр амплитудный для цикла по всем каналам вибрации
let ausps = []; //массив объектов спектров вибрации по каналам
let phases = []; //массив объектов ФЧХ по каналам
for (let i = 1; i <= signals.length -1; i++) {
let ausp = gtl.create_ausp({
src: gtl.analog_inputs[signals[i].portNumber], // сырой сигнал вибрации
frequency: frequency,
resolution: resolution,
average: average,
overlap: overlap,
window: gtl.spec.rectangular,
view: spec_view
});
ausps.push(ausp);
}; //цикл по каналам
let phase_delta = gtl.create_pfc({
src0: src_force, // сигнал силы, относительно него вычисляем дельту фазы
src1: gtl.analog_inputs[signals[channel].portNumber], // сигнал вибрации
frequency: frequency,
resolution: resolution,
average: average,
overlap: overlap,
window: gtl.spec.rectangular,
view: gtl.phase.deg,
range: gtl.phase.positive,
is_single: false
});
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; // состояние готовности диапазонов
// Порог для отслеживание импульсов
let __thresh = gtl.create_moving_thresh({
src: src_force,
name: "thresh",
time: time_window,
level: thresh_level
});
__thresh.triggered.connect(thresh_triggered_event); //подключаем функцию
// Функция получения диапазонов импульсов
function thresh_triggered_event(flag, sample) {
if (is_ranges) return;
if (flag) {
let start = (sample / __thresh.rate) - time_pre; //время срабатывания триггера
gtl.log.info("trigger on time", start);
let range = {
min: start,
max: start + time_impulse
};
ranges.push(range); //добавляем диапазон в массив
};
};
/* Функция диагностики.
Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера
После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера
Затем устанавливается интервал запуска функции диагностики, равный временному окну для анализа импульса и запускается отсчет циклов (попыток) диагностики
Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается
*/
gtl.diagnostic.interval = gtl.options.record.playerTime; // первичный интервал запуска функции диагностики
gtl.log.info('Время импульса', time_impulse);
function diagnose() {
if (!is_ranges) {
gtl.player.custom_ranges = ranges; // добавляем пользовательские диапазоны в плеер
gtl.results = { ranges: ranges }; // добавляем диапазоны в результат
gtl.log.info('creating ranges', true);
gtl.log.info('ranges', JSON.stringify(ranges));
is_ranges = true; // пользовательские диапазоны готовы
gtl.diagnostic.interval = time_impulse; // задаем время запуска функции диагностики, равное длине импульса
gtl.log.info("Количество диапазонов в плеере", ranges.length);
gtl.log.info("Установленный интервал запуска диагностики", time_impulse);
gtl.log.info("acq_time", gtl.acq_time);
}
if (tries > 0) {
gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`)
// Отображаем спектр силы
plot_ausp.add({
color: 0xff00f7,
name: `Спектр силы - удар №${tries}, N`,
x: force.resolution,
y: force.data,
tags: [`Спектр силы, N`]
});
for (let i = 0; i < ausps.length; i++) {
// Отображаем автоспектр вибрации
plot_ausp.add({
color: 0x34C924,
name: `Спектр канала ${i+1} - удар №${tries}, g`,
x: ausps[i].resolution,
y: ausps[i].data,
tags: ["Cпектр вибрации, g"]
});
// Вычисляем спектр отклика
let rsp = getResponse({
spec_force: force, //спектр силы
spec_vibro: ausps[i], //спектр вибрации
type: variant_freq_resp, //способ вычисления отклика
view: 0 //способ отображения спектра в линейных единицах или дБ
});
// Отображаем спектр отклика
plot_resp_ampl.add({
color: 0x3b30b6,
name: `Амплитуда частотного отклика канала ${i+1} - удар №${tries}, g/N`,
x: resolution,
y: rsp.data,
tags: ["Амплитуда частотного отклика, g/N"]
});
// Отображаем фазовый спектр отклика
plot_resp_phase.add({
color: 0xff3dcc,
name: `Фаза частотного отклика канала ${i+1} - удар №${tries}, °`,
x: resolution,
y: rsp.phase,
tags: ["Фаза частотного отклика, °"]
});
}
}
tries++;
if (tries > ranges.length) gtl.diagnostic.stop(); // останавливаем диагностику после окончания диапазонов
}