252 lines
12 KiB
JavaScript
252 lines
12 KiB
JavaScript
"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; // модуль вектора вибрации пробного пуска №2 */** (конечное значение)
|
||
let A2_corner = 120; // угол установки груза пробного пуска №2 (фиксированный параметр, НЕ ИЗМЕНЯТЬ)
|
||
|
||
// Переменные вспомогательные необходимые для расчётов
|
||
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;
|
||
|
||
// РАСЧЁТЫ (балансировочный калькулятор)
|
||
|
||
// Определение конечных значений переменных
|
||
// A2 вибрация пробного пуска №2
|
||
if (A2_ != 0) {A2 = A2_} // принимает значение из опций
|
||
else if (A2_ == 0 && FREQ_0 == 0) {A2 = RMSv_2_1000.value} // принимает СКЗv
|
||
else {A2 = 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)));}
|
||
|
||
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: 0x00ffffff,
|
||
name: "границы",
|
||
x: [-((A0+Math.max(A0,A1,A2))+2*A0*0.1), -((A0+Math.max(A0,A1,A2))+2*A0*0.1), ((A0+Math.max(A0,A1,A2))+2*A0*0.1), ((A0+Math.max(A0,A1,A2))+2*A0*0.1)],
|
||
y: [((A0+Math.max(A0,A1,A2))+2*A0*0.1), -((A0+Math.max(A0,A1,A2))+2*A0*0.1), -((A0+Math.max(A0,A1,A2))+2*A0*0.1), ((A0+Math.max(A0,A1,A2))+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("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
|
||
};
|
||
|
||
gtl.results = {"result": __result};
|
||
|
||
gtl.diagnostic.stop();
|
||
|
||
|
||
}
|