207 lines
10 KiB
JavaScript
207 lines
10 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 = gtl.analog_inputs[signals[0].portNumber]; // источник сигнала силы
|
||
let channel = 1; //номер первого канала вибрации
|
||
let window_spec_force = gtl.options.customOptions.window_spec_force; // окно спектра силы
|
||
let window_spec_vibr = gtl.options.customOptions.window_spec_vibr; // окно спектра вибрации
|
||
|
||
//формируем спектр силы
|
||
let force = gtl.create_ausp({
|
||
src: src_force, // сигнал силы
|
||
frequency: frequency,
|
||
resolution: resolution,
|
||
average: average,
|
||
overlap: overlap,
|
||
window: window_spec_force,
|
||
view: view
|
||
});
|
||
|
||
// Спектр амплитудный для цикла по всем каналам вибрации
|
||
let ausps = []; //массив объектов спектров вибрации по каналам
|
||
let phases = []; //массив объектов ФЧХ по каналам
|
||
let hits_data = {}; //объект результатов по каждому удару
|
||
|
||
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: window_spec_vibr,
|
||
view: spec_view
|
||
});
|
||
ausps.push(ausp);
|
||
|
||
let phase_delta = gtl.create_pfc({
|
||
src0: src_force, // сигнал силы, относительно него вычисляем дельту фазы
|
||
src1: gtl.analog_inputs[signals[i].portNumber], // сигнал вибрации
|
||
frequency: frequency,
|
||
resolution: resolution,
|
||
average: average,
|
||
overlap: overlap,
|
||
window: gtl.spec.rectangular,
|
||
view: gtl.phase.deg,
|
||
range: gtl.phase.positive,
|
||
is_single: false
|
||
});
|
||
phases.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 = 1; // циклы диагностики
|
||
let is_ranges = false; // состояние готовности диапазонов
|
||
|
||
/* Функция диагностики.
|
||
Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера
|
||
После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера
|
||
Затем устанавливается интервал запуска функции диагностики, равный временному окну для анализа импульса и запускается отсчет циклов (попыток) диагностики
|
||
Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается
|
||
*/
|
||
|
||
gtl.diagnostic.interval = gtl.options.record.playerTime; // первичный интервал запуска функции диагностики
|
||
gtl.log.info('Время импульса', time_impulse);
|
||
|
||
function diagnose() {
|
||
let resps_data = []; //массив данных амплитуды откликов после каждого удара
|
||
let resps_phase = []; //массив данных фазы откликов после каждого удара
|
||
|
||
for (let i = 0; i < ausps.length; i++) {
|
||
gtl.log.info('diagnostic', `Удар ${tries} - Канал ${i + 1}`)
|
||
|
||
// Отображаем спектр силы
|
||
plot_ausp.add({
|
||
color: 0xff00f7,
|
||
name: `Удар №${tries}, N - Спектр силы`,
|
||
x: force.resolution,
|
||
y: force.data,
|
||
tags: [`Спектр силы, N`]
|
||
});
|
||
|
||
// Отображаем автоспектр вибрации
|
||
plot_ausp.add({
|
||
color: 0x34C924,
|
||
name: `Удар №${tries}, g - Спектр канала ${i + 1}`,
|
||
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: `Удар №${tries}, g/N - Отклик канала ${i + 1}`,
|
||
x: resolution,
|
||
y: rsp.data,
|
||
tags: ["Амплитуда частотного отклика, g/N"]
|
||
});
|
||
|
||
// // Отображаем фазовый спектр отклика
|
||
// plot_resp_phase.add({
|
||
// color: 0xff3dcc,
|
||
// name: `Удар №${tries}, ° - Фаза частотного отклика канала ${i + 1}`,
|
||
// x: resolution,
|
||
// y: rsp.phase,
|
||
// tags: ["Фаза частотного отклика, °"]
|
||
// });
|
||
|
||
resps_data.push(rsp.data); //добавляем отклики по каждому каналу (амплитуда)
|
||
resps_phase.push(rsp.phase); //добавляем отклики по каждому каналу (фаза)
|
||
}
|
||
|
||
//собираем данные удара по всем каналам
|
||
hits_data[`hit${tries}`] = {
|
||
resps_data: resps_data,
|
||
resps_phase: resps_phase
|
||
}
|
||
|
||
tries++; // увеличение счётчика
|
||
|
||
if (tries > ranges.length) {
|
||
gtl.log.info('Вычисление среднего отклика по каналам', `processing...`);
|
||
// gtl.results = hits_data; //добавляем результат по всем ударам в ПО
|
||
|
||
for (let i = 0; i < ausps.length; i++) {
|
||
gtl.log.info(`Формируем данные по Каналу ${i + 1}`, `processing...`);
|
||
let channelData = [];
|
||
let channelPhase = [];
|
||
|
||
for (const hitKey in hits_data) {
|
||
let hit = hits_data[hitKey];
|
||
// gtl.log.info(`Канал ${i + 1}, удар ${hitKey}`, JSON.stringify(hit.resps_data[i]));
|
||
channelData.push(hit.resps_data[i]);
|
||
channelPhase.push(hit.resps_phase[i]);
|
||
}
|
||
|
||
let avgResponse = getAvgArray(channelData, remove_resp_arr); //вычисляем средний отклик
|
||
plot_avg_resp.add({
|
||
color: 0xff3dcc,
|
||
name: `Усредн.отклик кан.${i + 1}, g/N`,
|
||
x: resolution,
|
||
y: avgResponse,
|
||
tags: ["Усреднённый отклик, g/N"]
|
||
});
|
||
|
||
gtl.log.info(`Вычисление среднего отклика по Каналу ${i + 1}`, `done!`);
|
||
}
|
||
gtl.diagnostic.stop(); // останавливаем диагностику после окончания диапазонов
|
||
}
|
||
}
|