"use strict"; var signals = gtl.options.record.signalsModel; var options = gtl.options; var record = gtl.options.record; var point = gtl.options.point; var fnc = gtl.import("user-functions.js"); // используемые функции var plot_0 = gtl.plots.add("Спектр ускорения (канал 0)"); // спектр ускорения канала 0 var plot_1 = gtl.plots.add("Спектр ускорения (канал 1)"); // спектр ускорения канала 1 var plot_2 = gtl.plots.add("Спектр ускорения (канал 2)"); // спектр ускорения канала 2 var plot_3 = gtl.plots.add("Спектр силы (канал 3)"); // спектр ускорения канала 3 var plot_FreqResp_ampl_0_3 = gtl.plots.add("Частотный отклик (каналы 0 и 3)"); // частотный отклик между каналами 0 и 3 (действительная часть) var plot_FreqResp_ampl_1_3 = gtl.plots.add("Частотный отклик (каналы 1 и 3)"); // частотный отклик между каналами 1 и 3 (действительная часть) var plot_FreqResp_ampl_2_3 = gtl.plots.add("Частотный отклик (каналы 2 и 3)"); // частотный отклик между каналами 2 и 3 (действительная часть) var plot_FreqResp_phase_0_3 = gtl.plots.add("Фаза частотного отклика (каналы 0 и 3)"); // частотный отклик между каналами 0 и 3 (мнимая часть) var plot_FreqResp_phase_1_3 = gtl.plots.add("Фаза частотного отклика (каналы 1 и 3)"); // частотный отклик между каналами 1 и 3 (мнимая часть) var plot_FreqResp_phase_2_3 = gtl.plots.add("Фаза частотного отклика (каналы 2 и 3)");; // частотный отклик между каналами 2 и 3 (мнимая часть) // *************************************************************** // ********** ВЫЧИСЛЕНИЕ ЧАСТОТНОГО ОТКЛИКА (ВНИИЖТ) *********** // *************************************************************** // Алгоритм // 1. Получить спектры ускорения и силы в комплексном виде (вибропреобразователь и молоток). // 2. Преобразовать спектр силы (молотка) в комплексно-сопряжённый вид. // 3. Получить кросс-спектр (перекрёстный) между ускорением и силой. // 4. Вычислить деление кросс-спектра на спектр силы. // ОБРАБОТКА СИГНАЛОВ // ФИЛЬТРЫ // Входной сигнал - виброускорение // Файл импорта функций // var imp = gtl.import("..."); // ПАРАМЕТРЫ и их ПОРОГОВЫЕ ЗНАЧЕНИЯ (уставки) // Настройки спектров // Цвета // #ff0000 - красный // #00ff00 - зелёный // #0000ff - синий // #00ddff - голубой // #ff3dcc - фиолетовый // #ffff00 - жёлтый // Пороги и прочие изменяемые параметры var ausp_frequency = 1000; // граничная частота спектра var ausp_average = 1; // количество усреднений спектра var ausp_lines = 4; // множитель количества линий спектра (на 1 Гц) var ausp_smoothing_factor = 100; // усреднение средней линии var ausp_peak_level = 0.001 // порог обнаружения гармоник РЕДАКТИРОВАТЬ НА РЕАЛЬНЫХ СИГНАЛАХ var ausp_tolerance = 1; // диапазон поиска гармоники по ширине +/- Гц var average = 6; // количество усреднений объекта АФЧХ (когерентность и разница фаз) // var ausp_unit = gtl.spec.db; // отображение амплитуды в дБ var ausp_unit = gtl.spec.unit; // отображение амплитуды в м/с^2 // *** Формирование спектров сигналов *** // Спектры каналов ускорения (каналы датчиков вибрации) // Канал_0 var ausp_acсel_0 = gtl.add_ausp(gtl.analog_inputs[signals[0].portNumber]); // объявление переменной спектра ausp_acсel_0.color = 0x04ff00; // цвет спектра ausp_acсel_0.name = "Спектр ускорения (канал 0)"; // имя спектра ausp_acсel_0.color = 0x000000ff; // синий цвет спектра ausp_acсel_0.frequency = ausp_frequency; ausp_acсel_0.lines = ausp_frequency * ausp_lines; ausp_acсel_0.average = ausp_average; ausp_acсel_0.unit = ausp_unit; // отображение амплитуды ausp_acсel_0.smoothing_factor = ausp_smoothing_factor; ausp_acсel_0.smoothed_line_color = 0xff004dff; // цвет средней линии ausp_acсel_0.peak_level = ausp_peak_level; ausp_acсel_0.tolerance = ausp_tolerance; // диапазон поиска гармоник +/- // Канал_1 var ausp_acсel_1 = gtl.add_ausp(gtl.analog_inputs[signals[1].portNumber]); // объявление переменной спектра ausp_acсel_1.color = 0xcad714; // цвет спектра ausp_acсel_1.name = "Спектр ускорения (канал 1)"; // имя спектра ausp_acсel_1.color = 0x000000ff; // синий цвет спектра ausp_acсel_1.frequency = ausp_frequency; ausp_acсel_1.lines = ausp_frequency * ausp_lines; ausp_acсel_1.average = ausp_average; ausp_acсel_1.unit = ausp_unit; // отображение амплитуды ausp_acсel_1.smoothing_factor = ausp_smoothing_factor; ausp_acсel_1.smoothed_line_color = 0xff004dff; // цвет средней линии ausp_acсel_1.peak_level = ausp_peak_level; ausp_acсel_1.tolerance = ausp_tolerance; // диапазон поиска гармоник +/- // Канал_2 var ausp_acсel_2 = gtl.add_ausp(gtl.analog_inputs[signals[2].portNumber]); // объявление переменной спектра ausp_acсel_2.color = 0xff8800; // цвет спектра ausp_acсel_2.name = "Спектр ускорения (канал 2)"; // имя спектра ausp_acсel_2.color = 0x000000ff; // синий цвет спектра ausp_acсel_2.frequency = ausp_frequency; ausp_acсel_2.lines = ausp_frequency * ausp_lines; ausp_acсel_2.average = ausp_average; ausp_acсel_2.unit = ausp_unit; // отображение амплитуды ausp_acсel_2.smoothing_factor = ausp_smoothing_factor; ausp_acсel_2.smoothed_line_color = 0xff004dff; // цвет средней линии ausp_acсel_2.peak_level = ausp_peak_level; ausp_acсel_2.tolerance = ausp_tolerance; // диапазон поиска гармоник +/- // Спектр силы (канал сигнала молотка) // Канал_3 var ausp_force_3 = gtl.add_ausp(gtl.analog_inputs[signals[3].portNumber]); // объявление переменной спектра ausp_force_3.color = 0x000000ff; // цвет спектра ausp_force_3.name = "Спектр силы (канал 3)"; // имя спектра ausp_force_3.color = 0x00ff0000; // красный цвет спектра ausp_force_3.frequency = ausp_frequency; ausp_force_3.lines = ausp_frequency * ausp_lines; ausp_force_3.average = ausp_average; ausp_force_3.unit = ausp_unit; // отображение амплитуды ausp_force_3.smoothing_factor = ausp_smoothing_factor; ausp_force_3.smoothed_line_color = 0xff004dff; // цвет средней линии ausp_force_3.peak_level = ausp_peak_level; ausp_force_3.tolerance = ausp_tolerance; // диапазон поиска гармоник +/- // Спектры для комплексного представления // Канал 0 var ausp_0 = gtl.create_ausp( { "src" : gtl.analog_inputs[signals[0].portNumber], "frequency" : 1000, "resolution" : 0.25, "average" : 6, "overlap" : .5, "window" : gtl.spec.rectangular } ); // Канал 1 var ausp_1 = gtl.create_ausp( { "src" : gtl.analog_inputs[signals[1].portNumber], "frequency" : 1000, "resolution" : 0.25, "average" : 6, "overlap" : .5, "window" : gtl.spec.rectangular } ); // Канал 2 var ausp_2 = gtl.create_ausp( { "src" : gtl.analog_inputs[signals[2].portNumber], "frequency" : 1000, "resolution" : 0.25, "average" : 6, "overlap" : .5, "window" : gtl.spec.rectangular } ); // Канал 3 var ausp_3 = gtl.create_ausp( { "src" : gtl.analog_inputs[signals[3].portNumber], "frequency" : 1000, "resolution" : 0.25, "average" : 6, "overlap" : .5, "window" : gtl.spec.rectangular } ); //*******************ДИАГНОСТИКА********************* //*************************************************** // Задаем период проведения диагностики в секундах var acq_time = Math.max(ausp_acсel_0.acq_time, ausp_acсel_1.acq_time, ausp_acсel_2.acq_time, ausp_force_3.acq_time, ausp_0.acq_time, ausp_1.acq_time, ausp_2.acq_time, ausp_3.acq_time) + 0.3; gtl.diagnostic.interval = acq_time; // gtl.diagnostic.interval = 10; // время в секундах (константа) // примечание: наблюдается зависимость результатов АФЧХ от времени диагностики function diagnose() { // Массивы значений var ausp_accel_0_data = ausp_acсel_0.data; // массив уровней спектра ускорения 0 var ausp_accel_1_data = ausp_acсel_1.data; // массив уровней спектра ускорения 1 var ausp_accel_2_data = ausp_acсel_2.data; // массив уровней спектра ускорения 2 var ausp_force_3_data = ausp_force_3.data; // массив уровней спектра силы 3 // Комплексные числа var ausp_accel_0_real = ausp_0.real; // действительная часть спектра ускорения 0 var ausp_accel_0_imag = ausp_0.imag; // мнимая часть спектра ускорения 0 var ausp_accel_1_real = ausp_1.real; // действительная часть спектра ускорения 1 var ausp_accel_1_imag = ausp_1.imag; // мнимая часть спектра ускорения 1 var ausp_accel_2_real = ausp_2.real; // действительная часть спектра ускорения 2 var ausp_accel_2_imag = ausp_2.imag; // мнимая часть спектра ускорения 2 var ausp_force_3_real = ausp_3.real; // действительная часть спектра силы 3 var ausp_force_3_imag = ausp_3.imag; // мнимая часть спектра силы 3 var n = ausp_force_3_data.length; // переменная для цикла gtl.log.info("n (ausp_data.length)", ausp_force_3_data.length); gtl.log.info("Минимально необходимая длительность сигнала", gtl.diagnostic.interval); gtl.log.info("ausp_frequency", ausp_frequency); gtl.log.info("ausp_lines", ausp_lines); gtl.log.info("Math.PI", Math.PI); // Получение массивов для формулы определения частотного отклика // Канал_3 (ausp_force_3) - комплексно-сопряжённый вид // меняется знак мнимой части на противоположный // действительная часть без изменений var ausp_force_3_imag_anti = []; // мнимая часть с противоположным знаком for (let i = 0; i < n; i += 1) { ausp_force_3_imag_anti.push(ausp_force_3_imag[i] * (-1)); } // Кросс-спектры // Канал_0 & Канал_3 var ausp_cross_0_3_real = []; // действительная часть кросс-спектра 0 & 3 var ausp_cross_0_3_imag = []; // мнимая часть кросс-спектра 0 & 3 for (let i = 0; i < n; i += 1) { ausp_cross_0_3_real.push(ausp_accel_0_real[i] * ausp_force_3_real[i] - (ausp_accel_0_imag[i] * ausp_force_3_imag_anti[i])); ausp_cross_0_3_imag.push(ausp_accel_0_real[i] * ausp_force_3_imag_anti[i] + ausp_accel_0_imag[i] * ausp_force_3_real[i]); } // Канал_1 & Канал_3 var ausp_cross_1_3_real = []; // действительная часть кросс-спектра 1 & 3 var ausp_cross_1_3_imag = []; // мнимая часть кросс-спектра 1 & 3 for (let i = 0; i < n; i += 1) { ausp_cross_1_3_real.push(ausp_accel_1_real[i] * ausp_force_3_real[i] - (ausp_accel_1_imag[i] * ausp_force_3_imag_anti[i])); ausp_cross_1_3_imag.push(ausp_accel_1_real[i] * ausp_force_3_imag_anti[i] + ausp_accel_1_imag[i] * ausp_force_3_real[i]); } // Канал_2 & Канал_3 var ausp_cross_2_3_real = []; // действительная часть кросс-спектра 2 & 3 var ausp_cross_2_3_imag = []; // мнимая часть кросс-спектра 2 & 3 for (let i = 0; i < n; i += 1) { ausp_cross_2_3_real.push(ausp_accel_2_real[i] * ausp_force_3_real[i] - (ausp_accel_2_imag[i] * ausp_force_3_imag_anti[i])); ausp_cross_2_3_imag.push(ausp_accel_2_real[i] * ausp_force_3_imag_anti[i] + ausp_accel_2_imag[i] * ausp_force_3_real[i]); } // Частотный отклик (деление кросс-спектра на спектр силы) // (Канал_0 & Канал_3) / Канал_3 var freq_resp_0_3_real = []; // действительная часть частотного отклика между 0 и 3 var freq_resp_0_3_imag = []; // мнимая часть частотного отклика между 0 и 3 var freq_resp_0_3_ampl = []; // амплитуда частотного отклика между 0 и 3 var freq_resp_0_3_phase = []; // фаза частотного отклика между 0 и 3 for (let i = 0; i < n; i += 1) { freq_resp_0_3_real.push((ausp_cross_0_3_real[i] * ausp_force_3_real[i] + ausp_cross_0_3_imag[i] * ausp_force_3_imag[i]) / (Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2))); freq_resp_0_3_imag.push((ausp_force_3_real[i] * ausp_cross_0_3_imag[i] - ausp_cross_0_3_real[i] * ausp_force_3_imag[i]) / (Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2))); } // запись массива амплитуды и фазы for (let i = 0; i < n; i += 1) { freq_resp_0_3_ampl.push(Math.sqrt(Math.pow(freq_resp_0_3_real[i],2) + Math.pow(freq_resp_0_3_imag[i],2))); freq_resp_0_3_phase.push(Math.atan(freq_resp_0_3_imag[i] / freq_resp_0_3_real[i]) * 180 / Math.PI); } // (Канал_1 & Канал_3) / Канал_3 var freq_resp_1_3_real = []; // действительная часть частотного отклика между 0 и 3 var freq_resp_1_3_imag = []; // мнимая часть частотного отклика между 0 и 3 var freq_resp_1_3_ampl = []; // амплитуда частотного отклика между 0 и 3 var freq_resp_1_3_phase = []; // фаза частотного отклика между 0 и 3 for (let i = 0; i < n; i += 1) { freq_resp_1_3_real.push((ausp_cross_1_3_real[i] * ausp_force_3_real[i] + ausp_cross_1_3_imag[i] * ausp_force_3_imag[i]) / (Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2))); freq_resp_1_3_imag.push((ausp_force_3_real[i] * ausp_cross_1_3_imag[i] - ausp_cross_1_3_real[i] * ausp_force_3_imag[i]) / (Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2))); } // запись массива амплитуды и фазы for (let i = 0; i < n; i += 1) { freq_resp_1_3_ampl.push(Math.sqrt(Math.pow(freq_resp_1_3_real[i],2) + Math.pow(freq_resp_1_3_imag[i],2))); freq_resp_1_3_phase.push(Math.atan(freq_resp_1_3_imag[i] / freq_resp_1_3_real[i]) * 180 / Math.PI); } // (Канал_2 & Канал_3) / Канал_3 var freq_resp_2_3_real = []; // действительная часть частотного отклика между 2 и 3 var freq_resp_2_3_imag = []; // мнимая часть частотного отклика между 2 и 3 var freq_resp_2_3_ampl = []; // амплитуда частотного отклика между 2 и 3 var freq_resp_2_3_phase = []; // фаза частотного отклика между 2 и 3 for (let i = 0; i < n; i += 1) { freq_resp_2_3_real.push((ausp_cross_2_3_real[i] * ausp_force_3_real[i] + ausp_cross_2_3_imag[i] * ausp_force_3_imag[i]) / (Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2))); freq_resp_2_3_imag.push((ausp_force_3_real[i] * ausp_cross_2_3_imag[i] - ausp_cross_2_3_real[i] * ausp_force_3_imag[i]) / (Math.pow(ausp_force_3_real[i], 2) + Math.pow(ausp_force_3_imag[i], 2))); } // запись массива амплитуды и фазы for (let i = 0; i < n; i += 1) { freq_resp_2_3_ampl.push(Math.sqrt(Math.pow(freq_resp_2_3_real[i],2) + Math.pow(freq_resp_2_3_imag[i],2))); freq_resp_2_3_phase.push(Math.atan(freq_resp_2_3_imag[i] / freq_resp_2_3_real[i]) * 180 / Math.PI); } // Построение пользовательских графиков plot_0.add( { color: 0x04ff00, name: "Спектр ускорения (канал 0)", x: 1/ausp_lines, y: ausp_acсel_0.data }); plot_1.add( { color: 0xcad714, name: "Спектр ускорения (канал 1)", x: 1/ausp_lines, y: ausp_accel_1_data }); plot_2.add( { color: 0xff8800, name: "Спектр ускорения (канал 2)", x: 1/ausp_lines, y: ausp_accel_2_data }); plot_3.add( { color: 0xff00f7, name: "Спектр силы (канал 3)", x: 1/ausp_lines, y: ausp_force_3_data }); plot_FreqResp_ampl_0_3.add( { color: 0xedc887, name: "Частотный отклик (каналы 0 и 3)", x: 1/ausp_lines, y: freq_resp_0_3_real }); plot_FreqResp_phase_0_3.add( { color: 0xedc887, name: "Фаза частотного отклика (каналы 0 и 3)", x: 1/ausp_lines, y: freq_resp_0_3_phase }); plot_FreqResp_ampl_1_3.add( { color: 0xedc887, name: "Частотный отклик (каналы 1 и 3)", x: 1/ausp_lines, y: freq_resp_1_3_real }); plot_FreqResp_phase_1_3.add( { color: 0xedc887, name: "Фаза частотного отклика (каналы 1 и 3)", x: 1/ausp_lines, y: freq_resp_1_3_phase }); plot_FreqResp_ampl_2_3.add( { color: 0xedc887, name: "Частотный отклик (каналы 2 и 3)", x: 1/ausp_lines, y: freq_resp_2_3_real }); plot_FreqResp_phase_2_3.add( { color: 0xedc887, name: "Фаза частотного отклика (каналы 2 и 3)", x: 1/ausp_lines, y: freq_resp_2_3_phase }); gtl.diagnostic.stop(); }