"use strict"; var signals = gtl.options.record.signalsModel; var options = gtl.options; var record = gtl.options.record; var point = gtl.options.point; // Импорт функций var imp = gtl.import("functions_for_balance.js"); var fnc = gtl.import("user-functions.js"); // Цвета (для справки) // #ff0000 - красный // #00ff00 - зелёный // #0000ff - синий // #00ddff - голубой // #ff3dcc - фиолетовый // #ffff00 - жёлтый // ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ БЕЗ ФАЗЫ ***** // **************************************************************** // Получение входных сигналов // Настройки для спектров и АФЧХ var frequency = 1000; // граничная частота var resolution = 0.5; // частотное разрешение var average = 3; // количество усреднений var overlap = 0; // наложение // ФИЛЬТР 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра var filter_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]); filter_2_1000.kind = gtl.filter_iir.butterworth; filter_2_1000.type = gtl.filter_iir.bandpass; filter_2_1000.order = 6; filter_2_1000.frequency = 502; // центральная частота полосового фильтра filter_2_1000.width = 1000; // ширина полосы фильтра var filter_2_1000v = gtl.add_intg(filter_2_1000); // интегрирование filter_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное) // Спектр виброскорости для получения 1-й гармоники частоты вращения var AUSPv = gtl.add_ausp(filter_2_1000v); // объявление переменной спектра AUSPv.color = 0x00ff0000; // цвет спектра AUSPv.name = "AUSPv"; // имя спектра AUSPv.frequency = frequency; // граничная частота спектра AUSPv.lines = AUSPv.frequency * 1/resolution; // разрешение спектра (количество линий) AUSPv.average = average; // количество усреднений AUSPv.unit = gtl.spec.unit; // отображение амплитуды в мм/с AUSPv.smoothing_factor = 100; // усреднение средней линии AUSPv.smoothed_line_color = 0xff004dff; // цвет средней линии AUSPv.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный) AUSPv.tolerance = AUSPv.resolution; // диапазон поиска гармоник +/- // СКЗv var RMSv_2_1000 = gtl.add_value_rms(filter_2_1000v); RMSv_2_1000.time = 1; RMSv_2_1000.avg_cnt = 3; // var idx = 1; // индекс канала вибрации (канал 0 - опорный) // var cnt = record.signalsModel.length; // количество каналов вибрации // Спектр виброскорости (новый метод) var AUSPv_pl = gtl.create_ausp( { "src" : filter_2_1000v, "frequency" : frequency, "resolution" : resolution, "average" : average, "overlap" : overlap, "window" : gtl.spec.rectangular, "view" : gtl.spec.unit } ); // Объявление графических плоскостей для построения графиков let plot_ausp = gtl.plots.add("Спектр виброскорости"); // создание объекта для спектра let plot_balance = gtl.plots.add("Расположение дисбаланса и балансировочного груза"); // создание объекта для спектра let plot_vibration = gtl.plots.add("Вибрации пробных пусков"); // создание объекта для визуализации вибрации пробных пусков // Переменные основные // параметр вибрации (модуль вектора) - виброскорость (мм/с) // угол (фаза) вектора - градусы // масса груза (модуль вектора) - граммы // DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния) // * - значение получаем из измерительного блока при нажатии кнопки // ** - значение вводится пользователем // *** - значение получаем в результате расчёта программы балансировки // значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте let n = gtl.options.customOptions.n; // скорость вращения, об/мин ** (для вычисления массы пробного груза) let FREQ_0 = n / 60; // частота вращения, об/мин *** (для определения амплитуды оборотной гармоники) let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */** let A0 = A0_; // модуль вектора начальной вибрации */** (конечное значение) let A1_ = gtl.options.customOptions.A1; // модуль вектора вибрации пробного пуска №1 */** let A1 = A1_; // модуль вектора вибрации пробного пуска №1 */** (конечное значение) let A1_corner = 0; // угол установки груза пробного пуска №1 (фиксированный параметр, НЕ ИЗМЕНЯТЬ) let A2_ = gtl.options.customOptions.A2; // модуль вектора вибрации пробного пуска №2 */** let A2 = A2_; // модуль вектора вибрации пробного пуска №2 */** (конечное значение) let A2_corner = 120; // угол установки груза пробного пуска №2 (фиксированный параметр, НЕ ИЗМЕНЯТЬ) let A3_ = gtl.options.customOptions.A3; // модуль вектора вибрации пробного пуска №3 */** let A3; // модуль вектора вибрации пробного пуска №3 */** (конечное значение) let A3_corner = 240; // угол установки груза пробного пуска №3 (фиксированный параметр, НЕ ИЗМЕНЯТЬ) // Переменные вспомогательные необходимые для расчётов var x00 = 0; // координата центра окружности нулевого пуска по оси X var y00 = 0; // координата центра окружности нулевого пуска по оси Y var x_b_0 = 0; // координата центра окружности расположения балансировочного груза по оси X var y_b_0 = 0; // координата центра окружности расположения балансировочного груза по оси Y // ***** РАСЧЁТЫ ***** // gtl.diagnostic.interval = 15; gtl.diagnostic.interval = Math.max(AUSPv.acq_time, AUSPv_pl.acq_time) + 0.1; let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала function diagnose() { AUSPv.clear_harms_sets(); // очистка спектра let __AUSPv_tools = gtl.create_spec_tools( { data: AUSPv_pl.data, df: AUSPv_pl.resolution, base: { factor: 100, visible: true, color: 0x00ff00 }, peaks: { color: 0xff0000, visible: true, level: 0.000001 }, harms: { tolerance: 1 } }); let __row_AUSPv = __AUSPv_tools.harms.add(FREQ_0, 3, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес) __row_AUSPv.name = "F1v (гарм. ряд част. вращ.)"; // название гармонического ряда // __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес) plot_ausp.add( { color: 0x0000ff, name: "Спектр виброскорости", x: AUSPv_pl.resolution, y: AUSPv_pl.data, spec_tools: __AUSPv_tools.to_json() }); let __result1 = __AUSPv_tools.to_json(); // Амплитуда гармонического ряда частоты вращения var F1_1_a = __result1.harms.rows[0].harms[0].ampl; // Частота гармонического ряда частоты вращения var F1_1_f = __result1.harms.rows[0].harms[0].freq; // РАСЧЁТЫ (балансировочный калькулятор) // Определение конечных значений переменных // A3 вибрация пробного пуска №3 if (A3_ != 0) {A3 = A3_} // принимает значение из опций else if (A3_ == 0 && FREQ_0 == 0) {A3 = RMSv_2_1000.value} // принимает СКЗv else {A3 = F1_1_a} // принимает значение 1-й гармоники из спектра сигнала // определение координат точек окружности A0 var x0_array = []; // массив координат точек окружности A0 по оси X var y0_array = []; // массив координат точек окружности A0 по оси Y for (let i=0; i<=359; i++ ) { x0_array.push(x00 + A0 * (Math.sin((i) * Math.PI / 180))); y0_array.push(y00 + A0 * (Math.cos((i) * Math.PI / 180)));} //gtl.log.info("centr x00",x00); //gtl.log.info("centr y00",y00); // определение координат точек окружности A1 var x1_array = []; // массив координат точек окружности A1 по оси X var y1_array = []; // массив координат точек окружности A1 по оси Y var x01 = x0_array[0]; var y01 = y0_array[0]; for (let i=0; i<=359; i++ ) { x1_array.push(x01 + A1 * (Math.sin((i) * Math.PI / 180))); y1_array.push(y01 + A1 * (Math.cos((i) * Math.PI / 180)));} // определение координат точек окружности A2 var x2_array = []; // массив координат точек окружности A2 по оси X var y2_array = []; // массив координат точек окружности A2 по оси Y var x02 = x0_array[120]; var y02 = y0_array[120]; for (let i=0; i<=359; i++ ) { x2_array.push(x02 + A2 * (Math.sin((i) * Math.PI / 180))); y2_array.push(y02 + A2 * (Math.cos((i) * Math.PI / 180)));} // определение координат точек окружности A3 var x3_array = []; // массив координат точек окружности A3 по оси X var y3_array = []; // массив координат точек окружности A3 по оси Y var x03 = x0_array[240]; var y03 = y0_array[240]; for (let i=0; i<=359; i++ ) { x3_array.push(x03 + A3 * (Math.sin((i) * Math.PI / 180))); y3_array.push(y03 + A3 * (Math.cos((i) * Math.PI / 180)));} plot_vibration.add( { color: 0x0000ff, name: "Вибрация_A0", x: x0_array, y: y0_array, }); plot_vibration.add( { color: 0x00ff00, name: "Вибрация_A1", x: x1_array, y: y1_array, }); plot_vibration.add( { color: 0xff0000, name: "Вибрация_A2", x: x2_array, y: y2_array, }); plot_vibration.add( { color: 0xffff00, name: "Вибрация_A3", x: x3_array, y: y3_array, }); plot_vibration.add( { color: 0x00ffffff, name: "границы", x: [-((A0+Math.max(A0,A1,A2,A3))+2*A0*0.1), -((A0+Math.max(A0,A1,A2,A3))+2*A0*0.1), ((A0+Math.max(A0,A1,A2,A3))+2*A0*0.1), ((A0+Math.max(A0,A1,A2,A3))+2*A0*0.1)], y: [((A0+Math.max(A0,A1,A2,A3))+2*A0*0.1), -((A0+Math.max(A0,A1,A2,A3))+2*A0*0.1), -((A0+Math.max(A0,A1,A2,A3))+2*A0*0.1), ((A0+Math.max(A0,A1,A2,A3))+2*A0*0.1)] } ) gtl.log.info("RMSv_2_1000",RMSv_2_1000.value); gtl.log.info("Начальная вибрация A0",A0); gtl.log.info("Вибрация пробного пуска №1 A1",A1); gtl.log.info("Вибрация пробного пуска №2 A2",A2); gtl.log.info("Вибрация пробного пуска №3 A3",A3); gtl.log.info("F1_1_a (ампл)",F1_1_a); gtl.log.info("F1_1_f (част)",F1_1_f); gtl.log.info("gtl.diagnostic.interval",gtl.diagnostic.interval); gtl.log.info("Частота вращения, Гц", FREQ_0); // Выдача результата (results) let __result = { _001_Ампл_гарм_1F1: F1_1_a, _002_СКЗ_виброскорость: RMSv_2_1000.value, _003_Начальная_вибрация_A0: A0, _004_Вибрация_пробного_пуска_1_A1: A1, _005_Вибрация_пробного_пуска_2_A2: A2, _006_Вибрация_пробного_пуска_3_A3: A3 }; gtl.results = {"result": __result}; gtl.diagnostic.stop(); }