freq_responce/scripts/freq_response 2.js

184 lines
9.5 KiB
JavaScript
Raw 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 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;
// Задание диапазона сигнала для анализа
// 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 = 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 = []; //массив объектов ФЧХ по каналам
let ausps_data = []; //массив данных спектров после каздого удара
let resps_data = []; //массив данных откликов после каждого удара
for (let i = channel; i < signals.length; i++) { }; //цикл по каналам
let ausp = gtl.create_ausp({
src: gtl.analog_inputs[signals[channel].portNumber], // сырой сигнал вибрации
frequency: frequency,
resolution: resolution,
average: average,
overlap: overlap,
window: gtl.spec.rectangular,
view: spec_view
});
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; // состояние готовности диапазонов
/* Функция диагностики.
Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера
После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера
Затем устанавливается интервал запуска функции диагностики, равный временному окну диапазона и запускается отсчет циклов (попыток) диагностики
Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается
*/
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", ausp.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`]
});
// Отображаем автоспектр вибрации
plot_ausp.add({
color: 0x34C924,
name: `Спектр канала 1 - удар №${tries}, g`,
x: ausp.resolution,
y: ausp.data,
tags: ["Cпектр вибрации, g"]
});
// Вычисляем спектр отклика
let rsp = getResponse({
spec_force: force, //спектр силы
spec_vibro: ausp, //спектр вибрации
type: variant_freq_resp, //способ вычисления отклика
view: 0 //способ отображения спектра в линейных единицах или дБ
});
// Отображаем спектр отклика
plot_resp_ampl.add({
color: 0x3b30b6,
name: `Амплитуда частотного отклика канала 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();
}; // останавливаем диагностику после окончания диапазонов
}