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