balancer_calc/scripts/1 пл бф - шаг 1.js

222 lines
11 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"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();
}