193 lines
9.5 KiB
JavaScript
193 lines
9.5 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 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(); // останавливаем диагностику после окончания диапазонов
|
||
}
|