"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; // Спектры каналов ускорения (каналы датчиков вибрации) 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; // состояние готовности диапазонов // Порог для отслеживание импульсов 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.player.custom_ranges = [ranges[0]]; // добавляем первый диапазон в плеер gtl.results = { ranges: ranges }; // добавляем диапазоны в результат gtl.log.info('creating ranges', true); gtl.log.info('ranges', JSON.stringify(gtl.player.custom_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}`); 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); gtl.player.custom_ranges = [ranges[tries]]; // устанавливаем следующий диапазон } 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(); }; // останавливаем диагностику после окончания диапазонов }