"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_0_3 = gtl.plots.add("Перекрёстный спектр (каналы 0 и 3)"); // перекрёстный спектр каналов 0 и 3 var plot_1_3 = gtl.plots.add("Перекрёстный спектр (каналы 1 и 3)"); // перекрёстный спектр каналов 1 и 3 var plot_2_3 = gtl.plots.add("Перекрёстный спектр (каналы 2 и 3)"); // перекрёстный спектр каналов 2 и 3 var plotSpecTransfer_0_3 = gtl.plots.add("Спектр передаточной функции (каналы 0 и 3)"); // спектр передаточной функции каналов 0 и 3 var plotSpecTransfer_1_3 = gtl.plots.add("Спектр передаточной функции (каналы 1 и 3)"); // спектр передаточной функции каналов 1 и 3 var plotSpecTransfer_2_3 = gtl.plots.add("Спектр передаточной функции (каналы 2 и 3)"); // спектр передаточной функции каналов 2 и 3 var plotTransfer_0_3 = gtl.plots.add("Передаточная функция (каналы 0 и 3)"); // передаточная функция каналов 0 и 3 var plotTransfer_1_3 = gtl.plots.add("Передаточная функция (каналы 1 и 3)"); // передаточная функция каналов 1 и 3 var plotTransfer_2_3 = gtl.plots.add("Передаточная функция (каналы 2 и 3)");; // передаточная функция каналов 2 и 3 // *************************************************************** // ********** ВЫЧИСЛЕНИЕ ПЕРЕДАТОЧНОЙ ФУНКЦИИ (ВНИИЖТ) *********** // *************************************************************** // Алгоритм // 1. Получить спектры ускорения и силы (вибропреобразователь и молоток). // 2. Вычислить среднее значение по амплитудам (по обоим спектрам). // 3. Поочерёдно вычесть из каждого элемента амплитудного спектра соответствующее среднее значение, // записать массивы разниц. // 4. Перемножить значения массивов разниц, записать массив произведений. // 5. Разделить значения массива произведений на массив амплитудного спектра силы, // записать массив передаточной функции. // ОБРАБОТКА СИГНАЛОВ // ФИЛЬТРЫ // Входной сигнал - виброускорение // Файл импорта функций // 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; // диапазон поиска гармоник +/- //*******************ДИАГНОСТИКА********************* //*************************************************** // Задаем период проведения диагностики в секундах 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) + 0.1; gtl.diagnostic.interval = acq_time; // gtl.diagnostic.interval = 20; // время в секундах (константа) // примечание: наблюдается зависимость результатов АФЧХ от времени диагностики 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 gtl.log.info("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("-", "-"); // // Пример вычисления среднего по значениям массива // var arr = [1, 1, 1, 1, 1, 2]; // var average = 0; // среднее значение массива // let sum = 0; // сумма всех чисел массива // for (let i = 0; i < arr.length; i += 1) // { // sum += arr[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива // } // average = sum / arr.length; // возвращаем среднее арифметическое // gtl.log.info("average test array", average); // gtl.log.info("summ test array", sum); // gtl.log.info("length test array", arr.length); // Получение массивов для формулы передаточной функции // Канал_0 (ausp_accel_0_data) // среднее и сумма var aver_ausp_accel_0_data = 0; // среднее значение массива var sum_ausp_accel_0_data = 0; // сумма всех чисел массива for (let i = 0; i < ausp_accel_0_data.length; i += 1) { sum_ausp_accel_0_data += ausp_accel_0_data[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива } aver_ausp_accel_0_data = sum_ausp_accel_0_data / ausp_accel_0_data.length; // запись массивов (Y_i - Y_average) var delta_y_aver_ausp_accel_0_data = []; // массив for (let i = 0; i < ausp_accel_0_data.length; i++) { delta_y_aver_ausp_accel_0_data.push(ausp_accel_0_data[i] - aver_ausp_accel_0_data); } // Канал_1 (ausp_accel_1_data) // среднее и сумма var aver_ausp_accel_1_data = 0; // среднее значение массива var sum_ausp_accel_1_data = 0; // сумма всех чисел массива for (let i = 0; i < ausp_accel_1_data.length; i += 1) { sum_ausp_accel_1_data += ausp_accel_1_data[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива } aver_ausp_accel_1_data = sum_ausp_accel_1_data / ausp_accel_1_data.length; // запись массивов (Y_i - Y_average) var delta_y_aver_ausp_accel_1_data = []; // массив for (let i = 0; i < ausp_accel_1_data.length; i++) { delta_y_aver_ausp_accel_1_data.push(ausp_accel_1_data[i] - aver_ausp_accel_1_data); } // Канал_2 (ausp_accel_2_data) // среднее и сумма var aver_ausp_accel_2_data = 0; // среднее значение массива var sum_ausp_accel_2_data = 0; // сумма всех чисел массива for (let i = 0; i < ausp_accel_2_data.length; i += 1) { sum_ausp_accel_2_data += ausp_accel_2_data[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива } aver_ausp_accel_2_data = sum_ausp_accel_2_data / ausp_accel_2_data.length; // запись массивов (Y_i - Y_average) var delta_y_aver_ausp_accel_2_data = []; // массив for (let i = 0; i < ausp_accel_2_data.length; i++) { delta_y_aver_ausp_accel_2_data.push(ausp_accel_2_data[i] - aver_ausp_accel_2_data); } // Канал_3 (ausp_force_3_data) // среднее и сумма var aver_ausp_force_3_data = 0; // среднее значение массива var sum_ausp_force_3_data = 0; // сумма всех чисел массива for (let i = 0; i < ausp_force_3_data.length; i += 1) { sum_ausp_force_3_data += ausp_force_3_data[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива } aver_ausp_force_3_data = sum_ausp_force_3_data / ausp_force_3_data.length; // запись массивов (Y_i - Y_average) var delta_y_aver_ausp_force_3_data = []; // массив for (let i = 0; i < ausp_force_3_data.length; i++) { delta_y_aver_ausp_force_3_data.push(ausp_force_3_data[i] - aver_ausp_force_3_data); } // Получение передаточной функции (спектра передаточной функции) // Канал_0 & Канал_3 var Saf_0_3 = []; // массив перекрёстного спектра ускорения каналов 0 и 3 for (let i = 0; i < ausp_accel_0_data.length; i++) { Saf_0_3.push(delta_y_aver_ausp_accel_0_data[i] * delta_y_aver_ausp_force_3_data[i]); } var sum_Saf_0_3 = 0; // сумма всех чисел массива перекрёстного спектра Saf_0_3 for (let i = 0; i < Saf_0_3.length; i += 1) { sum_Saf_0_3 += Saf_0_3[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива } var HaF_0_3 = []; // массив спектра передаточной функции for (let i = 0; i < Saf_0_3.length; i++) { HaF_0_3.push(Saf_0_3[i] / ausp_force_3_data[i]); } var HaF_0_3_sum = []; // массив спектра передаточной функции for (let i = 0; i < Saf_0_3.length; i++) { HaF_0_3_sum.push(sum_Saf_0_3 / ausp_force_3_data[i]); } // Канал_1 & Канал_3 var Saf_1_3 = []; // массив перекрёстного спектра ускорения каналов 1 и 3 for (let i = 0; i < ausp_accel_1_data.length; i++) { Saf_1_3.push(delta_y_aver_ausp_accel_1_data[i] * delta_y_aver_ausp_force_3_data[i]); } var sum_Saf_1_3 = 0; // сумма всех чисел массива перекрёстного спектра Saf_1_3 for (let i = 0; i < Saf_1_3.length; i += 1) { sum_Saf_1_3 += Saf_1_3[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива } var HaF_1_3 = []; // массив спектра передаточной функции for (let i = 0; i < Saf_1_3.length; i++) { HaF_1_3.push(Saf_1_3[i] / ausp_force_3_data[i]); } var HaF_1_3_sum = []; // массив спектра передаточной функции for (let i = 0; i < Saf_1_3.length; i++) { HaF_1_3_sum.push(sum_Saf_1_3 / ausp_force_3_data[i]); } // Канал_2 & Канал_3 var Saf_2_3 = []; // массив перекрёстного спектра ускорения каналов 2 и 3 for (let i = 0; i < ausp_accel_2_data.length; i++) { Saf_2_3.push(delta_y_aver_ausp_accel_2_data[i] * delta_y_aver_ausp_force_3_data[i]); } var sum_Saf_2_3 = 0; // сумма всех чисел массива перекрёстного спектра Saf_2_3 for (let i = 0; i < Saf_2_3.length; i += 1) { sum_Saf_2_3 += Saf_2_3[i]; // на каждой итерации прибавляем к сумме значение текущего элемента массива } var HaF_2_3 = []; // массив спектра передаточной функции for (let i = 0; i < Saf_2_3.length; i++) { HaF_2_3.push(Saf_2_3[i] / ausp_force_3_data[i]); } var HaF_2_3_sum = []; // массив спектра передаточной функции for (let i = 0; i < Saf_2_3.length; i++) { HaF_2_3_sum.push(sum_Saf_2_3 / ausp_force_3_data[i]); } gtl.log.info("---", "---"); gtl.log.info("average ausp_force_3_data", aver_ausp_force_3_data); gtl.log.info("summ ausp_force_3_data", sum_ausp_force_3_data); gtl.log.info("length ausp_force_3_data", ausp_force_3_data.length); gtl.log.info("sum_Saf_0_3", sum_Saf_0_3); gtl.log.info("---", "---"); gtl.log.info("average ausp_accel_2_data", aver_ausp_accel_2_data); gtl.log.info("summ ausp_accel_2_data", sum_ausp_accel_2_data); gtl.log.info("length ausp_accel_2_data", ausp_accel_2_data.length); gtl.log.info("---", "---"); gtl.log.info("average ausp_accel_1_data", aver_ausp_accel_1_data); gtl.log.info("summ ausp_accel_1_data", sum_ausp_accel_1_data); gtl.log.info("length ausp_accel_1_data", ausp_accel_1_data.length); gtl.log.info("---", "---"); gtl.log.info("average ausp_accel_0_data", aver_ausp_accel_0_data); gtl.log.info("summ ausp_accel_0_data", sum_ausp_accel_0_data); gtl.log.info("length ausp_accel_0_data", ausp_accel_0_data.length); // Построение пользовательских графиков plot_0.add( { color: 0x04ff00, name: "Спектр ускорения (канал 0)", x: 1/ausp_lines, y: ausp_accel_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_0_3.add( { color: 0xff00ff, name: "Перекрёстный спектр (каналы 0 и 3)", x: 1/ausp_lines, y: Saf_0_3 }); plot_1_3.add( { color: 0xED3CCA, name: "Перекрёстный спектр (каналы 1 и 3)", x: 1/ausp_lines, y: Saf_1_3 }); plot_2_3.add( { color: 0x9966CC, name: "Перекрёстный спектр (каналы 2 и 3)", x: 1/ausp_lines, y: Saf_2_3 }); plotSpecTransfer_0_3.add( { color: 0x78DBE2, name: "Спектр передаточной функции (каналы 0 и 3)", x: 1/ausp_lines, y: HaF_0_3 }); plotSpecTransfer_1_3.add( { color: 0x349a32, name: "Спектр передаточной функции (каналы 1 и 3)", x: 1/ausp_lines, y: HaF_1_3 }); plotSpecTransfer_2_3.add( { color: 0x6dd08c, name: "Спектр передаточной функции (каналы 2 и 3)", x: 1/ausp_lines, y: HaF_2_3 }); plotTransfer_0_3.add( { color: 0xedc887, name: "Передаточная функция (каналы 0 и 3)", x: 1/ausp_lines, y: HaF_0_3_sum }); plotTransfer_1_3.add( { color: 0x99f0b7, name: "Передаточная функция (каналы 1 и 3)", x: 1/ausp_lines, y: HaF_1_3_sum }); plotTransfer_2_3.add( { color: 0xe8e463, name: "Передаточная функция (каналы 2 и 3)", x: 1/ausp_lines, y: HaF_2_3_sum }); gtl.diagnostic.stop(); }