183 lines
9.4 KiB
JavaScript
183 lines
9.4 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 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); //вычисляем средний отклик
|
||
|
||
// Отображаем средний спектр отклика
|
||
plot_avg_resp.add({
|
||
color: 0xff3dcc,
|
||
name: `Амплитуда среднего частотного отклика, g/N`,
|
||
x: resolution,
|
||
y: avgResponse,
|
||
tags: ["Амплитуда среднего частотного отклика, g/N"]
|
||
});
|
||
|
||
gtl.log.info('Вычисление среднего отклика', `done!`);
|
||
gtl.diagnostic.stop();
|
||
|
||
}; // останавливаем диагностику после окончания диапазонов
|
||
}
|