"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 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 R_ = gtl.options.customOptions.R; // радиус установки грузов ** (для вычисления массы пробного груза) let R; // радиус установки грузов ** (конечное значение) let P_ = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза) let P; // масса ротора, кг ** (конечное значение) let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */** let A0; // модуль вектора начальной вибрации */** (конечное значение) // Переменные вспомогательные необходимые для расчётов 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; // Проверка наличия оборотной гармоники и необходимости проведения балансировки var test_balance = ""; // переменная для текста о необходимости проведения балансировки if (n != 0) // если указна скорость вращения { if (F1_1_a >= RMSv_2_1000 * 0.4) // вклад оборотной гармоники в СКЗv {test_balance = "необходимо провести балансировку";} else {test_balance = "проведение балансировки не требуется или нецелесообразно";} } else {test_balance = "невозможно определить необходимость проведения балансировки";} // РАСЧЁТЫ (балансировочный калькулятор) // Определение конечных значений переменных // A0 начальная вибрация if (A0_ != 0) {A0 = A0_} // принимает значение из опций else if (A0_ == 0 && FREQ_0 == 0) {A0 = RMSv_2_1000.value} // принимает СКЗv else {A0 = 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); plot_vibration.add( { color: 0x0000ff, name: "Вибрация_A0", x: x0_array, y: y0_array, }); plot_vibration.add( { color: 0x00ffffff, name: "границы", x: [-(A0+A0*0.1), -(A0+A0*0.1), (A0+A0*0.1), (A0+A0*0.1)], y: [(A0+A0*0.1), -(A0+A0*0.1), -(A0+A0*0.1), (A0+A0*0.1)] } ) gtl.log.info("Необходимость проведения балансировки",test_balance); gtl.log.info("RMSv_2_1000",RMSv_2_1000.value); gtl.log.info("Начальная вибрация A0",A0); 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_Тестирование: test_balance, _002_Ампл_гарм_1F1: F1_1_a, _003_СКЗ_виброскорость: RMSv_2_1000.value, _004_Начальная_вибрация_A0: A0 }; gtl.results = {"result": __result}; gtl.diagnostic.stop(); }