406 lines
22 KiB
JavaScript
406 lines
22 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 - жёлтый
|
||
|
||
|
||
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ БЕЗ ФАЗЫ *****
|
||
// ****************************************************************
|
||
|
||
// Объявление графических плоскостей для построения графиков
|
||
let plot_balance = gtl.plots.add("Расположение дисбаланса и балансировочного груза"); // создание объекта для спектра
|
||
let plot_vibration = gtl.plots.add("Вибрации пробных пусков"); // создание объекта для визуализации вибрации пробных пусков
|
||
|
||
// Переменные основные
|
||
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
|
||
// угол (фаза) вектора - градусы
|
||
// масса груза (модуль вектора) - граммы
|
||
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
|
||
// * - значение получаем из измерительного блока при нажатии кнопки
|
||
// ** - значение вводится пользователем
|
||
// *** - значение получаем в результате расчёта программы балансировки
|
||
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
|
||
|
||
let test = ''; // проверка условия корректности данных
|
||
|
||
let n = gtl.options.customOptions.n; // скорость вращения, об/мин ** (для вычисления массы пробного груза)
|
||
let FREQ_0 = n / 60; // частота вращения, об/мин *** (для определения амплитуды оборотной гармоники)
|
||
let R_ = gtl.options.customOptions.R; // радиус установки грузов ** (для вычисления массы пробного груза)
|
||
let R = R_; // радиус установки грузов ** (конечное значение)
|
||
let P_ = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
|
||
let P = P_; // масса ротора, кг ** (конечное значение)
|
||
let U_per; // допустимый остаточный дисбаланс *** (ГОСТ 1940)
|
||
let U_res; // остаточный дисбаланс *** (ГОСТ 1940)
|
||
let G = gtl.options.customOptions.G; // класс точности балансировки, мм/с ** (ГОСТ 1940)
|
||
|
||
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 = A3_; // модуль вектора вибрации пробного пуска №3 */** (конечное значение)
|
||
let A3_corner = 240; // угол установки груза пробного пуска №3 (фиксированный параметр, НЕ ИЗМЕНЯТЬ)
|
||
let Mb; // масса балансировочного груза ***
|
||
let Mb_corner; // угол установки балансировочного груза ***
|
||
let Mdisb; // масса дисбаланса ***
|
||
let Mdisb_corner; // угол расположения дисбаланса ***
|
||
|
||
let m_test_ = gtl.options.customOptions.m_test; // модуль вектора пробного груза **
|
||
let m_test = m_test_; // модуль вектора пробного груза ** (конечное значение)
|
||
let m_test_calc; // масса пробного груза расчётная ***
|
||
|
||
// Переменные вспомогательные необходимые для расчётов
|
||
var x00 = 0; // координата центра окружности нулевого пуска по оси X
|
||
var y00 = 0; // координата центра окружности нулевого пуска по оси Y
|
||
var x_b_0 = 0; // координата центра окружности расположения балансировочного груза по оси X
|
||
var y_b_0 = 0; // координата центра окружности расположения балансировочного груза по оси Y
|
||
// переменные для обозначения пересечения окружностей A1 и A2
|
||
var d12; // расстояние между центрами окружностей пробных пусков №1 и 2
|
||
var b1; // расстояние от центра окружности A1 до точки пересечения P11 с окружностью A2
|
||
var c1; // расстояние от центра окружности A2 до точки пересечения P11 с окружностью A1
|
||
// d12 = b1 + c1
|
||
var P11; // центральная точка между P21 и P_21 (_ обозначает штрих)
|
||
var P21; // точка пересечения окружностей A1 и A2
|
||
var P_21; // точка пересечения окружностей A1 и A2
|
||
var h1; // расстояние от точки P11 до точки P21 и P_21
|
||
var P11_X; // координата точки P11 по оси X
|
||
var P11_Y; // координата точки P11 по оси Y
|
||
var P21_X; // координата точки P21 по оси X
|
||
var P21_Y; // координата точки P21 по оси Y
|
||
var P_21_X; // координата точки P_21 по оси X
|
||
var P_21_Y; // координата точки P_21 по оси Y
|
||
// переменные для обозначения пересечения окружностей A2 и A3
|
||
var d23; // расстояние между центрами окружностей пробных пусков №2 и 3
|
||
var b2; // расстояние от центра окружности A2 до точки пересечения P12 с окружностью A3
|
||
var c2; // расстояние от центра окружности A3 до точки пересечения P12 с окружностью A2
|
||
// d23 = b2 + c2
|
||
var P12; // центральная точка между P22 и P_22 (_ обозначает штрих)
|
||
var P22; // точка пересечения окружностей A2 и A3
|
||
var P_22; // точка пересечения окружностей A2 и A3
|
||
var h2; // расстояние от точки P12 до точки P22 и P_22
|
||
var P12_X; // координата точки P12 по оси X
|
||
var P12_Y; // координата точки P12 по оси Y
|
||
var P22_X; // координата точки P22 по оси X
|
||
var P22_Y; // координата точки P22 по оси Y
|
||
var P_22_X; // координата точки P_22 по оси X
|
||
var P_22_Y; // координата точки P_22 по оси Y
|
||
// переменные для обозначения пересечения окружностей A3 и A1
|
||
var d31; // расстояние между центрами окружностей пробных пусков №3 и 1
|
||
var b3; // расстояние от центра окружности A3 до точки пересечения P12 с окружностью A1
|
||
var c3; // расстояние от центра окружности A1 до точки пересечения P12 с окружностью A3
|
||
// d31 = b3 + c3
|
||
var P13; // центральная точка между P23 и P_23 (_ обозначает штрих)
|
||
var P23; // точка пересечения окружностей A3 и A1
|
||
var P_23; // точка пересечения окружностей A3 и A1
|
||
var h3; // расстояние от точки P13 до точки P23 и P_23
|
||
var P13_X; // координата точки P13 по оси X
|
||
var P13_Y; // координата точки P13 по оси Y
|
||
var P23_X; // координата точки P23 по оси X
|
||
var P23_Y; // координата точки P23 по оси Y
|
||
var P_23_X; // координата точки P_23 по оси X
|
||
var P_23_Y; // координата точки P_23 по оси Y
|
||
// точка пересечения окружностей
|
||
var K; // точка пересечения окружностей A1, A2, A3
|
||
var K_X; // координата точки K по оси X
|
||
var K_Y; // координата точки K по оси Y
|
||
var OK; // длина отрезка от центра окружности A0 до точки пересечения окружностей всех пробных пусков
|
||
|
||
|
||
// ***** РАСЧЁТЫ *****
|
||
// gtl.diagnostic.interval = 15;
|
||
gtl.diagnostic.interval = gtl.acq_time + 1;
|
||
|
||
function diagnose() {
|
||
|
||
// РАСЧЁТЫ (балансировочный калькулятор)
|
||
|
||
// определение координат точек окружности A0
|
||
var x0_array = []; // массив координат точек окружности A0 по оси X
|
||
var y0_array = []; // массив координат точек окружности A0 по оси Y
|
||
for (let i=0; i<=360; 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<=360; 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<=360; 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<=360; i++ ) {
|
||
x3_array.push(x03 + A3 * (Math.sin((i) * Math.PI / 180)));
|
||
y3_array.push(y03 + A3 * (Math.cos((i) * Math.PI / 180)));}
|
||
|
||
// определение координат точек окружности R (плоскость установки грузов)
|
||
var xR_array = []; // массив координат точек окружности R по оси X
|
||
var yR_array = []; // массив координат точек окружности R по оси Y
|
||
var x0R = 0; // центр в начале координат
|
||
var y0R = 0; // центр в начале координат
|
||
for (let i=0; i<=360; i++ ) {
|
||
xR_array.push(x0R + R * (Math.sin((i) * Math.PI / 180)));
|
||
yR_array.push(y0R + R * (Math.cos((i) * Math.PI / 180)));}
|
||
|
||
// Непосредственно вычисления для определения величины и угла дисбаланса
|
||
// определение вспомогательных переменных
|
||
d12 = Math.sqrt(Math.pow(x02 - x01, 2) + Math.pow(y02 - y01, 2));
|
||
d23 = d12;
|
||
d31 = d12;
|
||
|
||
c1 = (Math.pow(A1,2) - Math.pow(A2,2) + Math.pow(d12,2)) / (2 * d12);
|
||
b1 = d12 - c1;
|
||
c2 = (Math.pow(A2,2) - Math.pow(A3,2) + Math.pow(d12,2)) / (2 * d12);
|
||
b2 = d12 - c2;
|
||
c3 = (Math.pow(A3,2) - Math.pow(A1,2) + Math.pow(d12,2)) / (2 * d12);
|
||
b3 = d12 - c3;
|
||
|
||
h1 = Math.sqrt(Math.pow(A1,2) - Math.pow(c1,2));
|
||
h2 = Math.sqrt(Math.pow(A2,2) - Math.pow(c2,2));
|
||
h3 = Math.sqrt(Math.pow(A3,2) - Math.pow(c3,2));
|
||
|
||
P11_X = x01 + ((c1 * (x02 - x01)) / d12);
|
||
P11_Y = y01 + ((c1 * (y02 - y01)) / d12);
|
||
P21_X = P11_X - ((h1 * (y02 - y01)) / d12);
|
||
P21_Y = P11_Y + ((h1 * (x02 - x01)) / d12);
|
||
P_21_X = P11_X + ((h1 * (y02 - y01)) / d12);
|
||
P_21_Y = P11_Y - ((h1 * (x02 - x01)) / d12);
|
||
|
||
P12_X = x02 + ((c2 * (x03 - x02)) / d12);
|
||
P12_Y = y02 + ((c2 * (y03 - y02)) / d12);
|
||
P22_X = P12_X - ((h2 * (y03 - y02)) / d12);
|
||
P22_Y = P12_Y + ((h2 * (x03 - x02)) / d12);
|
||
P_22_X = P12_X + ((h2 * (y03 - y02)) / d12);
|
||
P_22_Y = P12_Y - ((h2 * (x03 - x02)) / d12);
|
||
|
||
P13_X = x03 + ((c3 * (x01 - x03)) / d12);
|
||
P13_Y = y03 + ((c3 * (y01 - y03)) / d12);
|
||
P23_X = P13_X - ((h3 * (y01 - y03)) / d12);
|
||
P23_Y = P13_Y + ((h3 * (x01 - x03)) / d12);
|
||
P_23_X = P13_X + ((h3 * (y01 - y03)) / d12);
|
||
P_23_Y = P13_Y - ((h3 * (x01 - x03)) / d12);
|
||
|
||
K_X = (P_21_X + P_22_X + P_23_X) / 3;
|
||
K_Y = (P_21_Y + P_22_Y + P_23_Y) / 3;
|
||
|
||
OK = Math.sqrt(Math.pow(K_X,2) + Math.pow(K_Y,2));
|
||
|
||
// определение координат точек отрезка ОК
|
||
var xOK_array = []; // массив координат точек отрезка OK по оси X
|
||
var yOK_array = []; // массив координат точек отрезка OK по оси Y
|
||
var x0_OK = 0; // отрезок OK выходит из начала координат x=0
|
||
var y0_OK = 0; // отрезок OK выходит из начала координат y=0
|
||
var x_OK = K_X; // конечная координата отрезка OK по X
|
||
var y_OK = K_Y; // конечная координата отрезка OK по Y
|
||
xOK_array[0] = x0_OK;
|
||
xOK_array[1] = x_OK;
|
||
yOK_array[0] = y0_OK;
|
||
yOK_array[1] = y_OK;
|
||
|
||
// определение массы балансировочного груза Mb
|
||
Mb = (m_test * A0) / OK;
|
||
|
||
// определение угла установки балансировочного груза Mb_corner
|
||
if ((K_X > 0) && (K_Y >= 0)) {
|
||
Mb_corner = (Math.acos(Math.abs(K_Y) / OK) * 180 ) / Math.PI}
|
||
if ((K_X <= 0) && (K_Y < 0)) {
|
||
Mb_corner = 180 + (Math.acos(Math.abs(K_Y) / OK) * 180 ) / Math.PI}
|
||
if ((K_X < 0) && (K_Y >= 0)) {
|
||
Mb_corner = 360 - (Math.acos(Math.abs(K_Y) / OK) * 180 ) / Math.PI}
|
||
if ((K_X >= 0) && (K_Y < 0)) {
|
||
Mb_corner = 180 - (Math.acos(Math.abs(K_Y) / OK) * 180 ) / Math.PI}
|
||
|
||
// определение координат точки установки балансировочного груза Mb
|
||
// рисуем круг с радиусом 10% от радиуса R плоскости коррекции
|
||
// !!! нужно заменить круг на жирную точку !!!
|
||
var xMb_array = []; // массив координат точек Mb по оси X
|
||
var yMb_array = []; // массив координат точек Mb по оси Y
|
||
var x0_Mb = xR_array[Math.round(Mb_corner)]; // центр на окружности плоскости установки грузов в угле Mb_corner
|
||
var y0_Mb = yR_array[Math.round(Mb_corner)]; // центр на окружности плоскости установки грузов в угле Mb_corner
|
||
for (let i=0; i<=360; i++ ) {
|
||
xMb_array.push(x0_Mb + 0.1*R * (Math.sin((i) * Math.PI / 180)));
|
||
yMb_array.push(y0_Mb + 0.1*R * (Math.cos((i) * Math.PI / 180)));}
|
||
|
||
// определение массы дисбаланса Mdisb
|
||
Mdisb = Mb; // равен массе балансировочного груза
|
||
|
||
// определение угла расположения дисбаланса Mdisb_corner
|
||
if ((Mb_corner + 180) > 360) {
|
||
Mdisb_corner = (Mb_corner + 180) - 360}
|
||
else if ((Mb_corner + 180) < 0) {
|
||
Mdisb_corner = (Mb_corner + 180) + 360}
|
||
else {Mdisb_corner = (Mb_corner + 180)}
|
||
|
||
// определение координат точки установки балансировочного груза Mdisb
|
||
// рисуем круг с радиусом 10% от радиуса R плоскости коррекции
|
||
// !!! нужно заменить круг на жирную точку !!!
|
||
var xMdisb_array = []; // массив координат точек Mdisb по оси X
|
||
var yMdisb_array = []; // массив координат точек Mdisb по оси Y
|
||
var x0_Mdisb = xR_array[Math.round(Mdisb_corner)]; // центр на окружности плоскости установки грузов в угле Mb_corner
|
||
var y0_Mdisb = yR_array[Math.round(Mdisb_corner)]; // центр на окружности плоскости установки грузов в угле Mb_corner
|
||
for (let i=0; i<=360; i++ ) {
|
||
xMdisb_array.push(x0_Mdisb + 0.1*R * (Math.sin((i) * Math.PI / 180)));
|
||
yMdisb_array.push(y0_Mdisb + 0.1*R * (Math.cos((i) * Math.PI / 180)));}
|
||
|
||
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("Масса балансировочного груза",Mb);
|
||
gtl.log.info("Угол установки балансировочного груза",Mb_corner);
|
||
gtl.log.info("Угол расположения дисбаланса",Mdisb_corner);
|
||
gtl.log.info("Длина отрезка OK",OK);
|
||
|
||
// Проверка условия корректности проведения измерений (или ввода значений вибрации)
|
||
if (
|
||
(((A1 + A2) >= 2*A0*Math.cos(30*Math.PI/180)) ||
|
||
((A2 + A3) >= 2*A0*Math.cos(30*Math.PI/180)) ||
|
||
((A1 + A3) >= 2*A0*Math.cos(30*Math.PI/180))) &&
|
||
(OK > 0)
|
||
)
|
||
{
|
||
test = 'Данные корректны. Вычисления произведены'
|
||
} else {
|
||
test = 'Проверьте корректность данных. Влияние балансировочного груза недостаточно, или дисбаланс несущественно влияет на вибрацию'
|
||
}
|
||
gtl.log.info("Корректность данных",test);
|
||
|
||
// Вычисление допустимого остаточного дисбаланса
|
||
U_per = (1000 * (G * P)) / (Math.PI * n / 30);
|
||
// Остаточный дисбаланс
|
||
U_res = Mdisb * R;
|
||
|
||
|
||
// Графики вибрации
|
||
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: 0x00ddff,
|
||
name: "Отрезок ОК",
|
||
x: xOK_array,
|
||
y: yOK_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)]
|
||
});
|
||
|
||
// Графики дисбаланса и балансировочного груза
|
||
plot_balance.add(
|
||
{
|
||
color: 0x0000ff,
|
||
name: "Плоскость установки грузов",
|
||
x: xR_array,
|
||
y: yR_array,
|
||
});
|
||
plot_balance.add(
|
||
{
|
||
color: 0x00ff00,
|
||
name: "Балансировочный груз",
|
||
x: xMb_array,
|
||
y: yMb_array,
|
||
});
|
||
plot_balance.add(
|
||
{
|
||
color: 0xff0000,
|
||
name: "Дисбаланс",
|
||
x: xMdisb_array,
|
||
y: yMdisb_array,
|
||
});
|
||
plot_balance.add(
|
||
{
|
||
color: 0x00ffffff,
|
||
name: "границы",
|
||
x: [-(R+R*0.1), -(R+R*0.1), (R+R*0.1), (R+R*0.1)],
|
||
y: [(R+R*0.1), -(R+R*0.1), -(R+R*0.1), (R+R*0.1)]
|
||
});
|
||
|
||
// Выдача результата (results)
|
||
let __result = {
|
||
_001_Начальная_вибрация_A0: A0,
|
||
_002_Вибрация_пробного_пуска_1_A1: A1,
|
||
_003_Вибрация_пробного_пуска_2_A2: A2,
|
||
_004_Вибрация_пробного_пуска_3_A3: A3,
|
||
_005_Вибрация_пробного_пуска_3_A3: A3,
|
||
_006_Угол_устан_баланс_груза: Mb_corner,
|
||
_007_Угол_расп_дисбаланса: Mdisb_corner,
|
||
_008_Масса_баланс_груза: Mb,
|
||
_010_Допуст_ост_дисб_г_мм: U_per,
|
||
_011_Остат_дисб_г_мм: U_res
|
||
};
|
||
|
||
gtl.results = {"result": __result};
|
||
|
||
gtl.diagnostic.stop();
|
||
|
||
|
||
}
|