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