This commit is contained in:
s.savelievrem 2026-06-08 15:59:37 +03:00
commit fa0b01096b
143 changed files with 42799 additions and 0 deletions

View File

@ -0,0 +1,7 @@
{
"_001_Радиус_установки_грузов_мм": 2000,
"_002_Масса_ротора_г": 17000,
"_003_ДКВодуль_мм_с_г": 0.028,
"_004_ДКВаза_град": -242.6,
"_005_Допуст_ост_дисб_г_мм": 405845.10488433315
}

View File

@ -0,0 +1,15 @@
{
"_001_Част_вращ_обмин": 1000,
"_002_Ампл_вибр_пуска_A0": 9,
"_003_Фаза_вибр_пуска_A0": 40,
"_004_Масса_дисбаланса": 321.42857142857144,
"_005_Угол_дисбаланса": 282.6,
"_006_Масса_баланс_груза_введён": 280,
"_007_Угол_баланс_груза_введён": 210,
"_008_Масса_баланс_груза_расч": 321.42857142857144,
"_009_Угол_баланс_груза_расч": 102.60000000000002,
"_010_Модуль_ДКВ": 0.028,
"_011_ФазаКВ": -242.6,
"_012_Допуст_ост_дисб_г_мм": 405845.10488433315,
"_013_Остат_дисб_г_мм": 642857.1428571428
}

View File

@ -0,0 +1,21 @@
{
"_001_Част_вращ_обмин": 1000,
"_002_Ампл_вибр_пуска_A0": 8,
"_003_Фаза_вибр_пуска_A0": 150,
"_004_Ампл_вибр_пуска_A2": 1,
"_005_Фаза_вибр_пуска_A2": 60,
"_006_Масса_дисбаланса": 287,
"_007_Угол_дисбаланса": 32.6,
"_008_Масса_баланс_груза": 280,
"_009_Угол_баланс_груза": 210,
"_010_Масса_баланс_груза_расч": 287,
"_011_Угол_баланс_груза_расч": 212.6,
"_012_Масса_дисбаланса_2": 35.714285714285715,
"_013_Угол_дисбаланса_2": 302.6,
"_014_Масса_баланс_груза_2": 35.714285714285715,
"_015_Угол_баланс_груза_2": 122.60000000000002,
"_016_Модуль_ДКВ": 0.028,
"_017_ФазаКВ": -242.6,
"_018_Допуст_ост_дисб_г_мм": 405845.10488433315,
"_019_Остат_дисб_после_г_мм": 71428.57142857143
}

View File

@ -0,0 +1,6 @@
{
"_001_Частотаращения_Гц": 16.666666666666668,
"_002_Радиус_установки_грузов_мм": 2000,
"_003_Масса_ротораг": 17000,
"_004_Допуст_ост_дисб_г_мм": 405845.10488433315
}

View File

@ -0,0 +1,4 @@
{
"_001_Примен_пробный_груз": 150,
"_002_Расч_пробный_груз": 820.08
}

View File

@ -0,0 +1,12 @@
{
"_001_Начальная_вибрация_A0": 12,
"_002_Вибрация_пробного_пуска_1_A1": 15,
"_003_Вибрация_пробного_пуска_2_A2": 18,
"_004_Вибрация_пробного_пуска_3_A3": 20,
"_005_Вибрация_пробного_пуска_3_A3": 20,
"_006_Угол_устан_баланс_груза": 23.25507578693725,
"_007_Угол_расп_дисбаланса": 203.25507578693725,
"_008_Масса_баланс_груза": 593.0100269316805,
"_010_Допуст_ост_дисб_г_мм": 405845.10488433315,
"_011_Остат_дисб_г_мм": 1186020.053863361
}

View File

@ -0,0 +1,6 @@
{
"_001_Радиус_установки_грузов_мм": 2000,
"_002_Масса_ротора_г": 17000,
"_003_Допуст_ост_дисб_г_мм": 405845.10488433315,
"_004_Част_вращ_обмин": 1000
}

View File

@ -0,0 +1,6 @@
{
"_001_Примен_пробный_груз": 500,
"_002_Угол_устан_пробн_груза": 250,
"_003_Расч_пробный_груз": 546.72,
"_004_Част_вращ_обмин": 1000
}

View File

@ -0,0 +1,16 @@
{
"_001_Ампл_вибр_пуска_A0": 8,
"_002_Фаза_вибр_пуска_A0": 150,
"_003_Ампл_вибр_пуска_A1": 9,
"_004_Фаза_вибр_пуска_A1": 40,
"_005_Масса_дисбаланса": 286.99773600284755,
"_006_Угол_дисбаланса": 32.64139573926241,
"_007_Масса_баланс_груза_расч": 286.99773600284755,
"_008_Угол_баланс_груза_расч": 212.6413957392624,
"_009_Масса_баланс_груза_введён": 280,
"_010_Угол_баланс_груза_введён": 210,
"_011_Модуль_ДКВ": 0.027874784349938654,
"_012_ФазаКВ": -242.64139573926235,
"_013_Допуст_ост_дисб_г_мм": 405845.10488433315,
"_014_Остат_дисб_г_мм": 573995.4720056951
}

View File

@ -0,0 +1,26 @@
{
"_001_Част_вращ_обмин": 1000,
"_002_Ампл_вибр_пуска_A0": 8,
"_003_Фаза_вибр_пуска_A0": 150,
"_004_Ампл_вибр_пуска_A1": 9,
"_005_Фаза_вибр_пуска_A1": 40,
"_006_Ампл_вибр_пуска_A2": 1,
"_007_Фаза_вибр_пуска_A2": 60,
"_008_Масса_дисбаланса": 287,
"_009_Угол_дисбаланса": 32.6,
"_010_Масса_баланс_груза": 280,
"_011_Угол_баланс_груза": 210,
"_012_Масса_баланс_груза_расч": 287,
"_013_Угол_баланс_груза_расч": 212.6,
"_014_Масса_дисбаланса_2": 35.874717450725356,
"_015_Угол_дисбаланса_2": 302.6413957,
"_016_Масса_баланс_груза_2": 35.874717450725356,
"_017_Угол_баланс_груза_2": 122.64139569999998,
"_018_Масса_пробн_груза_расч": 546.72,
"_019_Масса_пробн_груза": 500,
"_020_Угол_пробн_груза": 250,
"_021_Модуль_ДКВ": 0.027874784,
"_022_ФазаКВ": -242.6413957,
"_023_Допуст_ост_дисб_г_мм": 405845.10488433315,
"_024_Остат_дисб_после_г_мм": 71749.43490145072
}

View File

@ -0,0 +1,14 @@
{
"_001_Радиус_установки_грузов_пл1_мм": 2000,
"_002_Радиус_установки_грузов_пл2_мм": 2000,
"_003_Масса_ротораг": 17000,
"_004_Модуль_ДКВ_DCI_A1": 0.015,
"_005_ФазаКВ_DCI_A1": 168.5,
"_006_Модуль_ДКВ_DCI_A2": 0.025,
"_007_ФазаКВ_DCI_A2": 143.2,
"_008_Модуль_ДКВ_DCI_B1": 0.049,
"_009_ФазаКВ_DCI_B1": 317.3,
"_010_Модуль_ДКВ_DCI_B2": 0.044,
"_011_ФазаКВ_DCI_B2": 308.9,
"_012_Допуст_ост_дисб_г_мм": 405845.10488433315
}

View File

@ -0,0 +1,30 @@
{
"_001_Ампл_вибр_пуска_A0": 8,
"_002_Фаза_вибр_пуска_A0": 150,
"_003_Ампл_вибр_пуска_B0": 9,
"_004_Фаза_вибр_пуска_B0": 40,
"_005_Масса_дисбаланса_пл_1": 638.8721369761146,
"_006_Угол_дисбаланса_пл_1": 162.13179602047444,
"_007_Масса_дисбаланса_пл_2": 703.3126789706832,
"_008_Угол_дисбаланса_пл_2": 7.144339980526809,
"_009_Масса_баланс_груза_расч_пл_1": 638.8721369761146,
"_010_Угол_баланс_груза_расч_пл_1": 342.13179602047444,
"_011_Масса_баланс_груза_введён_пл_1": 600,
"_012_Угол_баланс_груза_введён_пл_1": 350,
"_013_Масса_баланс_груза_расч_пл_2": 703.3126789706832,
"_014_Угол_баланс_груза_расч_пл_2": 187.1443399805268,
"_015_Масса_баланс_груза_введён_пл_2": 700,
"_016_Угол_баланс_груза_введён_пл_2": 180,
"_017_Модуль_ДКВ_DCI_A1": 0.015,
"_018_ФазаКВ_DCI_A1": 168.5,
"_019_Модуль_ДКВ_DCI_A2": 0.025,
"_020_ФазаКВ_DCI_A2": 143.2,
"_021_Модуль_ДКВ_DCI_B1": 0.049,
"_022_ФазаКВ_DCI_B1": 317.3,
"_023_Модуль_ДКВ_DCI_B2": 0.044,
"_024_ФазаКВ_DCI_B2": 308.9,
"_025_Допуст_ост_дисб_г_мм": 405845.10488433315,
"_026_Остат_дисб_пл1_г_мм": 1277744.2739522292,
"_027_Остат_дисб_пл2_г_мм": 1406625.3579413665,
"_028_Остат_дисб_сумм_г_мм": 2684369.6318935957
}

View File

@ -0,0 +1,42 @@
{
"_001_Ампл_вибр_пуска_A0": 8,
"_002_Фаза_вибр_пуска_A0": 150,
"_003_Ампл_вибр_пуска_A3": 1,
"_004_Фаза_вибр_пуска_A3": 60,
"_005_Ампл_вибр_пуска_B0": 9,
"_006_Фаза_вибр_пуска_B0": 40,
"_007_Ампл_вибр_пуска_B3": 1,
"_008_Фаза_вибр_пуска_B3": 120,
"_009_Масса_дисбаланса_пл_1": 638,
"_010_Угол_дисбаланса_пл_1": 162.1,
"_011_Масса_дисбаланса_пл_2": 703,
"_012_Угол_дисбаланса_пл_2": 7.1,
"_013_Масса_баланс_груза_расч_пл_1": 638,
"_014_Угол_баланс_груза_расч_пл_1": 342.1,
"_015_Масса_баланс_груза_введён_пл_1": 600,
"_016_Угол_баланс_груза_введён_пл_1": 350,
"_017_Масса_баланс_груза_расч_пл_2": 703,
"_018_Угол_баланс_груза_расч_пл_2": 187.1,
"_019_Масса_баланс_груза_введён_пл_2": 700,
"_020_Угол_баланс_груза_введён_пл_2": 180,
"_021_Масса_остат_дисбаланса_пл_1": 90.07073811703124,
"_022_Угол_остат_дисбаланса_пл_1": 131.67987753466508,
"_023_Масса_остат_дисбаланса_пл_2": 81.67323954345251,
"_024_Угол_остат_дисбаланса_пл_2": 311.83502056566783,
"_025_Масса_грузаобаланс_пл_1": 90.07073811703124,
"_026_Угол_грузаобаланс_пл_1": 311.6798775346651,
"_027_Масса_грузаобаланс_пл_2": 81.67323954345251,
"_028_Угол_грузаобаланс_пл_2": 131.83502056566786,
"_029_Модуль_ДКВ_DCI_A1": 0.015,
"_030_ФазаКВ_DCI_A1": 168.5,
"_031_Модуль_ДКВ_DCI_A2": 0.025,
"_032_ФазаКВ_DCI_A2": 143.2,
"_033_Модуль_ДКВ_DCI_B1": 0.049,
"_034_ФазаКВ_DCI_B1": 317.3,
"_035_Модуль_ДКВ_DCI_B2": 0.044,
"_036_ФазаКВ_DCI_B2": 308.9,
"_037_Допуст_ост_дисб_г_мм": 405845104.88433313,
"_038_Остат_дисб_пл1_после_бал_г_мм": 180141.4762340625,
"_039_Остат_дисб_пл2_после_бал_г_мм": 163346.47908690502,
"_040_Остат_дисб_сумм_после_бал_г_мм": 343487.9553209675
}

View File

@ -0,0 +1,6 @@
{
"_001_Радиус_установки_грузов_пл1_мм": 2000,
"_002_Радиус_установки_грузов_пл2_мм": 2000,
"_003_Масса_ротораг": 17000,
"_004_Допуст_ост_дисб_г_мм": 405845.10488433315
}

View File

@ -0,0 +1,5 @@
{
"_001_Примен_пробный_груз_пл_1": 300,
"_002_Угол_устан_пробн_груза_пл_1": 250,
"_003_Расч_пробный_груз_пл_1": 546.72
}

View File

@ -0,0 +1,38 @@
{
"_001_Ампл_вибр_пуска_A0": 8,
"_002_Фаза_вибр_пуска_A0": 150,
"_003_Ампл_вибр_пуска_A1": 9.1,
"_004_Фаза_вибр_пуска_A1": 120,
"_005_Ампл_вибр_пуска_A2": 8.1,
"_006_Фаза_вибр_пуска_A2": 95,
"_007_Ампл_вибр_пуска_B0": 9,
"_008_Фаза_вибр_пуска_B0": 40,
"_009_Ампл_вибр_пуска_B1": 6.3,
"_010_Фаза_вибр_пуска_B1": 189,
"_011_Ампл_вибр_пуска_B2": 5.8,
"_012_Фаза_вибр_пуска_B2": 165,
"_013_Масса_дисбаланса_пл_1": 649.7502317203779,
"_014_Угол_дисбаланса_пл_1": 163.05631714463198,
"_015_Масса_дисбаланса_пл_2": 720.5269743990223,
"_015_Угол_дисбаланса_пл_2": 7.67536761444228,
"_016_Масса_баланс_груза_расч_пл_1": 649.7502317203779,
"_017_Угол_баланс_груза_расч_пл_1": 343.05631714463203,
"_018_Масса_баланс_груза_введён_пл_1": 600,
"_019_Угол_баланс_груза_введён_пл_1": 350,
"_020_Масса_баланс_груза_расч_пл_2": 720.5269743990223,
"_021_Угол_баланс_груза_расч_пл_2": 187.67536761444225,
"_022_Масса_баланс_груза_введён_пл_2": 700,
"_023_Угол_баланс_груза_введён_пл_2": 180,
"_024_Модуль_ДКВ_DCI_A1": 0.015171867682943005,
"_025_ФазаКВ_DCI_A1": 168.49971205106888,
"_026_Модуль_ДКВ_DCI_A2": 0.024782272752223607,
"_027_ФазаКВ_DCI_A2": 143.1835959369363,
"_028_Модуль_ДКВ_DCI_B1": 0.049203971373098135,
"_029_ФазаКВ_DCI_B1": 317.3017985641346,
"_030_Модуль_ДКВ_DCI_B2": 0.04403551344023356,
"_031_ФазаКВ_DCI_B2": 308.92190074190114,
"_032_Допуст_ост_дисб_г_мм": 405845.10488433315,
"_033_Остат_дисб_пл1_г_мм": 1299500.4634407558,
"_034_Остат_дисб_пл2_г_мм": 1441053.9487980446,
"_035_Остат_дисб_сумм_г_мм": 2740554.4122388004
}

View File

@ -0,0 +1,50 @@
{
"_001_Ампл_вибр_пуска_A0": 8,
"_002_Фаза_вибр_пуска_A0": 150,
"_003_Ампл_вибр_пуска_A1": 9.1,
"_004_Фаза_вибр_пуска_A1": 120,
"_005_Ампл_вибр_пуска_A2": 8.1,
"_006_Фаза_вибр_пуска_A2": 95,
"_007_Ампл_вибр_пуска_A3": 1,
"_008_Фаза_вибр_пуска_A3": 60,
"_009_Ампл_вибр_пуска_B0": 9,
"_010_Фаза_вибр_пуска_B0": 40,
"_011_Ампл_вибр_пуска_B1": 6.3,
"_012_Фаза_вибр_пуска_B1": 189,
"_013_Ампл_вибр_пуска_B2": 5.8,
"_014_Фаза_вибр_пуска_B2": 165,
"_015_Ампл_вибр_пуска_B3": 1,
"_016_Фаза_вибр_пуска_B3": 120,
"_017_Масса_дисбаланса_пл_1": 650,
"_018_Угол_дисбаланса_пл_1": 163.1,
"_019_Масса_дисбаланса_пл_2": 720,
"_020_Угол_дисбаланса_пл_2": 7.7,
"_021_Масса_баланс_груза_расч_пл_1": 650,
"_022_Угол_баланс_груза_расч_пл_1": 343.1,
"_023_Масса_баланс_груза_введён_пл_1": 600,
"_024_Угол_баланс_груза_введён_пл_1": 350,
"_025_Масса_баланс_груза_расч_пл_2": 720,
"_026_Угол_баланс_груза_расч_пл_2": 187.7,
"_027_Масса_баланс_груза_введён_пл_2": 700,
"_028_Угол_баланс_груза_введён_пл_2": 180,
"_029_Масса_остат_дисбаланса_пл_1": 91.6344324012871,
"_030_Угол_остат_дисбаланса_пл_1": 132.14910918667033,
"_031_Масса_остат_дисбаланса_пл_2": 83.63310673236978,
"_032_Угол_остат_дисбаланса_пл_2": 312.5961470829369,
"_033_Масса_грузаобаланс_пл_1": 91.6344324012871,
"_034_Угол_грузаобаланс_пл_1": 312.14910918667033,
"_035_Масса_грузаобаланс_пл_2": 83.63310673236978,
"_036_Угол_грузаобаланс_пл_2": 132.5961470829369,
"_037_Модуль_ДКВ_DCI_A1": 0.015171867,
"_038_ФазаКВ_DCI_A1": 168.49971205,
"_039_Модуль_ДКВ_DCI_A2": 0.02478227,
"_040_ФазаКВ_DCI_A2": 143.1835959,
"_041_Модуль_ДКВ_DCI_B1": 0.04920397,
"_042_ФазаКВ_DCI_B1": 317.301798,
"_043_Модуль_ДКВ_DCI_B2": 0.04403551344,
"_044_ФазаКВ_DCI_B2": 308.9219007,
"_045_Допуст_ост_дисб_г_мм": 405845.10488433315,
"_046_Остат_дисб_пл1_после_бал_г_мм": 183268.8648025742,
"_047_Остат_дисб_пл2_после_бал_г_мм": 167266.21346473956,
"_048_Остат_дисб_сумм_после_бал_г_мм": 350535.0782673138
}

10
balancing_calculator.gtld Normal file
View File

@ -0,0 +1,10 @@
{
"autoStartRecorder": false,
"expendTreeOnStart": true,
"lastTag": "шаг 6",
"projectTitle": "Балансировочный калькулятор",
"syncURL": "",
"useSync": false,
"vacuumOnStart": false,
"version": 1
}

View File

@ -0,0 +1,2 @@
[
]

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,182 @@
[
{
"RRDSize": 100,
"analizerScriptName": "",
"channelsToWrite": [
],
"comment": "",
"daemonConfigName": "",
"daemonScriptName": "",
"defaultRecordTime": 10,
"deviceIndex": -1,
"isDeviceSelected": false,
"isRRDEnabled": false,
"label": "8,4Гц - начальная вибрация",
"masterValueModel": [
],
"runAnalizer": false,
"stopRecorderFromScript": false,
"tachoOptions": {
"isTachoEnabled": false,
"maxTacho": 1000,
"minTacho": 0,
"recalcTacho": false,
"tachoChannel": 0,
"tachoChannelName": "",
"tachoFromInfo": 0,
"tachoState": 0,
"tachoValue": 0
},
"uuid": "{68a06416-a332-435b-a2c7-a9fc0d0ce56a}"
},
{
"RRDSize": 100,
"analizerScriptName": "",
"channelsToWrite": [
],
"comment": "",
"daemonConfigName": "",
"daemonScriptName": "",
"defaultRecordTime": 10,
"deviceIndex": -1,
"isDeviceSelected": false,
"isRRDEnabled": false,
"label": "8,4Гц - без дисбалансов",
"masterValueModel": [
],
"runAnalizer": false,
"stopRecorderFromScript": false,
"tachoOptions": {
"isTachoEnabled": false,
"maxTacho": 1000,
"minTacho": 0,
"recalcTacho": false,
"tachoChannel": 0,
"tachoChannelName": "",
"tachoFromInfo": 0,
"tachoState": 0,
"tachoValue": 0
},
"uuid": "{6f96cab3-cf28-45ae-b730-1fe3077582e4}"
},
{
"RRDSize": 100,
"analizerScriptName": "",
"channelsToWrite": [
],
"comment": "",
"daemonConfigName": "",
"daemonScriptName": "",
"defaultRecordTime": 10,
"deviceIndex": -1,
"isDeviceSelected": false,
"isRRDEnabled": false,
"label": "8,4Гц - контрольный пуск",
"masterValueModel": [
],
"runAnalizer": false,
"stopRecorderFromScript": false,
"tachoOptions": {
"isTachoEnabled": false,
"maxTacho": 1000,
"minTacho": 0,
"recalcTacho": false,
"tachoChannel": 0,
"tachoChannelName": "",
"tachoFromInfo": 0,
"tachoState": 0,
"tachoValue": 0
},
"uuid": "{bcfb8de2-5680-401c-8665-6ceb4a40d7aa}"
},
{
"RRDSize": 100,
"analizerScriptName": "",
"channelsToWrite": [
],
"comment": "",
"daemonConfigName": "",
"daemonScriptName": "",
"defaultRecordTime": 10,
"deviceIndex": -1,
"isDeviceSelected": false,
"isRRDEnabled": false,
"label": "8,4Гц - пробный груз в плоскости 2",
"masterValueModel": [
],
"runAnalizer": false,
"stopRecorderFromScript": false,
"tachoOptions": {
"isTachoEnabled": false,
"maxTacho": 1000,
"minTacho": 0,
"recalcTacho": false,
"tachoChannel": 0,
"tachoChannelName": "",
"tachoFromInfo": 0,
"tachoState": 0,
"tachoValue": 0
},
"uuid": "{d510a059-a41c-4832-9900-5719d9a54f20}"
},
{
"RRDSize": 100,
"analizerScriptName": "",
"channelsToWrite": [
],
"comment": "",
"daemonConfigName": "",
"daemonScriptName": "",
"defaultRecordTime": 10,
"deviceIndex": -1,
"isDeviceSelected": false,
"isRRDEnabled": false,
"label": "test_balancing (1)",
"masterValueModel": [
],
"runAnalizer": false,
"stopRecorderFromScript": false,
"tachoOptions": {
"isTachoEnabled": false,
"maxTacho": 1000,
"minTacho": 0,
"recalcTacho": false,
"tachoChannel": 0,
"tachoChannelName": "",
"tachoFromInfo": 0,
"tachoState": 0,
"tachoValue": 0
},
"uuid": "{dc42d8d0-1a99-48a5-ad83-ff5d5453d9fc}"
},
{
"RRDSize": 100,
"analizerScriptName": "",
"channelsToWrite": [
],
"comment": "",
"daemonConfigName": "",
"daemonScriptName": "",
"defaultRecordTime": 10,
"deviceIndex": -1,
"isDeviceSelected": false,
"isRRDEnabled": false,
"label": "8,4Гц - пробный груз в плоскости 1",
"masterValueModel": [
],
"runAnalizer": false,
"stopRecorderFromScript": false,
"tachoOptions": {
"isTachoEnabled": false,
"maxTacho": 1000,
"minTacho": 0,
"recalcTacho": false,
"tachoChannel": 0,
"tachoChannelName": "",
"tachoFromInfo": 0,
"tachoState": 0,
"tachoValue": 0
},
"uuid": "{f5347cd7-4614-45cf-a6b2-ab59004d230e}"
}
]

103
qml/default_object.qml Normal file
View File

@ -0,0 +1,103 @@
import QtQml
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Item {
id: mainWindow
anchors.fill: parent
SplitView {
id: splitView
orientation: Qt.Horizontal
anchors.fill: parent
anchors.margins: 2
handle: Rectangle {
implicitWidth: 6
color: "darkgray"
}
Rectangle {
SplitView.preferredWidth: parent.width/2
SplitView.maximumWidth: parent.width/100*75
SplitView.minimumWidth: parent.width/100*25
color: "gray"
ColumnLayout {
Text{
text: "gtld.node.name = " + gtld.node.name
font.pointSize: 18
color: "white"
}
Text{
text: "gtld.node.uuid = " + gtld.node.uuid.toString()
font.pointSize: 18
color: "white"
}
Text{
text: "gtld.node.lastResult[\"tag\"] = " + gtld.node.lastResult["tag"] || "undefined";
font.pointSize: 18
color: "white"
}
Text{
text: "gtld.node.lastResult.masterValues[\"skz\"] = " + gtld.node.lastResult.masterValues?.["skz"] || "undefined";
font.pointSize: 18
color: "white"
}
Text{
text: "gtld.storage.selectLastResults({args}).length = "
+ gtld.node.selectLastResults(
{
count: 5,
tag: gtld.node.lastResult["tag"]
}
).length || "undefined";
font.pointSize: 18
color: "white"
}
}
}
Rectangle {
SplitView.preferredWidth: parent.width/2
color: "lightGray"
ListView{
id: listView
anchors.fill: parent
spacing: 5
model: gtld.node.selectLastResults(
{
count: 5,
tag: "tag",
})
delegate: Rectangle {
height: 60
width: ListView.view.width
color: "darkblue"
Text {
anchors.centerIn: parent
color: "white"
text: "skz = " + modelData["masterValues"]?.["skz"] + "; speed = " + modelData["masterValues"]?.["speed"]
font.pointSize: 12
}
}
}
}
}
}

104
qml/default_point.qml Normal file
View File

@ -0,0 +1,104 @@
import QtQml
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Item {
id: mainWindow
anchors.fill: parent
SplitView {
id: splitView
orientation: Qt.Horizontal
anchors.fill: parent
anchors.margins: 2
handle: Rectangle {
implicitWidth: 6
color: "darkgray"
}
Rectangle {
SplitView.preferredWidth: parent.width/2
SplitView.maximumWidth: parent.width/100*75
SplitView.minimumWidth: parent.width/100*25
color: "gray"
ColumnLayout {
Text{
text: "gtld.node.name = " + gtld.node.name
font.pointSize: 18
color: "white"
}
Text{
text: "gtld.node.uuid = " + gtld.node.uuid.toString()
font.pointSize: 18
color: "white"
}
Text{
text: "gtld.node.parent.uuid = " + gtld.node.parent.uuid.toString()
font.pointSize: 18
color: "white"
}
Text{
text: "gtld.node.lastResult[\"tag\"] = " + gtld.node.lastResult?.[0]?.["tag"] || "undefined";
font.pointSize: 18
color: "white"
}
Text{
text: "gtld.storage.selectLastResults({args}).length = "
+ gtld.node.selectLastResults(
{
count: 5,
tag: gtld.node.lastResult?.[0]?.["tag"] || "undefined"
}
).length || "undefined";
font.pointSize: 18
color: "white"
}
}
}
Rectangle {
SplitView.preferredWidth: parent.width/2
color: "lightGray"
ListView{
id: listView
anchors.fill: parent
spacing: 5
model: gtld.node.selectLastResults(
{
count: 5,
tag: "tag",
}
)
delegate: Rectangle {
height: 60
width: ListView.view.width
color: "darkblue"
Text {
anchors.centerIn: parent
color: "white"
text: "record fileName = " + modelData?.["recordOptions"]?.["recordFileName"] +
"; skz = " + modelData["masterValues"]?.["skz"] +
"; speed = " + modelData["masterValues"]?.["speed"]
font.pointSize: 12
}
}
}
}
}
}

View File

@ -0,0 +1,137 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 65365,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 33791,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 10551551,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711735,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16772608,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65301,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 50175,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 6357247,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711798,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
},
"ranges": [
]
}

View File

@ -0,0 +1,137 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 6422272,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65475,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 5631,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711917,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16725760,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 10616576,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65411,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 21759,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 13631743,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
},
"ranges": [
]
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 16711770,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16763392,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 917248,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 59135,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 4063487,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711834,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16747264,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 5111552,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65495,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,137 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 6422272,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65475,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 5631,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711917,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16725760,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 10616576,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65411,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 21759,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 13631743,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
},
"ranges": [
]
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 16711770,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16763392,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 917248,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 59135,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 4063487,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711834,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16747264,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 5111552,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65495,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 65365,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 33791,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 10551551,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711735,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16772608,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65301,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 50175,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 6357247,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711798,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,137 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 16711770,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16763392,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 917248,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 59135,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 4063487,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711834,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16747264,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 5111552,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65495,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
},
"ranges": [
]
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 65365,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 33791,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 10551551,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711735,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16772608,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65301,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 50175,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 6357247,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711798,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 65365,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 33791,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 10551551,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711735,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16772608,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65301,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 50175,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 6357247,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711798,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 65365,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 33791,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 10551551,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711735,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16772608,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65301,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 50175,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 6357247,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711798,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 6422272,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65475,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 5631,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711917,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16725760,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 10616576,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65411,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 21759,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 13631743,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 65365,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 33791,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 10551551,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711735,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16772608,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65301,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 50175,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 6357247,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711798,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 6422272,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65475,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 5631,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711917,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16725760,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 10616576,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65411,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 21759,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 13631743,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 16711770,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16763392,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 917248,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 59135,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 4063487,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711834,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16747264,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 5111552,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65495,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,5 @@
<root>
<child color="0" gain="1" is_couping="0" is_iepe="0" is_inverting="0" name="1V202 #123" node="gtl::hw::player_analog_input" offset="0" reference="1" scale="1" sensitivity="1" unit=""/>
<child color="0" gain="1" is_couping="0" is_iepe="0" is_inverting="0" name="1V202 #124" node="gtl::hw::player_analog_input" offset="0" reference="1" scale="1" sensitivity="1" unit=""/>
<child color="0" gain="1" is_couping="0" is_iepe="0" is_inverting="0" name="8V91D #001" node="gtl::hw::player_analog_input" offset="0" reference="1" scale="1" sensitivity="1" unit=""/>
</root>

View File

@ -0,0 +1,47 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 0,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "1V202 #123",
"node": "gtl::hw::player_analog_input",
"offset": 0,
"reference": 1,
"sensitivity": 1
},
{
"color": 0,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "1V202 #124",
"node": "gtl::hw::player_analog_input",
"offset": 0,
"reference": 1,
"sensitivity": 1
},
{
"color": 0,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "8V91D #001",
"node": "gtl::hw::player_analog_input",
"offset": 0,
"reference": 1,
"sensitivity": 1
}
],
"name": "player[Лянг выхр_букса_ру_пропил__2022_04_12__12_42_49.wav]",
"rate": 128000
},
"ranges": [
]
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 65365,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 33791,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 10551551,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711735,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16772608,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65301,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 50175,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 6357247,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711798,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 6422272,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65475,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 5631,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711917,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16725760,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 10616576,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65411,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 21759,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 13631743,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,135 @@
{
"comment": "",
"hw": {
"channels": [
{
"color": 16711770,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [0] П_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16763392,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [1] П_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 917248,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [2] З_гориз",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 59135,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [3] 3_верт",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 4063487,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "102 [тахо]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16711834,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [0]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 16747264,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [1]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 5111552,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [2]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
},
{
"color": 65495,
"gain": 1,
"is_couping": false,
"is_iepe": false,
"is_inverting": false,
"name": "103 [3]",
"node": "gtl::hw::analog_input",
"offset": 0,
"reference": 1,
"scale": 1,
"sensitivity": 1,
"unit": ""
}
],
"name": "93.120.233.148:7000::0",
"rate": 64000
}
}

View File

@ -0,0 +1,81 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ с фазой *****
// ***************************************************************
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let R_ = gtl.options.customOptions.R; // радиус установки грузов ** (для вычисления массы пробного груза)
let R; // радиус установки грузов ** (для вычисления массы пробного груза) (конечное значение)
let P_ = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
let P; // масса ротора, кг ** (для вычисления массы пробного груза) (конечное значение)
let G = gtl.options.customOptions.G; // класс точности балансировки, мм/с ** (ГОСТ 1940)
let n = gtl.options.customOptions.n; // скорость вращения, об/мин ** (для вычисления массы пробного груза и допустимого остаточного дисбаланса)
let U_per; // допустимый остаточный дисбаланс *** (ГОСТ 1940)
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 0 - ввод исходных данных:
// ввод исходных данных: радиус установки грузов, масса ротора
// ввод ДКВ (DCI), если он известен (необязателен для этого алгоритма)
// R радиус установки грузов, мм
if (R_ != 0) {R = R_} // принимает значение из опций
else {R = false} // принимает значение false
// P масса ротора, г
if (P_ != 0) {P = P_} // принимает значение из опций
else {P = false} // принимает значение false
// Вычисление допустимого остаточного дисбаланса
U_per = (1000 * (G * P)) / (Math.PI * n / 30);
gtl.log.info("Масса ротора", P);
gtl.log.info("Радиус установки грузов", R);
gtl.log.info("Допустимый остаточный дисбаланс", U_per);
// Выдача результата (results)
let __result = {
_001_Радиус_установки_грузов_мм: R,
_002_Масса_ротораг: P,
_003опуст_ост_дисб_г_мм: U_per,
_004астращ_обмин: n
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

@ -0,0 +1,402 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ с фазой *****
// ***************************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
freq.time = 1; // длина (время) отрезка сигнала
freq.avg_cnt = 3; // количество усреднений
freq.dc = -0.05; // уровень, при переходе через который вычисляются периоды
// ФИЛЬТР 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let 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 = 501; // центральная частота полосового фильтра
filter_2_1000.width = 998; // ширина полосы фильтра
let filter_2_1000v = gtl.add_intg(filter_2_1000); // интегрирование
filter_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр для виброперемещения
let filter_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_2_300s.kind = gtl.filter_iir.butterworth;
filter_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_2_300s.order = 4;
filter_2_300s.frequency = 151; // центральная частота
filter_2_300s.width = 298; // ширина полосы
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = 0.5; // частотное разрешение
let average = 3; // количество усреднений
let overlap = 0; // наложение
let filter_vibr; // фильтр сигнала вибрации
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_vibr = filter_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_vibr = filter_2_300s;
frequency = 300;
}
// Спектр для получения 1-й гармоники частоты вращения
var AUSP = gtl.add_ausp(filter_vibr); // объявление переменной спектра
AUSP.color = 0x00ff0000; // цвет спектра
AUSP.name = "AUSP"; // имя спектра
AUSP.frequency = frequency; // граничная частота спектра
AUSP.lines = AUSP.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP.average = average; // количество усреднений
AUSP.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP.smoothing_factor = 100; // усреднение средней линии
AUSP.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP.tolerance = AUSP.resolution; // диапазон поиска гармоник +/-
// СКЗ
var RMS = gtl.add_value_rms(filter_vibr);
RMS.time = 1;
RMS.avg_cnt = 3;
// Спектр вибрации
var AUSP_pl = gtl.create_ausp(
{
"src" : filter_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ
var pfc_pl = gtl.create_pfc(
{
"src0" : filter_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектр вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбаланса"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0; // модуль вектора начальной вибрации */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации */**
let A0_phase; // фаза вектора начальной вибрации */** (конечное значение)
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time) + 0.1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP.clear_harms_sets();
let __AUSP_tools = gtl.create_spec_tools(
{
data: AUSP_pl.data,
df: AUSP_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP = __AUSP_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP.name = "F1 (гарм. ряд част. вращ.)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_tools = gtl.create_spec_tools(
{
data: pfc_pl.data,
df: pfc_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row1_phase = __pfc_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row1_phase.name = "F1_phase (гарм. ряд част. вращ.)"; // название гармонического ряда
// Построение графиков
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации",
x: AUSP_pl.resolution,
y: AUSP_pl.data,
spec_tools: __AUSP_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ",
x: pfc_pl.resolution,
y: pfc_pl.data,
spec_tools: __pfc_tools.to_json()
});
let __result1 = __AUSP_tools.to_json();
let __result2 = __pfc_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 F1_1_ph = __result2.harms.rows[0].harms[0].ampl;
// Проверка наличия оборотной гармоники и необходимости проведения баалнсировки
var test_balance = ""; // переменная для текста о необходимости проведения балансировки
if (F1_1_a >= RMS * 0.4) // вклад оборотной гармоники в СКЗ
{test_balance = "необходимо провести балансировку";}
else {test_balance = "проведение балансировки не требуется или нецелесообразно";}
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 1 - начальная вибрация A0:
// измерение начальной вибрации A0 (или ввод вручную)
// определение целесообразности проведения балансировки
// построение графика вибрации A0
// Определение конечных значений переменных
// A0 начальная вибрация
if (A0_ != 0) {A0 = A0_} // принимает значение из опций
else {A0 = F1_1_a} // принимает значение из спектра сигнала
if (A0_phase_ != 0) {A0_phase = A0_phase_} // принимает значение из опций
else {A0_phase = F1_1_ph} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0)+Math.max(A0)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0)+Math.max(A0)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0)+Math.max(A0)*0.2), -(Math.max(A0)+Math.max(A0)*0.2), (Math.max(A0)+Math.max(A0)*0.2), (Math.max(A0)+Math.max(A0)*0.2)],
y: [(Math.max(A0)+Math.max(A0)*0.2), -(Math.max(A0)+Math.max(A0)*0.2), -(Math.max(A0)+Math.max(A0)*0.2), (Math.max(A0)+Math.max(A0)*0.2)]
});
gtl.log.info("RMS",RMS.value);
gtl.log.info("Необходимость проведения балансировки",test_balance);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("F1_1_ph (фаза)",F1_1_ph);
gtl.log.info("F1_1_a (ампл)",F1_1_a);
gtl.log.info("F1_1_f (част)",F1_1_f);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
// Выдача результата (results)
let __result = {
_001астотаращения_F1: freq.value,
_002_Ампл_гарм_1F1: F1_1_a,
_003азаастращ_F1: F1_1_ph,
_004_Ампл_вибр_пуска_A0: A0,
_005аза_вибр_пуска_A0: A0_phase,
_006_Тестирование: test_balance,
_007_СКЗ_вибрации: RMS.value,
_008_Нестабастращ: instability*100,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

View File

@ -0,0 +1,181 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ с фазой *****
// ***************************************************************
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектр виброскорости"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбаланса"); // объект для дисбаланса
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let m_test_ = gtl.options.customOptions.m_test; // масса пробного груза **
let m_test; // масса пробного груза ** (конечное значение)
let m_test_corner_ = gtl.options.customOptions.m_test_corner; // угол установки пробного груза **
let m_test_corner = m_test_corner_; // угол установки пробного груза ** (конечное значение)
let m_test_calc; // масса пробного груза расчётная ***
let n = gtl.options.customOptions.n; // частота вращения, об/мин */** (для вычисления массы пробного груза)
let R_ = gtl.options.customOptions.R; // радиус установки грузов, мм ** (для вычисления массы пробного груза)
let R = R_; // радиус установки грузов, мм ** (для вычисления массы пробного груза) (конечное значение)
let P_ = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
let P = P_; // масса ротора, кг ** (для вычисления массы пробного груза) (конечное значение)
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0 = A0_; // модуль вектора начальной вибрации */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации */** (конечное значение)
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let m_test_corner_X;// угол наклона вектора m_test к оси X
let m_test_corner_Y;// угол наклона вектора m_test к оси Y
let m_test_1_X; // начальная координата вектора m_test по оси X
let m_test_2_X; // конечная координата вектора m_test по оси X
let m_test_1_Y; // начальная координата вектора m_test по оси Y
let m_test_2_Y; // конечная координата вектора m_test по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 2 - выбор массы и положения пробного груза:
// вычисление рекомендуемой массы пробного груза m_test_calc
// ввод пользователем массы пробного груза и угла его установки m_test
// построение графика расположения массы пробного груза m_test
// из предыдущих шагов переносятся: частота вращения freq, радиус установки грузов R,
// масса ротора P, уровень начальной вибрации A0
// Вычисление массы пробного груза (если не введено своё значение и есть данные для формулы)
// m_test масса пробного груза
if (P != 0 && R != 0)
{m_test_calc = 804 * ((P * A0) / (R/10 * n)); // R/10 - перевод мм в см
} else {m_test_calc = 0}
if (m_test_ != 0) {m_test = m_test_} // принимает значение из опций
else {m_test = 0} // значение не введено
// определение угла наклона вектора m_test к осям X и Y
if (m_test_corner <= 90) {
m_test_corner_X = 90 - m_test_corner}
if (m_test_corner <= 180) {
m_test_corner_X = m_test_corner - 90}
if (m_test_corner <= 270) {
m_test_corner_X = 270 - m_test_corner}
if (m_test_corner <= 360) {
m_test_corner_X = m_test_corner - 270}
if (m_test_corner <= 90) {
m_test_corner_Y = m_test_corner}
if (m_test_corner <= 180) {
m_test_corner_Y = 180 - m_test_corner}
if (m_test_corner <= 270) {
m_test_corner_Y = m_test_corner - 180}
if (m_test_corner <= 360) {
m_test_corner_Y = 360 - m_test_corner}
// определение координат вектора m_test
m_test_1_X = 0;
if (m_test_corner <= 180) {m_test_2_X = Math.abs(Math.cos(m_test_corner_X * 3.1415/180)) * m_test * (-1)
} else {m_test_2_X = Math.abs(Math.cos(m_test_corner_X * 3.1415/180)) * m_test}
m_test_1_Y = 0;
if (m_test_corner <= 90 || m_test_corner >= 270) {m_test_2_Y = Math.abs(Math.cos(m_test_corner_Y * 3.1415/180)) * m_test
} else {m_test_2_Y = Math.abs(Math.cos(m_test_corner_Y * 3.1415/180)) * m_test * (-1)}
// определение координат точек окружности обозначения массы пробного груза
var x_m_test_array = []; // массив координат точек окружности m_test по оси X
var y_m_test_array = []; // массив координат точек окружности m_test по оси Y
var x0_m_test = m_test_2_X; // центр по X
var y0_m_test = m_test_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_m_test_array.push(x0_m_test + (Math.max(m_test)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_m_test_array.push(y0_m_test + (Math.max(m_test)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности графика для отображения расположения дисбаланса
var xD_array = []; // массив координат точек окружности D по оси X
var yD_array = []; // массив координат точек окружности D по оси Y
var x0D = 0; // центр в начале координат
var y0D = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xD_array.push(x0D + (Math.max(m_test)+Math.max(m_test)*0.1) * (Math.sin((i) * Math.PI / 180)));
yD_array.push(y0D + (Math.max(m_test)+Math.max(m_test)*0.1) * (Math.cos((i) * Math.PI / 180)));}
plot_disb.add(
{
color: 0x0000ff,
name: "Пробный груз",
x: x_m_test_array,
y: y_m_test_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "График расположения дисбаланса",
x: xD_array,
y: yD_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(m_test)+Math.max(m_test)*0.2), -(Math.max(m_test)+Math.max(m_test)*0.2), (Math.max(m_test)+Math.max(m_test)*0.2), (Math.max(m_test)+Math.max(m_test)*0.2)],
y: [(Math.max(m_test)+Math.max(m_test)*0.2), -(Math.max(m_test)+Math.max(m_test)*0.2), -(Math.max(m_test)+Math.max(m_test)*0.2), (Math.max(m_test)+Math.max(m_test)*0.2)]
});
gtl.log.info("m_test (пробный груз введёный)",m_test);
gtl.log.info("m_test_corner (угол установки пробного груза)",m_test_corner);
gtl.log.info("m_test_calc (пробный груз расчётный)",m_test_calc);
gtl.log.info("Масса ротора, кг", P);
gtl.log.info("Радиус установки грузов, мм", R);
gtl.log.info("Начальная вибрация A0",A0);
gtl.log.info("Частота вращения, об/мин", n);
// Выдача результата (results)
let __result = {
_001римен_пробный_груз: m_test,
_002_Угол_устан_пробн_груза: m_test_corner,
_003_Расч_пробный_груз: m_test_calc,
_004астращ_обмин: n
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

@ -0,0 +1,490 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ с фазой *****
// ***************************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
freq.time = 1; // длина (время) отрезка сигнала
freq.avg_cnt = 3; // количество усреднений
freq.dc = -0.05; // уровень, при переходе через который вычисляются периоды
// ФИЛЬТР 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let 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 = 501; // центральная частота полосового фильтра
filter_2_1000.width = 998; // ширина полосы фильтра
let filter_2_1000v = gtl.add_intg(filter_2_1000); // интегрирование
filter_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр для виброперемещения
let filter_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_2_300s.kind = gtl.filter_iir.butterworth;
filter_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_2_300s.order = 4;
filter_2_300s.frequency = 151; // центральная частота
filter_2_300s.width = 298; // ширина полосы
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = 0.5; // частотное разрешение
let average = 3; // количество усреднений
let overlap = 0; // наложение
let filter_vibr; // фильтр сигнала вибрации
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_vibr = filter_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_vibr = filter_2_300s;
frequency = 300;
}
// Спектр для получения 1-й гармоники частоты вращения
var AUSP = gtl.add_ausp(filter_vibr); // объявление переменной спектра
AUSP.color = 0x00ff0000; // цвет спектра
AUSP.name = "AUSP"; // имя спектра
AUSP.frequency = frequency; // граничная частота спектра
AUSP.lines = AUSP.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP.average = average; // количество усреднений
AUSP.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP.smoothing_factor = 100; // усреднение средней линии
AUSP.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP.tolerance = AUSP.resolution; // диапазон поиска гармоник +/-
// СКЗ
var RMS = gtl.add_value_rms(filter_vibr);
RMS.time = 1;
RMS.avg_cnt = 3;
// Спектр вибрации
var AUSP_pl = gtl.create_ausp(
{
"src" : filter_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ
var pfc_pl = gtl.create_pfc(
{
"src0" : filter_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектр вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбаланса"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0 = A0_; // модуль вектора начальной вибрации */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации */** (конечное значение)
let A1_ = gtl.options.customOptions.A1; // модуль вектора вибрации после установки пробного груза */**
let A1; // модуль вектора вибрации после установки пробного груза */** (конечное значение)
let A1_phase_ = gtl.options.customOptions.A1_phase; // фаза вектора вибрации после установки пробного груза */**
let A1_phase; // фаза вектора вибрации после установки пробного груза */** (конечное значение)
let dA1; // модуль вектора дельты вибрации после установки пробного груза ***
let dA1_phase; // фаза вектора дельты вибрации после установки пробного груза ***
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let A1_phase_X; // угол наклона вектора A1 к оси X
let A1_phase_Y; // угол наклона вектора A1 к оси Y
let A1_1_X; // начальная координата вектора A1 по оси X
let A1_2_X; // конечная координата вектора A1 по оси X
let A1_1_Y; // начальная координата вектора A1 по оси Y
let A1_2_Y; // конечная координата вектора A1 по оси Y
let dA1_1_X; // начальная координата вектора dA1 по оси X
let dA1_2_X; // конечная координата вектора dA1 по оси X
let dA1_1_Y; // начальная координата вектора dA1 по оси Y
let dA1_2_Y; // конечная координата вектора dA1 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time) + 0.1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP.clear_harms_sets();
let __AUSP_tools = gtl.create_spec_tools(
{
data: AUSP_pl.data,
df: AUSP_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP = __AUSP_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP.name = "F1 (гарм. ряд част. вращ.)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_tools = gtl.create_spec_tools(
{
data: pfc_pl.data,
df: pfc_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row1_phase = __pfc_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row1_phase.name = "F1_phase (гарм. ряд част. вращ.)"; // название гармонического ряда
// Построение графиков
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации",
x: AUSP_pl.resolution,
y: AUSP_pl.data,
spec_tools: __AUSP_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ",
x: pfc_pl.resolution,
y: pfc_pl.data,
spec_tools: __pfc_tools.to_json()
});
let __result1 = __AUSP_tools.to_json();
let __result2 = __pfc_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 F1_1_ph = __result2.harms.rows[0].harms[0].ampl;
// Проверка наличия оборотной гармоники и необходимости проведения баалнсировки
var test_balance = ""; // переменная для текста о необходимости проведения балансировки
if (F1_1_a >= RMS * 0.4) // вклад оборотной гармоники в СКЗv
{test_balance = "необходимо провести балансировку";}
else {test_balance = "проведение балансировки не требуется или нецелесообразно";}
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 3 - вибрация пробного пуска A1:
// измерение начальной вибрации A1 (или ввод вручную)
// из предыдущих шагов переносятся: амплитуда и фаза вибрации A0
// построение графиков вибрации A0, A1 и dA1
// Определение конечных значений переменных
// A1 вибрация после установки пробного груза
if (A1_ != 0) {A1 = A1_} // принимает значение из опций
else {A1 = F1_1_a} // принимает значение из спектра сигнала
if (A1_phase_ != 0) {A1_phase = A1_phase_} // принимает значение из опций
else {A1_phase = F1_1_ph} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора A1 к осям X и Y
if (A1_phase <= 90) {
A1_phase_X = 90 - A1_phase}
if (A1_phase <= 180) {
A1_phase_X = A1_phase - 90}
if (A1_phase <= 270) {
A1_phase_X = 270 - A1_phase}
if (A1_phase <= 360) {
A1_phase_X = A1_phase - 270}
if (A1_phase <= 90) {
A1_phase_Y = A1_phase}
if (A1_phase <= 180) {
A1_phase_Y = 180 - A1_phase}
if (A1_phase <= 270) {
A1_phase_Y = A1_phase - 180}
if (A1_phase <= 360) {
A1_phase_Y = 360 - A1_phase}
// определение координат вектора A1
var xA1_array = []; // массив координат точек вектора A1 по оси X
var yA1_array = []; // массив координат точек вектора A1 по оси Y
A1_1_X = 0;
if (A1_phase <= 180) {A1_2_X = Math.abs(Math.cos(A1_phase_X * 3.1415/180)) * A1
} else {A1_2_X = Math.abs(Math.cos(A1_phase_X * 3.1415/180)) * A1 * (-1)}
A1_1_Y = 0;
if (A1_phase <= 90 || A1_phase >= 270) {A1_2_Y = Math.abs(Math.cos(A1_phase_Y * 3.1415/180)) * A1
} else {A1_2_Y = Math.abs(Math.cos(A1_phase_Y * 3.1415/180)) * A1 * (-1)}
xA1_array[0] = A1_1_X;
xA1_array[1] = A1_2_X;
yA1_array[0] = A1_1_Y;
yA1_array[1] = A1_2_Y;
// определение модуля вектора d1
var xdA1_array = []; // массив координат точек вектора dA1 по оси X
var ydA1_array = []; // массив координат точек вектора dA1 по оси Y
dA1_1_X = A0_2_X;
dA1_2_X = A1_2_X;
dA1_1_Y = A0_2_Y;
dA1_2_Y = A1_2_Y;
dA1 = Math.sqrt(Math.pow(dA1_2_X - dA1_1_X, 2) + Math.pow(dA1_2_Y - dA1_1_Y, 2))
xdA1_array[0] = dA1_1_X;
xdA1_array[1] = dA1_2_X;
ydA1_array[0] = dA1_1_Y;
ydA1_array[1] = dA1_2_Y;
// определение фазы вектора dA1
if ((dA1_2_Y < dA1_1_Y) && (dA1_2_X < dA1_1_X)) {
dA1_phase = 180 + (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / 3.1415)}
if ((dA1_2_Y > dA1_1_Y) && (dA1_2_X > dA1_1_X)) {
dA1_phase = (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / 3.1415)}
if ((dA1_2_Y > dA1_1_Y) && (dA1_2_X < dA1_1_X)) {
dA1_phase = 360 - (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / 3.1415)}
if ((dA1_2_Y < dA1_1_Y) && (dA1_2_X > dA1_1_X)) {
dA1_phase = 180 - (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / 3.1415)}
if (dA1_phase > 360) {dA1_phase = dA1_phase - 360}
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_A1",
x: xA1_array,
y: yA1_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA1",
x: xdA1_array,
y: ydA1_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2), -(Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2), (Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2), (Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2)],
y: [(Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2), -(Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2), -(Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2), (Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2)]
});
gtl.log.info("RMS",RMS.value);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("A1",A1);
gtl.log.info("A1_phase",A1_phase);
gtl.log.info("F1_1_ph (фаза)",F1_1_ph);
gtl.log.info("F1_1_a (ампл)",F1_1_a);
gtl.log.info("F1_1_f (част)",F1_1_f);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
// Выдача результата (results)
let __result = {
_001астотаращения_F1: freq.value,
_002_Ампл_гарм_1F1: F1_1_a,
_003азаастращ_F1: F1_1_ph,
_004_Ампл_вибр_пуска_A0: A0,
_005аза_вибр_пуска_A0: A0_phase,
_006_Ампл_вибр_пуска_A1: A1,
_007аза_вибр_пуска_A1: A1_phase,
_008_СКЗ_вибрации: RMS.value,
_009_Нестабастращ: instability*100,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

View File

@ -0,0 +1,536 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ с фазой *****
// ***************************************************************
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектр виброскорости"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбаланса"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let R = gtl.options.customOptions.R; // радиус установки грузов, мм ** (для вычисления массы пробного груза)
let P = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
let G = gtl.options.customOptions.G; // класс точности балансировки, мм/с ** (ГОСТ 1940)
let n = gtl.options.customOptions.n; // скорость вращения, об/мин ** (для вычисления массы пробного груза и допустимого остаточного дисбаланса)
let U_per; // допустимый остаточный дисбаланс *** (ГОСТ 1940)
let U_res; // остаточный дисбаланс *** (ГОСТ 1940)
let m_test_ = gtl.options.customOptions.m_test; // масса пробного груза **
let m_test = m_test_; // масса пробного груза ** (конечное значение)
let m_test_corner_ = gtl.options.customOptions.m_test_corner; // угол установки пробного груза **
let m_test_corner = m_test_corner_; // угол установки пробного груза ** (конечное значение)
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0 = A0_; // модуль вектора начальной вибрации */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации */** (конечное значение)
let A1_ = gtl.options.customOptions.A1; // модуль вектора вибрации после установки пробного груза */**
let A1 = A1_; // модуль вектора вибрации после установки пробного груза */** (конечное значение)
let A1_phase_ = gtl.options.customOptions.A1_phase; // фаза вектора вибрации после установки пробного груза */**
let A1_phase = A1_phase_; // фаза вектора вибрации после установки пробного груза */** (конечное значение)
let dA1; // модуль вектора дельты вибрации после установки пробного груза ***
let dA1_phase; // фаза вектора дельты вибрации после установки пробного груза ***
let DCI; // модуль (мм/с/граммы) динамического коэффициента влияния **/***
let DCI_phase; // фаза динамического коэффициента влияния **/***
let Mb = gtl.options.customOptions.Mb; // масса применённого балансировочного груза **/*** (конечное значение)
let Mb_corner = gtl.options.customOptions.Mb_corner; // угол применённого балансировочного груза **/*** (конечное значение)
let Mb_calc; // модуль расчётного вектора балансировочного груза ***
let Mb_corner_calc; // угол расчётного вектора балансировочного груза ***
let Mdisb; // модуль вектора дисбаланса ***
let Mdisb_corner; // угол вектора дисбаланса ***
// Переменные вспомогательные необходимые для расчётов и визуализации
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let A1_phase_X; // угол наклона вектора A1 к оси X
let A1_phase_Y; // угол наклона вектора A1 к оси Y
let A1_1_X; // начальная координата вектора A1 по оси X
let A1_2_X; // конечная координата вектора A1 по оси X
let A1_1_Y; // начальная координата вектора A1 по оси Y
let A1_2_Y; // конечная координата вектора A1 по оси Y
let dA1_1_X; // начальная координата вектора dA1 по оси X
let dA1_2_X; // конечная координата вектора dA1 по оси X
let dA1_1_Y; // начальная координата вектора dA1 по оси Y
let dA1_2_Y; // конечная координата вектора dA1 по оси Y
let m_test_corner_X;// угол наклона вектора m_test к оси X
let m_test_corner_Y;// угол наклона вектора m_test к оси Y
let m_test_1_X; // начальная координата вектора m_test по оси X
let m_test_2_X; // конечная координата вектора m_test по оси X
let m_test_1_Y; // начальная координата вектора m_test по оси Y
let m_test_2_Y; // конечная координата вектора m_test по оси Y
let Mb_corner_calc_X; // угол наклона расчётного вектора Mb_calc к оси X
let Mb_corner_calc_Y; // угол наклона расчётного вектора Mb_calc к оси Y
let Mb_1_calc_X; // начальная координата расчётного вектора Mb_calc по оси X
let Mb_2_calc_X; // конечная координата расчётного вектора Mb_calc по оси X
let Mb_1_calc_Y; // начальная координата расчётного вектора Mb_calc по оси Y
let Mb_2_calc_Y; // конечная координата расчётного вектора Mb_calc по оси Y
let Mb_corner_X; // угол наклона вектора Mb к оси X
let Mb_corner_Y; // угол наклона вектора Mb к оси Y
let Mb_1_X; // начальная координата вектора Mb по оси X
let Mb_2_X; // конечная координата вектора Mb по оси X
let Mb_1_Y; // начальная координата вектора Mb по оси Y
let Mb_2_Y; // конечная координата вектора Mb по оси Y
let Mdisb_corner_X; // угол наклона вектора Mdisb к оси X
let Mdisb_corner_Y; // угол наклона вектора Mdisb к оси Y
let Mdisb_1_X; // начальная координата вектора Mdisb по оси X
let Mdisb_2_X; // конечная координата вектора Mdisb по оси X
let Mdisb_1_Y; // начальная координата вектора Mdisb по оси Y
let Mdisb_2_Y; // конечная координата вектора Mdisb по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
// gtl.diagnostic.interval = Math.max(AUSPv.acq_time, AUSPv_pl.acq_time) + 0.1;
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 4 - расположение дисбаланса:
// вычисление положения дисбаланса Mdisb и рекомендуемого балансировочного груза Mb_calc
// ввод массы и угла установки балансировочного груза Mb
// построение графиков расположения пробного груза m_test, дисбаланса Mdisb, расчётного Mb_calc и введённого Mb балансировочного груза
// из предыдущих шагов переносятся: амплитуда и фаза вибрации A0 и A1, масса и угол установки пробного груза
// построение графиков вибрации A0, A1, dA1
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора A1 к осям X и Y
if (A1_phase <= 90) {
A1_phase_X = 90 - A1_phase}
if (A1_phase <= 180) {
A1_phase_X = A1_phase - 90}
if (A1_phase <= 270) {
A1_phase_X = 270 - A1_phase}
if (A1_phase <= 360) {
A1_phase_X = A1_phase - 270}
if (A1_phase <= 90) {
A1_phase_Y = A1_phase}
if (A1_phase <= 180) {
A1_phase_Y = 180 - A1_phase}
if (A1_phase <= 270) {
A1_phase_Y = A1_phase - 180}
if (A1_phase <= 360) {
A1_phase_Y = 360 - A1_phase}
// определение координат вектора A1
var xA1_array = []; // массив координат точек вектора A1 по оси X
var yA1_array = []; // массив координат точек вектора A1 по оси Y
A1_1_X = 0;
if (A1_phase <= 180) {A1_2_X = Math.abs(Math.cos(A1_phase_X * Math.PI/180)) * A1
} else {A1_2_X = Math.abs(Math.cos(A1_phase_X * Math.PI/180)) * A1 * (-1)}
A1_1_Y = 0;
if (A1_phase <= 90 || A1_phase >= 270) {A1_2_Y = Math.abs(Math.cos(A1_phase_Y * Math.PI/180)) * A1
} else {A1_2_Y = Math.abs(Math.cos(A1_phase_Y * Math.PI/180)) * A1 * (-1)}
xA1_array[0] = A1_1_X;
xA1_array[1] = A1_2_X;
yA1_array[0] = A1_1_Y;
yA1_array[1] = A1_2_Y;
// определение модуля вектора dA1
var xdA1_array = []; // массив координат точек вектора dA1 по оси X
var ydA1_array = []; // массив координат точек вектора dA1 по оси Y
dA1_1_X = A0_2_X;
dA1_2_X = A1_2_X;
dA1_1_Y = A0_2_Y;
dA1_2_Y = A1_2_Y;
dA1 = Math.sqrt(Math.pow(dA1_2_X - dA1_1_X, 2) + Math.pow(dA1_2_Y - dA1_1_Y, 2))
xdA1_array[0] = dA1_1_X;
xdA1_array[1] = dA1_2_X;
ydA1_array[0] = dA1_1_Y;
ydA1_array[1] = dA1_2_Y;
// определение фазы вектора dA1
if ((dA1_2_Y < dA1_1_Y) && (dA1_2_X < dA1_1_X)) {
dA1_phase = 180 + (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / Math.PI)}
if ((dA1_2_Y > dA1_1_Y) && (dA1_2_X > dA1_1_X)) {
dA1_phase = (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / Math.PI)}
if ((dA1_2_Y > dA1_1_Y) && (dA1_2_X < dA1_1_X)) {
dA1_phase = 360 - (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / Math.PI)}
if ((dA1_2_Y < dA1_1_Y) && (dA1_2_X > dA1_1_X)) {
dA1_phase = 180 - (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / Math.PI)}
if (dA1_phase > 360) {dA1_phase = dA1_phase - 360}
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// определение угла наклона вектора m_test к осям X и Y
if (m_test_corner <= 90) {
m_test_corner_X = 90 - m_test_corner}
if (m_test_corner <= 180) {
m_test_corner_X = m_test_corner - 90}
if (m_test_corner <= 270) {
m_test_corner_X = 270 - m_test_corner}
if (m_test_corner <= 360) {
m_test_corner_X = m_test_corner - 270}
if (m_test_corner <= 90) {
m_test_corner_Y = m_test_corner}
if (m_test_corner <= 180) {
m_test_corner_Y = 180 - m_test_corner}
if (m_test_corner <= 270) {
m_test_corner_Y = m_test_corner - 180}
if (m_test_corner <= 360) {
m_test_corner_Y = 360 - m_test_corner}
// определение координат вектора m_test
m_test_1_X = 0;
if (m_test_corner <= 180) {m_test_2_X = Math.abs(Math.cos(m_test_corner_X * Math.PI/180)) * m_test * (-1)
} else {m_test_2_X = Math.abs(Math.cos(m_test_corner_X * Math.PI/180)) * m_test}
m_test_1_Y = 0;
if (m_test_corner <= 90 || m_test_corner >= 270) {m_test_2_Y = Math.abs(Math.cos(m_test_corner_Y * Math.PI/180)) * m_test
} else {m_test_2_Y = Math.abs(Math.cos(m_test_corner_Y * Math.PI/180)) * m_test * (-1)}
// определение модуля вектора DCI (ДКВ)
DCI = dA1 / m_test; // a в экселе
// определение фазы вектора DCI
DCI_phase = dA1_phase - m_test_corner;
// определение модуля расчётного вектора Mb
Mb_calc = A0 / DCI; // Pур в экселе
// Mb_calc = (m_test * A0) / dA1;
// определение угла расчётного вектора Mb
if ((A0_phase - DCI_phase + 180) < 360) {
Mb_corner_calc = (A0_phase - DCI_phase + 180)
} else {Mb_corner_calc = (A0_phase - DCI_phase + 180) - 360}
// if ((m_test_corner + A0_phase - dA1_phase + 180) < 360) {
// Mb_corner_calc = (m_test_corner + A0_phase - dA1_phase + 180)
// } else {Mb_corner_calc = (m_test_corner + A0_phase - dA1_phase + 180) - 360}
// определение угла наклона расчётного вектора балансировочного груза Mb_calc к осям X и Y
if (Mb_corner_calc <= 90) {
Mb_corner_calc_X = 90 - Mb_corner_calc}
if (Mb_corner_calc <= 180) {
Mb_corner_calc_X = Mb_corner_calc - 90}
if (Mb_corner_calc <= 270) {
Mb_corner_calc_X = 270 - Mb_corner_calc}
if (Mb_corner_calc <= 360) {
Mb_corner_calc_X = Mb_corner_calc - 270}
if (Mb_corner_calc <= 90) {
Mb_corner_calc_Y = Mb_corner_calc}
if (Mb_corner_calc <= 180) {
Mb_corner_calc_Y = 180 - Mb_corner_calc}
if (Mb_corner_calc <= 270) {
Mb_corner_calc_Y = Mb_corner_calc - 180}
if (Mb_corner_calc <= 360) {
Mb_corner_calc_Y = 360 - Mb_corner_calc}
// определение координат расчётного вектора балансировочного груза Mb_calc
Mb_1_calc_X = 0;
if (Mb_corner_calc <= 180) {Mb_2_calc_X = Math.abs(Math.cos(Mb_corner_calc_X * Math.PI/180)) * Mb_calc * (-1)
} else {Mb_2_calc_X = Math.abs(Math.cos(Mb_corner_calc_X * Math.PI/180)) * Mb_calc}
Mb_1_calc_Y = 0;
if (Mb_corner_calc <= 90 || Mb_corner_calc >= 270) {Mb_2_calc_Y = Math.abs(Math.cos(Mb_corner_calc_Y * Math.PI/180)) * Mb_calc
} else {Mb_2_calc_Y = Math.abs(Math.cos(Mb_corner_calc_Y * Math.PI/180)) * Mb_calc * (-1)}
// определение угла наклона вектора балансировочного груза Mb к осям X и Y
if (Mb_corner <= 90) {
Mb_corner_X = 90 - Mb_corner}
if (Mb_corner <= 180) {
Mb_corner_X = Mb_corner - 90}
if (Mb_corner <= 270) {
Mb_corner_X = 270 - Mb_corner}
if (Mb_corner <= 360) {
Mb_corner_X = Mb_corner - 270}
if (Mb_corner <= 90) {
Mb_corner_Y = Mb_corner}
if (Mb_corner <= 180) {
Mb_corner_Y = 180 - Mb_corner}
if (Mb_corner <= 270) {
Mb_corner_Y = Mb_corner - 180}
if (Mb_corner <= 360) {
Mb_corner_Y = 360 - Mb_corner}
// определение координат вектора балансировочного груза Mb
Mb_1_X = 0;
if (Mb_corner <= 180) {Mb_2_X = Math.abs(Math.cos(Mb_corner_X * Math.PI/180)) * Mb * (-1)
} else {Mb_2_X = Math.abs(Math.cos(Mb_corner_X * Math.PI/180)) * Mb}
Mb_1_Y = 0;
if (Mb_corner <= 90 || Mb_corner >= 270) {Mb_2_Y = Math.abs(Math.cos(Mb_corner_Y * Math.PI/180)) * Mb
} else {Mb_2_Y = Math.abs(Math.cos(Mb_corner_Y * Math.PI/180)) * Mb * (-1)}
// определение массы дисбаланса
Mdisb = Mb_calc; // равен массе балансировочного груз P в экселе
// определение угла расположения дисбаланса
if ((Mb_corner_calc + 180) > 360) {
Mdisb_corner = (Mb_corner_calc + 180) - 360}
else if ((Mb_corner_calc + 180) < 0) {
Mdisb_corner = (Mb_corner_calc + 180) + 360}
else {Mdisb_corner = (Mb_corner_calc + 180)}
// определение угла наклона вектора дисбаланса Mdisb к осям X и Y
if (Mdisb_corner <= 90) {
Mdisb_corner_X = 90 - Mdisb_corner}
if (Mdisb_corner <= 180) {
Mdisb_corner_X = Mdisb_corner - 90}
if (Mdisb_corner <= 270) {
Mdisb_corner_X = 270 - Mdisb_corner}
if (Mdisb_corner <= 360) {
Mdisb_corner_X = Mdisb_corner - 270}
if (Mdisb_corner <= 90) {
Mdisb_corner_Y = Mdisb_corner}
if (Mdisb_corner <= 180) {
Mdisb_corner_Y = 180 - Mdisb_corner}
if (Mdisb_corner <= 270) {
Mdisb_corner_Y = Mdisb_corner - 180}
if (Mdisb_corner <= 360) {
Mdisb_corner_Y = 360 - Mdisb_corner}
// определение координат вектора дисбаланса Mdisb
Mdisb_1_X = 0;
if (Mdisb_corner <= 180) {Mdisb_2_X = Math.abs(Math.cos(Mdisb_corner_X * Math.PI/180)) * Mdisb * (-1)
} else {Mdisb_2_X = Math.abs(Math.cos(Mdisb_corner_X * Math.PI/180)) * Mdisb}
Mdisb_1_Y = 0;
if (Mdisb_corner <= 90 || Mdisb_corner >= 270) {Mdisb_2_Y = Math.abs(Math.cos(Mdisb_corner_Y * Math.PI/180)) * Mdisb
} else {Mdisb_2_Y = Math.abs(Math.cos(Mdisb_corner_Y * Math.PI/180)) * Mdisb * (-1)}
// Координаты масс для визуализации
// определение координат точек окружности обозначения массы дисбаланса Mdisb
var x_Mdisb_array = []; // массив координат точек окружности Mdisb по оси X
var y_Mdisb_array = []; // массив координат точек окружности Mdisb по оси Y
var x0_Mdisb = Mdisb_2_X; // центр по X
var y0_Mdisb = Mdisb_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mdisb_array.push(x0_Mdisb + (Math.max(m_test,Mb_calc,Mb,Mdisb)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mdisb_array.push(y0_Mdisb + (Math.max(m_test,Mb_calc,Mb,Mdisb)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы расчётного балансировочного груза Mb_calc
var x_Mb_calc_array = []; // массив координат точек окружности расчётного Mb по оси X
var y_Mb_calc_array = []; // массив координат точек окружности расчётного Mb по оси Y
var x0_Mb_calc = Mb_2_calc_X; // центр по X
var y0_Mb_calc = Mb_2_calc_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mb_calc_array.push(x0_Mb_calc + (Math.max(m_test,Mb_calc,Mb,Mdisb)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mb_calc_array.push(y0_Mb_calc + (Math.max(m_test,Mb_calc,Mb,Mdisb)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы введённого балансировочного груза Mb
var x_Mb_array = []; // массив координат точек окружности расчётного Mb по оси X
var y_Mb_array = []; // массив координат точек окружности расчётного Mb по оси Y
var x0_Mb = Mb_2_X; // центр по X
var y0_Mb = Mb_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mb_array.push(x0_Mb + (Math.max(m_test,Mb_calc,Mb,Mdisb)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mb_array.push(y0_Mb + (Math.max(m_test,Mb_calc,Mb,Mdisb)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности графика для отображения расположения дисбаланса
var xD_array = []; // массив координат точек окружности D по оси X
var yD_array = []; // массив координат точек окружности D по оси Y
var x0D = 0; // центр в начале координат
var y0D = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xD_array.push(x0D + (Math.max(m_test,Mb_calc,Mb,Mdisb)+Math.max(m_test,Mb_calc,Mb,Mdisb)*0.1) * (Math.sin((i) * Math.PI / 180)));
yD_array.push(y0D + (Math.max(m_test,Mb_calc,Mb,Mdisb)+Math.max(m_test,Mb_calc,Mb,Mdisb)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// определение координат точек окружности обозначения массы пробного груза
var x_m_test_array = []; // массив координат точек окружности m_test по оси X
var y_m_test_array = []; // массив координат точек окружности m_test по оси Y
var x0_m_test = m_test_2_X; // центр по X
var y0_m_test = m_test_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_m_test_array.push(x0_m_test + (Math.max(m_test,Mb_calc,Mb,Mdisb)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_m_test_array.push(y0_m_test + (Math.max(m_test,Mb_calc,Mb,Mdisb)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// Вычисление допустимого остаточного дисбаланса
U_per = (1000 * (G * P)) / (Math.PI * n / 30);
// Остаточный дисбаланс
U_res = Mdisb * R;
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_A1",
x: xA1_array,
y: yA1_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA",
x: xdA1_array,
y: ydA1_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2), -(Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2), (Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2), (Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2)],
y: [(Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2), -(Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2), -(Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2), (Math.max(A0,A1,dA1)+Math.max(A0,A1,dA1)*0.2)]
});
plot_disb.add(
{
color: 0x0000ff,
name: "Пробный груз",
x: x_m_test_array,
y: y_m_test_array,
});
plot_disb.add(
{
color: 0x00ff00,
name: "Балансировочный груз расчётный",
x: x_Mb_calc_array,
y: y_Mb_calc_array,
});
plot_disb.add(
{
color: 0x0fae1a,
name: "Балансировочный груз введённый",
x: x_Mb_array,
y: y_Mb_array,
});
plot_disb.add(
{
color: 0xff0000,
name: "Дисбаланс",
x: x_Mdisb_array,
y: y_Mdisb_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "График расположения дисбаланса",
x: xD_array,
y: yD_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(m_test,Mb_calc,Mb,Mdisb)+Math.max(m_test,Mb_calc,Mb,Mdisb)*0.2), -(Math.max(m_test,Mb_calc,Mb,Mdisb)+Math.max(m_test,Mb_calc,Mb,Mdisb)*0.2), (Math.max(m_test,Mb_calc,Mb,Mdisb)+Math.max(m_test,Mb_calc,Mb,Mdisb)*0.2), (Math.max(m_test,Mb_calc,Mb,Mdisb)+Math.max(m_test,Mb_calc,Mb,Mdisb)*0.2)],
y: [(Math.max(m_test,Mb_calc,Mb,Mdisb)+Math.max(m_test,Mb_calc,Mb,Mdisb)*0.2), -(Math.max(m_test,Mb_calc,Mb,Mdisb)+Math.max(m_test,Mb_calc,Mb,Mdisb)*0.2), -(Math.max(m_test,Mb_calc,Mb,Mdisb)+Math.max(m_test,Mb_calc,Mb,Mdisb)*0.2), (Math.max(m_test,Mb_calc,Mb,Mdisb)+Math.max(m_test,Mb_calc,Mb,Mdisb)*0.2)]
});
gtl.log.info("Mb_calc (масса балансировочного груза расчёт)",Mb_calc);
gtl.log.info("Mb_corner_calc (угол установки балансировочного груза расчёт)",Mb_corner_calc);
gtl.log.info("Mb (масса балансировочного груза введён)",Mb);
gtl.log.info("Mb_corner (угол установки балансировочного груза введён)",Mb_corner);
gtl.log.info("Mdisb (дисбаланс)",Mdisb);
gtl.log.info("Mdisb_corner (угол расположения дисбаланса)",Mdisb_corner);
gtl.log.info("m_test (пробный груз введёный)",m_test);
gtl.log.info("m_test_corner (угол установки пробного груза)",m_test_corner);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("A1",A1);
gtl.log.info("A1_phase",A1_phase);
gtl.log.info("модуль ДКВ", DCI);
gtl.log.info("фаза ДКВ", DCI_phase);
gtl.log.info("Допустимый остаточный дисбаланс", U_per);
gtl.log.info("Остаточный дисбаланс", U_res);
// Выдача результата (results)
let __result = {
_001_Ампл_вибр_пуска_A0: A0,
_002аза_вибр_пуска_A0: A0_phase,
_003_Ампл_вибр_пуска_A1: A1,
_004аза_вибр_пуска_A1: A1_phase,
_005_Масса_дисбаланса: Mdisb,
_006_Угол_дисбаланса: Mdisb_corner,
_007_Масса_баланс_груза_расч: Mb_calc,
_008_Угол_баланс_груза_расч: Mb_corner_calc,
_009_Масса_баланс_груза_введён: Mb,
_010_Угол_баланс_груза_введён: Mb_corner,
_011_МодульКВ: DCI,
_012азаКВ: DCI_phase,
_013опуст_ост_дисб_г_мм: U_per,
_014_Остат_дисб_г_мм: U_res
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
// break;
// default:
// break;
// }
}

View File

@ -0,0 +1,498 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ с фазой *****
// ***************************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
freq.time = 1; // длина (время) отрезка сигнала
freq.avg_cnt = 3; // количество усреднений
freq.dc = -0.05; // уровень, при переходе через который вычисляются периоды
// ФИЛЬТР 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let 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 = 501; // центральная частота полосового фильтра
filter_2_1000.width = 998; // ширина полосы фильтра
let filter_2_1000v = gtl.add_intg(filter_2_1000); // интегрирование
filter_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр для виброперемещения
let filter_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_2_300s.kind = gtl.filter_iir.butterworth;
filter_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_2_300s.order = 4;
filter_2_300s.frequency = 151; // центральная частота
filter_2_300s.width = 298; // ширина полосы
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = 0.5; // частотное разрешение
let average = 3; // количество усреднений
let overlap = 0; // наложение
let filter_vibr; // фильтр сигнала вибрации
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_vibr = filter_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_vibr = filter_2_300s;
frequency = 300;
}
// Спектр для получения 1-й гармоники частоты вращения
var AUSP = gtl.add_ausp(filter_vibr); // объявление переменной спектра
AUSP.color = 0x00ff0000; // цвет спектра
AUSP.name = "AUSP"; // имя спектра
AUSP.frequency = frequency; // граничная частота спектра
AUSP.lines = AUSP.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP.average = average; // количество усреднений
AUSP.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP.smoothing_factor = 100; // усреднение средней линии
AUSP.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP.tolerance = AUSP.resolution; // диапазон поиска гармоник +/-
// СКЗ
var RMS = gtl.add_value_rms(filter_vibr);
RMS.time = 1;
RMS.avg_cnt = 3;
// Спектр вибрации
var AUSP_pl = gtl.create_ausp(
{
"src" : filter_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ
var pfc_pl = gtl.create_pfc(
{
"src0" : filter_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектр вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбаланса"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0 = A0_; // модуль вектора начальной вибрации */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации */** (конечное значение)
let dA2; // модуль вектора дельты вибрации после установки пробного груза ***
let dA2_phase; // фаза вектора дельты вибрации после установки пробного груза ***
let A2_ = gtl.options.customOptions.A2; // модуль вектора вибрации после установки балансировочного груза */**
let A2; // модуль вектора вибрации после установки балансировочного груза */** (конечное значение)
let A2_phase_ = gtl.options.customOptions.A2_phase; // фаза вектора вибрации после установки балансировочного груза */**
let A2_phase; // фаза вектора вибрации после установки балансировочного груза */** (конечное значение)
// Переменные вспомогательные необходимые для расчётов и визуализации
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let dA2_1_X; // начальная координата вектора dA2 по оси X
let dA2_2_X; // конечная координата вектора dA2 по оси X
let dA2_1_Y; // начальная координата вектора dA2 по оси Y
let dA2_2_Y; // конечная координата вектора dA2 по оси Y
let A2_phase_X; // угол наклона вектора A2 к оси X
let A2_phase_Y; // угол наклона вектора A2 к оси Y
let A2_1_X; // начальная координата вектора A2 по оси X
let A2_2_X; // конечная координата вектора A2 по оси X
let A2_1_Y; // начальная координата вектора A2 по оси Y
let A2_2_Y; // конечная координата вектора A2 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time) + 0.1;
// gtl.diagnostic.interval = gtl.acq_time + 1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP.clear_harms_sets();
let __AUSP_tools = gtl.create_spec_tools(
{
data: AUSP_pl.data,
df: AUSP_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP = __AUSP_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP.name = "F1 (гарм. ряд част. вращ.)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_tools = gtl.create_spec_tools(
{
data: pfc_pl.data,
df: pfc_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row1_phase = __pfc_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row1_phase.name = "F1_phase (гарм. ряд част. вращ.)"; // название гармонического ряда
// Построение графиков
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации",
x: AUSP_pl.resolution,
y: AUSP_pl.data,
spec_tools: __AUSP_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ",
x: pfc_pl.resolution,
y: pfc_pl.data,
spec_tools: __pfc_tools.to_json()
});
let __result1 = __AUSP_tools.to_json();
let __result2 = __pfc_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 F1_1_ph = __result2.harms.rows[0].harms[0].ampl;
// Проверка наличия оборотной гармоники и необходимости проведения баалнсировки
var test_balance = ""; // переменная для текста о необходимости проведения балансировки
if (F1_1_a >= RMS * 0.4) // вклад оборотной гармоники в СКЗ
{test_balance = "необходимо провести балансировку";}
else {test_balance = "проведение балансировки не требуется или нецелесообразно";}
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 5 - контрольный пуск:
// измерение вибрации A2 после установки балансировочного груза
// определение целесообразности проведения добалансировки
// из предыдущих шагов переносятся: вибрация A0
// построение графика вибрации A0, A2 и dA2
// Определение конечных значений переменных
// A2 вибрация после установки балансировочного груза
if (A2_ != 0) {A2 = A2_} // принимает значение из опций
else {A2 = F1_1_a} // принимает значение из спектра сигнала
if (A2_phase_ != 0) {A2_phase = A2_phase_} // принимает значение из опций
else {A2_phase = F1_1_ph} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора A2 к осям X и Y
if (A2_phase <= 90) {
A2_phase_X = 90 - A2_phase}
if (A2_phase <= 180) {
A2_phase_X = A2_phase - 90}
if (A2_phase <= 270) {
A2_phase_X = 270 - A2_phase}
if (A2_phase <= 360) {
A2_phase_X = A2_phase - 270}
if (A2_phase <= 90) {
A2_phase_Y = A2_phase}
if (A2_phase <= 180) {
A2_phase_Y = 180 - A2_phase}
if (A2_phase <= 270) {
A2_phase_Y = A2_phase - 180}
if (A2_phase <= 360) {
A2_phase_Y = 360 - A2_phase}
// определение координат вектора A2
var xA2_array = []; // массив координат точек вектора A2 по оси X
var yA2_array = []; // массив координат точек вектора A2 по оси Y
A2_1_X = 0;
if (A2_phase <= 180) {A2_2_X = Math.abs(Math.cos(A2_phase_X * 3.1415/180)) * A2
} else {A2_2_X = Math.abs(Math.cos(A2_phase_X * 3.1415/180)) * A2 * (-1)}
A2_1_Y = 0;
if (A2_phase <= 90 || A2_phase >= 270) {A2_2_Y = Math.abs(Math.cos(A2_phase_Y * 3.1415/180)) * A2
} else {A2_2_Y = Math.abs(Math.cos(A2_phase_Y * 3.1415/180)) * A2 * (-1)}
xA2_array[0] = A2_1_X;
xA2_array[1] = A2_2_X;
yA2_array[0] = A2_1_Y;
yA2_array[1] = A2_2_Y;
// определение модуля вектора dA2
var xdA2_array = []; // массив координат точек вектора dA2 по оси X
var ydA2_array = []; // массив координат точек вектора dA2 по оси Y
dA2_1_X = A0_2_X;
dA2_2_X = A2_2_X;
dA2_1_Y = A0_2_Y;
dA2_2_Y = A2_2_Y;
dA2 = Math.sqrt(Math.pow(dA2_2_X - dA2_1_X, 2) + Math.pow(dA2_2_Y - dA2_1_Y, 2))
xdA2_array[0] = dA2_1_X;
xdA2_array[1] = dA2_2_X;
ydA2_array[0] = dA2_1_Y;
ydA2_array[1] = dA2_2_Y;
// определение фазы вектора dA2
if ((dA2_2_Y < dA2_1_Y) && (dA2_2_X < dA2_1_X)) {
dA2_phase = 180 + (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / 3.1415)}
if ((dA2_2_Y > dA2_1_Y) && (dA2_2_X > dA2_1_X)) {
dA2_phase = (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / 3.1415)}
if ((dA2_2_Y > dA2_1_Y) && (dA2_2_X < dA2_1_X)) {
dA2_phase = 360 - (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / 3.1415)}
if ((dA2_2_Y < dA2_1_Y) && (dA2_2_X > dA2_1_X)) {
dA2_phase = 180 - (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / 3.1415)}
if (dA2_phase > 360) {dA2_phase = dA2_phase - 360}
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A2",
x: xA2_array,
y: yA2_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA2",
x: xdA2_array,
y: ydA2_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), -(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2)],
y: [(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), -(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), -(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2)]
});
gtl.log.info("RMS",RMS.value);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("A2",A2);
gtl.log.info("A2_phase",A2_phase);
gtl.log.info("F1_1_ph (фаза)",F1_1_ph);
gtl.log.info("F1_1_a (ампл)",F1_1_a);
gtl.log.info("F1_1_f (част)",F1_1_f);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Необходимость проведения балансировки",test_balance);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
// Выдача результата (results)
let __result = {
_001астотаращения_F1: freq.value,
_002_Ампл_гарм_1F1: F1_1_a,
_003азаастращ_F1: F1_1_ph,
_004_Ампл_вибр_пуска_A0: A0,
_005аза_вибр_пуска_A0: A0_phase,
_006_Ампл_вибр_пуска_A2: A2,
_007аза_вибр_пуска_A2: A2_phase,
_008_СКЗ_вибрации: RMS.value,
_009_Тестирование: test_balance,
_010_Нестабастращ: instability*100,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

View File

@ -0,0 +1,740 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ с фазой *****
// ***************************************************************
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектр виброскорости"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбаланса"); // объект для дисбаланса
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let R = gtl.options.customOptions.R;// радиус установки грузов ** (для вычисления массы пробного груза)
let P = gtl.options.customOptions.P;// масса ротора, грамм ** (для вычисления массы пробного груза)
let G = gtl.options.customOptions.G;// класс точности балансировки, мм/с ** (ГОСТ 1940)
let n = gtl.options.customOptions.n;// скорость вращения, об/мин ** (для вычисления массы пробного груза и допустимого остаточного дисбаланса)
let U_per; // допустимый остаточный дисбаланс *** (ГОСТ 1940)
let U_res2; // остаточный дисбаланс (после балансировки) *** (ГОСТ 1940)
let m_test_ = gtl.options.customOptions.m_test; // масса пробного груза **
let m_test = m_test_; // масса пробного груза ** (конечное значение)
let m_test_corner_ = gtl.options.customOptions.m_test_corner; // угол установки пробного груза **
let m_test_corner = m_test_corner_; // угол установки пробного груза ** (конечное значение)
let m_test_calc_ = gtl.options.customOptions.m_test_calc; // масса пробного груза расчётная ***
let m_test_calc = m_test_calc_; // масса пробного груза расчётная ** (конечное значение)
let freq = gtl.options.customOptions.freq; // частота вращения, Гц */** (для вычисления массы пробного груза)
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0 = A0_; // модуль вектора начальной вибрации */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации */** (конечное значение)
let A1_ = gtl.options.customOptions.A1; // модуль вектора вибрации после установки пробного груза */**
let A1 = A1_; // модуль вектора вибрации после установки пробного груза */** (конечное значение)
let A1_phase_ = gtl.options.customOptions.A1_phase; // фаза вектора вибрации после установки пробного груза */**
let A1_phase = A1_phase_; // фаза вектора вибрации после установки пробного груза */** (конечное значение)
let dA1; // модуль вектора дельты вибрации после установки пробного груза ***
let dA1_phase; // фаза вектора дельты вибрации после установки пробного груза ***
let A2_ = gtl.options.customOptions.A2; // модуль вектора вибрации после установки балансировочного груза */**
let A2 = A2_; // модуль вектора вибрации после установки балансировочного груза */** (конечное значение)
let A2_phase_ = gtl.options.customOptions.A2_phase; // фаза вектора вибрации после установки балансировочного груза */**
let A2_phase = A2_phase_; // фаза вектора вибрации после установки балансировочного груза */** (конечное значение)
let dA2; // модуль вектора дельты вибрации после установки балансировочного груза ***
let dA2_phase; // фаза вектора дельты вибрации после установки балансировочного груза ***
let DCI_ = gtl.options.customOptions.DCI; // модуль (мм/с/граммы) динамического коэффициента влияния **/***
let DCI = DCI_; // модуль (мм/с/граммы) динамического коэффициента влияния **/*** (конечное значение)
let DCI_phase_ = gtl.options.customOptions.DCI_phase; // фаза динамического коэффициента влияния **/***
let DCI_phase = DCI_phase_; // фаза динамического коэффициента влияния **/*** (конечное значение)
let Mb_calc = gtl.options.customOptions.Mb_calc; // масса расчётного балансировочного груза **/*** (конечное значение)
let Mb_corner_calc = gtl.options.customOptions.Mb_corner_calc; // угол расчётного балансировочного груза **/*** (конечное значение)
let Mb = gtl.options.customOptions.Mb; // масса применённого балансировочного груза **/*** (конечное значение)
let Mb_corner = gtl.options.customOptions.Mb_corner; // угол применённого балансировочного груза **/*** (конечное значение)
let Mdisb = gtl.options.customOptions.Mdisb; // масса дисбаланса **/*** (конечное значение)
let Mdisb_corner = gtl.options.customOptions.Mdisb_corner; // угол дисбаланса **/*** (конечное значение)
let Mb2_calc; // модуль расчётного вектора балансировочного груза для добалансировки **/*** (конечное значение)
let Mb2_corner_calc; // угол расчётного вектора балансировочного груза для добалансировки **/*** (конечное значение)
let Mdisb2; // масса остаточного дисбаланса **/***
let Mdisb2_corner; // угол расположения остаточного дисбаланса **/***
// Переменные вспомогательные необходимые для расчётов и визуализации
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let A1_phase_X; // угол наклона вектора A1 к оси X
let A1_phase_Y; // угол наклона вектора A1 к оси Y
let A1_1_X; // начальная координата вектора A1 по оси X
let A1_2_X; // конечная координата вектора A1 по оси X
let A1_1_Y; // начальная координата вектора A1 по оси Y
let A1_2_Y; // конечная координата вектора A1 по оси Y
let dA1_1_X; // начальная координата вектора dA1 по оси X
let dA1_2_X; // конечная координата вектора dA1 по оси X
let dA1_1_Y; // начальная координата вектора dA1 по оси Y
let dA1_2_Y; // конечная координата вектора dA1 по оси Y
let dA2_1_X; // начальная координата вектора dA2 по оси X
let dA2_2_X; // конечная координата вектора dA2 по оси X
let dA2_1_Y; // начальная координата вектора dA2 по оси Y
let dA2_2_Y; // конечная координата вектора dA2 по оси Y
let A2_phase_X; // угол наклона вектора A2 к оси X
let A2_phase_Y; // угол наклона вектора A2 к оси Y
let A2_1_X; // начальная координата вектора A2 по оси X
let A2_2_X; // конечная координата вектора A2 по оси X
let A2_1_Y; // начальная координата вектора A2 по оси Y
let A2_2_Y; // конечная координата вектора A2 по оси Y
let m_test_corner_X;// угол наклона вектора m_test к оси X
let m_test_corner_Y;// угол наклона вектора m_test к оси Y
let m_test_1_X; // начальная координата вектора m_test по оси X
let m_test_2_X; // конечная координата вектора m_test по оси X
let m_test_1_Y; // начальная координата вектора m_test по оси Y
let m_test_2_Y; // конечная координата вектора m_test по оси Y
let Mb_corner_calc_X; // угол наклона расчётного вектора Mb_calc к оси X
let Mb_corner_calc_Y; // угол наклона расчётного вектора Mb_calc к оси Y
let Mb_1_calc_X; // начальная координата расчётного вектора Mb_calc по оси X
let Mb_2_calc_X; // конечная координата расчётного вектора Mb_calc по оси X
let Mb_1_calc_Y; // начальная координата расчётного вектора Mb_calc по оси Y
let Mb_2_calc_Y; // конечная координата расчётного вектора Mb_calc по оси Y
let Mb_corner_X; // угол наклона вектора Mb к оси X
let Mb_corner_Y; // угол наклона вектора Mb к оси Y
let Mb_1_X; // начальная координата вектора Mb по оси X
let Mb_2_X; // конечная координата вектора Mb по оси X
let Mb_1_Y; // начальная координата вектора Mb по оси Y
let Mb_2_Y; // конечная координата вектора Mb по оси Y
let Mdisb_corner_X;// угол наклона вектора Mdisb к оси X
let Mdisb_corner_Y;// угол наклона вектора Mdisb к оси Y
let Mdisb_1_X; // начальная координата вектора Mdisb по оси X
let Mdisb_2_X; // конечная координата вектора Mdisb по оси X
let Mdisb_1_Y; // начальная координата вектора Mdisb по оси Y
let Mdisb_2_Y; // конечная координата вектора Mdisb по оси Y
let Mb2_corner_calc_X; // угол наклона расчётного вектора Mb2 к оси X
let Mb2_corner_calc_Y; // угол наклона расчётного вектора Mb2 к оси Y
let Mb2_1_calc_X; // начальная координата расчётного вектора Mb2 по оси X
let Mb2_2_calc_X; // конечная координата расчётного вектора Mb2 по оси X
let Mb2_1_calc_Y; // начальная координата расчётного вектора Mb2 по оси Y
let Mb2_2_calc_Y; // конечная координата расчётного вектора Mb2 по оси Y
let Mdisb2_corner_X;// угол наклона вектора Mdisb2 к оси X
let Mdisb2_corner_Y;// угол наклона вектора Mdisb2 к оси Y
let Mdisb2_1_X; // начальная координата вектора Mdisb2 по оси X
let Mdisb2_2_X; // конечная координата вектора Mdisb2 по оси X
let Mdisb2_1_Y; // начальная координата вектора Mdisb2 по оси Y
let Mdisb2_2_Y; // конечная координата вектора Mdisb2 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
// gtl.diagnostic.interval = Math.max(AUSPv.acq_time, AUSPv_pl.acq_time) + 0.1;
gtl.diagnostic.interval = gtl.acq_time + 1;
// let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 6 - отчёт о проведённых операциях:
// из предыдущих шагов переносится:
// начальная вибрация A0,
// вибрации после установки пробного груза A1,
// вибрации после установки балансировочного груза A2,
// расчётный пробный груз m_test_calc
// масса и угол установки выбранного пробного груза m_test
// масса и угол расположения дисбаланса Mdisb
// масса и угол расположения расчётного балансировочного груза Mb_calc
// масса и угол расположения выбранного балансировочного груза Mb
// масса и угол расположения остаточного дисбаланса Mdisb2
// масса и угол расположения груза для добалансировки Mb2_calc
// построение графика вибрации: A0, A1, dA, A2 и dA2
// построение графиков расположения дисбалансов и балансировочных грузов: m_test, Mb_calc, Mb, Mdisb, Mb2_calc, Mdisb2
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора A1 к осям X и Y
if (A1_phase <= 90) {
A1_phase_X = 90 - A1_phase}
if (A1_phase <= 180) {
A1_phase_X = A1_phase - 90}
if (A1_phase <= 270) {
A1_phase_X = 270 - A1_phase}
if (A1_phase <= 360) {
A1_phase_X = A1_phase - 270}
if (A1_phase <= 90) {
A1_phase_Y = A1_phase}
if (A1_phase <= 180) {
A1_phase_Y = 180 - A1_phase}
if (A1_phase <= 270) {
A1_phase_Y = A1_phase - 180}
if (A1_phase <= 360) {
A1_phase_Y = 360 - A1_phase}
// определение координат вектора A1
var xA1_array = []; // массив координат точек вектора A1 по оси X
var yA1_array = []; // массив координат точек вектора A1 по оси Y
A1_1_X = 0;
if (A1_phase <= 180) {A1_2_X = Math.abs(Math.cos(A1_phase_X * Math.PI/180)) * A1
} else {A1_2_X = Math.abs(Math.cos(A1_phase_X * Math.PI/180)) * A1 * (-1)}
A1_1_Y = 0;
if (A1_phase <= 90 || A1_phase >= 270) {A1_2_Y = Math.abs(Math.cos(A1_phase_Y * Math.PI/180)) * A1
} else {A1_2_Y = Math.abs(Math.cos(A1_phase_Y * Math.PI/180)) * A1 * (-1)}
xA1_array[0] = A1_1_X;
xA1_array[1] = A1_2_X;
yA1_array[0] = A1_1_Y;
yA1_array[1] = A1_2_Y;
// определение угла наклона вектора A2 к осям X и Y
if (A2_phase <= 90) {
A2_phase_X = 90 - A2_phase}
if (A2_phase <= 180) {
A2_phase_X = A2_phase - 90}
if (A2_phase <= 270) {
A2_phase_X = 270 - A2_phase}
if (A2_phase <= 360) {
A2_phase_X = A2_phase - 270}
if (A2_phase <= 90) {
A2_phase_Y = A2_phase}
if (A2_phase <= 180) {
A2_phase_Y = 180 - A2_phase}
if (A2_phase <= 270) {
A2_phase_Y = A2_phase - 180}
if (A2_phase <= 360) {
A2_phase_Y = 360 - A2_phase}
// определение координат вектора A2
var xA2_array = []; // массив координат точек вектора A2 по оси X
var yA2_array = []; // массив координат точек вектора A2 по оси Y
A2_1_X = 0;
if (A2_phase <= 180) {A2_2_X = Math.abs(Math.cos(A2_phase_X * Math.PI/180)) * A2
} else {A2_2_X = Math.abs(Math.cos(A2_phase_X * Math.PI/180)) * A2 * (-1)}
A2_1_Y = 0;
if (A2_phase <= 90 || A2_phase >= 270) {A2_2_Y = Math.abs(Math.cos(A2_phase_Y * Math.PI/180)) * A2
} else {A2_2_Y = Math.abs(Math.cos(A2_phase_Y * Math.PI/180)) * A2 * (-1)}
xA2_array[0] = A2_1_X;
xA2_array[1] = A2_2_X;
yA2_array[0] = A2_1_Y;
yA2_array[1] = A2_2_Y;
// определение модуля вектора dA2
var xdA2_array = []; // массив координат точек вектора dA2 по оси X
var ydA2_array = []; // массив координат точек вектора dA2 по оси Y
dA2_1_X = A0_2_X;
dA2_2_X = A2_2_X;
dA2_1_Y = A0_2_Y;
dA2_2_Y = A2_2_Y;
dA2 = Math.sqrt(Math.pow(dA2_2_X - dA2_1_X, 2) + Math.pow(dA2_2_Y - dA2_1_Y, 2))
xdA2_array[0] = dA2_1_X;
xdA2_array[1] = dA2_2_X;
ydA2_array[0] = dA2_1_Y;
ydA2_array[1] = dA2_2_Y;
// определение фазы вектора dA2
if ((dA2_2_Y < dA2_1_Y) && (dA2_2_X < dA2_1_X)) {
dA2_phase = 180 + (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / Math.PI)}
if ((dA2_2_Y > dA2_1_Y) && (dA2_2_X > dA2_1_X)) {
dA2_phase = (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / Math.PI)}
if ((dA2_2_Y > dA2_1_Y) && (dA2_2_X < dA2_1_X)) {
dA2_phase = 360 - (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / Math.PI)}
if ((dA2_2_Y < dA2_1_Y) && (dA2_2_X > dA2_1_X)) {
dA2_phase = 180 - (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / Math.PI)}
if (dA2_phase > 360) {dA2_phase = dA2_phase - 360}
// определение модуля вектора dA1
var xdA1_array = []; // массив координат точек вектора dA1 по оси X
var ydA1_array = []; // массив координат точек вектора dA1 по оси Y
dA1_1_X = A0_2_X;
dA1_2_X = A1_2_X;
dA1_1_Y = A0_2_Y;
dA1_2_Y = A1_2_Y;
dA1 = Math.sqrt(Math.pow(dA1_2_X - dA1_1_X, 2) + Math.pow(dA1_2_Y - dA1_1_Y, 2))
xdA1_array[0] = dA1_1_X;
xdA1_array[1] = dA1_2_X;
ydA1_array[0] = dA1_1_Y;
ydA1_array[1] = dA1_2_Y;
// определение фазы вектора dA1
if ((dA1_2_Y < dA1_1_Y) && (dA1_2_X < dA1_1_X)) {
dA1_phase = 180 + (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / Math.PI)}
if ((dA1_2_Y > dA1_1_Y) && (dA1_2_X > dA1_1_X)) {
dA1_phase = (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / Math.PI)}
if ((dA1_2_Y > dA1_1_Y) && (dA1_2_X < dA1_1_X)) {
dA1_phase = 360 - (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / Math.PI)}
if ((dA1_2_Y < dA1_1_Y) && (dA1_2_X > dA1_1_X)) {
dA1_phase = 180 - (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / Math.PI)}
if (dA1_phase > 360) {dA1_phase = dA1_phase - 360}
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,A1,dA1,A2,dA2)+Math.max(A0,A1,A2,dA1,dA2)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,A1,dA1,A2,dA2)+Math.max(A0,A1,A2,dA1,dA2)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// определение угла наклона вектора m_test к осям X и Y
if (m_test_corner <= 90) {
m_test_corner_X = 90 - m_test_corner}
if (m_test_corner <= 180) {
m_test_corner_X = m_test_corner - 90}
if (m_test_corner <= 270) {
m_test_corner_X = 270 - m_test_corner}
if (m_test_corner <= 360) {
m_test_corner_X = m_test_corner - 270}
if (m_test_corner <= 90) {
m_test_corner_Y = m_test_corner}
if (m_test_corner <= 180) {
m_test_corner_Y = 180 - m_test_corner}
if (m_test_corner <= 270) {
m_test_corner_Y = m_test_corner - 180}
if (m_test_corner <= 360) {
m_test_corner_Y = 360 - m_test_corner}
// определение координат вектора m_test
m_test_1_X = 0;
if (m_test_corner <= 180) {m_test_2_X = Math.abs(Math.cos(m_test_corner_X * Math.PI/180)) * m_test * (-1)
} else {m_test_2_X = Math.abs(Math.cos(m_test_corner_X * Math.PI/180)) * m_test}
m_test_1_Y = 0;
if (m_test_corner <= 90 || m_test_corner >= 270) {m_test_2_Y = Math.abs(Math.cos(m_test_corner_Y * Math.PI/180)) * m_test
} else {m_test_2_Y = Math.abs(Math.cos(m_test_corner_Y * Math.PI/180)) * m_test * (-1)}
// Дисбаланс и балансировочный груз ДО балансировки (Mb,Mb_calc,Mdisb)
// определение угла наклона вектора балансировочного груза Mb_calc к осям X и Y
if (Mb_corner_calc <= 90) {
Mb_corner_calc_X = 90 - Mb_corner_calc}
if (Mb_corner_calc <= 180) {
Mb_corner_calc_X = Mb_corner_calc - 90}
if (Mb_corner_calc <= 270) {
Mb_corner_calc_X = 270 - Mb_corner_calc}
if (Mb_corner_calc <= 360) {
Mb_corner_calc_X = Mb_corner_calc - 270}
if (Mb_corner_calc <= 90) {
Mb_corner_calc_Y = Mb_corner_calc}
if (Mb_corner_calc <= 180) {
Mb_corner_calc_Y = 180 - Mb_corner_calc}
if (Mb_corner_calc <= 270) {
Mb_corner_calc_Y = Mb_corner_calc - 180}
if (Mb_corner_calc <= 360) {
Mb_corner_calc_Y = 360 - Mb_corner_calc}
// определение координат вектора балансировочного груза Mb_calc
Mb_1_calc_X = 0;
if (Mb_corner_calc <= 180) {Mb_2_calc_X = Math.abs(Math.cos(Mb_corner_calc_X * Math.PI/180)) * Mb_calc * (-1)
} else {Mb_2_calc_X = Math.abs(Math.cos(Mb_corner_calc_X * Math.PI/180)) * Mb_calc}
Mb_1_calc_Y = 0;
if (Mb_corner_calc <= 90 || Mb_corner_calc >= 270) {Mb_2_calc_Y = Math.abs(Math.cos(Mb_corner_calc_Y * Math.PI/180)) * Mb_calc
} else {Mb_2_calc_Y = Math.abs(Math.cos(Mb_corner_calc_Y * Math.PI/180)) * Mb_calc * (-1)}
// определение угла наклона вектора балансировочного груза Mb к осям X и Y
if (Mb_corner <= 90) {
Mb_corner_X = 90 - Mb_corner}
if (Mb_corner <= 180) {
Mb_corner_X = Mb_corner - 90}
if (Mb_corner <= 270) {
Mb_corner_X = 270 - Mb_corner}
if (Mb_corner <= 360) {
Mb_corner_X = Mb_corner - 270}
if (Mb_corner <= 90) {
Mb_corner_Y = Mb_corner}
if (Mb_corner <= 180) {
Mb_corner_Y = 180 - Mb_corner}
if (Mb_corner <= 270) {
Mb_corner_Y = Mb_corner - 180}
if (Mb_corner <= 360) {
Mb_corner_Y = 360 - Mb_corner}
// определение координат вектора балансировочного груза Mb
Mb_1_X = 0;
if (Mb_corner <= 180) {Mb_2_X = Math.abs(Math.cos(Mb_corner_X * Math.PI/180)) * Mb * (-1)
} else {Mb_2_X = Math.abs(Math.cos(Mb_corner_X * Math.PI/180)) * Mb}
Mb_1_Y = 0;
if (Mb_corner <= 90 || Mb_corner >= 270) {Mb_2_Y = Math.abs(Math.cos(Mb_corner_Y * Math.PI/180)) * Mb
} else {Mb_2_Y = Math.abs(Math.cos(Mb_corner_Y * Math.PI/180)) * Mb * (-1)}
// определение угла наклона вектора дисбаланса Mdisb к осям X и Y
if (Mdisb_corner <= 90) {
Mdisb_corner_X = 90 - Mdisb_corner}
if (Mdisb_corner <= 180) {
Mdisb_corner_X = Mdisb_corner - 90}
if (Mdisb_corner <= 270) {
Mdisb_corner_X = 270 - Mdisb_corner}
if (Mdisb_corner <= 360) {
Mdisb_corner_X = Mdisb_corner - 270}
if (Mdisb_corner <= 90) {
Mdisb_corner_Y = Mdisb_corner}
if (Mdisb_corner <= 180) {
Mdisb_corner_Y = 180 - Mdisb_corner}
if (Mdisb_corner <= 270) {
Mdisb_corner_Y = Mdisb_corner - 180}
if (Mdisb_corner <= 360) {
Mdisb_corner_Y = 360 - Mdisb_corner}
// определение координат вектора дисбаланса Mdisb
Mdisb_1_X = 0;
if (Mdisb_corner <= 180) {Mdisb_2_X = Math.abs(Math.cos(Mdisb_corner_X * Math.PI/180)) * Mdisb * (-1)
} else {Mdisb_2_X = Math.abs(Math.cos(Mdisb_corner_X * Math.PI/180)) * Mdisb}
Mdisb_1_Y = 0;
if (Mdisb_corner <= 90 || Mdisb_corner >= 270) {Mdisb_2_Y = Math.abs(Math.cos(Mdisb_corner_Y * Math.PI/180)) * Mdisb
} else {Mdisb_2_Y = Math.abs(Math.cos(Mdisb_corner_Y * Math.PI/180)) * Mdisb * (-1)}
// Дисбаланс и балансировочный груз ПОСЛЕ балансировки (Mb2_calc, Mdisb2)
// определение модуля вектора Mb2
Mb2_calc = A2 / DCI;
// определение угла вектора Mb
if ((A2_phase - DCI_phase + 180) < 360) {
Mb2_corner_calc = (A2_phase - DCI_phase + 180)
} else {Mb2_corner_calc = (A2_phase - DCI_phase + 180) - 360}
// определение угла наклона вектора балансировочного груза Mb2 к осям X и Y
if (Mb2_corner_calc <= 90) {
Mb2_corner_calc_X = 90 - Mb2_corner_calc}
if (Mb2_corner_calc <= 180) {
Mb2_corner_calc_X = Mb2_corner_calc - 90}
if (Mb2_corner_calc <= 270) {
Mb2_corner_calc_X = 270 - Mb2_corner_calc}
if (Mb2_corner_calc <= 360) {
Mb2_corner_calc_X = Mb2_corner_calc - 270}
if (Mb2_corner_calc <= 90) {
Mb2_corner_calc_Y = Mb2_corner_calc}
if (Mb2_corner_calc <= 180) {
Mb2_corner_calc_Y = 180 - Mb2_corner_calc}
if (Mb2_corner_calc <= 270) {
Mb2_corner_calc_Y = Mb2_corner_calc - 180}
if (Mb2_corner_calc <= 360) {
Mb2_corner_calc_Y = 360 - Mb2_corner_calc}
// определение координат вектора балансировочного груза Mb2
Mb2_1_calc_X = 0;
if (Mb2_corner_calc <= 180) {Mb2_2_calc_X = Math.abs(Math.cos(Mb2_corner_calc_X * Math.PI/180)) * Mb2_calc * (-1)
} else {Mb2_2_calc_X = Math.abs(Math.cos(Mb2_corner_calc_X * Math.PI/180)) * Mb2_calc}
Mb2_1_calc_Y = 0;
if (Mb2_corner_calc <= 90 || Mb2_corner_calc >= 270) {Mb2_2_calc_Y = Math.abs(Math.cos(Mb2_corner_calc_Y * Math.PI/180)) * Mb2_calc
} else {Mb2_2_calc_Y = Math.abs(Math.cos(Mb2_corner_calc_Y * Math.PI/180)) * Mb2_calc * (-1)}
// определение массы дисбаланса 2
Mdisb2 = Mb2_calc; // равен массе балансировочного груз
// определение угла расположения дисбаланса 2
if ((Mb2_corner_calc + 180) > 360) {
Mdisb2_corner = (Mb2_corner_calc + 180) - 360}
else if ((Mb2_corner_calc + 180) < 0) {
Mdisb2_corner = (Mb2_corner_calc + 180) + 360}
else {Mdisb2_corner = (Mb2_corner_calc + 180)}
// определение угла наклона вектора дисбаланса Mdisb2 к осям X и Y
if (Mdisb2_corner <= 90) {
Mdisb2_corner_X = 90 - Mdisb2_corner}
if (Mdisb2_corner <= 180) {
Mdisb2_corner_X = Mdisb2_corner - 90}
if (Mdisb2_corner <= 270) {
Mdisb2_corner_X = 270 - Mdisb2_corner}
if (Mdisb2_corner <= 360) {
Mdisb2_corner_X = Mdisb2_corner - 270}
if (Mdisb2_corner <= 90) {
Mdisb2_corner_Y = Mdisb2_corner}
if (Mdisb2_corner <= 180) {
Mdisb2_corner_Y = 180 - Mdisb2_corner}
if (Mdisb2_corner <= 270) {
Mdisb2_corner_Y = Mdisb2_corner - 180}
if (Mdisb2_corner <= 360) {
Mdisb2_corner_Y = 360 - Mdisb2_corner}
// определение координат вектора дисбаланса Mdisb2
Mdisb2_1_X = 0;
if (Mdisb2_corner <= 180) {Mdisb2_2_X = Math.abs(Math.cos(Mdisb2_corner_X * Math.PI/180)) * Mdisb2 * (-1)
} else {Mdisb2_2_X = Math.abs(Math.cos(Mdisb2_corner_X * Math.PI/180)) * Mdisb2}
Mdisb2_1_Y = 0;
if (Mdisb2_corner <= 90 || Mdisb2_corner >= 270) {Mdisb2_2_Y = Math.abs(Math.cos(Mdisb2_corner_Y * Math.PI/180)) * Mdisb2
} else {Mdisb2_2_Y = Math.abs(Math.cos(Mdisb2_corner_Y * Math.PI/180)) * Mdisb2 * (-1)}
// Координаты масс для визуализации
// определение координат точек окружности обозначения массы пробного груза
var x_m_test_array = []; // массив координат точек окружности m_test по оси X
var y_m_test_array = []; // массив координат точек окружности m_test по оси Y
var x0_m_test = m_test_2_X; // центр по X
var y0_m_test = m_test_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_m_test_array.push(x0_m_test + (Math.max(Mb,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_m_test_array.push(y0_m_test + (Math.max(Mb,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы балансировочного груза Mb_calc
var x_Mb_calc_array = []; // массив координат точек окружности Mb_calc по оси X
var y_Mb_calc_array = []; // массив координат точек окружности Mb_calc по оси Y
var x0_Mb_calc = Mb_2_calc_X; // центр по X
var y0_Mb_calc = Mb_2_calc_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mb_calc_array.push(x0_Mb_calc + (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mb_calc_array.push(y0_Mb_calc + (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы балансировочного груза Mb
var x_Mb_array = []; // массив координат точек окружности Mb по оси X
var y_Mb_array = []; // массив координат точек окружности Mb по оси Y
var x0_Mb = Mb_2_X; // центр по X
var y0_Mb = Mb_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mb_array.push(x0_Mb + (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mb_array.push(y0_Mb + (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы дисбаланса Mdisb
var x_Mdisb_array = []; // массив координат точек окружности Mdisb по оси X
var y_Mdisb_array = []; // массив координат точек окружности Mdisb по оси Y
var x0_Mdisb = Mdisb_2_X; // центр по X
var y0_Mdisb = Mdisb_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mdisb_array.push(x0_Mdisb + (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mdisb_array.push(y0_Mdisb + (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы балансировочного груза Mb2
var x_Mb2_calc_array = []; // массив координат точек окружности Mb2 по оси X
var y_Mb2_calc_array = []; // массив координат точек окружности Mb2 по оси Y
var x0_Mb2_calc = Mb2_2_calc_X; // центр по X
var y0_Mb2_calc = Mb2_2_calc_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mb2_calc_array.push(x0_Mb2_calc + (Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mb2_calc_array.push(y0_Mb2_calc + (Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы дисбаланса Mdisb2
var x_Mdisb2_array = []; // массив координат точек окружности Mdisb2 по оси X
var y_Mdisb2_array = []; // массив координат точек окружности Mdisb2 по оси Y
var x0_Mdisb2 = Mdisb2_2_X; // центр по X
var y0_Mdisb2 = Mdisb2_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mdisb2_array.push(x0_Mdisb2 + (Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mdisb2_array.push(y0_Mdisb2 + (Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности графика для отображения расположения дисбаланса
var xD_array = []; // массив координат точек окружности D по оси X
var yD_array = []; // массив координат точек окружности D по оси Y
var x0D = 0; // центр в начале координат
var y0D = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xD_array.push(x0D + (Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2,m_test)+Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1) * (Math.sin((i) * Math.PI / 180)));
yD_array.push(y0D + (Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2,m_test)+Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2,m_test)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Вычисление допустимого остаточного дисбаланса
U_per = (1000 * (G * P)) / (Math.PI * n / 30);
// Остаточный дисбаланс
U_res2 = Mdisb2 * R;
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_A1",
x: xA1_array,
y: yA1_array,
});
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A2",
x: xA2_array,
y: yA2_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA2",
x: xdA2_array,
y: ydA2_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA1",
x: xdA1_array,
y: ydA1_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,A1,dA1,A2,dA2)+Math.max(A0,A1,dA1,A2,dA2)*0.2), -(Math.max(A0,A1,dA1,A2,dA2)+Math.max(A0,A1,dA1,A2,dA2)*0.2), (Math.max(A0,A1,dA1,A2,dA2)+Math.max(A0,A1,dA1,A2,dA2)*0.2), (Math.max(A0,A1,dA1,A2,dA2)+Math.max(A0,A1,dA1,A2,dA2)*0.2)],
y: [(Math.max(A0,A1,dA1,A2,dA2)+Math.max(A0,A1,dA1,A2,dA2)*0.2), -(Math.max(A0,A1,dA1,A2,dA2)+Math.max(A0,A1,dA1,A2,dA2)*0.2), -(Math.max(A0,A1,dA1,A2,dA2)+Math.max(A0,A1,dA1,A2,dA2)*0.2), (Math.max(A0,A1,dA1,A2,dA2)+Math.max(A0,A1,dA1,A2,dA2)*0.2)]
});
plot_disb.add(
{
color: 0x0000ff,
name: "Пробный груз",
x: x_m_test_array,
y: y_m_test_array,
});
plot_disb.add(
{
color: 0x0fae1a,
name: "Балансировочный груз расчёт",
x: x_Mb_calc_array,
y: y_Mb_calc_array,
});
plot_disb.add(
{
color: 0x00ff00,
name: "Балансировочный груз",
x: x_Mb_array,
y: y_Mb_array,
});
plot_disb.add(
{
color: 0xff0000,
name: "Дисбаланс",
x: x_Mdisb_array,
y: y_Mdisb_array,
});
plot_disb.add(
{
color: 0x00ddff,
name: "Балансировочный груз для добалансировки",
x: x_Mb2_calc_array,
y: y_Mb2_calc_array,
});
plot_disb.add(
{
color: 0xff3dcc,
name: "Дисбаланс остаточный после балансировки",
x: x_Mdisb2_array,
y: y_Mdisb2_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "График расположения дисбаланса",
x: xD_array,
y: yD_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.2), -(Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.2), (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.2), (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.2)],
y: [(Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.2), -(Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.2), -(Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.2), (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2,m_test)*0.2)]
});
gtl.log.info("Mb (балансировочный груз)",Mb);
gtl.log.info("Mb_corner (угол установки груза)",Mb_corner);
gtl.log.info("Mb_calc (балансировочный груз расчёт)",Mb_calc);
gtl.log.info("Mb_corner_calc (угол установки груза расчёт)",Mb_corner_calc);
gtl.log.info("Mdisb (дисбаланс)",Mdisb);
gtl.log.info("Mdisb_corner (угол расположения дисбаланса)",Mdisb_corner);
gtl.log.info("Mb2_calc (балансировочный груз 2)",Mb2_calc);
gtl.log.info("Mb2_corner_calc (угол установки груза 2)",Mb2_corner_calc);
gtl.log.info("Mdisb2 (дисбаланс 2)",Mdisb2);
gtl.log.info("Mdisb2_corner (угол расположения дисбаланса 2)",Mdisb2_corner);
gtl.log.info("m_test (пробный груз введёный)",m_test);
gtl.log.info("m_test_corner (угол установки пробного груза)",m_test_corner);
gtl.log.info("m_test_calc (пробный груз расчётный)",m_test_calc);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("A1",A1);
gtl.log.info("A1_phase",A1_phase);
gtl.log.info("A2",A2);
gtl.log.info("A2_phase",A2_phase);
gtl.log.info("Допустимый остаточный дисбаланс", U_per);
gtl.log.info("Остаточный дисбаланс (после балансировки)", U_res2);
// Выдача результата (results)
let __result = {
_001астращ_обмин: n,
_002_Ампл_вибр_пуска_A0: A0,
_003аза_вибр_пуска_A0: A0_phase,
_004_Ампл_вибр_пуска_A1: A1,
_005аза_вибр_пуска_A1: A1_phase,
_006_Ампл_вибр_пуска_A2: A2,
_007аза_вибр_пуска_A2: A2_phase,
_008_Масса_дисбаланса: Mdisb,
_009_Угол_дисбаланса: Mdisb_corner,
_010_Масса_баланс_груза: Mb,
_011_Угол_баланс_груза: Mb_corner,
_012_Масса_баланс_груза_расч: Mb_calc,
_013_Угол_баланс_груза_расч: Mb_corner_calc,
_014_Масса_дисбаланса_2: Mdisb2,
_015_Угол_дисбаланса_2: Mdisb2_corner,
_016_Масса_баланс_груза_2: Mb2_calc,
_017_Угол_баланс_груза_2: Mb2_corner_calc,
_018_Масса_пробн_груза_расч: m_test_calc,
_019_Масса_пробн_груза: m_test,
_020_Угол_пробн_груза: m_test_corner,
_021_МодульКВ: DCI,
_022азаКВ: DCI_phase,
_023опуст_ост_дисб_г_мм: U_per,
_024_Остат_дисб_после_г_мм: U_res2
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
// break;
// default:
// break;
// }
}

View File

@ -0,0 +1,94 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ с фазой (использование ДКВ) *****
// ***********************************************************************************
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let R_ = gtl.options.customOptions.R; // радиус установки грузов ** (для вычисления массы пробного груза)
let R; // радиус установки грузов ** (для вычисления массы пробного груза) (конечное значение)
let P_ = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
let P; // масса ротора, кг ** (для вычисления массы пробного груза) (конечное значение)
let G = gtl.options.customOptions.G; // класс точности балансировки, мм/с ** (ГОСТ 1940)
let n = gtl.options.customOptions.n; // скорость вращения, об/мин ** (для вычисления массы пробного груза и допустимого остаточного дисбаланса)
let U_per; // допустимый остаточный дисбаланс *** (ГОСТ 1940)
let DCI_ = gtl.options.customOptions.DCI; // модуль (мм/с/граммы) динамического коэффициента влияния **/***
let DCI = DCI_; // модуль (мм/с/граммы) динамического коэффициента влияния **/*** (конечное значение)
let DCI_phase_ = gtl.options.customOptions.DCI_phase; // фаза динамического коэффициента влияния **/***
let DCI_phase = DCI_phase_; // фаза динамического коэффициента влияния **/*** (конечное значение)
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 0 - ввод исходных данных:
// ввод исходных данных: радиус установки грузов, масса ротора, ДКВ (DCI)
// R радиус установки грузов, мм
if (R_ != 0) {R = R_} // принимает значение из опций
else {R = false} // принимает значение false
// P масса ротора, г
if (P_ != 0) {P = P_} // принимает значение из опций
else {P = false} // принимает значение false
// DCI (модуль ДКВ), мм/с/г
if (DCI_ != 0) {DCI = DCI_} // принимает значение из опций
else {DCI = false} // принимает значение false
// DCI_corner (фаза ДКВ), град
if (DCI_phase_ != 0) {DCI_phase = DCI_phase_} // принимает значение из опций
else {DCI_phase = false} // принимает значение false
// Вычисление допустимого остаточного дисбаланса
U_per = (1000 * (G * P)) / (Math.PI * n / 30);
gtl.log.info("Масса ротора", P);
gtl.log.info("Радиус установки грузов", R);
gtl.log.info("модуль ДКВ", DCI);
gtl.log.info("фаза ДКВ", DCI_phase);
gtl.log.info("Допустимый остаточный дисбаланс", U_per);
// Выдача результата (results)
let __result = {
_001_Радиус_установки_грузов_мм: R,
_002_Масса_ротора_г: P,
_003КВодуль_мм_с_г: DCI,
_004КВаза_град: DCI_phase,
_005опуст_ост_дисб_г_мм: U_per
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

@ -0,0 +1,404 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ с фазой (использование ДКВ) *****
// ***********************************************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
freq.time = 1; // длина (время) отрезка сигнала
freq.avg_cnt = 3; // количество усреднений
freq.dc = -0.05; // уровень, при переходе через который вычисляются периоды
// ФИЛЬТР 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let 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 = 501; // центральная частота полосового фильтра
filter_2_1000.width = 998; // ширина полосы фильтра
let filter_2_1000v = gtl.add_intg(filter_2_1000); // интегрирование
filter_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр для виброперемещения
let filter_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_2_300s.kind = gtl.filter_iir.butterworth;
filter_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_2_300s.order = 4;
filter_2_300s.frequency = 151; // центральная частота
filter_2_300s.width = 298; // ширина полосы
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = 0.5; // частотное разрешение
let average = 3; // количество усреднений
let overlap = 0; // наложение
let filter_vibr; // фильтр сигнала вибрации
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_vibr = filter_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_vibr = filter_2_300s;
frequency = 300;
}
// Спектр для получения 1-й гармоники частоты вращения
var AUSP = gtl.add_ausp(filter_vibr); // объявление переменной спектра
AUSP.color = 0x00ff0000; // цвет спектра
AUSP.name = "AUSP"; // имя спектра
AUSP.frequency = frequency; // граничная частота спектра
AUSP.lines = AUSP.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP.average = average; // количество усреднений
AUSP.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP.smoothing_factor = 100; // усреднение средней линии
AUSP.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP.tolerance = AUSP.resolution; // диапазон поиска гармоник +/-
// СКЗ
var RMS = gtl.add_value_rms(filter_vibr);
RMS.time = 1;
RMS.avg_cnt = 3;
// Спектр вибрации
var AUSP_pl = gtl.create_ausp(
{
"src" : filter_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ
var pfc_pl = gtl.create_pfc(
{
"src0" : filter_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектр вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбаланса"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0; // модуль вектора начальной вибрации */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации */**
let A0_phase; // фаза вектора начальной вибрации */** (конечное значение)
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time) + 0.1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP.clear_harms_sets();
let __AUSP_tools = gtl.create_spec_tools(
{
data: AUSP_pl.data,
df: AUSP_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP = __AUSP_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP.name = "F1 (гарм. ряд част. вращ.)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_tools = gtl.create_spec_tools(
{
data: pfc_pl.data,
df: pfc_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row1_phase = __pfc_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row1_phase.name = "F1_phase (гарм. ряд част. вращ.)"; // название гармонического ряда
// Построение графиков
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации",
x: AUSP_pl.resolution,
y: AUSP_pl.data,
spec_tools: __AUSP_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ",
x: pfc_pl.resolution,
y: pfc_pl.data,
spec_tools: __pfc_tools.to_json()
});
let __result1 = __AUSP_tools.to_json();
let __result2 = __pfc_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 F1_1_ph = __result2.harms.rows[0].harms[0].ampl;
// Проверка наличия оборотной гармоники и необходимости проведения баалнсировки
var test_balance = ""; // переменная для текста о необходимости проведения балансировки
if (F1_1_a >= RMS * 0.4) // вклад оборотной гармоники в СКЗ
{test_balance = "необходимо провести балансировку";}
else {test_balance = "проведение балансировки не требуется или нецелесообразно";}
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 1 - начальная вибрация A0:
// измерение начальной вибрации A0 (или ввод вручную)
// определение целесообразности проведения балансировки
// построение графика вибрации A0
// Определение конечных значений переменных
// A0 начальная вибрация
if (A0_ != 0) {A0 = A0_} // принимает значение из опций
else {A0 = F1_1_a} // принимает значение из спектра сигнала
if (A0_phase_ != 0) {A0_phase = A0_phase_} // принимает значение из опций
else {A0_phase = F1_1_ph} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0)+Math.max(A0)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0)+Math.max(A0)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0)+Math.max(A0)*0.2), -(Math.max(A0)+Math.max(A0)*0.2), (Math.max(A0)+Math.max(A0)*0.2), (Math.max(A0)+Math.max(A0)*0.2)],
y: [(Math.max(A0)+Math.max(A0)*0.2), -(Math.max(A0)+Math.max(A0)*0.2), -(Math.max(A0)+Math.max(A0)*0.2), (Math.max(A0)+Math.max(A0)*0.2)]
});
gtl.log.info("RMS",RMS.value);
gtl.log.info("Необходимость проведения балансировки",test_balance);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("F1_1_ph (фаза)",F1_1_ph);
gtl.log.info("F1_1_a (ампл)",F1_1_a);
gtl.log.info("F1_1_f (част)",F1_1_f);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
// Выдача результата (results)
let __result = {
_001астотаращения_F1: freq.value,
_002_Ампл_гарм_1F1: F1_1_a,
_003азаастращ_F1: F1_1_ph,
_004_Ампл_вибр_пуска_A0: A0,
_005аза_вибр_пуска_A0: A0_phase,
_006_Тестирование: test_balance,
_007_СКЗ_вибрации: RMS.value,
_008_Нестабастращ: instability*100,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

View File

@ -0,0 +1,386 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ с фазой (использование ДКВ) *****
// ***********************************************************************************
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектр виброскорости"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбаланса"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let R = gtl.options.customOptions.R; // радиус установки грузов ** (для вычисления массы пробного груза)
let P = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
let G = gtl.options.customOptions.G; // класс точности балансировки, мм/с ** (ГОСТ 1940)
let n = gtl.options.customOptions.n; // скорость вращения, об/мин ** (для вычисления массы пробного груза и допустимого остаточного дисбаланса)
let U_per; // допустимый остаточный дисбаланс *** (ГОСТ 1940)
let U_res; // остаточный дисбаланс *** (ГОСТ 1940)
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0 = A0_; // модуль вектора начальной вибрации */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации */** (конечное значение)
let DCI_ = gtl.options.customOptions.DCI; // модуль (мм/с/граммы) динамического коэффициента влияния **/***
let DCI = DCI_; // модуль (мм/с/граммы) динамического коэффициента влияния **/*** (конечное значение)
let DCI_phase_ = gtl.options.customOptions.DCI_phase; // фаза динамического коэффициента влияния **/***
let DCI_phase = DCI_phase_; // фаза динамического коэффициента влияния **/*** (конечное значение)
let Mb = gtl.options.customOptions.Mb; // масса применённого балансировочного груза **/*** (конечное значение)
let Mb_corner = gtl.options.customOptions.Mb_corner; // угол применённого балансировочного груза **/*** (конечное значение)
let Mb_calc; // модуль расчётного вектора балансировочного груза ***
let Mb_corner_calc; // угол расчётного вектора балансировочного груза ***
let Mdisb; // масса дисбаланса ***
let Mdisb_corner; // угол расположения дисбаланса ***
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let Mb_corner_calc_X; // угол наклона расчётного вектора Mb к оси X
let Mb_corner_calc_Y; // угол наклона расчётного вектора Mb к оси Y
let Mb_1_calc_X; // начальная координата расчётного вектора Mb по оси X
let Mb_2_calc_X; // конечная координата расчётного вектора Mb по оси X
let Mb_1_calc_Y; // начальная координата расчётного вектора Mb по оси Y
let Mb_2_calc_Y; // конечная координата расчётного вектора Mb по оси Y
let Mb_corner_X; // угол наклона вектора Mb к оси X
let Mb_corner_Y; // угол наклона вектора Mb к оси Y
let Mb_1_X; // начальная координата вектора Mb по оси X
let Mb_2_X; // конечная координата вектора Mb по оси X
let Mb_1_Y; // начальная координата вектора Mb по оси Y
let Mb_2_Y; // конечная координата вектора Mb по оси Y
let Mdisb_corner_X;// угол наклона вектора Mdisb к оси X
let Mdisb_corner_Y;// угол наклона вектора Mdisb к оси Y
let Mdisb_1_X; // начальная координата вектора Mdisb по оси X
let Mdisb_2_X; // конечная координата вектора Mdisb по оси X
let Mdisb_1_Y; // начальная координата вектора Mdisb по оси Y
let Mdisb_2_Y; // конечная координата вектора Mdisb по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
// gtl.diagnostic.interval = Math.max(AUSPv.acq_time, AUSPv_pl.acq_time) + 0.1;
gtl.diagnostic.interval = gtl.acq_time + 1;
// let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 2 - расположение дисбаланса:
// вычисление положения дисбаланса и рекомендуемого балансировочного груза Mb_calc
// ввод массы и угла установки балансировочного груза Mb
// построение графиков расположения дисбаланса Mdisb, расчётного Mb_calc и введённого Mb балансировочного груза
// из предыдущих шагов переносятся: амплитуда и фаза вибрации A0
// построение графиков вибрации A0 и A2
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0)+Math.max(A0)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0)+Math.max(A0)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// определение модуля вектора Mb
Mb_calc = A0 / DCI;
// определение угла вектора Mb
if ((A0_phase - DCI_phase + 180) < 360) {
Mb_corner_calc = (A0_phase - DCI_phase + 180)
} else {Mb_corner_calc = (A0_phase - DCI_phase + 180) - 360}
// if ((m_test_corner + A0_phase - dA_phase + 180) < 360) {
// Mb_corner = (m_test_corner + A0_phase - dA_phase + 180)
// } else {Mb_corner = (m_test_corner + A0_phase - dA_phase + 180) - 360}
// определение угла наклона вектора балансировочного груза Mb_calc к осям X и Y
if (Mb_corner_calc <= 90) {
Mb_corner_calc_X = 90 - Mb_corner_calc}
if (Mb_corner_calc <= 180) {
Mb_corner_calc_X = Mb_corner_calc - 90}
if (Mb_corner_calc <= 270) {
Mb_corner_calc_X = 270 - Mb_corner_calc}
if (Mb_corner_calc <= 360) {
Mb_corner_calc_X = Mb_corner_calc - 270}
if (Mb_corner_calc <= 90) {
Mb_corner_calc_Y = Mb_corner_calc}
if (Mb_corner_calc <= 180) {
Mb_corner_calc_Y = 180 - Mb_corner_calc}
if (Mb_corner_calc <= 270) {
Mb_corner_calc_Y = Mb_corner_calc - 180}
if (Mb_corner_calc <= 360) {
Mb_corner_calc_Y = 360 - Mb_corner_calc}
// определение координат вектора балансировочного груза Mb_calc
Mb_1_calc_X = 0;
if (Mb_corner_calc <= 180) {Mb_2_calc_X = Math.abs(Math.cos(Mb_corner_calc_X * Math.PI/180)) * Mb_calc * (-1)
} else {Mb_2_calc_X = Math.abs(Math.cos(Mb_corner_calc_X * Math.PI/180)) * Mb_calc}
Mb_1_calc_Y = 0;
if (Mb_corner_calc <= 90 || Mb_corner_calc >= 270) {Mb_2_calc_Y = Math.abs(Math.cos(Mb_corner_calc_Y * Math.PI/180)) * Mb_calc
} else {Mb_2_calc_Y = Math.abs(Math.cos(Mb_corner_calc_Y * Math.PI/180)) * Mb_calc * (-1)}
// определение угла наклона вектора балансировочного груза Mb к осям X и Y
if (Mb_corner <= 90) {
Mb_corner_X = 90 - Mb_corner}
if (Mb_corner <= 180) {
Mb_corner_X = Mb_corner - 90}
if (Mb_corner <= 270) {
Mb_corner_X = 270 - Mb_corner}
if (Mb_corner <= 360) {
Mb_corner_X = Mb_corner - 270}
if (Mb_corner <= 90) {
Mb_corner_Y = Mb_corner}
if (Mb_corner <= 180) {
Mb_corner_Y = 180 - Mb_corner}
if (Mb_corner <= 270) {
Mb_corner_Y = Mb_corner - 180}
if (Mb_corner <= 360) {
Mb_corner_Y = 360 - Mb_corner}
// определение координат вектора балансировочного груза Mb
Mb_1_X = 0;
if (Mb_corner <= 180) {Mb_2_X = Math.abs(Math.cos(Mb_corner_X * Math.PI/180)) * Mb * (-1)
} else {Mb_2_X = Math.abs(Math.cos(Mb_corner_X * Math.PI/180)) * Mb}
Mb_1_Y = 0;
if (Mb_corner <= 90 || Mb_corner >= 270) {Mb_2_Y = Math.abs(Math.cos(Mb_corner_Y * Math.PI/180)) * Mb
} else {Mb_2_Y = Math.abs(Math.cos(Mb_corner_Y * Math.PI/180)) * Mb * (-1)}
// определение массы дисбаланса
Mdisb = Mb_calc; // равен массе балансировочного груза
// определение угла расположения дисбаланса
if ((Mb_corner_calc + 180) > 360) {
Mdisb_corner = (Mb_corner_calc + 180) - 360}
else if ((Mb_corner + 180) < 0) {
Mdisb_corner = (Mb_corner_calc + 180) + 360}
else {Mdisb_corner = (Mb_corner_calc + 180)}
// определение угла наклона вектора дисбаланса Mdisb к осям X и Y
if (Mdisb_corner <= 90) {
Mdisb_corner_X = 90 - Mdisb_corner}
if (Mdisb_corner <= 180) {
Mdisb_corner_X = Mdisb_corner - 90}
if (Mdisb_corner <= 270) {
Mdisb_corner_X = 270 - Mdisb_corner}
if (Mdisb_corner <= 360) {
Mdisb_corner_X = Mdisb_corner - 270}
if (Mdisb_corner <= 90) {
Mdisb_corner_Y = Mdisb_corner}
if (Mdisb_corner <= 180) {
Mdisb_corner_Y = 180 - Mdisb_corner}
if (Mdisb_corner <= 270) {
Mdisb_corner_Y = Mdisb_corner - 180}
if (Mdisb_corner <= 360) {
Mdisb_corner_Y = 360 - Mdisb_corner}
// определение координат вектора дисбаланса Mdisb
Mdisb_1_X = 0;
if (Mdisb_corner <= 180) {Mdisb_2_X = Math.abs(Math.cos(Mdisb_corner_X * Math.PI/180)) * Mdisb * (-1)
} else {Mdisb_2_X = Math.abs(Math.cos(Mdisb_corner_X * Math.PI/180)) * Mdisb}
Mdisb_1_Y = 0;
if (Mdisb_corner <= 90 || Mdisb_corner >= 270) {Mdisb_2_Y = Math.abs(Math.cos(Mdisb_corner_Y * Math.PI/180)) * Mdisb
} else {Mdisb_2_Y = Math.abs(Math.cos(Mdisb_corner_Y * Math.PI/180)) * Mdisb * (-1)}
// Координаты масс для визуализации
// определение координат точек окружности обозначения массы введённого балансировочного груза Mb
var x_Mb_array = []; // массив координат точек окружности расчётного Mb по оси X
var y_Mb_array = []; // массив координат точек окружности расчётного Mb по оси Y
var x0_Mb = Mb_2_X; // центр по X
var y0_Mb = Mb_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mb_array.push(x0_Mb + (Math.max(Mb_calc,Mb,Mdisb)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mb_array.push(y0_Mb + (Math.max(Mb_calc,Mb,Mdisb)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы расчётного балансировочного груза Mb_calc
var x_Mb_calc_array = []; // массив координат точек окружности Mb_calc по оси X
var y_Mb_calc_array = []; // массив координат точек окружности Mb_calc по оси Y
var x0_Mb_calc = Mb_2_calc_X; // центр по X
var y0_Mb_calc = Mb_2_calc_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mb_calc_array.push(x0_Mb_calc + (Math.max(Mb_calc,Mb,Mdisb)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mb_calc_array.push(y0_Mb_calc + (Math.max(Mb_calc,Mb,Mdisb)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы дисбаланса Mdisb
var x_Mdisb_array = []; // массив координат точек окружности Mdisb по оси X
var y_Mdisb_array = []; // массив координат точек окружности Mdisb по оси Y
var x0_Mdisb = Mdisb_2_X; // центр по X
var y0_Mdisb = Mdisb_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mdisb_array.push(x0_Mdisb + (Math.max(Mb_calc,Mb,Mdisb)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mdisb_array.push(y0_Mdisb + (Math.max(Mb_calc,Mb,Mdisb)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности графика для отображения расположения дисбаланса
var xD_array = []; // массив координат точек окружности D по оси X
var yD_array = []; // массив координат точек окружности D по оси Y
var x0D = 0; // центр в начале координат
var y0D = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xD_array.push(x0D + (Math.max(Mb_calc,Mb,Mdisb)+Math.max(Mb_calc,Mb,Mdisb)*0.1) * (Math.sin((i) * Math.PI / 180)));
yD_array.push(y0D + (Math.max(Mb_calc,Mb,Mdisb)+Math.max(Mb_calc,Mb,Mdisb)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Вычисление допустимого остаточного дисбаланса
U_per = (1000 * (G * P)) / (Math.PI * n / 30);
// Остаточный дисбаланс
U_res = Mdisb * R;
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0)+Math.max(A0)*0.2), -(Math.max(A0)+Math.max(A0)*0.2), (Math.max(A0)+Math.max(A0)*0.2), (Math.max(A0)+Math.max(A0)*0.2)],
y: [(Math.max(A0)+Math.max(A0)*0.2), -(Math.max(A0)+Math.max(A0)*0.2), -(Math.max(A0)+Math.max(A0)*0.2), (Math.max(A0)+Math.max(A0)*0.2)]
});
plot_disb.add(
{
color: 0x00ff00,
name: "Балансировочный груз расчётный",
x: x_Mb_calc_array,
y: y_Mb_calc_array,
});
plot_disb.add(
{
color: 0x0fae1a,
name: "Балансировочный груз введённый",
x: x_Mb_array,
y: y_Mb_array,
});
plot_disb.add(
{
color: 0xff0000,
name: "Дисбаланс",
x: x_Mdisb_array,
y: y_Mdisb_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "График расположения дисбаланса",
x: xD_array,
y: yD_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(Mb_calc,Mb,Mdisb)+Math.max(Mb_calc,Mb,Mdisb)*0.2), -(Math.max(Mb_calc,Mb,Mdisb)+Math.max(Mb_calc,Mb,Mdisb)*0.2), (Math.max(Mb_calc,Mb,Mdisb)+Math.max(Mb_calc,Mb,Mdisb)*0.2), (Math.max(Mb_calc,Mb,Mdisb)+Math.max(Mb_calc,Mb,Mdisb)*0.2)],
y: [(Math.max(Mb_calc,Mb,Mdisb)+Math.max(Mb_calc,Mb,Mdisb)*0.2), -(Math.max(Mb_calc,Mb,Mdisb)+Math.max(Mb_calc,Mb,Mdisb)*0.2), -(Math.max(Mb_calc,Mb,Mdisb)+Math.max(Mb_calc,Mb,Mdisb)*0.2), (Math.max(Mb_calc,Mb,Mdisb)+Math.max(Mb_calc,Mb,Mdisb)*0.2)]
});
gtl.log.info("Mb (балансировочный груз расчёт)",Mb_calc);
gtl.log.info("Mb_corner (угол установки груза расчёт)",Mb_corner_calc);
gtl.log.info("Mb (балансировочный груз введён)",Mb);
gtl.log.info("Mb_corner (угол установки груза введён)",Mb_corner);
gtl.log.info("Mdisb (дисбаланс)",Mdisb);
gtl.log.info("Mdisb_corner (угол расположения дисбаланса)",Mdisb_corner);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("модуль ДКВ", DCI);
gtl.log.info("фаза ДКВ", DCI_phase);
gtl.log.info("Допустимый остаточный дисбаланс", U_per);
gtl.log.info("Остаточный дисбаланс", U_res);
// Выдача результата (results)
let __result = {
_001астращ_обмин: n,
_002_Ампл_вибр_пуска_A0: A0,
_003аза_вибр_пуска_A0: A0_phase,
_004_Масса_дисбаланса: Mdisb,
_005_Угол_дисбаланса: Mdisb_corner,
_006_Масса_баланс_груза_введён: Mb,
_007_Угол_баланс_груза_введён: Mb_corner,
_008_Масса_баланс_груза_расч: Mb_calc,
_009_Угол_баланс_груза_расч: Mb_corner_calc,
_010_МодульКВ: DCI,
_011азаКВ: DCI_phase,
_012опуст_ост_дисб_г_мм: U_per,
_013_Остат_дисб_г_мм: U_res
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
// break;
// default:
// break;
// }
}

View File

@ -0,0 +1,491 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ с фазой (использование ДКВ) *****
// ***********************************************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
freq.time = 1; // длина (время) отрезка сигнала
freq.avg_cnt = 3; // количество усреднений
freq.dc = -0.05; // уровень, при переходе через который вычисляются периоды
// ФИЛЬТР 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let 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 = 501; // центральная частота полосового фильтра
filter_2_1000.width = 998; // ширина полосы фильтра
let filter_2_1000v = gtl.add_intg(filter_2_1000); // интегрирование
filter_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр для виброперемещения
let filter_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_2_300s.kind = gtl.filter_iir.butterworth;
filter_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_2_300s.order = 4;
filter_2_300s.frequency = 151; // центральная частота
filter_2_300s.width = 298; // ширина полосы
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = 0.5; // частотное разрешение
let average = 3; // количество усреднений
let overlap = 0; // наложение
let filter_vibr; // фильтр сигнала вибрации
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_vibr = filter_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_vibr = filter_2_300s;
frequency = 300;
}
// Спектр для получения 1-й гармоники частоты вращения
var AUSP = gtl.add_ausp(filter_vibr); // объявление переменной спектра
AUSP.color = 0x00ff0000; // цвет спектра
AUSP.name = "AUSP"; // имя спектра
AUSP.frequency = frequency; // граничная частота спектра
AUSP.lines = AUSP.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP.average = average; // количество усреднений
AUSP.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP.smoothing_factor = 100; // усреднение средней линии
AUSP.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP.tolerance = AUSP.resolution; // диапазон поиска гармоник +/-
// СКЗ
var RMS = gtl.add_value_rms(filter_vibr);
RMS.time = 1;
RMS.avg_cnt = 3;
// Спектр вибрации
var AUSP_pl = gtl.create_ausp(
{
"src" : filter_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ
var pfc_pl = gtl.create_pfc(
{
"src0" : filter_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектр вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбаланса"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0 = A0_; // модуль вектора начальной вибрации */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации */** (конечное значение)
let dA2; // модуль вектора дельты вибрации после установки пробного груза ***
let dA2_phase; // фаза вектора дельты вибрации после установки пробного груза ***
let A2_ = gtl.options.customOptions.A2; // модуль вектора вибрации после установки балансировочного груза */**
let A2; // модуль вектора вибрации после установки балансировочного груза */** (конечное значение)
let A2_phase_ = gtl.options.customOptions.A2_phase; // фаза вектора вибрации после установки балансировочного груза */**
let A2_phase; // фаза вектора вибрации после установки балансировочного груза */** (конечное значение)
// Переменные вспомогательные необходимые для расчётов и визуализации
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let dA2_1_X; // начальная координата вектора dA2 по оси X
let dA2_2_X; // конечная координата вектора dA2 по оси X
let dA2_1_Y; // начальная координата вектора dA2 по оси Y
let dA2_2_Y; // конечная координата вектора dA2 по оси Y
let A2_phase_X; // угол наклона вектора A2 к оси X
let A2_phase_Y; // угол наклона вектора A2 к оси Y
let A2_1_X; // начальная координата вектора A2 по оси X
let A2_2_X; // конечная координата вектора A2 по оси X
let A2_1_Y; // начальная координата вектора A2 по оси Y
let A2_2_Y; // конечная координата вектора A2 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time) + 0.1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP.acq_time, AUSP_pl.acq_time, pfc_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP.clear_harms_sets();
let __AUSP_tools = gtl.create_spec_tools(
{
data: AUSP_pl.data,
df: AUSP_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP = __AUSP_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP.name = "F1 (гарм. ряд част. вращ.)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_tools = gtl.create_spec_tools(
{
data: pfc_pl.data,
df: pfc_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row1_phase = __pfc_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row1_phase.name = "F1_phase (гарм. ряд част. вращ.)"; // название гармонического ряда
// Построение графиков
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации",
x: AUSP_pl.resolution,
y: AUSP_pl.data,
spec_tools: __AUSP_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ",
x: pfc_pl.resolution,
y: pfc_pl.data,
spec_tools: __pfc_tools.to_json()
});
let __result1 = __AUSP_tools.to_json();
let __result2 = __pfc_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 F1_1_ph = __result2.harms.rows[0].harms[0].ampl;
// Проверка наличия оборотной гармоники и необходимости проведения баалнсировки
var test_balance = ""; // переменная для текста о необходимости проведения балансировки
if (F1_1_a >= RMS * 0.4) // вклад оборотной гармоники в СКЗ
{test_balance = "необходимо провести балансировку";}
else {test_balance = "проведение балансировки не требуется или нецелесообразно";}
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 3 - контрольный пуск:
// измерение вибрации A2 после установки балансировочного груза
// определение целесообразности проведения добалансировки
// из предыдущих шагов переносятся: амплитуда и фаза вибрации A1
// построение графика вибрации A1, A2 и dA2
// Определение конечных значений переменных
// A2 вибрация после установки балансировочного груза
if (A2_ != 0) {A2 = A2_} // принимает значение из опций
else {A2 = F1_1_a} // принимает значение из спектра сигнала
if (A2_phase_ != 0) {A2_phase = A2_phase_} // принимает значение из опций
else {A2_phase = F1_1_ph} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора A2 к осям X и Y
if (A2_phase <= 90) {
A2_phase_X = 90 - A2_phase}
if (A2_phase <= 180) {
A2_phase_X = A2_phase - 90}
if (A2_phase <= 270) {
A2_phase_X = 270 - A2_phase}
if (A2_phase <= 360) {
A2_phase_X = A2_phase - 270}
if (A2_phase <= 90) {
A2_phase_Y = A2_phase}
if (A2_phase <= 180) {
A2_phase_Y = 180 - A2_phase}
if (A2_phase <= 270) {
A2_phase_Y = A2_phase - 180}
if (A2_phase <= 360) {
A2_phase_Y = 360 - A2_phase}
// определение координат вектора A2
var xA2_array = []; // массив координат точек вектора A2 по оси X
var yA2_array = []; // массив координат точек вектора A2 по оси Y
A2_1_X = 0;
if (A2_phase <= 180) {A2_2_X = Math.abs(Math.cos(A2_phase_X * 3.1415/180)) * A2
} else {A2_2_X = Math.abs(Math.cos(A2_phase_X * 3.1415/180)) * A2 * (-1)}
A2_1_Y = 0;
if (A2_phase <= 90 || A2_phase >= 270) {A2_2_Y = Math.abs(Math.cos(A2_phase_Y * 3.1415/180)) * A2
} else {A2_2_Y = Math.abs(Math.cos(A2_phase_Y * 3.1415/180)) * A2 * (-1)}
xA2_array[0] = A2_1_X;
xA2_array[1] = A2_2_X;
yA2_array[0] = A2_1_Y;
yA2_array[1] = A2_2_Y;
// определение модуля вектора dA2
var xdA2_array = []; // массив координат точек вектора dA2 по оси X
var ydA2_array = []; // массив координат точек вектора dA2 по оси Y
dA2_1_X = A0_2_X;
dA2_2_X = A2_2_X;
dA2_1_Y = A0_2_Y;
dA2_2_Y = A2_2_Y;
dA2 = Math.sqrt(Math.pow(dA2_2_X - dA2_1_X, 2) + Math.pow(dA2_2_Y - dA2_1_Y, 2))
xdA2_array[0] = dA2_1_X;
xdA2_array[1] = dA2_2_X;
ydA2_array[0] = dA2_1_Y;
ydA2_array[1] = dA2_2_Y;
// определение фазы вектора dA2
if ((dA2_2_Y < dA2_1_Y) && (dA2_2_X < dA2_1_X)) {
dA2_phase = 180 + (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / 3.1415)}
if ((dA2_2_Y > dA2_1_Y) && (dA2_2_X > dA2_1_X)) {
dA2_phase = (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / 3.1415)}
if ((dA2_2_Y > dA2_1_Y) && (dA2_2_X < dA2_1_X)) {
dA2_phase = 360 - (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / 3.1415)}
if ((dA2_2_Y < dA2_1_Y) && (dA2_2_X > dA2_1_X)) {
dA2_phase = 180 - (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / 3.1415)}
if (dA2_phase > 360) {dA2_phase = dA2_phase - 360}
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A2",
x: xA2_array,
y: yA2_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA2",
x: xdA2_array,
y: ydA2_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), -(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2)],
y: [(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), -(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), -(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2)]
});
gtl.log.info("RMS",RMS.value);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("A2",A2);
gtl.log.info("A2_phase",A2_phase);
gtl.log.info("F1_1_ph (фаза)",F1_1_ph);
gtl.log.info("F1_1_a (ампл)",F1_1_a);
gtl.log.info("F1_1_f (част)",F1_1_f);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Необходимость проведения балансировки",test_balance);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
// Выдача результата (results)
let __result = {
_001астотаращения_F1: freq.value,
_002_Ампл_вибр_пуска_A0: A0,
_003аза_вибр_пуска_A0: A0_phase,
_004_Ампл_вибр_пуска_A2: A2,
_005аза_вибр_пуска_A2: A2_phase,
_006_СКЗ_вибрации: RMS.value,
_007_Нестабастращ: instability*100,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

View File

@ -0,0 +1,594 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ с фазой (использование ДКВ) *****
// ***********************************************************************************
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектр виброскорости"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбаланса"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let R = gtl.options.customOptions.R; // радиус установки грузов, мм ** (для вычисления массы пробного груза)
let P = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
let G = gtl.options.customOptions.G; // класс точности балансировки, мм/с ** (ГОСТ 1940)
let n = gtl.options.customOptions.n; // скорость вращения, об/мин ** (для вычисления массы пробного груза и допустимого остаточного дисбаланса)
let U_per; // допустимый остаточный дисбаланс *** (ГОСТ 1940)
let U_res2; // остаточный дисбаланс (после балансировки) *** (ГОСТ 1940)
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0 = A0_; // модуль вектора начальной вибрации */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации */** (конечное значение)
let A1_ = gtl.options.customOptions.A1; // модуль вектора вибрации после установки пробного груза */**
let A1 = A1_; // модуль вектора вибрации после установки пробного груза */** (конечное значение)
let A1_phase_ = gtl.options.customOptions.A1_phase; // фаза вектора вибрации после установки пробного груза */**
let A1_phase = A1_phase_; // фаза вектора вибрации после установки пробного груза */** (конечное значение)
let dA; // модуль вектора дельты вибрации после установки пробного груза ***
let dA_phase; // фаза вектора дельты вибрации после установки пробного груза ***
let A2_ = gtl.options.customOptions.A2; // модуль вектора вибрации после установки балансировочного груза */**
let A2 = A2_; // модуль вектора вибрации после установки балансировочного груза */** (конечное значение)
let A2_phase_ = gtl.options.customOptions.A2_phase; // фаза вектора вибрации после установки балансировочного груза */**
let A2_phase = A2_phase_; // фаза вектора вибрации после установки балансировочного груза */** (конечное значение)
let dA2; // модуль вектора дельты вибрации после установки пробного груза ***
let dA2_phase; // фаза вектора дельты вибрации после установки пробного груза ***
let DCI_ = gtl.options.customOptions.DCI; // модуль (мм/с/граммы) динамического коэффициента влияния **/***
let DCI = DCI_; // модуль (мм/с/граммы) динамического коэффициента влияния **/*** (конечное значение)
let DCI_phase_ = gtl.options.customOptions.DCI_phase; // фаза динамического коэффициента влияния **/***
let DCI_phase = DCI_phase_; // фаза динамического коэффициента влияния **/*** (конечное значение)
let Mb_calc = gtl.options.customOptions.Mb_calc; // масса расчётного балансировочного груза **/*** (конечное значение)
let Mb_corner_calc = gtl.options.customOptions.Mb_corner_calc; // угол расчётного балансировочного груза **/*** (конечное значение)
let Mb = gtl.options.customOptions.Mb; // масса применённого балансировочного груза **/*** (конечное значение)
let Mb_corner = gtl.options.customOptions.Mb_corner; // угол применённого балансировочного груза **/*** (конечное значение)
let Mdisb = gtl.options.customOptions.Mdisb; // масса дисбаланса **/*** (конечное значение)
let Mdisb_corner = gtl.options.customOptions.Mdisb_corner; // угол дисбаланса **/*** (конечное значение)
let Mb2_calc; // модуль расчётного вектора балансировочного груза для добалансировки **/*** (конечное значение)
let Mb2_corner_calc; // угол расчётного вектора балансировочного груза для добалансировки **/*** (конечное значение)
let Mdisb2; // масса остаточного дисбаланса **/***
let Mdisb2_corner; // угол расположения остаточного дисбаланса **/***
// Переменные вспомогательные необходимые для расчётов и визуализации
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let dA2_1_X; // начальная координата вектора dA2 по оси X
let dA2_2_X; // конечная координата вектора dA2 по оси X
let dA2_1_Y; // начальная координата вектора dA2 по оси Y
let dA2_2_Y; // конечная координата вектора dA2 по оси Y
let A2_phase_X; // угол наклона вектора A2 к оси X
let A2_phase_Y; // угол наклона вектора A2 к оси Y
let A2_1_X; // начальная координата вектора A2 по оси X
let A2_2_X; // конечная координата вектора A2 по оси X
let A2_1_Y; // начальная координата вектора A2 по оси Y
let A2_2_Y; // конечная координата вектора A2 по оси Y
let Mb_corner_calc_X; // угол наклона расчётного вектора Mb_calc к оси X
let Mb_corner_calc_Y; // угол наклона расчётного вектора Mb_calc к оси Y
let Mb_1_calc_X; // начальная координата расчётного вектора Mb_calc по оси X
let Mb_2_calc_X; // конечная координата расчётного вектора Mb_calc по оси X
let Mb_1_calc_Y; // начальная координата расчётного вектора Mb_calc по оси Y
let Mb_2_calc_Y; // конечная координата расчётного вектора Mb_calc по оси Y
let Mb_corner_X; // угол наклона вектора Mb к оси X
let Mb_corner_Y; // угол наклона вектора Mb к оси Y
let Mb_1_X; // начальная координата вектора Mb по оси X
let Mb_2_X; // конечная координата вектора Mb по оси X
let Mb_1_Y; // начальная координата вектора Mb по оси Y
let Mb_2_Y; // конечная координата вектора Mb по оси Y
let Mdisb_corner_X;// угол наклона вектора Mdisb к оси X
let Mdisb_corner_Y;// угол наклона вектора Mdisb к оси Y
let Mdisb_1_X; // начальная координата вектора Mdisb по оси X
let Mdisb_2_X; // конечная координата вектора Mdisb по оси X
let Mdisb_1_Y; // начальная координата вектора Mdisb по оси Y
let Mdisb_2_Y; // конечная координата вектора Mdisb по оси Y
let Mb2_corner_calc_X; // угол наклона расчётного вектора Mb2 к оси X
let Mb2_corner_calc_Y; // угол наклона расчётного вектора Mb2 к оси Y
let Mb2_1_calc_X; // начальная координата расчётного вектора Mb2 по оси X
let Mb2_2_calc_X; // конечная координата расчётного вектора Mb2 по оси X
let Mb2_1_calc_Y; // начальная координата расчётного вектора Mb2 по оси Y
let Mb2_2_calc_Y; // конечная координата расчётного вектора Mb2 по оси Y
let Mdisb2_corner_X;// угол наклона вектора Mdisb2 к оси X
let Mdisb2_corner_Y;// угол наклона вектора Mdisb2 к оси Y
let Mdisb2_1_X; // начальная координата вектора Mdisb2 по оси X
let Mdisb2_2_X; // конечная координата вектора Mdisb2 по оси X
let Mdisb2_1_Y; // начальная координата вектора Mdisb2 по оси Y
let Mdisb2_2_Y; // конечная координата вектора Mdisb2 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
// gtl.diagnostic.interval = Math.max(AUSPv.acq_time, AUSPv_pl.acq_time) + 0.1;
gtl.diagnostic.interval = gtl.acq_time + 1;
// let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 4 - отчёт о проведённых операциях:
// из предыдущих шагов переносится:
// амплитуда и фаза начальной вибрации A0,
// вибрации после установки балансировочного груза A2,
// масса и угол расположения дисбаланса Mdisb
// масса и угол расположения расчётного балансировочного груза Mb_calc
// масса и угол расположения выбранного балансировочного груза Mb
// масса и угол расположения остаточного дисбаланса Mdisb2
// построение графика вибрации: A0, A2 и dA2
// построение графиков расположения дисбалансов и балансировочных грузов: Mb_calc, Mb, Mdisb, Mb2_calc, Mdisb2
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора A2 к осям X и Y
if (A2_phase <= 90) {
A2_phase_X = 90 - A2_phase}
if (A2_phase <= 180) {
A2_phase_X = A2_phase - 90}
if (A2_phase <= 270) {
A2_phase_X = 270 - A2_phase}
if (A2_phase <= 360) {
A2_phase_X = A2_phase - 270}
if (A2_phase <= 90) {
A2_phase_Y = A2_phase}
if (A2_phase <= 180) {
A2_phase_Y = 180 - A2_phase}
if (A2_phase <= 270) {
A2_phase_Y = A2_phase - 180}
if (A2_phase <= 360) {
A2_phase_Y = 360 - A2_phase}
// определение координат вектора A2
var xA2_array = []; // массив координат точек вектора A2 по оси X
var yA2_array = []; // массив координат точек вектора A2 по оси Y
A2_1_X = 0;
if (A2_phase <= 180) {A2_2_X = Math.abs(Math.cos(A2_phase_X * Math.PI/180)) * A2
} else {A2_2_X = Math.abs(Math.cos(A2_phase_X * Math.PI/180)) * A2 * (-1)}
A2_1_Y = 0;
if (A2_phase <= 90 || A2_phase >= 270) {A2_2_Y = Math.abs(Math.cos(A2_phase_Y * Math.PI/180)) * A2
} else {A2_2_Y = Math.abs(Math.cos(A2_phase_Y * Math.PI/180)) * A2 * (-1)}
xA2_array[0] = A2_1_X;
xA2_array[1] = A2_2_X;
yA2_array[0] = A2_1_Y;
yA2_array[1] = A2_2_Y;
// определение модуля вектора dA2
var xdA2_array = []; // массив координат точек вектора dA2 по оси X
var ydA2_array = []; // массив координат точек вектора dA2 по оси Y
dA2_1_X = A0_2_X;
dA2_2_X = A2_2_X;
dA2_1_Y = A0_2_Y;
dA2_2_Y = A2_2_Y;
dA2 = Math.sqrt(Math.pow(dA2_2_X - dA2_1_X, 2) + Math.pow(dA2_2_Y - dA2_1_Y, 2))
xdA2_array[0] = dA2_1_X;
xdA2_array[1] = dA2_2_X;
ydA2_array[0] = dA2_1_Y;
ydA2_array[1] = dA2_2_Y;
// определение фазы вектора dA2
if ((dA2_2_Y < dA2_1_Y) && (dA2_2_X < dA2_1_X)) {
dA2_phase = 180 + (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / Math.PI)}
if ((dA2_2_Y > dA2_1_Y) && (dA2_2_X > dA2_1_X)) {
dA2_phase = (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / Math.PI)}
if ((dA2_2_Y > dA2_1_Y) && (dA2_2_X < dA2_1_X)) {
dA2_phase = 360 - (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / Math.PI)}
if ((dA2_2_Y < dA2_1_Y) && (dA2_2_X > dA2_1_X)) {
dA2_phase = 180 - (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / Math.PI)}
if (dA2_phase > 360) {dA2_phase = dA2_phase - 360}
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Дисбаланс и балансировочный груз ДО балансировки (Mb,Mb_calc,Mdisb)
// определение угла наклона вектора балансировочного груза Mb_calc к осям X и Y
if (Mb_corner_calc <= 90) {
Mb_corner_calc_X = 90 - Mb_corner_calc}
if (Mb_corner_calc <= 180) {
Mb_corner_calc_X = Mb_corner_calc - 90}
if (Mb_corner_calc <= 270) {
Mb_corner_calc_X = 270 - Mb_corner_calc}
if (Mb_corner_calc <= 360) {
Mb_corner_calc_X = Mb_corner_calc - 270}
if (Mb_corner_calc <= 90) {
Mb_corner_calc_Y = Mb_corner_calc}
if (Mb_corner_calc <= 180) {
Mb_corner_calc_Y = 180 - Mb_corner_calc}
if (Mb_corner_calc <= 270) {
Mb_corner_calc_Y = Mb_corner_calc - 180}
if (Mb_corner_calc <= 360) {
Mb_corner_calc_Y = 360 - Mb_corner_calc}
// определение координат вектора балансировочного груза Mb_calc
Mb_1_calc_X = 0;
if (Mb_corner_calc <= 180) {Mb_2_calc_X = Math.abs(Math.cos(Mb_corner_calc_X * Math.PI/180)) * Mb_calc * (-1)
} else {Mb_2_calc_X = Math.abs(Math.cos(Mb_corner_calc_X * Math.PI/180)) * Mb_calc}
Mb_1_calc_Y = 0;
if (Mb_corner_calc <= 90 || Mb_corner_calc >= 270) {Mb_2_calc_Y = Math.abs(Math.cos(Mb_corner_calc_Y * Math.PI/180)) * Mb_calc
} else {Mb_2_calc_Y = Math.abs(Math.cos(Mb_corner_calc_Y * Math.PI/180)) * Mb_calc * (-1)}
// определение угла наклона вектора балансировочного груза Mb к осям X и Y
if (Mb_corner <= 90) {
Mb_corner_X = 90 - Mb_corner}
if (Mb_corner <= 180) {
Mb_corner_X = Mb_corner - 90}
if (Mb_corner <= 270) {
Mb_corner_X = 270 - Mb_corner}
if (Mb_corner <= 360) {
Mb_corner_X = Mb_corner - 270}
if (Mb_corner <= 90) {
Mb_corner_Y = Mb_corner}
if (Mb_corner <= 180) {
Mb_corner_Y = 180 - Mb_corner}
if (Mb_corner <= 270) {
Mb_corner_Y = Mb_corner - 180}
if (Mb_corner <= 360) {
Mb_corner_Y = 360 - Mb_corner}
// определение координат вектора балансировочного груза Mb
Mb_1_X = 0;
if (Mb_corner <= 180) {Mb_2_X = Math.abs(Math.cos(Mb_corner_X * Math.PI/180)) * Mb * (-1)
} else {Mb_2_X = Math.abs(Math.cos(Mb_corner_X * Math.PI/180)) * Mb}
Mb_1_Y = 0;
if (Mb_corner <= 90 || Mb_corner >= 270) {Mb_2_Y = Math.abs(Math.cos(Mb_corner_Y * Math.PI/180)) * Mb
} else {Mb_2_Y = Math.abs(Math.cos(Mb_corner_Y * Math.PI/180)) * Mb * (-1)}
// определение угла наклона вектора дисбаланса Mdisb к осям X и Y
if (Mdisb_corner <= 90) {
Mdisb_corner_X = 90 - Mdisb_corner}
if (Mdisb_corner <= 180) {
Mdisb_corner_X = Mdisb_corner - 90}
if (Mdisb_corner <= 270) {
Mdisb_corner_X = 270 - Mdisb_corner}
if (Mdisb_corner <= 360) {
Mdisb_corner_X = Mdisb_corner - 270}
if (Mdisb_corner <= 90) {
Mdisb_corner_Y = Mdisb_corner}
if (Mdisb_corner <= 180) {
Mdisb_corner_Y = 180 - Mdisb_corner}
if (Mdisb_corner <= 270) {
Mdisb_corner_Y = Mdisb_corner - 180}
if (Mdisb_corner <= 360) {
Mdisb_corner_Y = 360 - Mdisb_corner}
// определение координат вектора дисбаланса Mdisb
Mdisb_1_X = 0;
if (Mdisb_corner <= 180) {Mdisb_2_X = Math.abs(Math.cos(Mdisb_corner_X * Math.PI/180)) * Mdisb * (-1)
} else {Mdisb_2_X = Math.abs(Math.cos(Mdisb_corner_X * Math.PI/180)) * Mdisb}
Mdisb_1_Y = 0;
if (Mdisb_corner <= 90 || Mdisb_corner >= 270) {Mdisb_2_Y = Math.abs(Math.cos(Mdisb_corner_Y * Math.PI/180)) * Mdisb
} else {Mdisb_2_Y = Math.abs(Math.cos(Mdisb_corner_Y * Math.PI/180)) * Mdisb * (-1)}
// Дисбаланс и балансировочный груз ПОСЛЕ балансировки (Mb2, Mdisb2)
// определение модуля вектора Mb2
Mb2_calc = A2 / DCI;
// определение угла вектора Mb
if ((A2_phase - DCI_phase + 180) < 360) {
Mb2_corner_calc = (A2_phase - DCI_phase + 180)
} else {Mb2_corner_calc = (A2_phase - DCI_phase + 180) - 360}
// определение угла наклона вектора балансировочного груза Mb2 к осям X и Y
if (Mb2_corner_calc <= 90) {
Mb2_corner_calc_X = 90 - Mb2_corner_calc}
if (Mb2_corner_calc <= 180) {
Mb2_corner_calc_X = Mb2_corner_calc - 90}
if (Mb2_corner_calc <= 270) {
Mb2_corner_calc_X = 270 - Mb2_corner_calc}
if (Mb2_corner_calc <= 360) {
Mb2_corner_calc_X = Mb2_corner_calc - 270}
if (Mb2_corner_calc <= 90) {
Mb2_corner_calc_Y = Mb2_corner_calc}
if (Mb2_corner_calc <= 180) {
Mb2_corner_calc_Y = 180 - Mb2_corner_calc}
if (Mb2_corner_calc <= 270) {
Mb2_corner_calc_Y = Mb2_corner_calc - 180}
if (Mb2_corner_calc <= 360) {
Mb2_corner_calc_Y = 360 - Mb2_corner_calc}
// определение координат вектора балансировочного груза Mb2
Mb2_1_calc_X = 0;
if (Mb2_corner_calc <= 180) {Mb2_2_calc_X = Math.abs(Math.cos(Mb2_corner_calc_X * Math.PI/180)) * Mb2_calc * (-1)
} else {Mb2_2_calc_X = Math.abs(Math.cos(Mb2_corner_calc_X * Math.PI/180)) * Mb2_calc}
Mb2_1_calc_Y = 0;
if (Mb2_corner_calc <= 90 || Mb2_corner_calc >= 270) {Mb2_2_calc_Y = Math.abs(Math.cos(Mb2_corner_calc_Y * Math.PI/180)) * Mb2_calc
} else {Mb2_2_calc_Y = Math.abs(Math.cos(Mb2_corner_calc_Y * Math.PI/180)) * Mb2_calc * (-1)}
// определение массы дисбаланса 2
Mdisb2 = Mb2_calc; // равен массе балансировочного груз
// определение угла расположения дисбаланса 2
if ((Mb2_corner_calc + 180) > 360) {
Mdisb2_corner = (Mb2_corner_calc + 180) - 360}
else if ((Mb2_corner_calc + 180) < 0) {
Mdisb2_corner = (Mb2_corner_calc + 180) + 360}
else {Mdisb2_corner = (Mb2_corner_calc + 180)}
// определение угла наклона вектора дисбаланса Mdisb2 к осям X и Y
if (Mdisb2_corner <= 90) {
Mdisb2_corner_X = 90 - Mdisb2_corner}
if (Mdisb2_corner <= 180) {
Mdisb2_corner_X = Mdisb2_corner - 90}
if (Mdisb2_corner <= 270) {
Mdisb2_corner_X = 270 - Mdisb2_corner}
if (Mdisb2_corner <= 360) {
Mdisb2_corner_X = Mdisb2_corner - 270}
if (Mdisb2_corner <= 90) {
Mdisb2_corner_Y = Mdisb2_corner}
if (Mdisb2_corner <= 180) {
Mdisb2_corner_Y = 180 - Mdisb2_corner}
if (Mdisb2_corner <= 270) {
Mdisb2_corner_Y = Mdisb2_corner - 180}
if (Mdisb2_corner <= 360) {
Mdisb2_corner_Y = 360 - Mdisb2_corner}
// определение координат вектора дисбаланса Mdisb2
Mdisb2_1_X = 0;
if (Mdisb2_corner <= 180) {Mdisb2_2_X = Math.abs(Math.cos(Mdisb2_corner_X * Math.PI/180)) * Mdisb2 * (-1)
} else {Mdisb2_2_X = Math.abs(Math.cos(Mdisb2_corner_X * Math.PI/180)) * Mdisb2}
Mdisb2_1_Y = 0;
if (Mdisb2_corner <= 90 || Mdisb2_corner >= 270) {Mdisb2_2_Y = Math.abs(Math.cos(Mdisb2_corner_Y * Math.PI/180)) * Mdisb2
} else {Mdisb2_2_Y = Math.abs(Math.cos(Mdisb2_corner_Y * Math.PI/180)) * Mdisb2 * (-1)}
// Координаты масс для визуализации
// определение координат точек окружности обозначения массы балансировочного груза Mb_calc
var x_Mb_calc_array = []; // массив координат точек окружности Mb_calc по оси X
var y_Mb_calc_array = []; // массив координат точек окружности Mb_calc по оси Y
var x0_Mb_calc = Mb_2_calc_X; // центр по X
var y0_Mb_calc = Mb_2_calc_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mb_calc_array.push(x0_Mb_calc + (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mb_calc_array.push(y0_Mb_calc + (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы балансировочного груза Mb
var x_Mb_array = []; // массив координат точек окружности Mb по оси X
var y_Mb_array = []; // массив координат точек окружности Mb по оси Y
var x0_Mb = Mb_2_X; // центр по X
var y0_Mb = Mb_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mb_array.push(x0_Mb + (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mb_array.push(y0_Mb + (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы дисбаланса Mdisb
var x_Mdisb_array = []; // массив координат точек окружности Mdisb по оси X
var y_Mdisb_array = []; // массив координат точек окружности Mdisb по оси Y
var x0_Mdisb = Mdisb_2_X; // центр по X
var y0_Mdisb = Mdisb_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mdisb_array.push(x0_Mdisb + (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mdisb_array.push(y0_Mdisb + (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы балансировочного груза Mb2
var x_Mb2_calc_array = []; // массив координат точек окружности Mb2 по оси X
var y_Mb2_calc_array = []; // массив координат точек окружности Mb2 по оси Y
var x0_Mb2_calc = Mb2_2_calc_X; // центр по X
var y0_Mb2_calc = Mb2_2_calc_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mb2_calc_array.push(x0_Mb2_calc + (Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mb2_calc_array.push(y0_Mb2_calc + (Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности обозначения массы дисбаланса Mdisb2
var x_Mdisb2_array = []; // массив координат точек окружности Mdisb2 по оси X
var y_Mdisb2_array = []; // массив координат точек окружности Mdisb2 по оси Y
var x0_Mdisb2 = Mdisb2_2_X; // центр по X
var y0_Mdisb2 = Mdisb2_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_Mdisb2_array.push(x0_Mdisb2 + (Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_Mdisb2_array.push(y0_Mdisb2 + (Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности графика для отображения расположения дисбаланса
var xD_array = []; // массив координат точек окружности D по оси X
var yD_array = []; // массив координат точек окружности D по оси Y
var x0D = 0; // центр в начале координат
var y0D = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xD_array.push(x0D + (Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2)+Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2)*0.1) * (Math.sin((i) * Math.PI / 180)));
yD_array.push(y0D + (Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2)+Math.max(Mb_calc,Mb,Mdisb,Mb2_calc,Mdisb2)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Вычисление допустимого остаточного дисбаланса
U_per = (1000 * (G * P)) / (Math.PI * n / 30);
// Остаточный дисбаланс
U_res2 = Mdisb2 * R;
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A2",
x: xA2_array,
y: yA2_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA2",
x: xdA2_array,
y: ydA2_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), -(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2)],
y: [(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), -(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), -(Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2), (Math.max(A0,A2,dA2)+Math.max(A0,A2,dA2)*0.2)]
});
plot_disb.add(
{
color: 0x0fae1a,
name: "Балансировочный груз расчёт",
x: x_Mb_calc_array,
y: y_Mb_calc_array,
});
plot_disb.add(
{
color: 0x00ff00,
name: "Балансировочный груз",
x: x_Mb_array,
y: y_Mb_array,
});
plot_disb.add(
{
color: 0xff0000,
name: "Дисбаланс",
x: x_Mdisb_array,
y: y_Mdisb_array,
});
plot_disb.add(
{
color: 0x00ddff,
name: "Балансировочный груз для добалансировки",
x: x_Mb2_calc_array,
y: y_Mb2_calc_array,
});
plot_disb.add(
{
color: 0xff3dcc,
name: "Дисбаланс остаточный после балансировки",
x: x_Mdisb2_array,
y: y_Mdisb2_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "График расположения дисбаланса",
x: xD_array,
y: yD_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.2), -(Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.2), (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.2), (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.2)],
y: [(Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.2), -(Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.2), -(Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.2), (Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)+Math.max(Mb,Mb_calc,Mdisb,Mb2_calc,Mdisb2)*0.2)]
});
gtl.log.info("Mb (балансировочный груз)",Mb);
gtl.log.info("Mb_corner (угол установки груза)",Mb_corner);
gtl.log.info("Mb_calc (балансировочный груз расчёт)",Mb_calc);
gtl.log.info("Mb_corner_calc (угол установки груза расчёт)",Mb_corner_calc);
gtl.log.info("Mdisb (дисбаланс)",Mdisb);
gtl.log.info("Mdisb_corner (угол расположения дисбаланса)",Mdisb_corner);
gtl.log.info("Mb2_calc (балансировочный груз 2)",Mb2_calc);
gtl.log.info("Mb2_corner_calc (угол установки груза 2)",Mb2_corner_calc);
gtl.log.info("Mdisb2 (дисбаланс 2)",Mdisb2);
gtl.log.info("Mdisb2_corner (угол расположения дисбаланса 2)",Mdisb2_corner);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("A2",A2);
gtl.log.info("A2_phase",A2_phase);
gtl.log.info("Допустимый остаточный дисбаланс", U_per);
gtl.log.info("Остаточный дисбаланс (после балансировки)", U_res2);
// Выдача результата (results)
let __result = {
_001астращ_обмин: n,
_002_Ампл_вибр_пуска_A0: A0,
_003аза_вибр_пуска_A0: A0_phase,
_004_Ампл_вибр_пуска_A2: A2,
_005аза_вибр_пуска_A2: A2_phase,
_006_Масса_дисбаланса: Mdisb,
_007_Угол_дисбаланса: Mdisb_corner,
_008_Масса_баланс_груза: Mb,
_009_Угол_баланс_груза: Mb_corner,
_010_Масса_баланс_груза_расч: Mb_calc,
_011_Угол_баланс_груза_расч: Mb_corner_calc,
_012_Масса_дисбаланса_2: Mdisb2,
_013_Угол_дисбаланса_2: Mdisb2_corner,
_014_Масса_баланс_груза_2: Mb2_calc,
_015_Угол_баланс_груза_2: Mb2_corner_calc,
_016_МодульКВ: DCI,
_017азаКВ: DCI_phase,
_018опуст_ост_дисб_г_мм: U_per,
_019_Остат_дисб_после_г_мм: U_res2
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
// break;
// default:
// break;
// }
}

View File

@ -0,0 +1,77 @@
"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 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ БЕЗ ФАЗЫ *****
// ****************************************************************
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль вектора) - граммы
// 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 U_per; // допустимый остаточный дисбаланс *** (ГОСТ 1940)
let G = gtl.options.customOptions.G; // класс точности балансировки, мм/с ** (ГОСТ 1940)
// ***** РАСЧЁТЫ *****
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
// FREQ_0 введённое значение частоты вращения
if (n != 0) {FREQ_0 = n / 60} // принимает значение из опций
else {FREQ_0 = false} // принимает значение false
// R радиус установки грузов, мм
if (R_ != 0) {R = R_} // принимает значение из опций
else {R = false} // принимает значение false
// P масса ротора, грамм
if (P_ != 0) {P = P_} // принимает значение из опций
else {P = false} // принимает значение false
// Вычисление допустимого остаточного дисбаланса
U_per = (1000 * (G * P)) / (Math.PI * n / 30);
gtl.log.info("Частота вращения, Гц", P);
gtl.log.info("Масса ротора, кг", P);
gtl.log.info("Радиус установки грузов, мм", R);
// Выдача результата (results)
let __result = {
_001астотаращения_Гц: FREQ_0,
_002_Радиус_установки_грузов_мм: R,
_003_Масса_ротораг: P,
_004опуст_ост_дисб_г_мм: U_per,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

@ -0,0 +1,221 @@
"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();
}

View File

@ -0,0 +1,81 @@
"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 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ БЕЗ ФАЗЫ *****
// ****************************************************************
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль вектора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let m_test_ = gtl.options.customOptions.m_test; // модуль вектора пробного груза **
let m_test; // модуль вектора пробного груза ** (конечное значение)
var m_test_calc; // масса пробного груза расчётная ***
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 A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0 = A0_; // модуль вектора начальной вибрации */** (конечное значение)
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
// Вычисление массы пробного груза (если не введено своё значение и есть данные для формулы)
// m_test масса пробного груза
if (P != 0 && R != 0 && n != 0)
{m_test_calc = 804 * ((P * A0) / (R/10 * n)); // R/10 - перевод мм в см
} else {m_test_calc = 0}
if (m_test_ != 0) {m_test = m_test_} // принимает значение из опций
else {m_test = 0} // значение не введено
gtl.log.info("m_test (пробный груз введёный)",m_test);
gtl.log.info("m_test_calc (пробный груз расчётный)",m_test_calc);
gtl.log.info("Масса ротора, кг", P);
gtl.log.info("Радиус установки грузов, мм", R);
gtl.log.info("Начальная вибрация A0",A0);
gtl.log.info("Частота вращения, Гц", FREQ_0);
// Выдача результата (results)
let __result = {
_001римен_пробный_груз: m_test,
_002_Расч_пробный_груз: m_test_calc
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

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

View File

@ -0,0 +1,251 @@
"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();
}

View File

@ -0,0 +1,273 @@
"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();
}

View File

@ -0,0 +1,405 @@
"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();
}

View File

@ -0,0 +1,172 @@
"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("Спектр виброскорости"); // создание объекта для спектра
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль вектора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let n = gtl.options.customOptions.n; // скорость вращения, об/мин ** (для вычисления массы пробного груза)
let FREQ_0 = n / 60; // частота вращения, об/мин *** (для определения амплитуды оборотной гармоники)
let A; // вибрация контрольного пуска
let A_ = gtl.options.customOptions.A; // модуль вектора вибрации после установки балансировочного груза */**
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSPv.acq_time, AUSPv_pl.acq_time) + 0.1;
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;
// Определение конечных значений переменных
// A вибрация контрольного пуска
if (A_ != 0) {A = A_} // принимает значение из опций
else if (FREQ_0 == 0) {A = RMSv_2_1000.value} // принимает СКЗv
else {A = F1_1_a} // принимает значение 1-й гармоники из спектра сигнала
gtl.log.info("RMSv_2_1000",RMSv_2_1000.value);
gtl.log.info("Вибрация контрольного пуска A",A);
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_Вибрацияонтр_пуска_A: A
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

@ -0,0 +1,106 @@
"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 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ОДНА ПЛОСКОСТЬ БЕЗ ФАЗЫ *****
// ****************************************************************
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль вектора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
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 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 A_ = gtl.options.customOptions.A; // модуль вектора начальной вибрации */**
let A = A_; // вибрация контрольного пуска
let Mb = gtl.options.customOptions.Mb; // масса балансировочного груза ***
let Mb_corner = gtl.options.customOptions.Mb_corner; // угол установки балансировочного груза ***
let Mdisb = gtl.options.customOptions.Mdisb; // масса дисбаланса ***
let Mdisb_corner = gtl.options.customOptions.Mdisb_corner; // угол расположения дисбаланса ***
let m_test = gtl.options.customOptions.m_test; // модуль вектора пробного груза **
let m_test_calc = gtl.options.customOptions.m_test_calc; // масса пробного груза расчётная ***
let U_per; // допустимый остаточный дисбаланс *** (ГОСТ 1940)
let U_res2; // остаточный дисбаланс (после балансировки) *** (ГОСТ 1940)
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
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("Вибрация контрольного пуска A",A);
gtl.log.info("Масса ротора, гр", P);
gtl.log.info("Радиус установки грузов, мм", R);
gtl.log.info("Применённый пробный груз",m_test);
gtl.log.info("Расчётный пробный груз",m_test_calc);
gtl.log.info("Масса балансировочного груза",Mb);
gtl.log.info("Угол установки балансировочного груза",Mb_corner);
gtl.log.info("Угол расположения дисбаланса",Mdisb_corner);
gtl.log.info("Частота вращения, Гц", FREQ_0);
// Выдача результата (results)
let __result = {
_001_Начальная_вибрация_A0: A0,
_002_Вибрация_пробного_пуска_A1: A1,
_003_Вибрация_пробного_пуска_A2: A2,
_004_Вибрация_пробного_пуска_A3: A3,
_005_Вибрацияонтрольного_пуска_A: A,
_006_Масса_ротораг: P,
_007_Радиус_установки_грузов_мм: R,
_008рименённый_пробный_груз: m_test,
_009_Расчётный_пробный_груз: m_test_calc,
_010_Масса_балансировочного_груза: Mb,
_011_Угол_установки_балансировочного_груза: Mb_corner,
_012_Угол_расположения_дисбаланса: Mdisb_corner,
_013астотаращения_Гц: FREQ_0
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

@ -0,0 +1,93 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let R1_ = gtl.options.customOptions.R1; // радиус установки грузов на плоскости 1, мм ** (для вычисления массы пробного груза)
let R1; // радиус установки грузов на плоскости 1, мм ** (для вычисления массы пробного груза) (конечное значение)
let R2_ = gtl.options.customOptions.R2; // радиус установки грузов на плоскости 2, мм ** (для вычисления массы пробного груза)
let R2; // радиус установки грузов на плоскости 2, мм ** (для вычисления массы пробного груза) (конечное значение)
let P_ = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
let P; // масса ротора, кг ** (для вычисления массы пробного груза) (конечное значение)
let G = gtl.options.customOptions.G; // класс точности балансировки, мм/с ** (ГОСТ 1940)
let n = gtl.options.customOptions.n; // скорость вращения, об/мин ** (для вычисления массы пробного груза и допустимого остаточного дисбаланса)
let U_per; // допустимый остаточный дисбаланс *** (ГОСТ 1940)
let L_A = gtl.options.customOptions.L_A;// расстояние от центра масс до плоскости подшипника A
let L_B = gtl.options.customOptions.L_B;// расстояние от центра масс до плоскости подшипника B
let L = gtl.options.customOptions.L; // расстояние между подшипниковыми опорами
let b = gtl.options.customOptions.b; // расстояние между плоскостями коррекции
let b_A = gtl.options.customOptions.b_A;// расстояние от плоскости коррекции 1 до подшипниковой опоры A
let b_B = gtl.options.customOptions.b_B;// расстояние от плоскости коррекции 2 до подшипниковой опоры B
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 0 - ввод исходных данных:
// ввод исходных данных: радиус установки грузов, масса ротора
// ввод ДКВ (DCI), если он известен (необязателен для этого алгоритма)
// R1 радиус установки грузов на плоскости 1, мм
if (R1_ != 0) {R1 = R1_} // принимает значение из опций
else {R1 = false} // принимает значение false
// R2 радиус установки грузов на плоскости 2, мм
if (R2_ != 0) {R2 = R2_} // принимает значение из опций
else {R2 = false} // принимает значение false
// P масса ротора, г
if (P_ != 0) {P = P_} // принимает значение из опций
else {P = false} // принимает значение false
// Вычисление допустимого остаточного дисбаланса
U_per = (1000 * (G * P)) / (Math.PI * n / 30);
gtl.log.info("Масса ротора", P);
gtl.log.info("Радиус установки грузов на плоскости 1", R1);
gtl.log.info("Радиус установки грузов на плоскости 2", R2);
gtl.log.info("Допустимый остаточный дисбаланс", U_per);
// Выдача результата (results)
let __result = {
_001_Радиус_установки_грузов_пл1_мм: R1,
_002_Радиус_установки_грузов_пл2_мм: R2,
_003_Масса_ротораг: P,
_004опуст_ост_дисб_г_мм: U_per
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

@ -0,0 +1,93 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let R1_ = gtl.options.customOptions.R1; // радиус установки грузов на плоскости 1, мм ** (для вычисления массы пробного груза)
let R1; // радиус установки грузов на плоскости 1, мм ** (для вычисления массы пробного груза) (конечное значение)
let R2_ = gtl.options.customOptions.R2; // радиус установки грузов на плоскости 2, мм ** (для вычисления массы пробного груза)
let R2; // радиус установки грузов на плоскости 2, мм ** (для вычисления массы пробного груза) (конечное значение)
let P_ = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
let P; // масса ротора, кг ** (для вычисления массы пробного груза) (конечное значение)
let G = gtl.options.customOptions.G; // класс точности балансировки, мм/с ** (ГОСТ 1940)
let n = gtl.options.customOptions.n; // скорость вращения, об/мин ** (для вычисления массы пробного груза и допустимого остаточного дисбаланса)
let U_per; // допустимый остаточный дисбаланс *** (ГОСТ 1940)
let L_A = gtl.options.customOptions.L_A;// расстояние от центра масс до плоскости подшипника A
let L_B = gtl.options.customOptions.L_B;// расстояние от центра масс до плоскости подшипника B
let L = gtl.options.customOptions.L; // расстояние между подшипниковыми опорами
let b = gtl.options.customOptions.b; // расстояние между плоскостями коррекции
let b_A = gtl.options.customOptions.b_A;// расстояние от плоскости коррекции 1 до подшипниковой опоры A
let b_B = gtl.options.customOptions.b_B;// расстояние от плоскости коррекции 2 до подшипниковой опоры B
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 0 - ввод исходных данных:
// ввод исходных данных: радиус установки грузов, масса ротора
// ввод ДКВ (DCI), если он известен (необязателен для этого алгоритма)
// R1 радиус установки грузов на плоскости 1, мм
if (R1_ != 0) {R1 = R1_} // принимает значение из опций
else {R1 = false} // принимает значение false
// R2 радиус установки грузов на плоскости 2, мм
if (R2_ != 0) {R2 = R2_} // принимает значение из опций
else {R2 = false} // принимает значение false
// P масса ротора, г
if (P_ != 0) {P = P_} // принимает значение из опций
else {P = false} // принимает значение false
// Вычисление допустимого остаточного дисбаланса
U_per = (1000 * (G * P)) / (Math.PI * n / 30);
gtl.log.info("Масса ротора", P);
gtl.log.info("Радиус установки грузов на плоскости 1", R1);
gtl.log.info("Радиус установки грузов на плоскости 2", R2);
gtl.log.info("Допустимый остаточный дисбаланс", U_per);
// Выдача результата (results)
let __result = {
_001_Радиус_установки_грузов_пл1_мм: R1,
_002_Радиус_установки_грузов_пл2_мм: R2,
_003_Масса_ротораг: P,
_004опуст_ост_дисб_г_мм: U_per
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

@ -0,0 +1,624 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
let freq_time = gtl.options.customOptions.freq_time; // длина (время) отрезка сигнала
let freq_avg_cnt = gtl.options.customOptions.freq_avg_cnt; // количество усреднений
freq.time = freq_time;
freq.avg_cnt = freq_avg_cnt;
freq.dc = gtl.options.customOptions.freq_dc; // уровень, при переходе через который вычисляются периоды
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = gtl.options.customOptions.resolution; // частотное разрешение
let average = gtl.options.customOptions.average; // количество усреднений
let overlap = gtl.options.customOptions.overlap; // наложение
let peak_level = gtl.options.customOptions.peak_level; // порог обнаружения гармоник
let filter_A_vibr; // фильтр сигнала A вибрации
let filter_B_vibr; // фильтр сигнала B вибрации
let channel_A = gtl.options.customOptions.channel_A; // выбор канала A
let channel_B = gtl.options.customOptions.channel_B; // выбор канала B
// Канал A
// ФИЛЬТР_A 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_A_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_A].portNumber]);
filter_A_2_1000.kind = gtl.filter_iir.butterworth;
filter_A_2_1000.type = gtl.filter_iir.bandpass;
filter_A_2_1000.order = 6;
filter_A_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_A_2_1000.width = 998; // ширина полосы фильтра
let filter_A_2_1000v = gtl.add_intg(filter_A_2_1000); // интегрирование
filter_A_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
filter_A_2_1000v.scale = 1000; // множитель перехода от [м] к [мм]
// Фильтр A для виброперемещения
let filter_A_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_A].portNumber]);
filter_A_2_300s.kind = gtl.filter_iir.butterworth;
filter_A_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_A_2_300s.order = 4;
filter_A_2_300s.frequency = 151; // центральная частота
filter_A_2_300s.width = 298; // ширина полосы
// Канал B
// ФИЛЬТР_B 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_B_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_B].portNumber]);
filter_B_2_1000.kind = gtl.filter_iir.butterworth;
filter_B_2_1000.type = gtl.filter_iir.bandpass;
filter_B_2_1000.order = 6;
filter_B_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_B_2_1000.width = 998; // ширина полосы фильтра
let filter_B_2_1000v = gtl.add_intg(filter_B_2_1000); // интегрирование
filter_B_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
filter_B_2_1000v.scale = 1000; // множитель перехода от [м] к [мм]
// Фильтр B для виброперемещения
let filter_B_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_B].portNumber]);
filter_B_2_300s.kind = gtl.filter_iir.butterworth;
filter_B_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_B_2_300s.order = 4;
filter_B_2_300s.frequency = 151; // центральная частота
filter_B_2_300s.width = 298; // ширина полосы
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_A_vibr = filter_A_2_1000v;
filter_B_vibr = filter_B_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_A_vibr = filter_A_2_300s;
filter_B_vibr = filter_B_2_300s;
frequency = 300;
}
// Спектр_A для получения 1-й гармоники частоты вращения
let AUSP_A = gtl.add_ausp(filter_A_vibr); // объявление переменной спектра
AUSP_A.color = 0x00ff0000; // цвет спектра
AUSP_A.name = "AUSP_A"; // имя спектра
AUSP_A.frequency = frequency; // граничная частота спектра
AUSP_A.lines = AUSP_A.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_A.average = average; // количество усреднений
AUSP_A.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_A.smoothing_factor = 100; // усреднение средней линии
AUSP_A.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_A.peak_level = peak_level; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_A.tolerance = AUSP_A.resolution; // диапазон поиска гармоник +/-
// СКЗ_A
let RMS_A = gtl.add_value_rms(filter_A_vibr);
RMS_A.time = 1;
RMS_A.avg_cnt = 3;
// Спектр_B для получения 1-й гармоники частоты вращения
let AUSP_B = gtl.add_ausp(filter_B_vibr); // объявление переменной спектра
AUSP_B.color = 0x00ff0000; // цвет спектра
AUSP_B.name = "AUSP_B"; // имя спектра
AUSP_B.frequency = frequency; // граничная частота спектра
AUSP_B.lines = AUSP_B.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_B.average = average; // количество усреднений
AUSP_B.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_B.smoothing_factor = 100; // усреднение средней линии
AUSP_B.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_B.peak_level = peak_level; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_B.tolerance = AUSP_B.resolution; // диапазон поиска гармоник +/-
// СКЗ_B
let RMS_B = gtl.add_value_rms(filter_B_vibr);
RMS_B.time = 1;
RMS_B.avg_cnt = 3;
// Спектр вибрации точки A
var AUSP_A_pl = gtl.create_ausp(
{
"src" : filter_A_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки A
var pfc_A_pl = gtl.create_pfc(
{
// "src0" : filter_A_vibr,
// "src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src0" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src1" : filter_A_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
"range" : gtl.phase.positive,
"is_single" : false
}
);
// Спектр виброскорости точки B
var AUSP_B_pl = gtl.create_ausp(
{
"src" : filter_B_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки B
var pfc_B_pl = gtl.create_pfc(
{
// "src0" : filter_B_vibr,
// "src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src0" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src1" : filter_B_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
"range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектры вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбалансов"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации точки A */**
let A0; // модуль вектора начальной вибрации точки A */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации точки A */**
let A0_phase; // фаза вектора начальной вибрации точки A */** (конечное значение)
let B0_ = gtl.options.customOptions.B0; // модуль вектора начальной вибрации точки B */**
let B0; // модуль вектора начальной вибрации точки B */** (конечное значение)
let B0_phase_ = gtl.options.customOptions.B0_phase; // фаза вектора начальной вибрации точки B */**
let B0_phase; // фаза вектора начальной вибрации точки B */** (конечное значение)
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
// Переменные вспомогательные необходимые для расчётов
let B0_phase_X; // угол наклона вектора B0 к оси X
let B0_phase_Y; // угол наклона вектора B0 к оси Y
let B0_1_X; // начальная координата вектора B0 по оси X
let B0_2_X; // конечная координата вектора B0 по оси X
let B0_1_Y; // начальная координата вектора B0 по оси Y
let B0_2_Y; // конечная координата вектора B0 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time) + 0.1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP_A.clear_harms_sets();
AUSP_B.clear_harms_sets();
// Спектры вибрации точки A
let __AUSP_A_tools = gtl.create_spec_tools(
{
data: AUSP_A_pl.data,
df: AUSP_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: peak_level
},
harms: {
tolerance: 1
}
});
let __row_AUSP_A = __AUSP_A_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_A.name = "F1_A (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_A_tools = gtl.create_spec_tools(
{
data: pfc_A_pl.data,
df: pfc_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: peak_level
},
harms: {
tolerance: 1
}
});
let __row_phase_A = __pfc_A_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_A.name = "F1_A_phase (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// Спектры вибрации точки B
let __AUSP_B_tools = gtl.create_spec_tools(
{
data: AUSP_B_pl.data,
df: AUSP_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: peak_level
},
harms: {
tolerance: 1
}
});
let __row_AUSP_B = __AUSP_B_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_B.name = "F1_B (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_B_tools = gtl.create_spec_tools(
{
data: pfc_B_pl.data,
df: pfc_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: peak_level
},
harms: {
tolerance: 1
}
});
let __row_phase_B = __pfc_B_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_B.name = "F1_B_phase (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// Построение графиков
// Вибрация точки A
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки A",
x: AUSP_A_pl.resolution,
y: AUSP_A_pl.data,
spec_tools: __AUSP_A_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки A",
x: pfc_A_pl.resolution,
y: pfc_A_pl.data,
spec_tools: __pfc_A_tools.to_json()
});
let __result1_A = __AUSP_A_tools.to_json();
let __result2_A = __pfc_A_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_A = __result1_A.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_A = __result1_A.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_A = __result2_A.harms.rows[0].harms[0].ampl;
// Вибрация точки B
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки B",
x: AUSP_B_pl.resolution,
y: AUSP_B_pl.data,
spec_tools: __AUSP_B_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки B",
x: pfc_B_pl.resolution,
y: pfc_B_pl.data,
spec_tools: __pfc_B_tools.to_json()
});
let __result1_B = __AUSP_B_tools.to_json();
let __result2_B = __pfc_B_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_B = __result1_B.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_B = __result1_B.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_B = __result2_B.harms.rows[0].harms[0].ampl;
// Проверка наличия оборотной гармоники и необходимости проведения баалнсировки
var test_balance = ""; // переменная для текста о необходимости проведения балансировки
if (F1_1_a_A >= RMS_A.value * 0.4 || F1_1_a_B >= RMS_B.value * 0.4) // вклад оборотной гармоники в СКЗv
{test_balance = "необходимо провести балансировку";}
else {test_balance = "проведение балансировки не требуется или нецелесообразно";}
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 1 - начальная вибрация A0 и B0:
// измерение начальной вибрации A0 (или ввод вручную)
// определение целесообразности проведения балансировки
// построение графиков вибрации A0 и B0
// Определение конечных значений переменных
// A0 начальная вибрация
if (A0_ != "-") {A0 = A0_} // принимает значение из опций
else {A0 = F1_1_a_A} // принимает значение из спектра сигнала
if (A0_phase_ != "-") {A0_phase = A0_phase_} // принимает значение из опций
else {A0_phase = F1_1_ph_A} // принимает значение из спектра сигнала
// B0 начальная вибрация
if (B0_ != "-") {B0 = B0_} // принимает значение из опций
else {B0 = F1_1_a_B} // принимает значение из спектра сигнала
if (B0_phase_ != "-") {B0_phase = B0_phase_} // принимает значение из опций
else {B0_phase = F1_1_ph_B} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI / 180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI / 180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI / 180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI / 180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора B0 к осям X и Y
if (B0_phase <= 90) {
B0_phase_X = 90 - B0_phase}
if (B0_phase <= 180) {
B0_phase_X = B0_phase - 90}
if (B0_phase <= 270) {
B0_phase_X = 270 - B0_phase}
if (B0_phase <= 360) {
B0_phase_X = B0_phase - 270}
if (B0_phase <= 90) {
B0_phase_Y = B0_phase}
if (B0_phase <= 180) {
B0_phase_Y = 180 - B0_phase}
if (B0_phase <= 270) {
B0_phase_Y = B0_phase - 180}
if (B0_phase <= 360) {
B0_phase_Y = 360 - B0_phase}
// определение координат вектора B0
var xB0_array = []; // массив координат точек вектора B0 по оси X
var yB0_array = []; // массив координат точек вектора B0 по оси Y
B0_1_X = 0;
if (B0_phase <= 180) {B0_2_X = Math.abs(Math.cos(B0_phase_X * Math.PI / 180)) * B0
} else {B0_2_X = Math.abs(Math.cos(B0_phase_X * Math.PI / 180)) * B0 * (-1)}
B0_1_Y = 0;
if (B0_phase <= 90 || B0_phase >= 270) {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * Math.PI / 180)) * B0
} else {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * Math.PI / 180)) * B0 * (-1)}
xB0_array[0] = B0_1_X;
xB0_array[1] = B0_2_X;
yB0_array[0] = B0_1_Y;
yB0_array[1] = B0_2_Y;
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,B0)+Math.max(A0,B0)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,B0)+Math.max(A0,B0)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_B0",
x: xB0_array,
y: yB0_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,B0)+Math.max(A0,B0)*0.2), -(Math.max(A0,B0)+Math.max(A0,B0)*0.2), (Math.max(A0,B0)+Math.max(A0,B0)*0.2), (Math.max(A0,B0)+Math.max(A0,B0)*0.2)],
y: [(Math.max(A0,B0)+Math.max(A0,B0)*0.2), -(Math.max(A0,B0)+Math.max(A0,B0)*0.2), -(Math.max(A0,B0)+Math.max(A0,B0)*0.2), (Math.max(A0,B0)+Math.max(A0,B0)*0.2)]
});
gtl.log.info("RMS_A",RMS_A.value);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("F1_1_ph_A (фаза)",F1_1_ph_A);
gtl.log.info("F1_1_a_A (ампл)",F1_1_a_A);
gtl.log.info("F1_1_f_A (част)",F1_1_f_A);
gtl.log.info("-","-");
gtl.log.info("RMS_B",RMS_B.value);
gtl.log.info("B0",B0);
gtl.log.info("B0_phase",B0_phase);
gtl.log.info("F1_1_ph_B (фаза)",F1_1_ph_B);
gtl.log.info("F1_1_a_B (ампл)",F1_1_a_B);
gtl.log.info("F1_1_f_B (част)",F1_1_f_B);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
gtl.log.info("Необходимость проведения балансировки",test_balance);
// Выдача результата (results)
let __result = {
_001_Ампл_гарм_1F1очкиA: F1_1_a_A,
_002азаастращ_F1очкиA: F1_1_ph_A,
_003_Ампл_вибр_пуска_A0: A0,
_004аза_вибр_пуска_A0: A0_phase,
_005_СКЗ_виброчкиA: RMS_A.value,
_006_Ампл_гарм_1F1очкиB: F1_1_a_B,
_007азаастращ_F1очкиB: F1_1_ph_B,
_008_Ампл_вибр_пуска_B0: B0,
_009аза_вибр_пуска_B0: B0_phase,
_010_СКЗ_виброчкиB: RMS_B.value,
_011_Нестабастращ: instability*100,
_012астотаращения_F1: freq.value,
_013_Тестирование: test_balance,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

View File

@ -0,0 +1,612 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
freq.time = 1; // длина (время) отрезка сигнала
freq.avg_cnt = 3; // количество усреднений
freq.dc = -0.05; // уровень, при переходе через который вычисляются периоды
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = 0.5; // частотное разрешение
let average = 3; // количество усреднений
let overlap = 0; // наложение
let filter_A_vibr; // фильтр сигнала A вибрации
let filter_B_vibr; // фильтр сигнала B вибрации
// Канал A
// ФИЛЬТР_A 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_A_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_A_2_1000.kind = gtl.filter_iir.butterworth;
filter_A_2_1000.type = gtl.filter_iir.bandpass;
filter_A_2_1000.order = 6;
filter_A_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_A_2_1000.width = 998; // ширина полосы фильтра
let filter_A_2_1000v = gtl.add_intg(filter_A_2_1000); // интегрирование
filter_A_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр A для виброперемещения
let filter_A_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_A_2_300s.kind = gtl.filter_iir.butterworth;
filter_A_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_A_2_300s.order = 4;
filter_A_2_300s.frequency = 151; // центральная частота
filter_A_2_300s.width = 298; // ширина полосы
// Канал B
// ФИЛЬТР_B 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_B_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[1].portNumber]);
filter_B_2_1000.kind = gtl.filter_iir.butterworth;
filter_B_2_1000.type = gtl.filter_iir.bandpass;
filter_B_2_1000.order = 6;
filter_B_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_B_2_1000.width = 998; // ширина полосы фильтра
let filter_B_2_1000v = gtl.add_intg(filter_B_2_1000); // интегрирование
filter_B_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр B для виброперемещения
let filter_B_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[1].portNumber]);
filter_B_2_300s.kind = gtl.filter_iir.butterworth;
filter_B_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_B_2_300s.order = 4;
filter_B_2_300s.frequency = 151; // центральная частота
filter_B_2_300s.width = 298; // ширина полосы
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_A_vibr = filter_A_2_1000v;
filter_B_vibr = filter_B_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_A_vibr = filter_A_2_300s;
filter_B_vibr = filter_B_2_300s;
frequency = 300;
}
// Спектр_A для получения 1-й гармоники частоты вращения
let AUSP_A = gtl.add_ausp(filter_A_vibr); // объявление переменной спектра
AUSP_A.color = 0x00ff0000; // цвет спектра
AUSP_A.name = "AUSP_A"; // имя спектра
AUSP_A.frequency = frequency; // граничная частота спектра
AUSP_A.lines = AUSP_A.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_A.average = average; // количество усреднений
AUSP_A.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_A.smoothing_factor = 100; // усреднение средней линии
AUSP_A.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_A.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_A.tolerance = AUSP_A.resolution; // диапазон поиска гармоник +/-
// СКЗ_A
let RMS_A = gtl.add_value_rms(filter_A_vibr);
RMS_A.time = 1;
RMS_A.avg_cnt = 3;
// Спектр_B для получения 1-й гармоники частоты вращения
let AUSP_B = gtl.add_ausp(filter_B_vibr); // объявление переменной спектра
AUSP_B.color = 0x00ff0000; // цвет спектра
AUSP_B.name = "AUSP_A"; // имя спектра
AUSP_B.frequency = frequency; // граничная частота спектра
AUSP_B.lines = AUSP_B.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_B.average = average; // количество усреднений
AUSP_B.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_B.smoothing_factor = 100; // усреднение средней линии
AUSP_B.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_B.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_B.tolerance = AUSP_B.resolution; // диапазон поиска гармоник +/-
// СКЗ_B
let RMS_B = gtl.add_value_rms(filter_B_vibr);
RMS_B.time = 1;
RMS_B.avg_cnt = 3;
// Спектр вибрации точки A
var AUSP_A_pl = gtl.create_ausp(
{
"src" : filter_A_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки A
var pfc_A_pl = gtl.create_pfc(
{
"src0" : filter_A_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// Спектр виброскорости точки B
var AUSP_B_pl = gtl.create_ausp(
{
"src" : filter_B_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки B
var pfc_B_pl = gtl.create_pfc(
{
"src0" : filter_B_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектры вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбалансов"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации точки A */**
let A0; // модуль вектора начальной вибрации точки A */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации точки A */**
let A0_phase; // фаза вектора начальной вибрации точки A */** (конечное значение)
let B0_ = gtl.options.customOptions.B0; // модуль вектора начальной вибрации точки B */**
let B0; // модуль вектора начальной вибрации точки B */** (конечное значение)
let B0_phase_ = gtl.options.customOptions.B0_phase; // фаза вектора начальной вибрации точки B */**
let B0_phase; // фаза вектора начальной вибрации точки B */** (конечное значение)
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
// Переменные вспомогательные необходимые для расчётов
let B0_phase_X; // угол наклона вектора B0 к оси X
let B0_phase_Y; // угол наклона вектора B0 к оси Y
let B0_1_X; // начальная координата вектора B0 по оси X
let B0_2_X; // конечная координата вектора B0 по оси X
let B0_1_Y; // начальная координата вектора B0 по оси Y
let B0_2_Y; // конечная координата вектора B0 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time) + 0.1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP_A.clear_harms_sets();
AUSP_B.clear_harms_sets();
// Спектры вибрации точки A
let __AUSP_A_tools = gtl.create_spec_tools(
{
data: AUSP_A_pl.data,
df: AUSP_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_A = __AUSP_A_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_A.name = "F1_A (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_A_tools = gtl.create_spec_tools(
{
data: pfc_A_pl.data,
df: pfc_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_A = __pfc_A_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_A.name = "F1_A_phase (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// Спектры вибрации точки B
let __AUSP_B_tools = gtl.create_spec_tools(
{
data: AUSP_B_pl.data,
df: AUSP_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_B = __AUSP_B_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_B.name = "F1_B (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_B_tools = gtl.create_spec_tools(
{
data: pfc_B_pl.data,
df: pfc_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_B = __pfc_B_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_B.name = "F1_B_phase (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// Построение графиков
// Вибрация точки A
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки A",
x: AUSP_A_pl.resolution,
y: AUSP_A_pl.data,
spec_tools: __AUSP_A_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки A",
x: pfc_A_pl.resolution,
y: pfc_A_pl.data,
spec_tools: __pfc_A_tools.to_json()
});
let __result1_A = __AUSP_A_tools.to_json();
let __result2_A = __pfc_A_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_A = __result1_A.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_A = __result1_A.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_A = __result2_A.harms.rows[0].harms[0].ampl;
// Вибрация точки B
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки B",
x: AUSP_B_pl.resolution,
y: AUSP_B_pl.data,
spec_tools: __AUSP_B_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки B",
x: pfc_B_pl.resolution,
y: pfc_B_pl.data,
spec_tools: __pfc_B_tools.to_json()
});
let __result1_B = __AUSP_B_tools.to_json();
let __result2_B = __pfc_B_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_B = __result1_B.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_B = __result1_B.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_B = __result2_B.harms.rows[0].harms[0].ampl;
// Проверка наличия оборотной гармоники и необходимости проведения баалнсировки
var test_balance = ""; // переменная для текста о необходимости проведения балансировки
if (F1_1_a_A >= RMS_A * 0.4 || F1_1_a_B >= RMS_B * 0.4) // вклад оборотной гармоники в СКЗv
{test_balance = "необходимо провести балансировку";}
else {test_balance = "проведение балансировки не требуется или нецелесообразно";}
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 1 - начальная вибрация A0 и B0:
// измерение начальной вибрации A0 (или ввод вручную)
// определение целесообразности проведения балансировки
// построение графиков вибрации A0 и B0
// Определение конечных значений переменных
// A0 начальная вибрация
if (A0_ != 0) {A0 = A0_} // принимает значение из опций
else {A0 = F1_1_a_A} // принимает значение из спектра сигнала
if (A0_phase_ != 0) {A0_phase = A0_phase_} // принимает значение из опций
else {A0_phase = F1_1_ph_A} // принимает значение из спектра сигнала
// B0 начальная вибрация
if (B0_ != 0) {B0 = B0_} // принимает значение из опций
else {B0 = F1_1_a_B} // принимает значение из спектра сигнала
if (B0_phase_ != 0) {B0_phase = B0_phase_} // принимает значение из опций
else {B0_phase = F1_1_ph_B} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора B0 к осям X и Y
if (B0_phase <= 90) {
B0_phase_X = 90 - B0_phase}
if (B0_phase <= 180) {
B0_phase_X = B0_phase - 90}
if (B0_phase <= 270) {
B0_phase_X = 270 - B0_phase}
if (B0_phase <= 360) {
B0_phase_X = B0_phase - 270}
if (B0_phase <= 90) {
B0_phase_Y = B0_phase}
if (B0_phase <= 180) {
B0_phase_Y = 180 - B0_phase}
if (B0_phase <= 270) {
B0_phase_Y = B0_phase - 180}
if (B0_phase <= 360) {
B0_phase_Y = 360 - B0_phase}
// определение координат вектора B0
var xB0_array = []; // массив координат точек вектора B0 по оси X
var yB0_array = []; // массив координат точек вектора B0 по оси Y
B0_1_X = 0;
if (B0_phase <= 180) {B0_2_X = Math.abs(Math.cos(B0_phase_X * 3.1415/180)) * B0
} else {B0_2_X = Math.abs(Math.cos(B0_phase_X * 3.1415/180)) * B0 * (-1)}
B0_1_Y = 0;
if (B0_phase <= 90 || B0_phase >= 270) {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * 3.1415/180)) * B0
} else {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * 3.1415/180)) * B0 * (-1)}
xB0_array[0] = B0_1_X;
xB0_array[1] = B0_2_X;
yB0_array[0] = B0_1_Y;
yB0_array[1] = B0_2_Y;
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,B0)+Math.max(A0,B0)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,B0)+Math.max(A0,B0)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_B0",
x: xB0_array,
y: yB0_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,B0)+Math.max(A0,B0)*0.2), -(Math.max(A0,B0)+Math.max(A0,B0)*0.2), (Math.max(A0,B0)+Math.max(A0,B0)*0.2), (Math.max(A0,B0)+Math.max(A0,B0)*0.2)],
y: [(Math.max(A0,B0)+Math.max(A0,B0)*0.2), -(Math.max(A0,B0)+Math.max(A0,B0)*0.2), -(Math.max(A0,B0)+Math.max(A0,B0)*0.2), (Math.max(A0,B0)+Math.max(A0,B0)*0.2)]
});
gtl.log.info("RMS_A",RMS_A.value);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("F1_1_ph_A (фаза)",F1_1_ph_A);
gtl.log.info("F1_1_a_A (ампл)",F1_1_a_A);
gtl.log.info("F1_1_f_A (част)",F1_1_f_A);
gtl.log.info("-","-");
gtl.log.info("RMS_B",RMS_B.value);
gtl.log.info("B0",B0);
gtl.log.info("B0_phase",B0_phase);
gtl.log.info("F1_1_ph_B (фаза)",F1_1_ph_B);
gtl.log.info("F1_1_a_B (ампл)",F1_1_a_B);
gtl.log.info("F1_1_f_B (част)",F1_1_f_B);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
gtl.log.info("Необходимость проведения балансировки",test_balance);
// Выдача результата (results)
let __result = {
_001_Ампл_гарм_1F1очкиA: F1_1_a_A,
_002азаастращ_F1очкиA: F1_1_ph_A,
_003_Ампл_вибр_пуска_A0: A0,
_004аза_вибр_пуска_A0: A0_phase,
_005_СКЗ_виброчкиA: RMS_A.value,
_006_Ампл_гарм_1F1очкиB: F1_1_a_B,
_007азаастращ_F1очкиB: F1_1_ph_B,
_008_Ампл_вибр_пуска_B0: B0,
_009аза_вибр_пуска_B0: B0_phase,
_010_СКЗ_виброчкиB: RMS_B.value,
_011_Нестабастращ: instability*100,
_012астотаращения_F1: freq.value,
_013_Тестирование: test_balance,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

View File

@ -0,0 +1,177 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектры виброскорости"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбалансов"); // объект для дисбаланса
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let m_test_1_ = gtl.options.customOptions.m_test_1; // масса пробного груза плоскости 1 **
let m_test_1; // масса пробного груза плоскости 1 ** (конечное значение)
let m_test_1_corner_ = gtl.options.customOptions.m_test_1_corner; // угол установки пробного груза плоскости 1 **
let m_test_1_corner = m_test_1_corner_; // угол установки пробного груза плоскости 1 ** (конечное значение)
let m_test_1_calc; // масса пробного груза расчётная плоскости 1 ***
let n = gtl.options.customOptions.n; // частота вращения, об/мин */** (для вычисления массы пробного груза)
let R1_ = gtl.options.customOptions.R1; // радиус установки грузов плоскости 1 ** (для вычисления массы пробного груза)
let R1 = R1_; // радиус установки грузов плоскости 1 ** (для вычисления массы пробного груза) (конечное значение)
let P_ = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
let P = P_; // масса ротора, кг ** (для вычисления массы пробного груза) (конечное значение)
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0 = A0_; // модуль вектора начальной вибрации */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации */** (конечное значение)
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let m_test_1_corner_X; // угол наклона вектора m_test_1 к оси X
let m_test_1_corner_Y; // угол наклона вектора m_test_1 к оси Y
let m_test_1_1_X; // начальная координата вектора m_test_1 по оси X
let m_test_1_2_X; // конечная координата вектора m_test_1 по оси X
let m_test_1_1_Y; // начальная координата вектора m_test_1 по оси Y
let m_test_1_2_Y; // конечная координата вектора m_test_1 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 2 - выбор массы и положения пробного груза плоскости 1:
// вычисление рекомендуемой массы пробного груза m_test_1_calc
// ввод пользователем массы пробного груза и угла его установки m_test_1 плоскости 1
// построение графика расположения массы пробного груза плоскости 1 m_test_1
// из предыдущих шагов переносятся: частота вращения freq, радиус установки грузов плоскости 1 R1, масса ротора P, уровень начальной вибрации A0
// Вычисление массы пробного груза (если не введено своё значение и есть данные для формулы)
// m_test_1 масса пробного груза
if (P != 0 && R1 != 0)
{m_test_1_calc = 804 * ((P * A0) / (R1/10 * n));
} else {m_test_1_calc = 0}
if (m_test_1_ != 0) {m_test_1 = m_test_1_} // принимает значение из опций
else {m_test_1 = 0} // значение не введено
// определение угла наклона вектора m_test_1 к осям X и Y
if (m_test_1_corner <= 90) {
m_test_1_corner_X = 90 - m_test_1_corner}
if (m_test_1_corner <= 180) {
m_test_1_corner_X = m_test_1_corner - 90}
if (m_test_1_corner <= 270) {
m_test_1_corner_X = 270 - m_test_1_corner}
if (m_test_1_corner <= 360) {
m_test_1_corner_X = m_test_1_corner - 270}
if (m_test_1_corner <= 90) {
m_test_1_corner_Y = m_test_1_corner}
if (m_test_1_corner <= 180) {
m_test_1_corner_Y = 180 - m_test_1_corner}
if (m_test_1_corner <= 270) {
m_test_1_corner_Y = m_test_1_corner - 180}
if (m_test_1_corner <= 360) {
m_test_1_corner_Y = 360 - m_test_1_corner}
// определение координат вектора m_test_1
m_test_1_1_X = 0;
if (m_test_1_corner <= 180) {m_test_1_2_X = Math.abs(Math.cos(m_test_1_corner_X * Math.PI/180)) * m_test_1 * (-1)
} else {m_test_1_2_X = Math.abs(Math.cos(m_test_1_corner_X * Math.PI/180)) * m_test_1}
m_test_1_1_Y = 0;
if (m_test_1_corner <= 90 || m_test_1_corner >= 270) {m_test_1_2_Y = Math.abs(Math.cos(m_test_1_corner_Y * Math.PI/180)) * m_test_1
} else {m_test_1_2_Y = Math.abs(Math.cos(m_test_1_corner_Y * Math.PI/180)) * m_test_1 * (-1)}
// определение координат точек окружности обозначения массы пробного груза
var x_m_test_1_array = []; // массив координат точек окружности m_test_1 по оси X
var y_m_test_1_array = []; // массив координат точек окружности m_test_1 по оси Y
var x0_m_test_1 = m_test_1_2_X; // центр по X
var y0_m_test_1 = m_test_1_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_m_test_1_array.push(x0_m_test_1 + (Math.max(m_test_1)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_m_test_1_array.push(y0_m_test_1 + (Math.max(m_test_1)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности графика для отображения расположения дисбаланса
var xD_array = []; // массив координат точек окружности D по оси X
var yD_array = []; // массив координат точек окружности D по оси Y
var x0D = 0; // центр в начале координат
var y0D = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xD_array.push(x0D + (Math.max(m_test_1)+Math.max(m_test_1)*0.1) * (Math.sin((i) * Math.PI / 180)));
yD_array.push(y0D + (Math.max(m_test_1)+Math.max(m_test_1)*0.1) * (Math.cos((i) * Math.PI / 180)));}
plot_disb.add(
{
color: 0x0000ff,
name: "Пробный груз плоскости 1",
x: x_m_test_1_array,
y: y_m_test_1_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "График расположения дисбаланса",
x: xD_array,
y: yD_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(m_test_1)+Math.max(m_test_1)*0.2), -(Math.max(m_test_1)+Math.max(m_test_1)*0.2), (Math.max(m_test_1)+Math.max(m_test_1)*0.2), (Math.max(m_test_1)+Math.max(m_test_1)*0.2)],
y: [(Math.max(m_test_1)+Math.max(m_test_1)*0.2), -(Math.max(m_test_1)+Math.max(m_test_1)*0.2), -(Math.max(m_test_1)+Math.max(m_test_1)*0.2), (Math.max(m_test_1)+Math.max(m_test_1)*0.2)]
});
gtl.log.info("m_test_1 (пробный груз плоскости 1 введёный)",m_test_1);
gtl.log.info("m_test_1_corner (угол установки пробного груза плоскости 1)",m_test_1_corner);
gtl.log.info("m_test_1_calc (пробный груз плоскости 1 расчётный)",m_test_1_calc);
gtl.log.info("Масса ротора, кг", P);
gtl.log.info("Радиус установки грузов плоскости 1, мм", R1);
gtl.log.info("Начальная вибрация A0",A0);
// Выдача результата (results)
let __result = {
_001римен_пробный_груз_пл_1: m_test_1,
_002_Угол_устан_пробн_груза_пл_1: m_test_1_corner,
_003_Расч_пробный_груз_пл_1: m_test_1_calc
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

@ -0,0 +1,177 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектры виброскорости"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбалансов"); // объект для дисбаланса
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let m_test_1_ = gtl.options.customOptions.m_test_1; // масса пробного груза плоскости 1 **
let m_test_1; // масса пробного груза плоскости 1 ** (конечное значение)
let m_test_1_corner_ = gtl.options.customOptions.m_test_1_corner; // угол установки пробного груза плоскости 1 **
let m_test_1_corner = m_test_1_corner_; // угол установки пробного груза плоскости 1 ** (конечное значение)
let m_test_1_calc; // масса пробного груза расчётная плоскости 1 ***
let n = gtl.options.customOptions.n; // частота вращения, об/мин */** (для вычисления массы пробного груза)
let R1_ = gtl.options.customOptions.R1; // радиус установки грузов плоскости 1 ** (для вычисления массы пробного груза)
let R1 = R1_; // радиус установки грузов плоскости 1 ** (для вычисления массы пробного груза) (конечное значение)
let P_ = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
let P = P_; // масса ротора, кг ** (для вычисления массы пробного груза) (конечное значение)
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации */**
let A0 = A0_; // модуль вектора начальной вибрации */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации */** (конечное значение)
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let m_test_1_corner_X; // угол наклона вектора m_test_1 к оси X
let m_test_1_corner_Y; // угол наклона вектора m_test_1 к оси Y
let m_test_1_1_X; // начальная координата вектора m_test_1 по оси X
let m_test_1_2_X; // конечная координата вектора m_test_1 по оси X
let m_test_1_1_Y; // начальная координата вектора m_test_1 по оси Y
let m_test_1_2_Y; // конечная координата вектора m_test_1 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 2 - выбор массы и положения пробного груза плоскости 1:
// вычисление рекомендуемой массы пробного груза m_test_1_calc
// ввод пользователем массы пробного груза и угла его установки m_test_1 плоскости 1
// построение графика расположения массы пробного груза плоскости 1 m_test_1
// из предыдущих шагов переносятся: частота вращения freq, радиус установки грузов плоскости 1 R1, масса ротора P, уровень начальной вибрации A0
// Вычисление массы пробного груза (если не введено своё значение и есть данные для формулы)
// m_test_1 масса пробного груза
if (P != 0 && R1 != 0)
{m_test_1_calc = 804 * ((P * A0) / (R1/10 * n));
} else {m_test_1_calc = 0}
if (m_test_1_ != 0) {m_test_1 = m_test_1_} // принимает значение из опций
else {m_test_1 = 0} // значение не введено
// определение угла наклона вектора m_test_1 к осям X и Y
if (m_test_1_corner <= 90) {
m_test_1_corner_X = 90 - m_test_1_corner}
if (m_test_1_corner <= 180) {
m_test_1_corner_X = m_test_1_corner - 90}
if (m_test_1_corner <= 270) {
m_test_1_corner_X = 270 - m_test_1_corner}
if (m_test_1_corner <= 360) {
m_test_1_corner_X = m_test_1_corner - 270}
if (m_test_1_corner <= 90) {
m_test_1_corner_Y = m_test_1_corner}
if (m_test_1_corner <= 180) {
m_test_1_corner_Y = 180 - m_test_1_corner}
if (m_test_1_corner <= 270) {
m_test_1_corner_Y = m_test_1_corner - 180}
if (m_test_1_corner <= 360) {
m_test_1_corner_Y = 360 - m_test_1_corner}
// определение координат вектора m_test_1
m_test_1_1_X = 0;
if (m_test_1_corner <= 180) {m_test_1_2_X = Math.abs(Math.cos(m_test_1_corner_X * Math.PI/180)) * m_test_1 * (-1)
} else {m_test_1_2_X = Math.abs(Math.cos(m_test_1_corner_X * Math.PI/180)) * m_test_1}
m_test_1_1_Y = 0;
if (m_test_1_corner <= 90 || m_test_1_corner >= 270) {m_test_1_2_Y = Math.abs(Math.cos(m_test_1_corner_Y * Math.PI/180)) * m_test_1
} else {m_test_1_2_Y = Math.abs(Math.cos(m_test_1_corner_Y * Math.PI/180)) * m_test_1 * (-1)}
// определение координат точек окружности обозначения массы пробного груза
var x_m_test_1_array = []; // массив координат точек окружности m_test_1 по оси X
var y_m_test_1_array = []; // массив координат точек окружности m_test_1 по оси Y
var x0_m_test_1 = m_test_1_2_X; // центр по X
var y0_m_test_1 = m_test_1_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_m_test_1_array.push(x0_m_test_1 + (Math.max(m_test_1)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_m_test_1_array.push(y0_m_test_1 + (Math.max(m_test_1)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности графика для отображения расположения дисбаланса
var xD_array = []; // массив координат точек окружности D по оси X
var yD_array = []; // массив координат точек окружности D по оси Y
var x0D = 0; // центр в начале координат
var y0D = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xD_array.push(x0D + (Math.max(m_test_1)+Math.max(m_test_1)*0.1) * (Math.sin((i) * Math.PI / 180)));
yD_array.push(y0D + (Math.max(m_test_1)+Math.max(m_test_1)*0.1) * (Math.cos((i) * Math.PI / 180)));}
plot_disb.add(
{
color: 0x0000ff,
name: "Пробный груз плоскости 1",
x: x_m_test_1_array,
y: y_m_test_1_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "График расположения дисбаланса",
x: xD_array,
y: yD_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(m_test_1)+Math.max(m_test_1)*0.2), -(Math.max(m_test_1)+Math.max(m_test_1)*0.2), (Math.max(m_test_1)+Math.max(m_test_1)*0.2), (Math.max(m_test_1)+Math.max(m_test_1)*0.2)],
y: [(Math.max(m_test_1)+Math.max(m_test_1)*0.2), -(Math.max(m_test_1)+Math.max(m_test_1)*0.2), -(Math.max(m_test_1)+Math.max(m_test_1)*0.2), (Math.max(m_test_1)+Math.max(m_test_1)*0.2)]
});
gtl.log.info("m_test_1 (пробный груз плоскости 1 введёный)",m_test_1);
gtl.log.info("m_test_1_corner (угол установки пробного груза плоскости 1)",m_test_1_corner);
gtl.log.info("m_test_1_calc (пробный груз плоскости 1 расчётный)",m_test_1_calc);
gtl.log.info("Масса ротора, кг", P);
gtl.log.info("Радиус установки грузов плоскости 1, мм", R1);
gtl.log.info("Начальная вибрация A0",A0);
// Выдача результата (results)
let __result = {
_001римен_пробный_груз_пл_1: m_test_1,
_002_Угол_устан_пробн_груза_пл_1: m_test_1_corner,
_003_Расч_пробный_груз_пл_1: m_test_1_calc
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

@ -0,0 +1,790 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
let freq_time = gtl.options.customOptions.freq_time; // длина (время) отрезка сигнала
let freq_avg_cnt = gtl.options.customOptions.freq_avg_cnt; // количество усреднений
freq.time = freq_time;
freq.avg_cnt = freq_avg_cnt;
freq.dc = gtl.options.customOptions.freq_dc; // уровень, при переходе через который вычисляются периоды
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = gtl.options.customOptions.resolution; // частотное разрешение
let average = gtl.options.customOptions.average; // количество усреднений
let overlap = gtl.options.customOptions.overlap; // наложение
let peak_level = gtl.options.customOptions.peak_level; // порог обнаружения гармоник
let filter_A_vibr; // фильтр сигнала A вибрации
let filter_B_vibr; // фильтр сигнала B вибрации
let channel_A = gtl.options.customOptions.channel_A; // выбор канала A
let channel_B = gtl.options.customOptions.channel_B; // выбор канала B
// Канал A
// ФИЛЬТР_A 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_A_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_A].portNumber]);
filter_A_2_1000.kind = gtl.filter_iir.butterworth;
filter_A_2_1000.type = gtl.filter_iir.bandpass;
filter_A_2_1000.order = 6;
filter_A_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_A_2_1000.width = 998; // ширина полосы фильтра
let filter_A_2_1000v = gtl.add_intg(filter_A_2_1000); // интегрирование
filter_A_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр A для виброперемещения
let filter_A_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_A].portNumber]);
filter_A_2_300s.kind = gtl.filter_iir.butterworth;
filter_A_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_A_2_300s.order = 4;
filter_A_2_300s.frequency = 151; // центральная частота
filter_A_2_300s.width = 298; // ширина полосы
// Канал B
// ФИЛЬТР_B 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_B_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_B].portNumber]);
filter_B_2_1000.kind = gtl.filter_iir.butterworth;
filter_B_2_1000.type = gtl.filter_iir.bandpass;
filter_B_2_1000.order = 6;
filter_B_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_B_2_1000.width = 998; // ширина полосы фильтра
let filter_B_2_1000v = gtl.add_intg(filter_B_2_1000); // интегрирование
filter_B_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр B для виброперемещения
let filter_B_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_B].portNumber]);
filter_B_2_300s.kind = gtl.filter_iir.butterworth;
filter_B_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_B_2_300s.order = 4;
filter_B_2_300s.frequency = 151; // центральная частота
filter_B_2_300s.width = 298; // ширина полосы
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_A_vibr = filter_A_2_1000v;
filter_B_vibr = filter_B_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_A_vibr = filter_A_2_300s;
filter_B_vibr = filter_B_2_300s;
frequency = 300;
}
// Спектр_A для получения 1-й гармоники частоты вращения
let AUSP_A = gtl.add_ausp(filter_A_vibr); // объявление переменной спектра
AUSP_A.color = 0x00ff0000; // цвет спектра
AUSP_A.name = "AUSP_A"; // имя спектра
AUSP_A.frequency = frequency; // граничная частота спектра
AUSP_A.lines = AUSP_A.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_A.average = average; // количество усреднений
AUSP_A.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_A.smoothing_factor = 100; // усреднение средней линии
AUSP_A.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_A.peak_level = peak_level; // порог обнаружения гармоник
AUSP_A.tolerance = AUSP_A.resolution; // диапазон поиска гармоник +/-
// СКЗ_A
let RMS_A = gtl.add_value_rms(filter_A_vibr);
RMS_A.time = 1;
RMS_A.avg_cnt = 3;
// Спектр_B для получения 1-й гармоники частоты вращения
let AUSP_B = gtl.add_ausp(filter_B_vibr); // объявление переменной спектра
AUSP_B.color = 0x00ff0000; // цвет спектра
AUSP_B.name = "AUSP_B"; // имя спектра
AUSP_B.frequency = frequency; // граничная частота спектра
AUSP_B.lines = AUSP_B.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_B.average = average; // количество усреднений
AUSP_B.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_B.smoothing_factor = 100; // усреднение средней линии
AUSP_B.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_B.peak_level = peak_level; // порог обнаружения гармоник
AUSP_B.tolerance = AUSP_B.resolution; // диапазон поиска гармоник +/-
// СКЗ_B
let RMS_B = gtl.add_value_rms(filter_B_vibr);
RMS_B.time = 1;
RMS_B.avg_cnt = 3;
// Спектр вибрации точки A
var AUSP_A_pl = gtl.create_ausp(
{
"src" : filter_A_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки A
var pfc_A_pl = gtl.create_pfc(
{
// "src0" : filter_A_vibr,
// "src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src0" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src1" : filter_A_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
"range" : gtl.phase.positive,
"is_single" : false
}
);
// Спектр виброскорости точки B
var AUSP_B_pl = gtl.create_ausp(
{
"src" : filter_B_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки B
var pfc_B_pl = gtl.create_pfc(
{
// "src0" : filter_B_vibr,
// "src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src0" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src1" : filter_B_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
"range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектры вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбалансов"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации точки A */**
let A0 = A0_; // модуль вектора начальной вибрации точки A */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации точки A */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации точки A */** (конечное значение)
let A1_ = gtl.options.customOptions.A1; // модуль вектора вибрации точки A после установки пробного груза в плоскость 1 */**
let A1; // модуль вектора вибрации точки A после установки пробного груза в плоскость 1 */** (конечное значение)
let A1_phase_ = gtl.options.customOptions.A1_phase; // фаза вектора вибрации точки A после установки пробного груза в плоскость 1 */**
let A1_phase; // фаза вектора вибрации точки A после установки пробного груза в плоскость 1 */** (конечное значение)
let dA1; // модуль вектора дельты вибрации точки A после установки пробного груза в плоскость 1 ***
let dA1_phase; // фаза вектора дельты вибрации точки A после установки пробного груза в плоскость 1 ***
let B0_ = gtl.options.customOptions.B0; // модуль вектора начальной вибрации точки B */**
let B0 = B0_; // модуль вектора начальной вибрации точки B */** (конечное значение)
let B0_phase_ = gtl.options.customOptions.B0_phase; // фаза вектора начальной вибрации точки B */**
let B0_phase = B0_phase_; // фаза вектора начальной вибрации точки B */** (конечное значение)
let B1_ = gtl.options.customOptions.B1; // модуль вектора вибрации точки B после установки пробного груза в плоскость 1 */**
let B1; // модуль вектора вибрации точки B после установки пробного груза в плоскость 1 */** (конечное значение)
let B1_phase_ = gtl.options.customOptions.B1_phase; // фаза вектора вибрации точки B после установки пробного груза в плоскость 1 */**
let B1_phase; // фаза вектора вибрации точки B после установки пробного груза в плоскость 1 */** (конечное значение)
let dB1; // модуль вектора дельты вибрации точки B после установки пробного груза в плоскость 1 ***
let dB1_phase; // фаза вектора дельты вибрации точки B после установки пробного груза в плоскость 1 ***
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let A1_phase_X; // угол наклона вектора A1 к оси X
let A1_phase_Y; // угол наклона вектора A1 к оси Y
let A1_1_X; // начальная координата вектора A1 по оси X
let A1_2_X; // конечная координата вектора A1 по оси X
let A1_1_Y; // начальная координата вектора A1 по оси Y
let A1_2_Y; // конечная координата вектора A1 по оси Y
let dA1_1_X; // начальная координата вектора dA1 по оси X
let dA1_2_X; // конечная координата вектора dA1 по оси X
let dA1_1_Y; // начальная координата вектора dA1 по оси Y
let dA1_2_Y; // конечная координата вектора dA1 по оси Y
let B0_phase_X; // угол наклона вектора B0 к оси X
let B0_phase_Y; // угол наклона вектора B0 к оси Y
let B0_1_X; // начальная координата вектора B0 по оси X
let B0_2_X; // конечная координата вектора B0 по оси X
let B0_1_Y; // начальная координата вектора B0 по оси Y
let B0_2_Y; // конечная координата вектора B0 по оси Y
let B1_phase_X; // угол наклона вектора B1 к оси X
let B1_phase_Y; // угол наклона вектора B1 к оси Y
let B1_1_X; // начальная координата вектора B1 по оси X
let B1_2_X; // конечная координата вектора B1 по оси X
let B1_1_Y; // начальная координата вектора B1 по оси Y
let B1_2_Y; // конечная координата вектора B1 по оси Y
let dB1_1_X; // начальная координата вектора dB1 по оси X
let dB1_2_X; // конечная координата вектора dB1 по оси X
let dB1_1_Y; // начальная координата вектора dB1 по оси Y
let dB1_2_Y; // конечная координата вектора dB1 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time) + 0.1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP_A.clear_harms_sets();
AUSP_B.clear_harms_sets();
// Спектры вибрации точки A
let __AUSP_A_tools = gtl.create_spec_tools(
{
data: AUSP_A_pl.data,
df: AUSP_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_A = __AUSP_A_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_A.name = "F1_A (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_A_tools = gtl.create_spec_tools(
{
data: pfc_A_pl.data,
df: pfc_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_A = __pfc_A_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_A.name = "F1_A_phase (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// Спектры вибрации точки B
let __AUSP_B_tools = gtl.create_spec_tools(
{
data: AUSP_B_pl.data,
df: AUSP_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_B = __AUSP_B_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_B.name = "F1_B (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_B_tools = gtl.create_spec_tools(
{
data: pfc_B_pl.data,
df: pfc_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_B = __pfc_B_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_B.name = "F1_B_phase (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// Построение графиков
// Вибрация точки A
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки A",
x: AUSP_A_pl.resolution,
y: AUSP_A_pl.data,
spec_tools: __AUSP_A_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки A",
x: pfc_A_pl.resolution,
y: pfc_A_pl.data,
spec_tools: __pfc_A_tools.to_json()
});
let __result1_A = __AUSP_A_tools.to_json();
let __result2_A = __pfc_A_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_A = __result1_A.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_A = __result1_A.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_A = __result2_A.harms.rows[0].harms[0].ampl;
// Вибрация точки B
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки B",
x: AUSP_B_pl.resolution,
y: AUSP_B_pl.data,
spec_tools: __AUSP_B_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки B",
x: pfc_B_pl.resolution,
y: pfc_B_pl.data,
spec_tools: __pfc_B_tools.to_json()
});
let __result1_B = __AUSP_B_tools.to_json();
let __result2_B = __pfc_B_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_B = __result1_B.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_B = __result1_B.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_B = __result2_B.harms.rows[0].harms[0].ampl;
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 3 - вибрация пробного пуска A1 и B1 (пробный груз в плоскости 1):
// измерение начальной A1 и B1 (или ввод вручную)
// из предыдущих шагов переносятся: амплитуда и фаза вибрации A0, B0
// построение графиков A0, A1 и dA1, B0, B1 и dB1
// Определение конечных значений переменных
// A1 вибрация после установки пробного груза в плоскость 1
if (A1_ != "-") {A1 = A1_} // принимает значение из опций
else {A1 = F1_1_a_A} // принимает значение из спектра сигнала
if (A1_phase_ != "-") {A1_phase = A1_phase_} // принимает значение из опций
else {A1_phase = F1_1_ph_A} // принимает значение из спектра сигнала
// B1 вибрация после установки пробного груза в плоскость 1
if (B1_ != "-") {B1 = B1_} // принимает значение из опций
else {B1 = F1_1_a_B} // принимает значение из спектра сигнала
if (B1_phase_ != "-") {B1_phase = B1_phase_} // принимает значение из опций
else {B1_phase = F1_1_ph_B} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора A1 к осям X и Y
if (A1_phase <= 90) {
A1_phase_X = 90 - A1_phase}
if (A1_phase <= 180) {
A1_phase_X = A1_phase - 90}
if (A1_phase <= 270) {
A1_phase_X = 270 - A1_phase}
if (A1_phase <= 360) {
A1_phase_X = A1_phase - 270}
if (A1_phase <= 90) {
A1_phase_Y = A1_phase}
if (A1_phase <= 180) {
A1_phase_Y = 180 - A1_phase}
if (A1_phase <= 270) {
A1_phase_Y = A1_phase - 180}
if (A1_phase <= 360) {
A1_phase_Y = 360 - A1_phase}
// определение координат вектора A1
var xA1_array = []; // массив координат точек вектора A1 по оси X
var yA1_array = []; // массив координат точек вектора A1 по оси Y
A1_1_X = 0;
if (A1_phase <= 180) {A1_2_X = Math.abs(Math.cos(A1_phase_X * Math.PI/180)) * A1
} else {A1_2_X = Math.abs(Math.cos(A1_phase_X * Math.PI/180)) * A1 * (-1)}
A1_1_Y = 0;
if (A1_phase <= 90 || A1_phase >= 270) {A1_2_Y = Math.abs(Math.cos(A1_phase_Y * Math.PI/180)) * A1
} else {A1_2_Y = Math.abs(Math.cos(A1_phase_Y * Math.PI/180)) * A1 * (-1)}
xA1_array[0] = A1_1_X;
xA1_array[1] = A1_2_X;
yA1_array[0] = A1_1_Y;
yA1_array[1] = A1_2_Y;
// определение модуля вектора dA1
var xdA1_array = []; // массив координат точек вектора dA1 по оси X
var ydA1_array = []; // массив координат точек вектора dA1 по оси Y
dA1_1_X = A0_2_X;
dA1_2_X = A1_2_X;
dA1_1_Y = A0_2_Y;
dA1_2_Y = A1_2_Y;
dA1 = Math.sqrt(Math.pow(dA1_2_X - dA1_1_X, 2) + Math.pow(dA1_2_Y - dA1_1_Y, 2))
xdA1_array[0] = dA1_1_X;
xdA1_array[1] = dA1_2_X;
ydA1_array[0] = dA1_1_Y;
ydA1_array[1] = dA1_2_Y;
// определение фазы вектора dA1
if ((dA1_2_Y < dA1_1_Y) && (dA1_2_X < dA1_1_X)) {
dA1_phase = 180 + (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / Math.PI)}
if ((dA1_2_Y > dA1_1_Y) && (dA1_2_X > dA1_1_X)) {
dA1_phase = (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / Math.PI)}
if ((dA1_2_Y > dA1_1_Y) && (dA1_2_X < dA1_1_X)) {
dA1_phase = 360 - (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / Math.PI)}
if ((dA1_2_Y < dA1_1_Y) && (dA1_2_X > dA1_1_X)) {
dA1_phase = 180 - (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / Math.PI)}
if (dA1_phase > 360) {dA1_phase = dA1_phase - 360}
// определение угла наклона вектора B0 к осям X и Y
if (B0_phase <= 90) {
B0_phase_X = 90 - B0_phase}
if (B0_phase <= 180) {
B0_phase_X = B0_phase - 90}
if (B0_phase <= 270) {
B0_phase_X = 270 - B0_phase}
if (B0_phase <= 360) {
B0_phase_X = B0_phase - 270}
if (B0_phase <= 90) {
B0_phase_Y = B0_phase}
if (B0_phase <= 180) {
B0_phase_Y = 180 - B0_phase}
if (B0_phase <= 270) {
B0_phase_Y = B0_phase - 180}
if (B0_phase <= 360) {
B0_phase_Y = 360 - B0_phase}
// определение координат вектора B0
var xB0_array = []; // массив координат точек вектора B0 по оси X
var yB0_array = []; // массив координат точек вектора B0 по оси Y
B0_1_X = 0;
if (B0_phase <= 180) {B0_2_X = Math.abs(Math.cos(B0_phase_X * Math.PI/180)) * B0
} else {B0_2_X = Math.abs(Math.cos(B0_phase_X * Math.PI/180)) * B0 * (-1)}
B0_1_Y = 0;
if (B0_phase <= 90 || B0_phase >= 270) {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * Math.PI/180)) * B0
} else {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * Math.PI/180)) * B0 * (-1)}
xB0_array[0] = B0_1_X;
xB0_array[1] = B0_2_X;
yB0_array[0] = B0_1_Y;
yB0_array[1] = B0_2_Y;
// определение угла наклона вектора B1 к осям X и Y
if (B1_phase <= 90) {
B1_phase_X = 90 - B1_phase}
if (B1_phase <= 180) {
B1_phase_X = B1_phase - 90}
if (B1_phase <= 270) {
B1_phase_X = 270 - B1_phase}
if (B1_phase <= 360) {
B1_phase_X = B1_phase - 270}
if (B1_phase <= 90) {
B1_phase_Y = B1_phase}
if (B1_phase <= 180) {
B1_phase_Y = 180 - B1_phase}
if (B1_phase <= 270) {
B1_phase_Y = B1_phase - 180}
if (B1_phase <= 360) {
B1_phase_Y = 360 - B1_phase}
// определение координат вектора B1
var xB1_array = []; // массив координат точек вектора B1 по оси X
var yB1_array = []; // массив координат точек вектора B1 по оси Y
B1_1_X = 0;
if (B1_phase <= 180) {B1_2_X = Math.abs(Math.cos(B1_phase_X * Math.PI/180)) * B1
} else {B1_2_X = Math.abs(Math.cos(B1_phase_X * Math.PI/180)) * B1 * (-1)}
B1_1_Y = 0;
if (B1_phase <= 90 || B1_phase >= 270) {B1_2_Y = Math.abs(Math.cos(B1_phase_Y * Math.PI/180)) * B1
} else {B1_2_Y = Math.abs(Math.cos(B1_phase_Y * Math.PI/180)) * B1 * (-1)}
xB1_array[0] = B1_1_X;
xB1_array[1] = B1_2_X;
yB1_array[0] = B1_1_Y;
yB1_array[1] = B1_2_Y;
// определение модуля вектора dB1
var xdB1_array = []; // массив координат точек вектора dB1 по оси X
var ydB1_array = []; // массив координат точек вектора dB1 по оси Y
dB1_1_X = B0_2_X;
dB1_2_X = B1_2_X;
dB1_1_Y = B0_2_Y;
dB1_2_Y = B1_2_Y;
dB1 = Math.sqrt(Math.pow(dB1_2_X - dB1_1_X, 2) + Math.pow(dB1_2_Y - dB1_1_Y, 2))
xdB1_array[0] = dB1_1_X;
xdB1_array[1] = dB1_2_X;
ydB1_array[0] = dB1_1_Y;
ydB1_array[1] = dB1_2_Y;
// определение фазы вектора dB1
if ((dB1_2_Y < dB1_1_Y) && (dB1_2_X < dB1_1_X)) {
dB1_phase = 180 + (((Math.acos((Math.abs(dB1_2_Y - dB1_1_Y)) / dB1)) * 180 ) / Math.PI)}
if ((dB1_2_Y > dB1_1_Y) && (dB1_2_X > dB1_1_X)) {
dB1_phase = (((Math.acos((Math.abs(dB1_2_Y - dB1_1_Y)) / dB1)) * 180 ) / Math.PI)}
if ((dB1_2_Y > dB1_1_Y) && (dB1_2_X < dB1_1_X)) {
dB1_phase = 360 - (((Math.acos((Math.abs(dB1_2_Y - dB1_1_Y)) / dB1)) * 180 ) / Math.PI)}
if ((dB1_2_Y < dB1_1_Y) && (dB1_2_X > dB1_1_X)) {
dB1_phase = 180 - (((Math.acos((Math.abs(dB1_2_Y - dB1_1_Y)) / dB1)) * 180 ) / Math.PI)}
if (dB1_phase > 360) {dB1_phase = dB1_phase - 360}
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_A1",
x: xA1_array,
y: yA1_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA1",
x: xdA1_array,
y: ydA1_array,
});
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_B0",
x: xB0_array,
y: yB0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_B1",
x: xB1_array,
y: yB1_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dB1",
x: xdB1_array,
y: ydB1_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2), -(Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2), (Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2), (Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2)],
y: [(Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2), -(Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2), -(Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2), (Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2)]
});
gtl.log.info("RMS_A",RMS_A.value);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("A1",A1);
gtl.log.info("A1_phase",A1_phase);
gtl.log.info("F1_1_ph_A (фаза)",F1_1_ph_A);
gtl.log.info("F1_1_a_A (ампл)",F1_1_a_A);
gtl.log.info("F1_1_f_A (част)",F1_1_f_A);
gtl.log.info("RMS_B",RMS_B.value);
gtl.log.info("B0",B0);
gtl.log.info("B0_phase",B0_phase);
gtl.log.info("B1",B1);
gtl.log.info("B1_phase",B1_phase);
gtl.log.info("F1_1_ph_B (фаза)",F1_1_ph_B);
gtl.log.info("F1_1_a_B (ампл)",F1_1_a_B);
gtl.log.info("F1_1_f_B (част)",F1_1_f_B);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
// Выдача результата (results)
let __result = {
_001_Ампл_гарм_1F1_A: F1_1_a_A,
_002азаастращ_F1_A: F1_1_ph_A,
_003_Ампл_вибр_пуска_A0: A0,
_004аза_вибр_пуска_A0: A0_phase,
_005_Ампл_вибр_пуска_A1: A1,
_006аза_вибр_пуска_A1: A1_phase,
_007_СКЗ_вибр_A: RMS_A.value,
_008_Ампл_гарм_1F1_B: F1_1_a_B,
_009азаастращ_F1_B: F1_1_ph_B,
_010_Ампл_вибр_пуска_B0: B0,
_011аза_вибр_пуска_B0: B0_phase,
_012_Ампл_вибр_пуска_B1: B1,
_013аза_вибр_пуска_B1: B1_phase,
_014_СКЗ_вибр_B: RMS_B.value,
_015астотаращения_F1: freq.value,
_016_Нестабастращ: instability*100,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

View File

@ -0,0 +1,780 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
freq.time = 1; // длина (время) отрезка сигнала
freq.avg_cnt = 3; // количество усреднений
freq.dc = -0.05; // уровень, при переходе через который вычисляются периоды
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = 0.5; // частотное разрешение
let average = 3; // количество усреднений
let overlap = 0; // наложение
let filter_A_vibr; // фильтр сигнала A вибрации
let filter_B_vibr; // фильтр сигнала B вибрации
// Канал A
// ФИЛЬТР_A 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_A_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_A_2_1000.kind = gtl.filter_iir.butterworth;
filter_A_2_1000.type = gtl.filter_iir.bandpass;
filter_A_2_1000.order = 6;
filter_A_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_A_2_1000.width = 998; // ширина полосы фильтра
let filter_A_2_1000v = gtl.add_intg(filter_A_2_1000); // интегрирование
filter_A_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр A для виброперемещения
let filter_A_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_A_2_300s.kind = gtl.filter_iir.butterworth;
filter_A_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_A_2_300s.order = 4;
filter_A_2_300s.frequency = 151; // центральная частота
filter_A_2_300s.width = 298; // ширина полосы
// Канал B
// ФИЛЬТР_B 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_B_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[1].portNumber]);
filter_B_2_1000.kind = gtl.filter_iir.butterworth;
filter_B_2_1000.type = gtl.filter_iir.bandpass;
filter_B_2_1000.order = 6;
filter_B_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_B_2_1000.width = 998; // ширина полосы фильтра
let filter_B_2_1000v = gtl.add_intg(filter_B_2_1000); // интегрирование
filter_B_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр B для виброперемещения
let filter_B_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[1].portNumber]);
filter_B_2_300s.kind = gtl.filter_iir.butterworth;
filter_B_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_B_2_300s.order = 4;
filter_B_2_300s.frequency = 151; // центральная частота
filter_B_2_300s.width = 298; // ширина полосы
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_A_vibr = filter_A_2_1000v;
filter_B_vibr = filter_B_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_A_vibr = filter_A_2_300s;
filter_B_vibr = filter_B_2_300s;
frequency = 300;
}
// Спектр_A для получения 1-й гармоники частоты вращения
let AUSP_A = gtl.add_ausp(filter_A_vibr); // объявление переменной спектра
AUSP_A.color = 0x00ff0000; // цвет спектра
AUSP_A.name = "AUSP_A"; // имя спектра
AUSP_A.frequency = frequency; // граничная частота спектра
AUSP_A.lines = AUSP_A.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_A.average = average; // количество усреднений
AUSP_A.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_A.smoothing_factor = 100; // усреднение средней линии
AUSP_A.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_A.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_A.tolerance = AUSP_A.resolution; // диапазон поиска гармоник +/-
// СКЗ_A
let RMS_A = gtl.add_value_rms(filter_A_vibr);
RMS_A.time = 1;
RMS_A.avg_cnt = 3;
// Спектр_B для получения 1-й гармоники частоты вращения
let AUSP_B = gtl.add_ausp(filter_B_vibr); // объявление переменной спектра
AUSP_B.color = 0x00ff0000; // цвет спектра
AUSP_B.name = "AUSP_A"; // имя спектра
AUSP_B.frequency = frequency; // граничная частота спектра
AUSP_B.lines = AUSP_B.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_B.average = average; // количество усреднений
AUSP_B.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_B.smoothing_factor = 100; // усреднение средней линии
AUSP_B.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_B.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_B.tolerance = AUSP_B.resolution; // диапазон поиска гармоник +/-
// СКЗ_B
let RMS_B = gtl.add_value_rms(filter_B_vibr);
RMS_B.time = 1;
RMS_B.avg_cnt = 3;
// Спектр вибрации точки A
var AUSP_A_pl = gtl.create_ausp(
{
"src" : filter_A_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки A
var pfc_A_pl = gtl.create_pfc(
{
"src0" : filter_A_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// Спектр виброскорости точки B
var AUSP_B_pl = gtl.create_ausp(
{
"src" : filter_B_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки B
var pfc_B_pl = gtl.create_pfc(
{
"src0" : filter_B_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектры вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбалансов"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации точки A */**
let A0 = A0_; // модуль вектора начальной вибрации точки A */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации точки A */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации точки A */** (конечное значение)
let A1_ = gtl.options.customOptions.A1; // модуль вектора вибрации точки A после установки пробного груза в плоскость 1 */**
let A1; // модуль вектора вибрации точки A после установки пробного груза в плоскость 1 */** (конечное значение)
let A1_phase_ = gtl.options.customOptions.A1_phase; // фаза вектора вибрации точки A после установки пробного груза в плоскость 1 */**
let A1_phase; // фаза вектора вибрации точки A после установки пробного груза в плоскость 1 */** (конечное значение)
let dA1; // модуль вектора дельты вибрации точки A после установки пробного груза в плоскость 1 ***
let dA1_phase; // фаза вектора дельты вибрации точки A после установки пробного груза в плоскость 1 ***
let B0_ = gtl.options.customOptions.B0; // модуль вектора начальной вибрации точки B */**
let B0 = B0_; // модуль вектора начальной вибрации точки B */** (конечное значение)
let B0_phase_ = gtl.options.customOptions.B0_phase; // фаза вектора начальной вибрации точки B */**
let B0_phase = B0_phase_; // фаза вектора начальной вибрации точки B */** (конечное значение)
let B1_ = gtl.options.customOptions.B1; // модуль вектора вибрации точки B после установки пробного груза в плоскость 1 */**
let B1; // модуль вектора вибрации точки B после установки пробного груза в плоскость 1 */** (конечное значение)
let B1_phase_ = gtl.options.customOptions.B1_phase; // фаза вектора вибрации точки B после установки пробного груза в плоскость 1 */**
let B1_phase; // фаза вектора вибрации точки B после установки пробного груза в плоскость 1 */** (конечное значение)
let dB1; // модуль вектора дельты вибрации точки B после установки пробного груза в плоскость 1 ***
let dB1_phase; // фаза вектора дельты вибрации точки B после установки пробного груза в плоскость 1 ***
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let A1_phase_X; // угол наклона вектора A1 к оси X
let A1_phase_Y; // угол наклона вектора A1 к оси Y
let A1_1_X; // начальная координата вектора A1 по оси X
let A1_2_X; // конечная координата вектора A1 по оси X
let A1_1_Y; // начальная координата вектора A1 по оси Y
let A1_2_Y; // конечная координата вектора A1 по оси Y
let dA1_1_X; // начальная координата вектора dA1 по оси X
let dA1_2_X; // конечная координата вектора dA1 по оси X
let dA1_1_Y; // начальная координата вектора dA1 по оси Y
let dA1_2_Y; // конечная координата вектора dA1 по оси Y
let B0_phase_X; // угол наклона вектора B0 к оси X
let B0_phase_Y; // угол наклона вектора B0 к оси Y
let B0_1_X; // начальная координата вектора B0 по оси X
let B0_2_X; // конечная координата вектора B0 по оси X
let B0_1_Y; // начальная координата вектора B0 по оси Y
let B0_2_Y; // конечная координата вектора B0 по оси Y
let B1_phase_X; // угол наклона вектора B1 к оси X
let B1_phase_Y; // угол наклона вектора B1 к оси Y
let B1_1_X; // начальная координата вектора B1 по оси X
let B1_2_X; // конечная координата вектора B1 по оси X
let B1_1_Y; // начальная координата вектора B1 по оси Y
let B1_2_Y; // конечная координата вектора B1 по оси Y
let dB1_1_X; // начальная координата вектора dB1 по оси X
let dB1_2_X; // конечная координата вектора dB1 по оси X
let dB1_1_Y; // начальная координата вектора dB1 по оси Y
let dB1_2_Y; // конечная координата вектора dB1 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time) + 0.1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP_A.clear_harms_sets();
AUSP_B.clear_harms_sets();
// Спектры вибрации точки A
let __AUSP_A_tools = gtl.create_spec_tools(
{
data: AUSP_A_pl.data,
df: AUSP_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_A = __AUSP_A_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_A.name = "F1_A (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_A_tools = gtl.create_spec_tools(
{
data: pfc_A_pl.data,
df: pfc_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_A = __pfc_A_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_A.name = "F1_A_phase (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// Спектры вибрации точки B
let __AUSP_B_tools = gtl.create_spec_tools(
{
data: AUSP_B_pl.data,
df: AUSP_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_B = __AUSP_B_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_B.name = "F1_B (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_B_tools = gtl.create_spec_tools(
{
data: pfc_B_pl.data,
df: pfc_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_B = __pfc_B_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_B.name = "F1_B_phase (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// Построение графиков
// Вибрация точки A
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки A",
x: AUSP_A_pl.resolution,
y: AUSP_A_pl.data,
spec_tools: __AUSP_A_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки A",
x: pfc_A_pl.resolution,
y: pfc_A_pl.data,
spec_tools: __pfc_A_tools.to_json()
});
let __result1_A = __AUSP_A_tools.to_json();
let __result2_A = __pfc_A_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_A = __result1_A.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_A = __result1_A.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_A = __result2_A.harms.rows[0].harms[0].ampl;
// Вибрация точки B
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки B",
x: AUSP_B_pl.resolution,
y: AUSP_B_pl.data,
spec_tools: __AUSP_B_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки B",
x: pfc_B_pl.resolution,
y: pfc_B_pl.data,
spec_tools: __pfc_B_tools.to_json()
});
let __result1_B = __AUSP_B_tools.to_json();
let __result2_B = __pfc_B_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_B = __result1_B.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_B = __result1_B.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_B = __result2_B.harms.rows[0].harms[0].ampl;
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 3 - вибрация пробного пуска A1 и B1 (пробный груз в плоскости 1):
// измерение начальной A1 и B1 (или ввод вручную)
// из предыдущих шагов переносятся: амплитуда и фаза вибрации A0, B0
// построение графиков A0, A1 и dA1, B0, B1 и dB1
// Определение конечных значений переменных
// A1 вибрация после установки пробного груза в плоскость 1
if (A1_ != 0) {A1 = A1_} // принимает значение из опций
else {A1 = F1_1_a_A} // принимает значение из спектра сигнала
if (A1_phase_ != 0) {A1_phase = A1_phase_} // принимает значение из опций
else {A1_phase = F1_1_ph_A} // принимает значение из спектра сигнала
// B1 вибрация после установки пробного груза в плоскость 1
if (B1_ != 0) {B1 = B1_} // принимает значение из опций
else {B1 = F1_1_a_B} // принимает значение из спектра сигнала
if (B1_phase_ != 0) {B1_phase = B1_phase_} // принимает значение из опций
else {B1_phase = F1_1_ph_B} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора A1 к осям X и Y
if (A1_phase <= 90) {
A1_phase_X = 90 - A1_phase}
if (A1_phase <= 180) {
A1_phase_X = A1_phase - 90}
if (A1_phase <= 270) {
A1_phase_X = 270 - A1_phase}
if (A1_phase <= 360) {
A1_phase_X = A1_phase - 270}
if (A1_phase <= 90) {
A1_phase_Y = A1_phase}
if (A1_phase <= 180) {
A1_phase_Y = 180 - A1_phase}
if (A1_phase <= 270) {
A1_phase_Y = A1_phase - 180}
if (A1_phase <= 360) {
A1_phase_Y = 360 - A1_phase}
// определение координат вектора A1
var xA1_array = []; // массив координат точек вектора A1 по оси X
var yA1_array = []; // массив координат точек вектора A1 по оси Y
A1_1_X = 0;
if (A1_phase <= 180) {A1_2_X = Math.abs(Math.cos(A1_phase_X * 3.1415/180)) * A1
} else {A1_2_X = Math.abs(Math.cos(A1_phase_X * 3.1415/180)) * A1 * (-1)}
A1_1_Y = 0;
if (A1_phase <= 90 || A1_phase >= 270) {A1_2_Y = Math.abs(Math.cos(A1_phase_Y * 3.1415/180)) * A1
} else {A1_2_Y = Math.abs(Math.cos(A1_phase_Y * 3.1415/180)) * A1 * (-1)}
xA1_array[0] = A1_1_X;
xA1_array[1] = A1_2_X;
yA1_array[0] = A1_1_Y;
yA1_array[1] = A1_2_Y;
// определение модуля вектора dA1
var xdA1_array = []; // массив координат точек вектора dA1 по оси X
var ydA1_array = []; // массив координат точек вектора dA1 по оси Y
dA1_1_X = A0_2_X;
dA1_2_X = A1_2_X;
dA1_1_Y = A0_2_Y;
dA1_2_Y = A1_2_Y;
dA1 = Math.sqrt(Math.pow(dA1_2_X - dA1_1_X, 2) + Math.pow(dA1_2_Y - dA1_1_Y, 2))
xdA1_array[0] = dA1_1_X;
xdA1_array[1] = dA1_2_X;
ydA1_array[0] = dA1_1_Y;
ydA1_array[1] = dA1_2_Y;
// определение фазы вектора dA1
if ((dA1_2_Y < dA1_1_Y) && (dA1_2_X < dA1_1_X)) {
dA1_phase = 180 + (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / 3.1415)}
if ((dA1_2_Y > dA1_1_Y) && (dA1_2_X > dA1_1_X)) {
dA1_phase = (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / 3.1415)}
if ((dA1_2_Y > dA1_1_Y) && (dA1_2_X < dA1_1_X)) {
dA1_phase = 360 - (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / 3.1415)}
if ((dA1_2_Y < dA1_1_Y) && (dA1_2_X > dA1_1_X)) {
dA1_phase = 180 - (((Math.acos((Math.abs(dA1_2_Y - dA1_1_Y)) / dA1)) * 180 ) / 3.1415)}
if (dA1_phase > 360) {dA1_phase = dA1_phase - 360}
// определение угла наклона вектора B0 к осям X и Y
if (B0_phase <= 90) {
B0_phase_X = 90 - B0_phase}
if (B0_phase <= 180) {
B0_phase_X = B0_phase - 90}
if (B0_phase <= 270) {
B0_phase_X = 270 - B0_phase}
if (B0_phase <= 360) {
B0_phase_X = B0_phase - 270}
if (B0_phase <= 90) {
B0_phase_Y = B0_phase}
if (B0_phase <= 180) {
B0_phase_Y = 180 - B0_phase}
if (B0_phase <= 270) {
B0_phase_Y = B0_phase - 180}
if (B0_phase <= 360) {
B0_phase_Y = 360 - B0_phase}
// определение координат вектора B0
var xB0_array = []; // массив координат точек вектора B0 по оси X
var yB0_array = []; // массив координат точек вектора B0 по оси Y
B0_1_X = 0;
if (B0_phase <= 180) {B0_2_X = Math.abs(Math.cos(B0_phase_X * 3.1415/180)) * B0
} else {B0_2_X = Math.abs(Math.cos(B0_phase_X * 3.1415/180)) * B0 * (-1)}
B0_1_Y = 0;
if (B0_phase <= 90 || B0_phase >= 270) {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * 3.1415/180)) * B0
} else {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * 3.1415/180)) * B0 * (-1)}
xB0_array[0] = B0_1_X;
xB0_array[1] = B0_2_X;
yB0_array[0] = B0_1_Y;
yB0_array[1] = B0_2_Y;
// определение угла наклона вектора B1 к осям X и Y
if (B1_phase <= 90) {
B1_phase_X = 90 - B1_phase}
if (B1_phase <= 180) {
B1_phase_X = B1_phase - 90}
if (B1_phase <= 270) {
B1_phase_X = 270 - B1_phase}
if (B1_phase <= 360) {
B1_phase_X = B1_phase - 270}
if (B1_phase <= 90) {
B1_phase_Y = B1_phase}
if (B1_phase <= 180) {
B1_phase_Y = 180 - B1_phase}
if (B1_phase <= 270) {
B1_phase_Y = B1_phase - 180}
if (B1_phase <= 360) {
B1_phase_Y = 360 - B1_phase}
// определение координат вектора B1
var xB1_array = []; // массив координат точек вектора B1 по оси X
var yB1_array = []; // массив координат точек вектора B1 по оси Y
B1_1_X = 0;
if (B1_phase <= 180) {B1_2_X = Math.abs(Math.cos(B1_phase_X * 3.1415/180)) * B1
} else {B1_2_X = Math.abs(Math.cos(B1_phase_X * 3.1415/180)) * B1 * (-1)}
B1_1_Y = 0;
if (B1_phase <= 90 || B1_phase >= 270) {B1_2_Y = Math.abs(Math.cos(B1_phase_Y * 3.1415/180)) * B1
} else {B1_2_Y = Math.abs(Math.cos(B1_phase_Y * 3.1415/180)) * B1 * (-1)}
xB1_array[0] = B1_1_X;
xB1_array[1] = B1_2_X;
yB1_array[0] = B1_1_Y;
yB1_array[1] = B1_2_Y;
// определение модуля вектора dB1
var xdB1_array = []; // массив координат точек вектора dB1 по оси X
var ydB1_array = []; // массив координат точек вектора dB1 по оси Y
dB1_1_X = B0_2_X;
dB1_2_X = B1_2_X;
dB1_1_Y = B0_2_Y;
dB1_2_Y = B1_2_Y;
dB1 = Math.sqrt(Math.pow(dB1_2_X - dB1_1_X, 2) + Math.pow(dB1_2_Y - dB1_1_Y, 2))
xdB1_array[0] = dB1_1_X;
xdB1_array[1] = dB1_2_X;
ydB1_array[0] = dB1_1_Y;
ydB1_array[1] = dB1_2_Y;
// определение фазы вектора dB1
if ((dB1_2_Y < dB1_1_Y) && (dB1_2_X < dB1_1_X)) {
dB1_phase = 180 + (((Math.acos((Math.abs(dB1_2_Y - dB1_1_Y)) / dB1)) * 180 ) / 3.1415)}
if ((dB1_2_Y > dB1_1_Y) && (dB1_2_X > dB1_1_X)) {
dB1_phase = (((Math.acos((Math.abs(dB1_2_Y - dB1_1_Y)) / dB1)) * 180 ) / 3.1415)}
if ((dB1_2_Y > dB1_1_Y) && (dB1_2_X < dB1_1_X)) {
dB1_phase = 360 - (((Math.acos((Math.abs(dB1_2_Y - dB1_1_Y)) / dB1)) * 180 ) / 3.1415)}
if ((dB1_2_Y < dB1_1_Y) && (dB1_2_X > dB1_1_X)) {
dB1_phase = 180 - (((Math.acos((Math.abs(dB1_2_Y - dB1_1_Y)) / dB1)) * 180 ) / 3.1415)}
if (dB1_phase > 360) {dB1_phase = dB1_phase - 360}
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_A1",
x: xA1_array,
y: yA1_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA1",
x: xdA1_array,
y: ydA1_array,
});
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_B0",
x: xB0_array,
y: yB0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_B1",
x: xB1_array,
y: yB1_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dB1",
x: xdB1_array,
y: ydB1_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2), -(Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2), (Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2), (Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2)],
y: [(Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2), -(Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2), -(Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2), (Math.max(A0,A1,dA1,B0,B1,dB1)+Math.max(A0,A1,dA1,B0,B1,dB1)*0.2)]
});
gtl.log.info("RMS_A",RMS_A.value);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("A1",A1);
gtl.log.info("A1_phase",A1_phase);
gtl.log.info("F1_1_ph_A (фаза)",F1_1_ph_A);
gtl.log.info("F1_1_a_A (ампл)",F1_1_a_A);
gtl.log.info("F1_1_f_A (част)",F1_1_f_A);
gtl.log.info("RMS_B",RMS_B.value);
gtl.log.info("B0",B0);
gtl.log.info("B0_phase",B0_phase);
gtl.log.info("B1",B1);
gtl.log.info("B1_phase",B1_phase);
gtl.log.info("F1_1_ph_B (фаза)",F1_1_ph_B);
gtl.log.info("F1_1_a_B (ампл)",F1_1_a_B);
gtl.log.info("F1_1_f_B (част)",F1_1_f_B);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
// Выдача результата (results)
let __result = {
_001_Ампл_гарм_1F1_A: F1_1_a_A,
_002азаастращ_F1_A: F1_1_ph_A,
_003_Ампл_вибр_пуска_A0: A0,
_004аза_вибр_пуска_A0: A0_phase,
_005_Ампл_вибр_пуска_A1: A1,
_006аза_вибр_пуска_A1: A1_phase,
_007_СКЗ_вибр_A: RMS_A.value,
_008_Ампл_гарм_1F1_B: F1_1_a_B,
_009азаастращ_F1_B: F1_1_ph_B,
_010_Ампл_вибр_пуска_B0: B0,
_011аза_вибр_пуска_B0: B0_phase,
_012_Ампл_вибр_пуска_B1: B1,
_013аза_вибр_пуска_B1: B1_phase,
_014_СКЗ_вибр_B: RMS_B.value,
_015астотаращения_F1: freq.value,
_016_Нестабастращ: instability*100,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

View File

@ -0,0 +1,178 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектры виброскорости"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбалансов"); // объект для дисбаланса
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let m_test_2_ = gtl.options.customOptions.m_test_2; // масса пробного груза плоскости 2 **
let m_test_2; // масса пробного груза плоскости 2 ** (конечное значение)
let m_test_2_corner_ = gtl.options.customOptions.m_test_2_corner; // угол установки пробного груза плоскости 2 **
let m_test_2_corner = m_test_2_corner_; // угол установки пробного груза плоскости 2 ** (конечное значение)
let m_test_2_calc; // масса пробного груза расчётная плоскости 2 ***
let n = gtl.options.customOptions.n; // частота вращения, об/мин */** (для вычисления массы пробного груза)
let R2_ = gtl.options.customOptions.R2; // радиус установки грузов плоскости 2 ** (для вычисления массы пробного груза)
let R2 = R2_; // радиус установки грузов плоскости 2 ** (для вычисления массы пробного груза) (конечное значение)
let P_ = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
let P = P_; // масса ротора, кг ** (для вычисления массы пробного груза) (конечное значение)
let B0_ = gtl.options.customOptions.B0; // модуль вектора начальной вибрации */**
let B0 = B0_; // модуль вектора начальной вибрации */** (конечное значение)
let B0_phase_ = gtl.options.customOptions.B0_phase; // фаза вектора начальной вибрации */**
let B0_phase = B0_phase_; // фаза вектора начальной вибрации */** (конечное значение)
// Переменные вспомогательные необходимые для расчётов
let B0_phase_X; // угол наклона вектора B0 к оси X
let B0_phase_Y; // угол наклона вектора B0 к оси Y
let B0_1_X; // начальная координата вектора B0 по оси X
let B0_2_X; // конечная координата вектора B0 по оси X
let B0_1_Y; // начальная координата вектора B0 по оси Y
let B0_2_Y; // конечная координата вектора B0 по оси Y
let m_test_2_corner_X; // угол наклона вектора m_test_2 к оси X
let m_test_2_corner_Y; // угол наклона вектора m_test_2 к оси Y
let m_test_2_1_X; // начальная координата вектора m_test_2 по оси X
let m_test_2_2_X; // конечная координата вектора m_test_2 по оси X
let m_test_2_1_Y; // начальная координата вектора m_test_2 по оси Y
let m_test_2_2_Y; // конечная координата вектора m_test_2 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 4 - выбор массы и положения пробного груза плоскости 2:
// вычисление рекомендуемой массы пробного груза m_test_2_calc
// ввод пользователем массы пробного груза и угла его установки m_test_2 плоскости 2
// построение графика расположения массы пробного груза плоскости 2 m_test_2
// из предыдущих шагов переносятся: частота вращения freq, радиус установки грузов плоскости 2 R2, масса ротора P, уровень начальной вибрации B0
// Вычисление массы пробного груза (если не введено своё значение и есть данные для формулы)
// m_test_2 масса пробного груза
if (P != 0 && R2 != 0)
{m_test_2_calc = 804 * ((P * B0) / (R2/10 * n));
} else {m_test_2_calc = 0}
if (m_test_2_ != 0) {m_test_2 = m_test_2_} // принимает значение из опций
else {m_test_2 = 0} // значение не введено
// определение угла наклона вектора m_test_2 к осям X и Y
if (m_test_2_corner <= 90) {
m_test_2_corner_X = 90 - m_test_2_corner}
if (m_test_2_corner <= 180) {
m_test_2_corner_X = m_test_2_corner - 90}
if (m_test_2_corner <= 270) {
m_test_2_corner_X = 270 - m_test_2_corner}
if (m_test_2_corner <= 360) {
m_test_2_corner_X = m_test_2_corner - 270}
if (m_test_2_corner <= 90) {
m_test_2_corner_Y = m_test_2_corner}
if (m_test_2_corner <= 180) {
m_test_2_corner_Y = 180 - m_test_2_corner}
if (m_test_2_corner <= 270) {
m_test_2_corner_Y = m_test_2_corner - 180}
if (m_test_2_corner <= 360) {
m_test_2_corner_Y = 360 - m_test_2_corner}
// определение координат вектора m_test_2
m_test_2_1_X = 0;
if (m_test_2_corner <= 180) {m_test_2_2_X = Math.abs(Math.cos(m_test_2_corner_X * Math.PI/180)) * m_test_2 * (-1)
} else {m_test_2_2_X = Math.abs(Math.cos(m_test_2_corner_X * Math.PI/180)) * m_test_2}
m_test_2_1_Y = 0;
if (m_test_2_corner <= 90 || m_test_2_corner >= 270) {m_test_2_2_Y = Math.abs(Math.cos(m_test_2_corner_Y * Math.PI/180)) * m_test_2
} else {m_test_2_2_Y = Math.abs(Math.cos(m_test_2_corner_Y * Math.PI/180)) * m_test_2 * (-1)}
// определение координат точек окружности обозначения массы пробного груза
var x_m_test_2_array = []; // массив координат точек окружности m_test_2 по оси X
var y_m_test_2_array = []; // массив координат точек окружности m_test_2 по оси Y
var x0_m_test_2 = m_test_2_2_X; // центр по X
var y0_m_test_2 = m_test_2_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_m_test_2_array.push(x0_m_test_2 + (Math.max(m_test_2)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_m_test_2_array.push(y0_m_test_2 + (Math.max(m_test_2)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности графика для отображения расположения дисбаланса
var xD_array = []; // массив координат точек окружности D по оси X
var yD_array = []; // массив координат точек окружности D по оси Y
var x0D = 0; // центр в начале координат
var y0D = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xD_array.push(x0D + (Math.max(m_test_2)+Math.max(m_test_2)*0.1) * (Math.sin((i) * Math.PI / 180)));
yD_array.push(y0D + (Math.max(m_test_2)+Math.max(m_test_2)*0.1) * (Math.cos((i) * Math.PI / 180)));}
plot_disb.add(
{
color: 0x0000ff,
name: "Пробный груз плоскости 2",
x: x_m_test_2_array,
y: y_m_test_2_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "График расположения дисбаланса",
x: xD_array,
y: yD_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(m_test_2)+Math.max(m_test_2)*0.2), -(Math.max(m_test_2)+Math.max(m_test_2)*0.2), (Math.max(m_test_2)+Math.max(m_test_2)*0.2), (Math.max(m_test_2)+Math.max(m_test_2)*0.2)],
y: [(Math.max(m_test_2)+Math.max(m_test_2)*0.2), -(Math.max(m_test_2)+Math.max(m_test_2)*0.2), -(Math.max(m_test_2)+Math.max(m_test_2)*0.2), (Math.max(m_test_2)+Math.max(m_test_2)*0.2)]
});
gtl.log.info("m_test_2 (пробный груз плоскости 2 введёный)",m_test_2);
gtl.log.info("m_test_2_corner (угол установки пробного груза плоскости 2)",m_test_2_corner);
gtl.log.info("m_test_2_calc (пробный груз плоскости 2 расчётный)",m_test_2_calc);
gtl.log.info("Масса ротора, кг", P);
gtl.log.info("Радиус установки грузов плоскости 2, мм", R2);
gtl.log.info("Начальная вибрация B0",B0);
// Выдача результата (results)
let __result = {
_001римен_пробный_груз_пл_2: m_test_2,
_002_Угол_устан_пробн_груза_пл_2: m_test_2_corner,
_003_Расч_пробный_груз_пл_2: m_test_2_calc
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

@ -0,0 +1,178 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектры виброскорости"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбалансов"); // объект для дисбаланса
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let m_test_2_ = gtl.options.customOptions.m_test_2; // масса пробного груза плоскости 2 **
let m_test_2; // масса пробного груза плоскости 2 ** (конечное значение)
let m_test_2_corner_ = gtl.options.customOptions.m_test_2_corner; // угол установки пробного груза плоскости 2 **
let m_test_2_corner = m_test_2_corner_; // угол установки пробного груза плоскости 2 ** (конечное значение)
let m_test_2_calc; // масса пробного груза расчётная плоскости 2 ***
let n = gtl.options.customOptions.n; // частота вращения, об/мин */** (для вычисления массы пробного груза)
let R2_ = gtl.options.customOptions.R2; // радиус установки грузов плоскости 2 ** (для вычисления массы пробного груза)
let R2 = R2_; // радиус установки грузов плоскости 2 ** (для вычисления массы пробного груза) (конечное значение)
let P_ = gtl.options.customOptions.P; // масса ротора, кг ** (для вычисления массы пробного груза)
let P = P_; // масса ротора, кг ** (для вычисления массы пробного груза) (конечное значение)
let B0_ = gtl.options.customOptions.B0; // модуль вектора начальной вибрации */**
let B0 = B0_; // модуль вектора начальной вибрации */** (конечное значение)
let B0_phase_ = gtl.options.customOptions.B0_phase; // фаза вектора начальной вибрации */**
let B0_phase = B0_phase_; // фаза вектора начальной вибрации */** (конечное значение)
// Переменные вспомогательные необходимые для расчётов
let B0_phase_X; // угол наклона вектора B0 к оси X
let B0_phase_Y; // угол наклона вектора B0 к оси Y
let B0_1_X; // начальная координата вектора B0 по оси X
let B0_2_X; // конечная координата вектора B0 по оси X
let B0_1_Y; // начальная координата вектора B0 по оси Y
let B0_2_Y; // конечная координата вектора B0 по оси Y
let m_test_2_corner_X; // угол наклона вектора m_test_2 к оси X
let m_test_2_corner_Y; // угол наклона вектора m_test_2 к оси Y
let m_test_2_1_X; // начальная координата вектора m_test_2 по оси X
let m_test_2_2_X; // конечная координата вектора m_test_2 по оси X
let m_test_2_1_Y; // начальная координата вектора m_test_2 по оси Y
let m_test_2_2_Y; // конечная координата вектора m_test_2 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = gtl.acq_time + 1;
function diagnose() {
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 4 - выбор массы и положения пробного груза плоскости 2:
// вычисление рекомендуемой массы пробного груза m_test_2_calc
// ввод пользователем массы пробного груза и угла его установки m_test_2 плоскости 2
// построение графика расположения массы пробного груза плоскости 2 m_test_2
// из предыдущих шагов переносятся: частота вращения freq, радиус установки грузов плоскости 2 R2, масса ротора P, уровень начальной вибрации B0
// Вычисление массы пробного груза (если не введено своё значение и есть данные для формулы)
// m_test_2 масса пробного груза
if (P != 0 && R2 != 0)
{m_test_2_calc = 804 * ((P * B0) / (R2/10 * n));
} else {m_test_2_calc = 0}
if (m_test_2_ != 0) {m_test_2 = m_test_2_} // принимает значение из опций
else {m_test_2 = 0} // значение не введено
// определение угла наклона вектора m_test_2 к осям X и Y
if (m_test_2_corner <= 90) {
m_test_2_corner_X = 90 - m_test_2_corner}
if (m_test_2_corner <= 180) {
m_test_2_corner_X = m_test_2_corner - 90}
if (m_test_2_corner <= 270) {
m_test_2_corner_X = 270 - m_test_2_corner}
if (m_test_2_corner <= 360) {
m_test_2_corner_X = m_test_2_corner - 270}
if (m_test_2_corner <= 90) {
m_test_2_corner_Y = m_test_2_corner}
if (m_test_2_corner <= 180) {
m_test_2_corner_Y = 180 - m_test_2_corner}
if (m_test_2_corner <= 270) {
m_test_2_corner_Y = m_test_2_corner - 180}
if (m_test_2_corner <= 360) {
m_test_2_corner_Y = 360 - m_test_2_corner}
// определение координат вектора m_test_2
m_test_2_1_X = 0;
if (m_test_2_corner <= 180) {m_test_2_2_X = Math.abs(Math.cos(m_test_2_corner_X * 3.1415/180)) * m_test_2 * (-1)
} else {m_test_2_2_X = Math.abs(Math.cos(m_test_2_corner_X * 3.1415/180)) * m_test_2}
m_test_2_1_Y = 0;
if (m_test_2_corner <= 90 || m_test_2_corner >= 270) {m_test_2_2_Y = Math.abs(Math.cos(m_test_2_corner_Y * 3.1415/180)) * m_test_2
} else {m_test_2_2_Y = Math.abs(Math.cos(m_test_2_corner_Y * 3.1415/180)) * m_test_2 * (-1)}
// определение координат точек окружности обозначения массы пробного груза
var x_m_test_2_array = []; // массив координат точек окружности m_test_2 по оси X
var y_m_test_2_array = []; // массив координат точек окружности m_test_2 по оси Y
var x0_m_test_2 = m_test_2_2_X; // центр по X
var y0_m_test_2 = m_test_2_2_Y; // центр по Y
for (let i=0; i<=359; i++ ) {
x_m_test_2_array.push(x0_m_test_2 + (Math.max(m_test_2)*0.1 * (Math.sin((i) * Math.PI / 180))));
y_m_test_2_array.push(y0_m_test_2 + (Math.max(m_test_2)*0.1 * (Math.cos((i) * Math.PI / 180))));}
// определение координат точек окружности графика для отображения расположения дисбаланса
var xD_array = []; // массив координат точек окружности D по оси X
var yD_array = []; // массив координат точек окружности D по оси Y
var x0D = 0; // центр в начале координат
var y0D = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xD_array.push(x0D + (Math.max(m_test_2)+Math.max(m_test_2)*0.1) * (Math.sin((i) * Math.PI / 180)));
yD_array.push(y0D + (Math.max(m_test_2)+Math.max(m_test_2)*0.1) * (Math.cos((i) * Math.PI / 180)));}
plot_disb.add(
{
color: 0x0000ff,
name: "Пробный груз плоскости 2",
x: x_m_test_2_array,
y: y_m_test_2_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "График расположения дисбаланса",
x: xD_array,
y: yD_array,
});
plot_disb.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(m_test_2)+Math.max(m_test_2)*0.2), -(Math.max(m_test_2)+Math.max(m_test_2)*0.2), (Math.max(m_test_2)+Math.max(m_test_2)*0.2), (Math.max(m_test_2)+Math.max(m_test_2)*0.2)],
y: [(Math.max(m_test_2)+Math.max(m_test_2)*0.2), -(Math.max(m_test_2)+Math.max(m_test_2)*0.2), -(Math.max(m_test_2)+Math.max(m_test_2)*0.2), (Math.max(m_test_2)+Math.max(m_test_2)*0.2)]
});
gtl.log.info("m_test_2 (пробный груз плоскости 2 введёный)",m_test_2);
gtl.log.info("m_test_2_corner (угол установки пробного груза плоскости 2)",m_test_2_corner);
gtl.log.info("m_test_2_calc (пробный груз плоскости 2 расчётный)",m_test_2_calc);
gtl.log.info("Масса ротора, кг", P);
gtl.log.info("Радиус установки грузов плоскости 2, мм", R2);
gtl.log.info("Начальная вибрация B0",B0);
// Выдача результата (results)
let __result = {
_001римен_пробный_груз_пл_2: m_test_2,
_002_Угол_устан_пробн_груза_пл_2: m_test_2_corner,
_003_Расч_пробный_груз_пл_2: m_test_2_calc
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
}

View File

@ -0,0 +1,790 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
let freq_time = gtl.options.customOptions.freq_time; // длина (время) отрезка сигнала
let freq_avg_cnt = gtl.options.customOptions.freq_avg_cnt; // количество усреднений
freq.time = freq_time;
freq.avg_cnt = freq_avg_cnt;
freq.dc = gtl.options.customOptions.freq_dc; // уровень, при переходе через который вычисляются периоды
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = gtl.options.customOptions.resolution; // частотное разрешение
let average = gtl.options.customOptions.average; // количество усреднений
let overlap = gtl.options.customOptions.overlap; // наложение
let peak_level = gtl.options.customOptions.peak_level; // порог обнаружения гармоник
let filter_A_vibr; // фильтр сигнала A вибрации
let filter_B_vibr; // фильтр сигнала B вибрации
let channel_A = gtl.options.customOptions.channel_A; // выбор канала A
let channel_B = gtl.options.customOptions.channel_B; // выбор канала B
// Канал A
// ФИЛЬТР_A 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_A_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_A].portNumber]);
filter_A_2_1000.kind = gtl.filter_iir.butterworth;
filter_A_2_1000.type = gtl.filter_iir.bandpass;
filter_A_2_1000.order = 6;
filter_A_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_A_2_1000.width = 998; // ширина полосы фильтра
let filter_A_2_1000v = gtl.add_intg(filter_A_2_1000); // интегрирование
filter_A_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр A для виброперемещения
let filter_A_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_A].portNumber]);
filter_A_2_300s.kind = gtl.filter_iir.butterworth;
filter_A_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_A_2_300s.order = 4;
filter_A_2_300s.frequency = 151; // центральная частота
filter_A_2_300s.width = 298; // ширина полосы
// Канал B
// ФИЛЬТР_B 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_B_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_B].portNumber]);
filter_B_2_1000.kind = gtl.filter_iir.butterworth;
filter_B_2_1000.type = gtl.filter_iir.bandpass;
filter_B_2_1000.order = 6;
filter_B_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_B_2_1000.width = 998; // ширина полосы фильтра
let filter_B_2_1000v = gtl.add_intg(filter_B_2_1000); // интегрирование
filter_B_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр B для виброперемещения
let filter_B_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_B].portNumber]);
filter_B_2_300s.kind = gtl.filter_iir.butterworth;
filter_B_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_B_2_300s.order = 4;
filter_B_2_300s.frequency = 151; // центральная частота
filter_B_2_300s.width = 298; // ширина полосы
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_A_vibr = filter_A_2_1000v;
filter_B_vibr = filter_B_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_A_vibr = filter_A_2_300s;
filter_B_vibr = filter_B_2_300s;
frequency = 300;
}
// Спектр_A для получения 1-й гармоники частоты вращения
let AUSP_A = gtl.add_ausp(filter_A_vibr); // объявление переменной спектра
AUSP_A.color = 0x00ff0000; // цвет спектра
AUSP_A.name = "AUSP_A"; // имя спектра
AUSP_A.frequency = frequency; // граничная частота спектра
AUSP_A.lines = AUSP_A.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_A.average = average; // количество усреднений
AUSP_A.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_A.smoothing_factor = 100; // усреднение средней линии
AUSP_A.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_A.peak_level = peak_level; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_A.tolerance = AUSP_A.resolution; // диапазон поиска гармоник +/-
// СКЗ_A
let RMS_A = gtl.add_value_rms(filter_A_vibr);
RMS_A.time = 1;
RMS_A.avg_cnt = 3;
// Спектр_B для получения 1-й гармоники частоты вращения
let AUSP_B = gtl.add_ausp(filter_B_vibr); // объявление переменной спектра
AUSP_B.color = 0x00ff0000; // цвет спектра
AUSP_B.name = "AUSP_B"; // имя спектра
AUSP_B.frequency = frequency; // граничная частота спектра
AUSP_B.lines = AUSP_B.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_B.average = average; // количество усреднений
AUSP_B.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_B.smoothing_factor = 100; // усреднение средней линии
AUSP_B.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_B.peak_level = peak_level; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_B.tolerance = AUSP_B.resolution; // диапазон поиска гармоник +/-
// СКЗ_B
let RMS_B = gtl.add_value_rms(filter_B_vibr);
RMS_B.time = 1;
RMS_B.avg_cnt = 3;
// Спектр вибрации точки A
var AUSP_A_pl = gtl.create_ausp(
{
"src" : filter_A_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки A
var pfc_A_pl = gtl.create_pfc(
{
// "src0" : filter_A_vibr,
// "src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src0" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src1" : filter_A_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
"range" : gtl.phase.positive,
"is_single" : false
}
);
// Спектр виброскорости точки B
var AUSP_B_pl = gtl.create_ausp(
{
"src" : filter_B_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки B
var pfc_B_pl = gtl.create_pfc(
{
// "src0" : filter_B_vibr,
// "src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src0" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src1" : filter_B_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
"range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектры вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбалансов"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации точки A */**
let A0 = A0_; // модуль вектора начальной вибрации точки A */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации точки A */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации точки A */** (конечное значение)
let A2_ = gtl.options.customOptions.A2; // модуль вектора вибрации точки A после установки пробного груза в плоскость 2 */**
let A2; // модуль вектора вибрации точки A после установки пробного груза в плоскость 2 */** (конечное значение)
let A2_phase_ = gtl.options.customOptions.A2_phase; // фаза вектора вибрации точки A после установки пробного груза в плоскость 2 */**
let A2_phase; // фаза вектора вибрации точки A после установки пробного груза в плоскость 2 */** (конечное значение)
let dA2; // модуль вектора дельты вибрации точки A после установки пробного груза в плоскость 2 ***
let dA2_phase; // фаза вектора дельты вибрации точки A после установки пробного груза в плоскость 2 ***
let B0_ = gtl.options.customOptions.B0; // модуль вектора начальной вибрации точки B */**
let B0 = B0_; // модуль вектора начальной вибрации точки B */** (конечное значение)
let B0_phase_ = gtl.options.customOptions.B0_phase; // фаза вектора начальной вибрации точки B */**
let B0_phase = B0_phase_; // фаза вектора начальной вибрации точки B */** (конечное значение)
let B2_ = gtl.options.customOptions.B2; // модуль вектора вибрации точки B после установки пробного груза в плоскость 2 */**
let B2; // модуль вектора вибрации точки B после установки пробного груза в плоскость 2*/** (конечное значение)
let B2_phase_ = gtl.options.customOptions.B2_phase; // фаза вектора вибрации точки B после установки пробного груза в плоскость 2 */**
let B2_phase; // фаза вектора вибрации точки B после установки пробного груза в плоскость 2 */** (конечное значение)
let dB2 // модуль вектора дельты вибрации точки B после установки пробного груза в плоскость 2 ***
let dB2_phase; // фаза вектора дельты вибрации точки B после установки пробного груза в плоскость 2 ***
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let A2_phase_X; // угол наклона вектора A2к оси X
let A2_phase_Y; // угол наклона вектора A2 к оси Y
let A2_1_X; // начальная координата вектора A2 по оси X
let A2_2_X; // конечная координата вектора A2 по оси X
let A2_1_Y; // начальная координата вектора A2 по оси Y
let A2_2_Y; // конечная координата вектора A2 по оси Y
let dA2_1_X; // начальная координата вектора dA2 по оси X
let dA2_2_X; // конечная координата вектора dA2 по оси X
let dA2_1_Y; // начальная координата вектора dA2 по оси Y
let dA2_2_Y; // конечная координата вектора dA2 по оси Y
let B0_phase_X; // угол наклона вектора B0 к оси X
let B0_phase_Y; // угол наклона вектора B0 к оси Y
let B0_1_X; // начальная координата вектора B0 по оси X
let B0_2_X; // конечная координата вектора B0 по оси X
let B0_1_Y; // начальная координата вектора B0 по оси Y
let B0_2_Y; // конечная координата вектора B0 по оси Y
let B2_phase_X; // угол наклона вектора B2 к оси X
let B2_phase_Y; // угол наклона вектора B2 к оси Y
let B2_1_X; // начальная координата вектора B2 по оси X
let B2_2_X; // конечная координата вектора B2 по оси X
let B2_1_Y; // начальная координата вектора B2 по оси Y
let B2_2_Y; // конечная координата вектора B2 по оси Y
let dB2_1_X; // начальная координата вектора dB2 по оси X
let dB2_2_X; // конечная координата вектора dB2 по оси X
let dB2_1_Y; // начальная координата вектора dB2 по оси Y
let dB2_2_Y; // конечная координата вектора dB2 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time) + 0.1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP_A.clear_harms_sets();
AUSP_B.clear_harms_sets();
// Спектры вибрации точки A
let __AUSP_A_tools = gtl.create_spec_tools(
{
data: AUSP_A_pl.data,
df: AUSP_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_A = __AUSP_A_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_A.name = "F1_A (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_A_tools = gtl.create_spec_tools(
{
data: pfc_A_pl.data,
df: pfc_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_A = __pfc_A_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_A.name = "F1_A_phase (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// Спектры вибрации точки B
let __AUSP_B_tools = gtl.create_spec_tools(
{
data: AUSP_B_pl.data,
df: AUSP_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_B = __AUSP_B_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_B.name = "F1_B (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_B_tools = gtl.create_spec_tools(
{
data: pfc_B_pl.data,
df: pfc_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_B = __pfc_B_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_B.name = "F1_B_phase (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// Построение графиков
// Вибрация точки A
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки A",
x: AUSP_A_pl.resolution,
y: AUSP_A_pl.data,
spec_tools: __AUSP_A_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки A",
x: pfc_A_pl.resolution,
y: pfc_A_pl.data,
spec_tools: __pfc_A_tools.to_json()
});
let __result1_A = __AUSP_A_tools.to_json();
let __result2_A = __pfc_A_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_A = __result1_A.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_A = __result1_A.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_A = __result2_A.harms.rows[0].harms[0].ampl;
// Вибрация точки B
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки B",
x: AUSP_B_pl.resolution,
y: AUSP_B_pl.data,
spec_tools: __AUSP_B_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки B",
x: pfc_B_pl.resolution,
y: pfc_B_pl.data,
spec_tools: __pfc_B_tools.to_json()
});
let __result1_B = __AUSP_B_tools.to_json();
let __result2_B = __pfc_B_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_B = __result1_B.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_B = __result1_B.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_B = __result2_B.harms.rows[0].harms[0].ampl;
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 5 - вибрация пробного пуска A2 и B2 (пробный груз в плоскости 2):
// измерение вибрации A2 и B2 (или ввод вручную)
// из предыдущих шагов переносятся: амплитуда и фаза вибрации A0, B0
// построение графиков вибрации A0, A2 и dA2, B0, B2 и dB2
// Определение конечных значений переменных
// A2 вибрация после установки пробного груза в плоскость 2
if (A2_ != "-") {A2 = A2_} // принимает значение из опций
else {A2 = F1_1_a_A} // принимает значение из спектра сигнала
if (A2_phase_ != "-") {A2_phase = A2_phase_} // принимает значение из опций
else {A2_phase = F1_1_ph_A} // принимает значение из спектра сигнала
// B2 вибрация после установки пробного груза в плоскость 2
if (B2_ != "-") {B2 = B2_} // принимает значение из опций
else {B2 = F1_1_a_B} // принимает значение из спектра сигнала
if (B2_phase_ != "-") {B2_phase = B2_phase_} // принимает значение из опций
else {B2_phase = F1_1_ph_B} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора A2 к осям X и Y
if (A2_phase <= 90) {
A2_phase_X = 90 - A2_phase}
if (A2_phase <= 180) {
A2_phase_X = A2_phase - 90}
if (A2_phase <= 270) {
A2_phase_X = 270 - A2_phase}
if (A2_phase <= 360) {
A2_phase_X = A2_phase - 270}
if (A2_phase <= 90) {
A2_phase_Y = A2_phase}
if (A2_phase <= 180) {
A2_phase_Y = 180 - A2_phase}
if (A2_phase <= 270) {
A2_phase_Y = A2_phase - 180}
if (A2_phase <= 360) {
A2_phase_Y = 360 - A2_phase}
// определение координат вектора A2
var xA2_array = []; // массив координат точек вектора A2 по оси X
var yA2_array = []; // массив координат точек вектора A2 по оси Y
A2_1_X = 0;
if (A2_phase <= 180) {A2_2_X = Math.abs(Math.cos(A2_phase_X * Math.PI/180)) * A2
} else {A2_2_X = Math.abs(Math.cos(A2_phase_X * Math.PI/180)) * A2 * (-1)}
A2_1_Y = 0;
if (A2_phase <= 90 || A2_phase >= 270) {A2_2_Y = Math.abs(Math.cos(A2_phase_Y * Math.PI/180)) * A2
} else {A2_2_Y = Math.abs(Math.cos(A2_phase_Y * Math.PI/180)) * A2 * (-1)}
xA2_array[0] = A2_1_X;
xA2_array[1] = A2_2_X;
yA2_array[0] = A2_1_Y;
yA2_array[1] = A2_2_Y;
// определение модуля вектора dA2
var xdA2_array = []; // массив координат точек вектора dA2 по оси X
var ydA2_array = []; // массив координат точек вектора dA2 по оси Y
dA2_1_X = A0_2_X;
dA2_2_X = A2_2_X;
dA2_1_Y = A0_2_Y;
dA2_2_Y = A2_2_Y;
dA2 = Math.sqrt(Math.pow(dA2_2_X - dA2_1_X, 2) + Math.pow(dA2_2_Y - dA2_1_Y, 2))
xdA2_array[0] = dA2_1_X;
xdA2_array[1] = dA2_2_X;
ydA2_array[0] = dA2_1_Y;
ydA2_array[1] = dA2_2_Y;
// определение фазы вектора dA2
if ((dA2_2_Y < dA2_1_Y) && (dA2_2_X < dA2_1_X)) {
dA2_phase = 180 + (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / Math.PI)}
if ((dA2_2_Y > dA2_1_Y) && (dA2_2_X > dA2_1_X)) {
dA2_phase = (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / Math.PI)}
if ((dA2_2_Y > dA2_1_Y) && (dA2_2_X < dA2_1_X)) {
dA2_phase = 360 - (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / Math.PI)}
if ((dA2_2_Y < dA2_1_Y) && (dA2_2_X > dA2_1_X)) {
dA2_phase = 180 - (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / Math.PI)}
if (dA2_phase > 360) {dA2_phase = dA2_phase - 360}
// определение угла наклона вектора B0 к осям X и Y
if (B0_phase <= 90) {
B0_phase_X = 90 - B0_phase}
if (B0_phase <= 180) {
B0_phase_X = B0_phase - 90}
if (B0_phase <= 270) {
B0_phase_X = 270 - B0_phase}
if (B0_phase <= 360) {
B0_phase_X = B0_phase - 270}
if (B0_phase <= 90) {
B0_phase_Y = B0_phase}
if (B0_phase <= 180) {
B0_phase_Y = 180 - B0_phase}
if (B0_phase <= 270) {
B0_phase_Y = B0_phase - 180}
if (B0_phase <= 360) {
B0_phase_Y = 360 - B0_phase}
// определение координат вектора B0
var xB0_array = []; // массив координат точек вектора B0 по оси X
var yB0_array = []; // массив координат точек вектора B0 по оси Y
B0_1_X = 0;
if (B0_phase <= 180) {B0_2_X = Math.abs(Math.cos(B0_phase_X * Math.PI/180)) * B0
} else {B0_2_X = Math.abs(Math.cos(B0_phase_X * Math.PI/180)) * B0 * (-1)}
B0_1_Y = 0;
if (B0_phase <= 90 || B0_phase >= 270) {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * Math.PI/180)) * B0
} else {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * Math.PI/180)) * B0 * (-1)}
xB0_array[0] = B0_1_X;
xB0_array[1] = B0_2_X;
yB0_array[0] = B0_1_Y;
yB0_array[1] = B0_2_Y;
// определение угла наклона вектора B2 к осям X и Y
if (B2_phase <= 90) {
B2_phase_X = 90 - B2_phase}
if (B2_phase <= 180) {
B2_phase_X = B2_phase - 90}
if (B2_phase <= 270) {
B2_phase_X = 270 - B2_phase}
if (B2_phase <= 360) {
B2_phase_X = B2_phase - 270}
if (B2_phase <= 90) {
B2_phase_Y = B2_phase}
if (B2_phase <= 180) {
B2_phase_Y = 180 - B2_phase}
if (B2_phase <= 270) {
B2_phase_Y = B2_phase - 180}
if (B2_phase <= 360) {
B2_phase_Y = 360 - B2_phase}
// определение координат вектора B2
var xB2_array = []; // массив координат точек вектора B2 по оси X
var yB2_array = []; // массив координат точек вектора B2 по оси Y
B2_1_X = 0;
if (B2_phase <= 180) {B2_2_X = Math.abs(Math.cos(B2_phase_X * Math.PI/180)) * B2
} else {B2_2_X = Math.abs(Math.cos(B2_phase_X * Math.PI/180)) * B2 * (-1)}
B2_1_Y = 0;
if (B2_phase <= 90 || B2_phase >= 270) {B2_2_Y = Math.abs(Math.cos(B2_phase_Y * Math.PI/180)) * B2
} else {B2_2_Y = Math.abs(Math.cos(B2_phase_Y * Math.PI/180)) * B2 * (-1)}
xB2_array[0] = B2_1_X;
xB2_array[1] = B2_2_X;
yB2_array[0] = B2_1_Y;
yB2_array[1] = B2_2_Y;
// определение модуля вектора dB2
var xdB2_array = []; // массив координат точек вектора dB2 по оси X
var ydB2_array = []; // массив координат точек вектора dB2 по оси Y
dB2_1_X = B0_2_X;
dB2_2_X = B2_2_X;
dB2_1_Y = B0_2_Y;
dB2_2_Y = B2_2_Y;
dB2 = Math.sqrt(Math.pow(dB2_2_X - dB2_1_X, 2) + Math.pow(dB2_2_Y - dB2_1_Y, 2))
xdB2_array[0] = dB2_1_X;
xdB2_array[1] = dB2_2_X;
ydB2_array[0] = dB2_1_Y;
ydB2_array[1] = dB2_2_Y;
// определение фазы вектора dB2
if ((dB2_2_Y < dB2_1_Y) && (dB2_2_X < dB2_1_X)) {
dB2_phase = 180 + (((Math.acos((Math.abs(dB2_2_Y - dB2_1_Y)) / dB2)) * 180 ) / Math.PI)}
if ((dB2_2_Y > dB2_1_Y) && (dB2_2_X > dB2_1_X)) {
dB2_phase = (((Math.acos((Math.abs(dB2_2_Y - dB2_1_Y)) / dB2)) * 180 ) / Math.PI)}
if ((dB2_2_Y > dB2_1_Y) && (dB2_2_X < dB2_1_X)) {
dB2_phase = 360 - (((Math.acos((Math.abs(dB2_2_Y - dB2_1_Y)) / dB2)) * 180 ) / Math.PI)}
if ((dB2_2_Y < dB2_1_Y) && (dB2_2_X > dB2_1_X)) {
dB2_phase = 180 - (((Math.acos((Math.abs(dB2_2_Y - dB2_1_Y)) / dB2)) * 180 ) / Math.PI)}
if (dB2_phase > 360) {dB2_phase = dB2_phase - 360}
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_A2",
x: xA2_array,
y: yA2_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA2",
x: xdA2_array,
y: ydA2_array,
});
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_B0",
x: xB0_array,
y: yB0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_B2",
x: xB2_array,
y: yB2_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dB2",
x: xdB2_array,
y: ydB2_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2), -(Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2), (Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2), (Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2)],
y: [(Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2), -(Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2), -(Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2), (Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2)]
});
gtl.log.info("RMS_A",RMS_A.value);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("A2",A2);
gtl.log.info("A2_phase",A2_phase);
gtl.log.info("F1_1_ph_A (фаза)",F1_1_ph_A);
gtl.log.info("F1_1_a_A (ампл)",F1_1_a_A);
gtl.log.info("F1_1_f_A (част)",F1_1_f_A);
gtl.log.info("RMS_B",RMS_B.value);
gtl.log.info("B0",B0);
gtl.log.info("B0_phase",B0_phase);
gtl.log.info("B2",B2);
gtl.log.info("B2_phase",B2_phase);
gtl.log.info("F1_1_ph_B (фаза)",F1_1_ph_B);
gtl.log.info("F1_1_a_B (ампл)",F1_1_a_B);
gtl.log.info("F1_1_f_B (част)",F1_1_f_B);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
// Выдача результата (results)
let __result = {
_001_Ампл_гарм_1F1_A: F1_1_a_A,
_002азаастращ_F1_A: F1_1_ph_A,
_003_Ампл_вибр_пуска_A0: A0,
_004аза_вибр_пуска_A0: A0_phase,
_005_Ампл_вибр_пуска_A2: A2,
_006аза_вибр_пуска_A2: A2_phase,
_007_СКЗ_вибр_A: RMS_A.value,
_008_Ампл_гарм_1F1_B: F1_1_a_B,
_009азаастращ_F1_B: F1_1_ph_B,
_010_Ампл_вибр_пуска_B0: B0,
_011аза_вибр_пуска_B0: B0_phase,
_012_Ампл_вибр_пуска_B2: B2,
_013аза_вибр_пуска_B2: B2_phase,
_014_СКЗ_вибр_B: RMS_B.value,
_015астотаращения_F1: freq.value,
_016_Нестабастращ: instability*100,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

View File

@ -0,0 +1,780 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
freq.time = 1; // длина (время) отрезка сигнала
freq.avg_cnt = 3; // количество усреднений
freq.dc = -0.05; // уровень, при переходе через который вычисляются периоды
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = 0.5; // частотное разрешение
let average = 3; // количество усреднений
let overlap = 0; // наложение
let filter_A_vibr; // фильтр сигнала A вибрации
let filter_B_vibr; // фильтр сигнала B вибрации
// Канал A
// ФИЛЬТР_A 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_A_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_A_2_1000.kind = gtl.filter_iir.butterworth;
filter_A_2_1000.type = gtl.filter_iir.bandpass;
filter_A_2_1000.order = 6;
filter_A_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_A_2_1000.width = 998; // ширина полосы фильтра
let filter_A_2_1000v = gtl.add_intg(filter_A_2_1000); // интегрирование
filter_A_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр A для виброперемещения
let filter_A_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_A_2_300s.kind = gtl.filter_iir.butterworth;
filter_A_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_A_2_300s.order = 4;
filter_A_2_300s.frequency = 151; // центральная частота
filter_A_2_300s.width = 298; // ширина полосы
// Канал B
// ФИЛЬТР_B 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_B_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[1].portNumber]);
filter_B_2_1000.kind = gtl.filter_iir.butterworth;
filter_B_2_1000.type = gtl.filter_iir.bandpass;
filter_B_2_1000.order = 6;
filter_B_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_B_2_1000.width = 998; // ширина полосы фильтра
let filter_B_2_1000v = gtl.add_intg(filter_B_2_1000); // интегрирование
filter_B_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр B для виброперемещения
let filter_B_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[1].portNumber]);
filter_B_2_300s.kind = gtl.filter_iir.butterworth;
filter_B_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_B_2_300s.order = 4;
filter_B_2_300s.frequency = 151; // центральная частота
filter_B_2_300s.width = 298; // ширина полосы
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_A_vibr = filter_A_2_1000v;
filter_B_vibr = filter_B_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_A_vibr = filter_A_2_300s;
filter_B_vibr = filter_B_2_300s;
frequency = 300;
}
// Спектр_A для получения 1-й гармоники частоты вращения
let AUSP_A = gtl.add_ausp(filter_A_vibr); // объявление переменной спектра
AUSP_A.color = 0x00ff0000; // цвет спектра
AUSP_A.name = "AUSP_A"; // имя спектра
AUSP_A.frequency = frequency; // граничная частота спектра
AUSP_A.lines = AUSP_A.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_A.average = average; // количество усреднений
AUSP_A.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_A.smoothing_factor = 100; // усреднение средней линии
AUSP_A.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_A.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_A.tolerance = AUSP_A.resolution; // диапазон поиска гармоник +/-
// СКЗ_A
let RMS_A = gtl.add_value_rms(filter_A_vibr);
RMS_A.time = 1;
RMS_A.avg_cnt = 3;
// Спектр_B для получения 1-й гармоники частоты вращения
let AUSP_B = gtl.add_ausp(filter_B_vibr); // объявление переменной спектра
AUSP_B.color = 0x00ff0000; // цвет спектра
AUSP_B.name = "AUSP_A"; // имя спектра
AUSP_B.frequency = frequency; // граничная частота спектра
AUSP_B.lines = AUSP_B.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_B.average = average; // количество усреднений
AUSP_B.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_B.smoothing_factor = 100; // усреднение средней линии
AUSP_B.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_B.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_B.tolerance = AUSP_B.resolution; // диапазон поиска гармоник +/-
// СКЗ_B
let RMS_B = gtl.add_value_rms(filter_B_vibr);
RMS_B.time = 1;
RMS_B.avg_cnt = 3;
// Спектр вибрации точки A
var AUSP_A_pl = gtl.create_ausp(
{
"src" : filter_A_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки A
var pfc_A_pl = gtl.create_pfc(
{
"src0" : filter_A_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// Спектр виброскорости точки B
var AUSP_B_pl = gtl.create_ausp(
{
"src" : filter_B_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки B
var pfc_B_pl = gtl.create_pfc(
{
"src0" : filter_B_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектры вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбалансов"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации точки A */**
let A0 = A0_; // модуль вектора начальной вибрации точки A */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации точки A */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации точки A */** (конечное значение)
let A2_ = gtl.options.customOptions.A2; // модуль вектора вибрации точки A после установки пробного груза в плоскость 2 */**
let A2; // модуль вектора вибрации точки A после установки пробного груза в плоскость 2 */** (конечное значение)
let A2_phase_ = gtl.options.customOptions.A2_phase; // фаза вектора вибрации точки A после установки пробного груза в плоскость 2 */**
let A2_phase; // фаза вектора вибрации точки A после установки пробного груза в плоскость 2 */** (конечное значение)
let dA2; // модуль вектора дельты вибрации точки A после установки пробного груза в плоскость 2 ***
let dA2_phase; // фаза вектора дельты вибрации точки A после установки пробного груза в плоскость 2 ***
let B0_ = gtl.options.customOptions.B0; // модуль вектора начальной вибрации точки B */**
let B0 = B0_; // модуль вектора начальной вибрации точки B */** (конечное значение)
let B0_phase_ = gtl.options.customOptions.B0_phase; // фаза вектора начальной вибрации точки B */**
let B0_phase = B0_phase_; // фаза вектора начальной вибрации точки B */** (конечное значение)
let B2_ = gtl.options.customOptions.B2; // модуль вектора вибрации точки B после установки пробного груза в плоскость 2 */**
let B2; // модуль вектора вибрации точки B после установки пробного груза в плоскость 2*/** (конечное значение)
let B2_phase_ = gtl.options.customOptions.B2_phase; // фаза вектора вибрации точки B после установки пробного груза в плоскость 2 */**
let B2_phase; // фаза вектора вибрации точки B после установки пробного груза в плоскость 2 */** (конечное значение)
let dB2 // модуль вектора дельты вибрации точки B после установки пробного груза в плоскость 2 ***
let dB2_phase; // фаза вектора дельты вибрации точки B после установки пробного груза в плоскость 2 ***
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let A2_phase_X; // угол наклона вектора A2к оси X
let A2_phase_Y; // угол наклона вектора A2 к оси Y
let A2_1_X; // начальная координата вектора A2 по оси X
let A2_2_X; // конечная координата вектора A2 по оси X
let A2_1_Y; // начальная координата вектора A2 по оси Y
let A2_2_Y; // конечная координата вектора A2 по оси Y
let dA2_1_X; // начальная координата вектора dA2 по оси X
let dA2_2_X; // конечная координата вектора dA2 по оси X
let dA2_1_Y; // начальная координата вектора dA2 по оси Y
let dA2_2_Y; // конечная координата вектора dA2 по оси Y
let B0_phase_X; // угол наклона вектора B0 к оси X
let B0_phase_Y; // угол наклона вектора B0 к оси Y
let B0_1_X; // начальная координата вектора B0 по оси X
let B0_2_X; // конечная координата вектора B0 по оси X
let B0_1_Y; // начальная координата вектора B0 по оси Y
let B0_2_Y; // конечная координата вектора B0 по оси Y
let B2_phase_X; // угол наклона вектора B2 к оси X
let B2_phase_Y; // угол наклона вектора B2 к оси Y
let B2_1_X; // начальная координата вектора B2 по оси X
let B2_2_X; // конечная координата вектора B2 по оси X
let B2_1_Y; // начальная координата вектора B2 по оси Y
let B2_2_Y; // конечная координата вектора B2 по оси Y
let dB2_1_X; // начальная координата вектора dB2 по оси X
let dB2_2_X; // конечная координата вектора dB2 по оси X
let dB2_1_Y; // начальная координата вектора dB2 по оси Y
let dB2_2_Y; // конечная координата вектора dB2 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time) + 0.1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP_A.clear_harms_sets();
AUSP_B.clear_harms_sets();
// Спектры вибрации точки A
let __AUSP_A_tools = gtl.create_spec_tools(
{
data: AUSP_A_pl.data,
df: AUSP_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_A = __AUSP_A_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_A.name = "F1_A (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_A_tools = gtl.create_spec_tools(
{
data: pfc_A_pl.data,
df: pfc_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_A = __pfc_A_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_A.name = "F1_A_phase (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// Спектры вибрации точки B
let __AUSP_B_tools = gtl.create_spec_tools(
{
data: AUSP_B_pl.data,
df: AUSP_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_B = __AUSP_B_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_B.name = "F1_B (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_B_tools = gtl.create_spec_tools(
{
data: pfc_B_pl.data,
df: pfc_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_B = __pfc_B_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_B.name = "F1_B_phase (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// Построение графиков
// Вибрация точки A
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки A",
x: AUSP_A_pl.resolution,
y: AUSP_A_pl.data,
spec_tools: __AUSP_A_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки A",
x: pfc_A_pl.resolution,
y: pfc_A_pl.data,
spec_tools: __pfc_A_tools.to_json()
});
let __result1_A = __AUSP_A_tools.to_json();
let __result2_A = __pfc_A_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_A = __result1_A.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_A = __result1_A.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_A = __result2_A.harms.rows[0].harms[0].ampl;
// Вибрация точки B
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки B",
x: AUSP_B_pl.resolution,
y: AUSP_B_pl.data,
spec_tools: __AUSP_B_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки B",
x: pfc_B_pl.resolution,
y: pfc_B_pl.data,
spec_tools: __pfc_B_tools.to_json()
});
let __result1_B = __AUSP_B_tools.to_json();
let __result2_B = __pfc_B_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_B = __result1_B.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_B = __result1_B.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_B = __result2_B.harms.rows[0].harms[0].ampl;
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 5 - вибрация пробного пуска A2 и B2 (пробный груз в плоскости 2):
// измерение вибрации A2 и B2 (или ввод вручную)
// из предыдущих шагов переносятся: амплитуда и фаза вибрации A0, B0
// построение графиков вибрации A0, A2 и dA2, B0, B2 и dB2
// Определение конечных значений переменных
// A2 вибрация после установки пробного груза в плоскость 2
if (A2_ != 0) {A2 = A2_} // принимает значение из опций
else {A2 = F1_1_a_A} // принимает значение из спектра сигнала
if (A2_phase_ != 0) {A2_phase = A2_phase_} // принимает значение из опций
else {A2_phase = F1_1_ph_A} // принимает значение из спектра сигнала
// B2 вибрация после установки пробного груза в плоскость 2
if (B2_ != 0) {B2 = B2_} // принимает значение из опций
else {B2 = F1_1_a_B} // принимает значение из спектра сигнала
if (B2_phase_ != 0) {B2_phase = B2_phase_} // принимает значение из опций
else {B2_phase = F1_1_ph_B} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора A2 к осям X и Y
if (A2_phase <= 90) {
A2_phase_X = 90 - A2_phase}
if (A2_phase <= 180) {
A2_phase_X = A2_phase - 90}
if (A2_phase <= 270) {
A2_phase_X = 270 - A2_phase}
if (A2_phase <= 360) {
A2_phase_X = A2_phase - 270}
if (A2_phase <= 90) {
A2_phase_Y = A2_phase}
if (A2_phase <= 180) {
A2_phase_Y = 180 - A2_phase}
if (A2_phase <= 270) {
A2_phase_Y = A2_phase - 180}
if (A2_phase <= 360) {
A2_phase_Y = 360 - A2_phase}
// определение координат вектора A2
var xA2_array = []; // массив координат точек вектора A2 по оси X
var yA2_array = []; // массив координат точек вектора A2 по оси Y
A2_1_X = 0;
if (A2_phase <= 180) {A2_2_X = Math.abs(Math.cos(A2_phase_X * 3.1415/180)) * A2
} else {A2_2_X = Math.abs(Math.cos(A2_phase_X * 3.1415/180)) * A2 * (-1)}
A2_1_Y = 0;
if (A2_phase <= 90 || A2_phase >= 270) {A2_2_Y = Math.abs(Math.cos(A2_phase_Y * 3.1415/180)) * A2
} else {A2_2_Y = Math.abs(Math.cos(A2_phase_Y * 3.1415/180)) * A2 * (-1)}
xA2_array[0] = A2_1_X;
xA2_array[1] = A2_2_X;
yA2_array[0] = A2_1_Y;
yA2_array[1] = A2_2_Y;
// определение модуля вектора dA2
var xdA2_array = []; // массив координат точек вектора dA2 по оси X
var ydA2_array = []; // массив координат точек вектора dA2 по оси Y
dA2_1_X = A0_2_X;
dA2_2_X = A2_2_X;
dA2_1_Y = A0_2_Y;
dA2_2_Y = A2_2_Y;
dA2 = Math.sqrt(Math.pow(dA2_2_X - dA2_1_X, 2) + Math.pow(dA2_2_Y - dA2_1_Y, 2))
xdA2_array[0] = dA2_1_X;
xdA2_array[1] = dA2_2_X;
ydA2_array[0] = dA2_1_Y;
ydA2_array[1] = dA2_2_Y;
// определение фазы вектора dA2
if ((dA2_2_Y < dA2_1_Y) && (dA2_2_X < dA2_1_X)) {
dA2_phase = 180 + (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / 3.1415)}
if ((dA2_2_Y > dA2_1_Y) && (dA2_2_X > dA2_1_X)) {
dA2_phase = (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / 3.1415)}
if ((dA2_2_Y > dA2_1_Y) && (dA2_2_X < dA2_1_X)) {
dA2_phase = 360 - (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / 3.1415)}
if ((dA2_2_Y < dA2_1_Y) && (dA2_2_X > dA2_1_X)) {
dA2_phase = 180 - (((Math.acos((Math.abs(dA2_2_Y - dA2_1_Y)) / dA2)) * 180 ) / 3.1415)}
if (dA2_phase > 360) {dA2_phase = dA2_phase - 360}
// определение угла наклона вектора B0 к осям X и Y
if (B0_phase <= 90) {
B0_phase_X = 90 - B0_phase}
if (B0_phase <= 180) {
B0_phase_X = B0_phase - 90}
if (B0_phase <= 270) {
B0_phase_X = 270 - B0_phase}
if (B0_phase <= 360) {
B0_phase_X = B0_phase - 270}
if (B0_phase <= 90) {
B0_phase_Y = B0_phase}
if (B0_phase <= 180) {
B0_phase_Y = 180 - B0_phase}
if (B0_phase <= 270) {
B0_phase_Y = B0_phase - 180}
if (B0_phase <= 360) {
B0_phase_Y = 360 - B0_phase}
// определение координат вектора B0
var xB0_array = []; // массив координат точек вектора B0 по оси X
var yB0_array = []; // массив координат точек вектора B0 по оси Y
B0_1_X = 0;
if (B0_phase <= 180) {B0_2_X = Math.abs(Math.cos(B0_phase_X * 3.1415/180)) * B0
} else {B0_2_X = Math.abs(Math.cos(B0_phase_X * 3.1415/180)) * B0 * (-1)}
B0_1_Y = 0;
if (B0_phase <= 90 || B0_phase >= 270) {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * 3.1415/180)) * B0
} else {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * 3.1415/180)) * B0 * (-1)}
xB0_array[0] = B0_1_X;
xB0_array[1] = B0_2_X;
yB0_array[0] = B0_1_Y;
yB0_array[1] = B0_2_Y;
// определение угла наклона вектора B2 к осям X и Y
if (B2_phase <= 90) {
B2_phase_X = 90 - B2_phase}
if (B2_phase <= 180) {
B2_phase_X = B2_phase - 90}
if (B2_phase <= 270) {
B2_phase_X = 270 - B2_phase}
if (B2_phase <= 360) {
B2_phase_X = B2_phase - 270}
if (B2_phase <= 90) {
B2_phase_Y = B2_phase}
if (B2_phase <= 180) {
B2_phase_Y = 180 - B2_phase}
if (B2_phase <= 270) {
B2_phase_Y = B2_phase - 180}
if (B2_phase <= 360) {
B2_phase_Y = 360 - B2_phase}
// определение координат вектора B2
var xB2_array = []; // массив координат точек вектора B2 по оси X
var yB2_array = []; // массив координат точек вектора B2 по оси Y
B2_1_X = 0;
if (B2_phase <= 180) {B2_2_X = Math.abs(Math.cos(B2_phase_X * 3.1415/180)) * B2
} else {B2_2_X = Math.abs(Math.cos(B2_phase_X * 3.1415/180)) * B2 * (-1)}
B2_1_Y = 0;
if (B2_phase <= 90 || B2_phase >= 270) {B2_2_Y = Math.abs(Math.cos(B2_phase_Y * 3.1415/180)) * B2
} else {B2_2_Y = Math.abs(Math.cos(B2_phase_Y * 3.1415/180)) * B2 * (-1)}
xB2_array[0] = B2_1_X;
xB2_array[1] = B2_2_X;
yB2_array[0] = B2_1_Y;
yB2_array[1] = B2_2_Y;
// определение модуля вектора dB2
var xdB2_array = []; // массив координат точек вектора dB2 по оси X
var ydB2_array = []; // массив координат точек вектора dB2 по оси Y
dB2_1_X = B0_2_X;
dB2_2_X = B2_2_X;
dB2_1_Y = B0_2_Y;
dB2_2_Y = B2_2_Y;
dB2 = Math.sqrt(Math.pow(dB2_2_X - dB2_1_X, 2) + Math.pow(dB2_2_Y - dB2_1_Y, 2))
xdB2_array[0] = dB2_1_X;
xdB2_array[1] = dB2_2_X;
ydB2_array[0] = dB2_1_Y;
ydB2_array[1] = dB2_2_Y;
// определение фазы вектора dB2
if ((dB2_2_Y < dB2_1_Y) && (dB2_2_X < dB2_1_X)) {
dB2_phase = 180 + (((Math.acos((Math.abs(dB2_2_Y - dB2_1_Y)) / dB2)) * 180 ) / 3.1415)}
if ((dB2_2_Y > dB2_1_Y) && (dB2_2_X > dB2_1_X)) {
dB2_phase = (((Math.acos((Math.abs(dB2_2_Y - dB2_1_Y)) / dB2)) * 180 ) / 3.1415)}
if ((dB2_2_Y > dB2_1_Y) && (dB2_2_X < dB2_1_X)) {
dB2_phase = 360 - (((Math.acos((Math.abs(dB2_2_Y - dB2_1_Y)) / dB2)) * 180 ) / 3.1415)}
if ((dB2_2_Y < dB2_1_Y) && (dB2_2_X > dB2_1_X)) {
dB2_phase = 180 - (((Math.acos((Math.abs(dB2_2_Y - dB2_1_Y)) / dB2)) * 180 ) / 3.1415)}
if (dB2_phase > 360) {dB2_phase = dB2_phase - 360}
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_A2",
x: xA2_array,
y: yA2_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA2",
x: xdA2_array,
y: ydA2_array,
});
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_B0",
x: xB0_array,
y: yB0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_B2",
x: xB2_array,
y: yB2_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dB2",
x: xdB2_array,
y: ydB2_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2), -(Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2), (Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2), (Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2)],
y: [(Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2), -(Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2), -(Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2), (Math.max(A0,A2,dA2,B0,B2,dB2)+Math.max(A0,A2,dA2,B0,B2,dB2)*0.2)]
});
gtl.log.info("RMS_A",RMS_A.value);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("A2",A2);
gtl.log.info("A2_phase",A2_phase);
gtl.log.info("F1_1_ph_A (фаза)",F1_1_ph_A);
gtl.log.info("F1_1_a_A (ампл)",F1_1_a_A);
gtl.log.info("F1_1_f_A (част)",F1_1_f_A);
gtl.log.info("RMS_B",RMS_B.value);
gtl.log.info("B0",B0);
gtl.log.info("B0_phase",B0_phase);
gtl.log.info("B2",B2);
gtl.log.info("B2_phase",B2_phase);
gtl.log.info("F1_1_ph_B (фаза)",F1_1_ph_B);
gtl.log.info("F1_1_a_B (ампл)",F1_1_a_B);
gtl.log.info("F1_1_f_B (част)",F1_1_f_B);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
// Выдача результата (results)
let __result = {
_001_Ампл_гарм_1F1_A: F1_1_a_A,
_002азаастращ_F1_A: F1_1_ph_A,
_003_Ампл_вибр_пуска_A0: A0,
_004аза_вибр_пуска_A0: A0_phase,
_005_Ампл_вибр_пуска_A2: A2,
_006аза_вибр_пуска_A2: A2_phase,
_007_СКЗ_вибр_A: RMS_A.value,
_008_Ампл_гарм_1F1_B: F1_1_a_B,
_009азаастращ_F1_B: F1_1_ph_B,
_010_Ампл_вибр_пуска_B0: B0,
_011аза_вибр_пуска_B0: B0_phase,
_012_Ампл_вибр_пуска_B2: B2,
_013аза_вибр_пуска_B2: B2_phase,
_014_СКЗ_вибр_B: RMS_B.value,
_015астотаращения_F1: freq.value,
_016_Нестабастращ: instability*100,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

File diff suppressed because it is too large Load Diff

1459
scripts/2 пл - шаг 6.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,800 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
let freq_time = gtl.options.customOptions.freq_time; // длина (время) отрезка сигнала
let freq_avg_cnt = gtl.options.customOptions.freq_avg_cnt; // количество усреднений
freq.time = freq_time;
freq.avg_cnt = freq_avg_cnt;
freq.dc = gtl.options.customOptions.freq_dc; // уровень, при переходе через который вычисляются периоды
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = gtl.options.customOptions.resolution; // частотное разрешение
let average = gtl.options.customOptions.average; // количество усреднений
let overlap = gtl.options.customOptions.overlap; // наложение
let peak_level = gtl.options.customOptions.peak_level; // порог обнаружения гармоник
let filter_A_vibr; // фильтр сигнала A вибрации
let filter_B_vibr; // фильтр сигнала B вибрации
let channel_A = gtl.options.customOptions.channel_A; // выбор канала A
let channel_B = gtl.options.customOptions.channel_B; // выбор канала B
// Канал A
// ФИЛЬТР_A 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_A_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_A].portNumber]);
filter_A_2_1000.kind = gtl.filter_iir.butterworth;
filter_A_2_1000.type = gtl.filter_iir.bandpass;
filter_A_2_1000.order = 6;
filter_A_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_A_2_1000.width = 998; // ширина полосы фильтра
let filter_A_2_1000v = gtl.add_intg(filter_A_2_1000); // интегрирование
filter_A_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр A для виброперемещения
let filter_A_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_A].portNumber]);
filter_A_2_300s.kind = gtl.filter_iir.butterworth;
filter_A_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_A_2_300s.order = 4;
filter_A_2_300s.frequency = 151; // центральная частота
filter_A_2_300s.width = 298; // ширина полосы
// Канал B
// ФИЛЬТР_B 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_B_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_B].portNumber]);
filter_B_2_1000.kind = gtl.filter_iir.butterworth;
filter_B_2_1000.type = gtl.filter_iir.bandpass;
filter_B_2_1000.order = 6;
filter_B_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_B_2_1000.width = 998; // ширина полосы фильтра
let filter_B_2_1000v = gtl.add_intg(filter_B_2_1000); // интегрирование
filter_B_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр B для виброперемещения
let filter_B_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[channel_B].portNumber]);
filter_B_2_300s.kind = gtl.filter_iir.butterworth;
filter_B_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_B_2_300s.order = 4;
filter_B_2_300s.frequency = 151; // центральная частота
filter_B_2_300s.width = 298; // ширина полосы
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_A_vibr = filter_A_2_1000v;
filter_B_vibr = filter_B_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_A_vibr = filter_A_2_300s;
filter_B_vibr = filter_B_2_300s;
frequency = 300;
}
// Спектр_A для получения 1-й гармоники частоты вращения
let AUSP_A = gtl.add_ausp(filter_A_vibr); // объявление переменной спектра
AUSP_A.color = 0x00ff0000; // цвет спектра
AUSP_A.name = "AUSP_A"; // имя спектра
AUSP_A.frequency = frequency; // граничная частота спектра
AUSP_A.lines = AUSP_A.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_A.average = average; // количество усреднений
AUSP_A.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_A.smoothing_factor = 100; // усреднение средней линии
AUSP_A.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_A.peak_level = peak_level; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_A.tolerance = AUSP_A.resolution; // диапазон поиска гармоник +/-
// СКЗ_A
let RMS_A = gtl.add_value_rms(filter_A_vibr);
RMS_A.time = 1;
RMS_A.avg_cnt = 3;
// Спектр_B для получения 1-й гармоники частоты вращения
let AUSP_B = gtl.add_ausp(filter_B_vibr); // объявление переменной спектра
AUSP_B.color = 0x00ff0000; // цвет спектра
AUSP_B.name = "AUSP_B"; // имя спектра
AUSP_B.frequency = frequency; // граничная частота спектра
AUSP_B.lines = AUSP_B.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_B.average = average; // количество усреднений
AUSP_B.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_B.smoothing_factor = 100; // усреднение средней линии
AUSP_B.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_B.peak_level = peak_level; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_B.tolerance = AUSP_B.resolution; // диапазон поиска гармоник +/-
// СКЗ_B
let RMS_B = gtl.add_value_rms(filter_B_vibr);
RMS_B.time = 1;
RMS_B.avg_cnt = 3;
// Спектр вибрации точки A
var AUSP_A_pl = gtl.create_ausp(
{
"src" : filter_A_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки A
var pfc_A_pl = gtl.create_pfc(
{
// "src0" : filter_A_vibr,
// "src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src0" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src1" : filter_A_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
"range" : gtl.phase.positive,
"is_single" : false
}
);
// Спектр виброскорости точки B
var AUSP_B_pl = gtl.create_ausp(
{
"src" : filter_B_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки B
var pfc_B_pl = gtl.create_pfc(
{
// "src0" : filter_B_vibr,
// "src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src0" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"src1" : filter_B_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
"range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектры вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбалансов"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации точки A */**
let A0 = A0_; // модуль вектора начальной вибрации точки A */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации точки A */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации точки A */** (конечное значение)
let A3_ = gtl.options.customOptions.A3; // модуль вектора вибрации точки A после установки балансировочного груза в плоскость 1 */**
let A3; // модуль вектора вибрации точки A после установки балансировочного груза в плоскость 1 */** (конечное значение)
let A3_phase_ = gtl.options.customOptions.A3_phase; // фаза вектора вибрации точки A после установки балансировочного груза в плоскость 1 */**
let A3_phase; // фаза вектора вибрации точки A после установки балансировочного груза в плоскость 1 */** (конечное значение)
let dA3; // модуль вектора дельты вибрации точки A после установки балансировочного груза в плоскость 1 ***
let dA3_phase; // фаза вектора дельты вибрации точки A после установки балансировочного груза в плоскость 1 ***
let B0_ = gtl.options.customOptions.B0; // модуль вектора начальной вибрации точки B */**
let B0 = B0_; // модуль вектора начальной вибрации точки B */** (конечное значение)
let B0_phase_ = gtl.options.customOptions.B0_phase; // фаза вектора начальной вибрации точки B */**
let B0_phase = B0_phase_; // фаза вектора начальной вибрации точки B */** (конечное значение)
let B3_ = gtl.options.customOptions.B3; // модуль вектора вибрации точки B после установки балансировочного груза в плоскость 2 */**
let B3; // модуль вектора вибрации точки B после установки балансировочного груза в плоскость 2 */** (конечное значение)
let B3_phase_ = gtl.options.customOptions.B3_phase; // фаза вектора вибрации точки B после установки балансировочного груза в плоскость 2 */**
let B3_phase; // фаза вектора вибрации точки B после установки балансировочного груза в плоскость 2 */** (конечное значение)
let dB3; // модуль вектора дельты вибрации точки B после установки балансировочного груза в плоскость 2 ***
let dB3_phase; // фаза вектора дельты вибрации точки B после установки балансировочного груза в плоскость 2 ***
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let A3_phase_X; // угол наклона вектора A3 к оси X
let A3_phase_Y; // угол наклона вектора A3 к оси Y
let A3_1_X; // начальная координата вектора A3 по оси X
let A3_2_X; // конечная координата вектора A3 по оси X
let A3_1_Y; // начальная координата вектора A3 по оси Y
let A3_2_Y; // конечная координата вектора A3 по оси Y
let dA3_1_X; // начальная координата вектора dA3 по оси X
let dA3_2_X; // конечная координата вектора dA3 по оси X
let dA3_1_Y; // начальная координата вектора dA3 по оси Y
let dA3_2_Y; // конечная координата вектора dA3 по оси Y
let B0_phase_X; // угол наклона вектора B0 к оси X
let B0_phase_Y; // угол наклона вектора B0 к оси Y
let B0_1_X; // начальная координата вектора B0 по оси X
let B0_2_X; // конечная координата вектора B0 по оси X
let B0_1_Y; // начальная координата вектора B0 по оси Y
let B0_2_Y; // конечная координата вектора B0 по оси Y
let B3_phase_X; // угол наклона вектора B3 к оси X
let B3_phase_Y; // угол наклона вектора B3 к оси Y
let B3_1_X; // начальная координата вектора B3 по оси X
let B3_2_X; // конечная координата вектора B3 по оси X
let B3_1_Y; // начальная координата вектора B3 по оси Y
let B3_2_Y; // конечная координата вектора B3 по оси Y
let dB3_1_X; // начальная координата вектора dB3 по оси X
let dB3_2_X; // конечная координата вектора dB3 по оси X
let dB3_1_Y; // начальная координата вектора dB3 по оси Y
let dB3_2_Y; // конечная координата вектора dB3 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time) + 0.1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP_A.clear_harms_sets();
AUSP_B.clear_harms_sets();
// Спектры вибрации точки A
let __AUSP_A_tools = gtl.create_spec_tools(
{
data: AUSP_A_pl.data,
df: AUSP_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_A = __AUSP_A_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_A.name = "F1_A (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_A_tools = gtl.create_spec_tools(
{
data: pfc_A_pl.data,
df: pfc_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_A = __pfc_A_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_A.name = "F1_A_phase (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// Спектры вибрации точки B
let __AUSP_B_tools = gtl.create_spec_tools(
{
data: AUSP_B_pl.data,
df: AUSP_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_B = __AUSP_B_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_B.name = "F1_B (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_B_tools = gtl.create_spec_tools(
{
data: pfc_B_pl.data,
df: pfc_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_B = __pfc_B_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_B.name = "F1_B_phase (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// Построение графиков
// Вибрация точки A
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки A",
x: AUSP_A_pl.resolution,
y: AUSP_A_pl.data,
spec_tools: __AUSP_A_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки A",
x: pfc_A_pl.resolution,
y: pfc_A_pl.data,
spec_tools: __pfc_A_tools.to_json()
});
let __result1_A = __AUSP_A_tools.to_json();
let __result2_A = __pfc_A_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_A = __result1_A.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_A = __result1_A.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_A = __result2_A.harms.rows[0].harms[0].ampl;
// Вибрация точки B
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки B",
x: AUSP_B_pl.resolution,
y: AUSP_B_pl.data,
spec_tools: __AUSP_B_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки B",
x: pfc_B_pl.resolution,
y: pfc_B_pl.data,
spec_tools: __pfc_B_tools.to_json()
});
let __result1_B = __AUSP_B_tools.to_json();
let __result2_B = __pfc_B_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_B = __result1_B.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_B = __result1_B.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_B = __result2_B.harms.rows[0].harms[0].ampl;
// Проверка наличия оборотной гармоники и необходимости проведения баалнсировки
var test_balance = ""; // переменная для текста о необходимости проведения балансировки
if (F1_1_a_A >= RMS_A.value * 0.4 || F1_1_a_B >= RMS_B.value * 0.4) // вклад оборотной гармоники в СКЗ
{test_balance = "необходимо провести балансировку";}
else {test_balance = "проведение балансировки не требуется или нецелесообразно";}
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 7 - контрольный пуск:
// измерение вибрации A3 и B3 после установки балансировочных грузов
// определение целесообразности проведения добалансировки
// из предыдущих шагов переносятся: амплитуда и фаза вибрации A0, B0
// построение графиков A0, A3 и dA3, B0, B3 и dB3
// Определение конечных значений переменных
// A3 вибрация после установки балансировочного груза в плоскость 1
if (A3_ != "-") {A3 = A3_} // принимает значение из опций
else {A3 = F1_1_a_A} // принимает значение из спектра сигнала
if (A3_phase_ != "-") {A3_phase = A3_phase_} // принимает значение из опций
else {A3_phase = F1_1_ph_A} // принимает значение из спектра сигнала
// B3 вибрация после установки балансировочного груза в плоскость 2
if (B3_ != "-") {B3 = B3_} // принимает значение из опций
else {B3 = F1_1_a_B} // принимает значение из спектра сигнала
if (B3_phase_ != "-") {B3_phase = B3_phase_} // принимает значение из опций
else {B3_phase = F1_1_ph_B} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * Math.PI/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * Math.PI/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора A3 к осям X и Y
if (A3_phase <= 90) {
A3_phase_X = 90 - A3_phase}
if (A3_phase <= 180) {
A3_phase_X = A3_phase - 90}
if (A3_phase <= 270) {
A3_phase_X = 270 - A3_phase}
if (A3_phase <= 360) {
A3_phase_X = A3_phase - 270}
if (A3_phase <= 90) {
A3_phase_Y = A3_phase}
if (A3_phase <= 180) {
A3_phase_Y = 180 - A3_phase}
if (A3_phase <= 270) {
A3_phase_Y = A3_phase - 180}
if (A3_phase <= 360) {
A3_phase_Y = 360 - A3_phase}
// определение координат вектора A3
var xA3_array = []; // массив координат точек вектора A3 по оси X
var yA3_array = []; // массив координат точек вектора A3 по оси Y
A3_1_X = 0;
if (A3_phase <= 180) {A3_2_X = Math.abs(Math.cos(A3_phase_X * Math.PI/180)) * A3
} else {A3_2_X = Math.abs(Math.cos(A3_phase_X * Math.PI/180)) * A3 * (-1)}
A3_1_Y = 0;
if (A3_phase <= 90 || A3_phase >= 270) {A3_2_Y = Math.abs(Math.cos(A3_phase_Y * Math.PI/180)) * A3
} else {A3_2_Y = Math.abs(Math.cos(A3_phase_Y * Math.PI/180)) * A3 * (-1)}
xA3_array[0] = A3_1_X;
xA3_array[1] = A3_2_X;
yA3_array[0] = A3_1_Y;
yA3_array[1] = A3_2_Y;
// определение модуля вектора dA3
var xdA3_array = []; // массив координат точек вектора dA3 по оси X
var ydA3_array = []; // массив координат точек вектора dA3 по оси Y
dA3_1_X = A0_2_X;
dA3_2_X = A3_2_X;
dA3_1_Y = A0_2_Y;
dA3_2_Y = A3_2_Y;
dA3 = Math.sqrt(Math.pow(dA3_2_X - dA3_1_X, 2) + Math.pow(dA3_2_Y - dA3_1_Y, 2))
xdA3_array[0] = dA3_1_X;
xdA3_array[1] = dA3_2_X;
ydA3_array[0] = dA3_1_Y;
ydA3_array[1] = dA3_2_Y;
// определение фазы вектора dA3
if ((dA3_2_Y < dA3_1_Y) && (dA3_2_X < dA3_1_X)) {
dA3_phase = 180 + (((Math.acos((Math.abs(dA3_2_Y - dA3_1_Y)) / dA3)) * 180 ) / Math.PI)}
if ((dA3_2_Y > dA3_1_Y) && (dA3_2_X > dA3_1_X)) {
dA3_phase = (((Math.acos((Math.abs(dA3_2_Y - dA3_1_Y)) / dA3)) * 180 ) / Math.PI)}
if ((dA3_2_Y > dA3_1_Y) && (dA3_2_X < dA3_1_X)) {
dA3_phase = 360 - (((Math.acos((Math.abs(dA3_2_Y - dA3_1_Y)) / dA3)) * 180 ) / Math.PI)}
if ((dA3_2_Y < dA3_1_Y) && (dA3_2_X > dA3_1_X)) {
dA3_phase = 180 - (((Math.acos((Math.abs(dA3_2_Y - dA3_1_Y)) / dA3)) * 180 ) / Math.PI)}
if (dA3_phase > 360) {dA3_phase = dA3_phase - 360}
// определение угла наклона вектора B0 к осям X и Y
if (B0_phase <= 90) {
B0_phase_X = 90 - B0_phase}
if (B0_phase <= 180) {
B0_phase_X = B0_phase - 90}
if (B0_phase <= 270) {
B0_phase_X = 270 - B0_phase}
if (B0_phase <= 360) {
B0_phase_X = B0_phase - 270}
if (B0_phase <= 90) {
B0_phase_Y = B0_phase}
if (B0_phase <= 180) {
B0_phase_Y = 180 - B0_phase}
if (B0_phase <= 270) {
B0_phase_Y = B0_phase - 180}
if (B0_phase <= 360) {
B0_phase_Y = 360 - B0_phase}
// определение координат вектора B0
var xB0_array = []; // массив координат точек вектора B0 по оси X
var yB0_array = []; // массив координат точек вектора B0 по оси Y
B0_1_X = 0;
if (B0_phase <= 180) {B0_2_X = Math.abs(Math.cos(B0_phase_X * Math.PI/180)) * B0
} else {B0_2_X = Math.abs(Math.cos(B0_phase_X * Math.PI/180)) * B0 * (-1)}
B0_1_Y = 0;
if (B0_phase <= 90 || B0_phase >= 270) {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * Math.PI/180)) * B0
} else {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * Math.PI/180)) * B0 * (-1)}
xB0_array[0] = B0_1_X;
xB0_array[1] = B0_2_X;
yB0_array[0] = B0_1_Y;
yB0_array[1] = B0_2_Y;
// определение угла наклона вектора B3 к осям X и Y
if (B3_phase <= 90) {
B3_phase_X = 90 - B3_phase}
if (B3_phase <= 180) {
B3_phase_X = B3_phase - 90}
if (B3_phase <= 270) {
B3_phase_X = 270 - B3_phase}
if (B3_phase <= 360) {
B3_phase_X = B3_phase - 270}
if (B3_phase <= 90) {
B3_phase_Y = B3_phase}
if (B3_phase <= 180) {
B3_phase_Y = 180 - B3_phase}
if (B3_phase <= 270) {
B3_phase_Y = B3_phase - 180}
if (B3_phase <= 360) {
B3_phase_Y = 360 - B3_phase}
// определение координат вектора B3
var xB3_array = []; // массив координат точек вектора B3 по оси X
var yB3_array = []; // массив координат точек вектора B3 по оси Y
B3_1_X = 0;
if (B3_phase <= 180) {B3_2_X = Math.abs(Math.cos(B3_phase_X * Math.PI/180)) * B3
} else {B3_2_X = Math.abs(Math.cos(B3_phase_X * Math.PI/180)) * B3 * (-1)}
B3_1_Y = 0;
if (B3_phase <= 90 || B3_phase >= 270) {B3_2_Y = Math.abs(Math.cos(B3_phase_Y * Math.PI/180)) * B3
} else {B3_2_Y = Math.abs(Math.cos(B3_phase_Y * Math.PI/180)) * B3 * (-1)}
xB3_array[0] = B3_1_X;
xB3_array[1] = B3_2_X;
yB3_array[0] = B3_1_Y;
yB3_array[1] = B3_2_Y;
// определение модуля вектора dB3
var xdB3_array = []; // массив координат точек вектора dB3 по оси X
var ydB3_array = []; // массив координат точек вектора dB3 по оси Y
dB3_1_X = B0_2_X;
dB3_2_X = B3_2_X;
dB3_1_Y = B0_2_Y;
dB3_2_Y = B3_2_Y;
dB3 = Math.sqrt(Math.pow(dB3_2_X - dB3_1_X, 2) + Math.pow(dB3_2_Y - dB3_1_Y, 2))
xdB3_array[0] = dB3_1_X;
xdB3_array[1] = dB3_2_X;
ydB3_array[0] = dB3_1_Y;
ydB3_array[1] = dB3_2_Y;
// определение фазы вектора dB3
if ((dB3_2_Y < dB3_1_Y) && (dB3_2_X < dB3_1_X)) {
dB3_phase = 180 + (((Math.acos((Math.abs(dB3_2_Y - dB3_1_Y)) / dB3)) * 180 ) / Math.PI)}
if ((dB3_2_Y > dB3_1_Y) && (dB3_2_X > dB3_1_X)) {
dB3_phase = (((Math.acos((Math.abs(dB3_2_Y - dB3_1_Y)) / dB3)) * 180 ) / Math.PI)}
if ((dB3_2_Y > dB3_1_Y) && (dB3_2_X < dB3_1_X)) {
dB3_phase = 360 - (((Math.acos((Math.abs(dB3_2_Y - dB3_1_Y)) / dB3)) * 180 ) / Math.PI)}
if ((dB3_2_Y < dB3_1_Y) && (dB3_2_X > dB3_1_X)) {
dB3_phase = 180 - (((Math.acos((Math.abs(dB3_2_Y - dB3_1_Y)) / dB3)) * 180 ) / Math.PI)}
if (dB3_phase > 360) {dB3_phase = dB3_phase - 360}
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_A3",
x: xA3_array,
y: yA3_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA3",
x: xdA3_array,
y: ydA3_array,
});
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_B0",
x: xB0_array,
y: yB0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_B3",
x: xB3_array,
y: yB3_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dB3",
x: xdB3_array,
y: ydB3_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2), -(Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2), (Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2), (Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2)],
y: [(Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2), -(Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2), -(Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2), (Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2)]
});
gtl.log.info("RMS_A",RMS_A.value);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("A3",A3);
gtl.log.info("A3_phase",A3_phase);
gtl.log.info("F1_1_ph_A (фаза)",F1_1_ph_A);
gtl.log.info("F1_1_a_A (ампл)",F1_1_a_A);
gtl.log.info("F1_1_f_A (част)",F1_1_f_A);
gtl.log.info("RMS_B",RMS_B.value);
gtl.log.info("B0",B0);
gtl.log.info("B0_phase",B0_phase);
gtl.log.info("B3",B3);
gtl.log.info("B3_phase",B3_phase);
gtl.log.info("F1_1_ph_B (фаза)",F1_1_ph_B);
gtl.log.info("F1_1_a_B (ампл)",F1_1_a_B);
gtl.log.info("F1_1_f_B (част)",F1_1_f_B);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
gtl.log.info("Необходимость проведения балансировки",test_balance);
// Выдача результата (results)
let __result = {
_001_Ампл_гарм_1F1_A: F1_1_a_A,
_002азаастращ_F1_A: F1_1_ph_A,
_003_Ампл_вибр_пуска_A0: A0,
_004аза_вибр_пуска_A0: A0_phase,
_005_Ампл_вибр_пуска_A3: A3,
_006аза_вибр_пуска_A3: A3_phase,
_007_СКЗ_вибр_A: RMS_A.value,
_008_Ампл_гарм_1F1_B: F1_1_a_B,
_009азаастращ_F1_B: F1_1_ph_B,
_010_Ампл_вибр_пуска_B0: B0,
_011аза_вибр_пуска_B0: B0_phase,
_012_Ампл_вибр_пуска_B3: B3,
_013аза_вибр_пуска_B3: B3_phase,
_014_СКЗ_вибр_B: RMS_B.value,
_015астотаращения_F1: freq.value,
_016_Нестабастращ: instability*100,
_017_Тестирование: test_balance,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

View File

@ -0,0 +1,790 @@
"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 - салатовый
// #0fae1a - зелёный
// #0000ff - синий
// #00ddff - голубой
// #ff3dcc - фиолетовый
// #ffff00 - жёлтый
// ***** БАЛАНСИРОВОЧНЫЙ КАЛЬКУЛЯТОР. ДВЕ ПЛОСКОСТИ *****
// ******************************************************
// Получение входных сигналов
// Определение частоты вращения по параметру freq.dc
let freq = gtl.add_value_freq(gtl.analog_inputs[record.tachoOptions.tachoChannel]);
freq.time = 1; // длина (время) отрезка сигнала
freq.avg_cnt = 3; // количество усреднений
freq.dc = -0.05; // уровень, при переходе через который вычисляются периоды
// Настройки для спектров и АФЧХ
let frequency; // граничная частота
let resolution = 0.5; // частотное разрешение
let average = 3; // количество усреднений
let overlap = 0; // наложение
let filter_A_vibr; // фильтр сигнала A вибрации
let filter_B_vibr; // фильтр сигнала B вибрации
// Канал A
// ФИЛЬТР_A 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_A_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_A_2_1000.kind = gtl.filter_iir.butterworth;
filter_A_2_1000.type = gtl.filter_iir.bandpass;
filter_A_2_1000.order = 6;
filter_A_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_A_2_1000.width = 998; // ширина полосы фильтра
let filter_A_2_1000v = gtl.add_intg(filter_A_2_1000); // интегрирование
filter_A_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр A для виброперемещения
let filter_A_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[0].portNumber]);
filter_A_2_300s.kind = gtl.filter_iir.butterworth;
filter_A_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_A_2_300s.order = 4;
filter_A_2_300s.frequency = 151; // центральная частота
filter_A_2_300s.width = 298; // ширина полосы
// Канал B
// ФИЛЬТР_B 2...1000 Гц, полосовой фильтр для СКЗ виброскорости и спектра
let filter_B_2_1000 = gtl.add_filter_iir(gtl.analog_inputs[signals[1].portNumber]);
filter_B_2_1000.kind = gtl.filter_iir.butterworth;
filter_B_2_1000.type = gtl.filter_iir.bandpass;
filter_B_2_1000.order = 6;
filter_B_2_1000.frequency = 501; // центральная частота полосового фильтра
filter_B_2_1000.width = 998; // ширина полосы фильтра
let filter_B_2_1000v = gtl.add_intg(filter_B_2_1000); // интегрирование
filter_B_2_1000v.taps = 1; // степень интегрирования (скорость из ускорения - 1-нарное)
// Фильтр B для виброперемещения
let filter_B_2_300s = gtl.add_filter_iir(gtl.analog_inputs[signals[1].portNumber]);
filter_B_2_300s.kind = gtl.filter_iir.butterworth;
filter_B_2_300s.type = gtl.filter_iir.bandpass; // полосовой фильтр
filter_B_2_300s.order = 4;
filter_B_2_300s.frequency = 151; // центральная частота
filter_B_2_300s.width = 298; // ширина полосы
// Переключатель источника сигнала - относительная / абсолютная вибрация
// 0 - относительная вибрация (датчик виброперемещения)
// 1 - абсолютная вибрация (датчик виброускорения)
let select_vibr_sign = gtl.options.customOptions.select_vibr_sign;
// Выбор фильтра и параметров спектров в зависимости от значения переключателя источника сигнала вибрации
if (select_vibr_sign == 1)
{
filter_A_vibr = filter_A_2_1000v;
filter_B_vibr = filter_B_2_1000v;
frequency = 1000;
}
else if (select_vibr_sign == 0)
{
filter_A_vibr = filter_A_2_300s;
filter_B_vibr = filter_B_2_300s;
frequency = 300;
}
// Спектр_A для получения 1-й гармоники частоты вращения
let AUSP_A = gtl.add_ausp(filter_A_vibr); // объявление переменной спектра
AUSP_A.color = 0x00ff0000; // цвет спектра
AUSP_A.name = "AUSP_A"; // имя спектра
AUSP_A.frequency = frequency; // граничная частота спектра
AUSP_A.lines = AUSP_A.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_A.average = average; // количество усреднений
AUSP_A.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_A.smoothing_factor = 100; // усреднение средней линии
AUSP_A.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_A.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_A.tolerance = AUSP_A.resolution; // диапазон поиска гармоник +/-
// СКЗ_A
let RMS_A = gtl.add_value_rms(filter_A_vibr);
RMS_A.time = 1;
RMS_A.avg_cnt = 3;
// Спектр_B для получения 1-й гармоники частоты вращения
let AUSP_B = gtl.add_ausp(filter_B_vibr); // объявление переменной спектра
AUSP_B.color = 0x00ff0000; // цвет спектра
AUSP_B.name = "AUSP_A"; // имя спектра
AUSP_B.frequency = frequency; // граничная частота спектра
AUSP_B.lines = AUSP_B.frequency * 1/resolution; // разрешение спектра (количество линий)
AUSP_B.average = average; // количество усреднений
AUSP_B.unit = gtl.spec.unit; // отображение амплитуды в мм/с
AUSP_B.smoothing_factor = 100; // усреднение средней линии
AUSP_B.smoothed_line_color = 0xff004dff; // цвет средней линии
AUSP_B.peak_level = 0.001; // порог обнаружения гармоник (необходим самый минимальный)
AUSP_B.tolerance = AUSP_B.resolution; // диапазон поиска гармоник +/-
// СКЗ_B
let RMS_B = gtl.add_value_rms(filter_B_vibr);
RMS_B.time = 1;
RMS_B.avg_cnt = 3;
// Спектр вибрации точки A
var AUSP_A_pl = gtl.create_ausp(
{
"src" : filter_A_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки A
var pfc_A_pl = gtl.create_pfc(
{
"src0" : filter_A_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// Спектр виброскорости точки B
var AUSP_B_pl = gtl.create_ausp(
{
"src" : filter_B_vibr,
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.spec.unit
}
);
// ФЧХ точки B
var pfc_B_pl = gtl.create_pfc(
{
"src0" : filter_B_vibr,
"src1" : gtl.analog_inputs[record.tachoOptions.tachoChannel],
"frequency" : frequency,
"resolution" : resolution,
"average" : average,
"overlap" : overlap,
"window" : gtl.spec.rectangular,
"view" : gtl.phase.deg,
// "range" : gtl.phase.positive,
"is_single" : false
}
);
// "range": gtl.phase.negative,
// "delay" : .1, // по умолчанию - 0
// "start" : false // по умолчанию - true
// Объявление графических плоскостей для построения графиков
let plot_pfc = gtl.plots.add("ФЧХ"); // фазо-частотная характеристика
let plot_ausp = gtl.plots.add("Спектры вибрации"); // объект для спектра
let plot_vibr = gtl.plots.add("Векторы вибрации"); // объект для векторов вибрации
let plot_disb = gtl.plots.add("Расположение дисбалансов"); // объект для дисбаланса
// gtl.log.info("размер массива AUSPv_pl", AUSPv_pl.data.length);
// gtl.log.info("размер массива pfc_pl", pfc_pl.data.length);
// Переменные основные
// параметр вибрации (модуль вектора) - виброскорость (мм/с)
// угол (фаза) вектора - градусы
// масса груза (модуль ветора) - граммы
// DCI - Dynamic Coefficient of Influence (динамический коэффициент влияния)
// * - значение получаем из измерительного блока при нажатии кнопки
// ** - значение вводится пользователем
// *** - значение получаем в результате расчёта программы балансировки
// значение переменной с нижним подчёркиванием (..._) берётся из "дополнительных опций"; если оно не задано, то рассчитывается в скрипте
let A0_ = gtl.options.customOptions.A0; // модуль вектора начальной вибрации точки A */**
let A0 = A0_; // модуль вектора начальной вибрации точки A */** (конечное значение)
let A0_phase_ = gtl.options.customOptions.A0_phase; // фаза вектора начальной вибрации точки A */**
let A0_phase = A0_phase_; // фаза вектора начальной вибрации точки A */** (конечное значение)
let A3_ = gtl.options.customOptions.A3; // модуль вектора вибрации точки A после установки балансировочного груза в плоскость 1 */**
let A3; // модуль вектора вибрации точки A после установки балансировочного груза в плоскость 1 */** (конечное значение)
let A3_phase_ = gtl.options.customOptions.A3_phase; // фаза вектора вибрации точки A после установки балансировочного груза в плоскость 1 */**
let A3_phase; // фаза вектора вибрации точки A после установки балансировочного груза в плоскость 1 */** (конечное значение)
let dA3; // модуль вектора дельты вибрации точки A после установки балансировочного груза в плоскость 1 ***
let dA3_phase; // фаза вектора дельты вибрации точки A после установки балансировочного груза в плоскость 1 ***
let B0_ = gtl.options.customOptions.B0; // модуль вектора начальной вибрации точки B */**
let B0 = B0_; // модуль вектора начальной вибрации точки B */** (конечное значение)
let B0_phase_ = gtl.options.customOptions.B0_phase; // фаза вектора начальной вибрации точки B */**
let B0_phase = B0_phase_; // фаза вектора начальной вибрации точки B */** (конечное значение)
let B3_ = gtl.options.customOptions.B3; // модуль вектора вибрации точки B после установки балансировочного груза в плоскость 2 */**
let B3; // модуль вектора вибрации точки B после установки балансировочного груза в плоскость 2 */** (конечное значение)
let B3_phase_ = gtl.options.customOptions.B3_phase; // фаза вектора вибрации точки B после установки балансировочного груза в плоскость 2 */**
let B3_phase; // фаза вектора вибрации точки B после установки балансировочного груза в плоскость 2 */** (конечное значение)
let dB3; // модуль вектора дельты вибрации точки B после установки балансировочного груза в плоскость 2 ***
let dB3_phase; // фаза вектора дельты вибрации точки B после установки балансировочного груза в плоскость 2 ***
// Переменные вспомогательные необходимые для расчётов
let A0_phase_X; // угол наклона вектора A0 к оси X
let A0_phase_Y; // угол наклона вектора A0 к оси Y
let A0_1_X; // начальная координата вектора A0 по оси X
let A0_2_X; // конечная координата вектора A0 по оси X
let A0_1_Y; // начальная координата вектора A0 по оси Y
let A0_2_Y; // конечная координата вектора A0 по оси Y
let A3_phase_X; // угол наклона вектора A3 к оси X
let A3_phase_Y; // угол наклона вектора A3 к оси Y
let A3_1_X; // начальная координата вектора A3 по оси X
let A3_2_X; // конечная координата вектора A3 по оси X
let A3_1_Y; // начальная координата вектора A3 по оси Y
let A3_2_Y; // конечная координата вектора A3 по оси Y
let dA3_1_X; // начальная координата вектора dA3 по оси X
let dA3_2_X; // конечная координата вектора dA3 по оси X
let dA3_1_Y; // начальная координата вектора dA3 по оси Y
let dA3_2_Y; // конечная координата вектора dA3 по оси Y
let B0_phase_X; // угол наклона вектора B0 к оси X
let B0_phase_Y; // угол наклона вектора B0 к оси Y
let B0_1_X; // начальная координата вектора B0 по оси X
let B0_2_X; // конечная координата вектора B0 по оси X
let B0_1_Y; // начальная координата вектора B0 по оси Y
let B0_2_Y; // конечная координата вектора B0 по оси Y
let B3_phase_X; // угол наклона вектора B3 к оси X
let B3_phase_Y; // угол наклона вектора B3 к оси Y
let B3_1_X; // начальная координата вектора B3 по оси X
let B3_2_X; // конечная координата вектора B3 по оси X
let B3_1_Y; // начальная координата вектора B3 по оси Y
let B3_2_Y; // конечная координата вектора B3 по оси Y
let dB3_1_X; // начальная координата вектора dB3 по оси X
let dB3_2_X; // конечная координата вектора dB3 по оси X
let dB3_1_Y; // начальная координата вектора dB3 по оси Y
let dB3_2_Y; // конечная координата вектора dB3 по оси Y
// ***** РАСЧЁТЫ *****
// gtl.diagnostic.interval = 15;
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time) + 0.1;
let state = record.tachoOptions.tachoState; // начальное состояние после выбора источника тахо сигнала
function diagnose() {
// Нестабильность частоты вращения
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = ((freq_max - freq_min) / freq.value) * 100; // * 100%
switch (state) {
case 0: // считаем частоту вращения и настраиваем спектры
var freq_max = Math.max(...freq.values);
var freq_min = Math.min(...freq.values);
var instability = (freq_max - freq_min) / freq.value;
// if (instability > imp.tolerance()) {
if (instability > 0.3) {
gtl.log.info("Критическая нестабильность частоты вращения, %", instability * 100);
gtl.log.info("Результат:", "Диагностика прервана");
//gtl.diagnostic.stop(); //принудительная остановка диагностики
let __result = {
Result: false
};
gtl.results = __result;
};
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;;
state = 3;
break;
case 1: // Частота вращения фиксированная
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 2: // Частота вращения из поля INFO (виброметр)
// Определение минимально необходимой длительности сигнала для проведения диагностики
gtl.diagnostic.interval = Math.max(AUSP_A.acq_time, AUSP_A_pl.acq_time, pfc_A_pl.acq_time) + 0.1;
state = 3;
break;
case 3: // Выполняем анализ спектов
// Очистка партретов спектров
AUSP_A.clear_harms_sets();
AUSP_B.clear_harms_sets();
// Спектры вибрации точки A
let __AUSP_A_tools = gtl.create_spec_tools(
{
data: AUSP_A_pl.data,
df: AUSP_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_A = __AUSP_A_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_A.name = "F1_A (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_A_tools = gtl.create_spec_tools(
{
data: pfc_A_pl.data,
df: pfc_A_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_A = __pfc_A_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_A.name = "F1_A_phase (гарм. ряд част. вращ. точки A)"; // название гармонического ряда
// Спектры вибрации точки B
let __AUSP_B_tools = gtl.create_spec_tools(
{
data: AUSP_B_pl.data,
df: AUSP_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x00ff00
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_AUSP_B = __AUSP_B_tools.harms.add(freq.value, 1, 0x0000ff, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_AUSP_B.name = "F1_B (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// __row1.modulate(5, 2, 0x00ff00, 1); // добавление амплитудной модуляции для набора гармоник (частота, количество, цвет, вес)
let __pfc_B_tools = gtl.create_spec_tools(
{
data: pfc_B_pl.data,
df: pfc_B_pl.resolution,
base: {
factor: 100,
visible: true,
color: 0x0000ff
},
peaks: {
color: 0xff0000,
visible: true,
level: 0.000001
},
harms: {
tolerance: 1
}
});
let __row_phase_B = __pfc_B_tools.harms.add(freq.value, 1, 0x00ff00, 1); // добавление набора гармоник (частота, количество, цвет, вес)
__row_phase_B.name = "F1_B_phase (гарм. ряд част. вращ. точки B)"; // название гармонического ряда
// Построение графиков
// Вибрация точки A
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки A",
x: AUSP_A_pl.resolution,
y: AUSP_A_pl.data,
spec_tools: __AUSP_A_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки A",
x: pfc_A_pl.resolution,
y: pfc_A_pl.data,
spec_tools: __pfc_A_tools.to_json()
});
let __result1_A = __AUSP_A_tools.to_json();
let __result2_A = __pfc_A_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_A = __result1_A.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_A = __result1_A.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_A = __result2_A.harms.rows[0].harms[0].ampl;
// Вибрация точки B
plot_ausp.add(
{
color: 0x0000ff,
name: "Спектр вибрации точки B",
x: AUSP_B_pl.resolution,
y: AUSP_B_pl.data,
spec_tools: __AUSP_B_tools.to_json()
});
plot_pfc.add(
{
color: 0xff0000,
name: "ФЧХ вибрации точки B",
x: pfc_B_pl.resolution,
y: pfc_B_pl.data,
spec_tools: __pfc_B_tools.to_json()
});
let __result1_B = __AUSP_B_tools.to_json();
let __result2_B = __pfc_B_tools.to_json();
// Амплитуда гармонического ряда частоты вращения
var F1_1_a_B = __result1_B.harms.rows[0].harms[0].ampl;
// Частота гармонического ряда частоты вращения
var F1_1_f_B = __result1_B.harms.rows[0].harms[0].freq;
// Фаза (амплитуда) гармонического ряда частоты вращения
var F1_1_ph_B = __result2_B.harms.rows[0].harms[0].ampl;
// Проверка наличия оборотной гармоники и необходимости проведения баалнсировки
var test_balance = ""; // переменная для текста о необходимости проведения балансировки
if (F1_1_a_A >= RMS_A * 0.4 || F1_1_a_B >= RMS_B * 0.4) // вклад оборотной гармоники в СКЗ
{test_balance = "необходимо провести балансировку";}
else {test_balance = "проведение балансировки не требуется или нецелесообразно";}
// РАСЧЁТЫ (балансировочный калькулятор)
// ШАГ 7 - контрольный пуск:
// измерение вибрации A3 и B3 после установки балансировочных грузов
// определение целесообразности проведения добалансировки
// из предыдущих шагов переносятся: амплитуда и фаза вибрации A0, B0
// построение графиков A0, A3 и dA3, B0, B3 и dB3
// Определение конечных значений переменных
// A3 вибрация после установки балансировочного груза в плоскость 1
if (A3_ != 0) {A3 = A3_} // принимает значение из опций
else {A3 = F1_1_a_A} // принимает значение из спектра сигнала
if (A3_phase_ != 0) {A3_phase = A3_phase_} // принимает значение из опций
else {A3_phase = F1_1_ph_A} // принимает значение из спектра сигнала
// B3 вибрация после установки балансировочного груза в плоскость 2
if (B3_ != 0) {B3 = B3_} // принимает значение из опций
else {B3 = F1_1_a_B} // принимает значение из спектра сигнала
if (B3_phase_ != 0) {B3_phase = B3_phase_} // принимает значение из опций
else {B3_phase = F1_1_ph_B} // принимает значение из спектра сигнала
// определение угла наклона вектора A0 к осям X и Y
if (A0_phase <= 90) {
A0_phase_X = 90 - A0_phase}
if (A0_phase <= 180) {
A0_phase_X = A0_phase - 90}
if (A0_phase <= 270) {
A0_phase_X = 270 - A0_phase}
if (A0_phase <= 360) {
A0_phase_X = A0_phase - 270}
if (A0_phase <= 90) {
A0_phase_Y = A0_phase}
if (A0_phase <= 180) {
A0_phase_Y = 180 - A0_phase}
if (A0_phase <= 270) {
A0_phase_Y = A0_phase - 180}
if (A0_phase <= 360) {
A0_phase_Y = 360 - A0_phase}
// определение координат вектора A0
var xA0_array = []; // массив координат точек вектора A0 по оси X
var yA0_array = []; // массив координат точек вектора A0 по оси Y
A0_1_X = 0;
if (A0_phase <= 180) {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0
} else {A0_2_X = Math.abs(Math.cos(A0_phase_X * 3.1415/180)) * A0 * (-1)}
A0_1_Y = 0;
if (A0_phase <= 90 || A0_phase >= 270) {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0
} else {A0_2_Y = Math.abs(Math.cos(A0_phase_Y * 3.1415/180)) * A0 * (-1)}
xA0_array[0] = A0_1_X;
xA0_array[1] = A0_2_X;
yA0_array[0] = A0_1_Y;
yA0_array[1] = A0_2_Y;
// определение угла наклона вектора A3 к осям X и Y
if (A3_phase <= 90) {
A3_phase_X = 90 - A3_phase}
if (A3_phase <= 180) {
A3_phase_X = A3_phase - 90}
if (A3_phase <= 270) {
A3_phase_X = 270 - A3_phase}
if (A3_phase <= 360) {
A3_phase_X = A3_phase - 270}
if (A3_phase <= 90) {
A3_phase_Y = A3_phase}
if (A3_phase <= 180) {
A3_phase_Y = 180 - A3_phase}
if (A3_phase <= 270) {
A3_phase_Y = A3_phase - 180}
if (A3_phase <= 360) {
A3_phase_Y = 360 - A3_phase}
// определение координат вектора A3
var xA3_array = []; // массив координат точек вектора A3 по оси X
var yA3_array = []; // массив координат точек вектора A3 по оси Y
A3_1_X = 0;
if (A3_phase <= 180) {A3_2_X = Math.abs(Math.cos(A3_phase_X * 3.1415/180)) * A3
} else {A3_2_X = Math.abs(Math.cos(A3_phase_X * 3.1415/180)) * A3 * (-1)}
A3_1_Y = 0;
if (A3_phase <= 90 || A3_phase >= 270) {A3_2_Y = Math.abs(Math.cos(A3_phase_Y * 3.1415/180)) * A3
} else {A3_2_Y = Math.abs(Math.cos(A3_phase_Y * 3.1415/180)) * A3 * (-1)}
xA3_array[0] = A3_1_X;
xA3_array[1] = A3_2_X;
yA3_array[0] = A3_1_Y;
yA3_array[1] = A3_2_Y;
// определение модуля вектора dA3
var xdA3_array = []; // массив координат точек вектора dA3 по оси X
var ydA3_array = []; // массив координат точек вектора dA3 по оси Y
dA3_1_X = A0_2_X;
dA3_2_X = A3_2_X;
dA3_1_Y = A0_2_Y;
dA3_2_Y = A3_2_Y;
dA3 = Math.sqrt(Math.pow(dA3_2_X - dA3_1_X, 2) + Math.pow(dA3_2_Y - dA3_1_Y, 2))
xdA3_array[0] = dA3_1_X;
xdA3_array[1] = dA3_2_X;
ydA3_array[0] = dA3_1_Y;
ydA3_array[1] = dA3_2_Y;
// определение фазы вектора dA3
if ((dA3_2_Y < dA3_1_Y) && (dA3_2_X < dA3_1_X)) {
dA3_phase = 180 + (((Math.acos((Math.abs(dA3_2_Y - dA3_1_Y)) / dA3)) * 180 ) / 3.1415)}
if ((dA3_2_Y > dA3_1_Y) && (dA3_2_X > dA3_1_X)) {
dA3_phase = (((Math.acos((Math.abs(dA3_2_Y - dA3_1_Y)) / dA3)) * 180 ) / 3.1415)}
if ((dA3_2_Y > dA3_1_Y) && (dA3_2_X < dA3_1_X)) {
dA3_phase = 360 - (((Math.acos((Math.abs(dA3_2_Y - dA3_1_Y)) / dA3)) * 180 ) / 3.1415)}
if ((dA3_2_Y < dA3_1_Y) && (dA3_2_X > dA3_1_X)) {
dA3_phase = 180 - (((Math.acos((Math.abs(dA3_2_Y - dA3_1_Y)) / dA3)) * 180 ) / 3.1415)}
if (dA3_phase > 360) {dA3_phase = dA3_phase - 360}
// определение угла наклона вектора B0 к осям X и Y
if (B0_phase <= 90) {
B0_phase_X = 90 - B0_phase}
if (B0_phase <= 180) {
B0_phase_X = B0_phase - 90}
if (B0_phase <= 270) {
B0_phase_X = 270 - B0_phase}
if (B0_phase <= 360) {
B0_phase_X = B0_phase - 270}
if (B0_phase <= 90) {
B0_phase_Y = B0_phase}
if (B0_phase <= 180) {
B0_phase_Y = 180 - B0_phase}
if (B0_phase <= 270) {
B0_phase_Y = B0_phase - 180}
if (B0_phase <= 360) {
B0_phase_Y = 360 - B0_phase}
// определение координат вектора B0
var xB0_array = []; // массив координат точек вектора B0 по оси X
var yB0_array = []; // массив координат точек вектора B0 по оси Y
B0_1_X = 0;
if (B0_phase <= 180) {B0_2_X = Math.abs(Math.cos(B0_phase_X * 3.1415/180)) * B0
} else {B0_2_X = Math.abs(Math.cos(B0_phase_X * 3.1415/180)) * B0 * (-1)}
B0_1_Y = 0;
if (B0_phase <= 90 || B0_phase >= 270) {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * 3.1415/180)) * B0
} else {B0_2_Y = Math.abs(Math.cos(B0_phase_Y * 3.1415/180)) * B0 * (-1)}
xB0_array[0] = B0_1_X;
xB0_array[1] = B0_2_X;
yB0_array[0] = B0_1_Y;
yB0_array[1] = B0_2_Y;
// определение угла наклона вектора B3 к осям X и Y
if (B3_phase <= 90) {
B3_phase_X = 90 - B3_phase}
if (B3_phase <= 180) {
B3_phase_X = B3_phase - 90}
if (B3_phase <= 270) {
B3_phase_X = 270 - B3_phase}
if (B3_phase <= 360) {
B3_phase_X = B3_phase - 270}
if (B3_phase <= 90) {
B3_phase_Y = B3_phase}
if (B3_phase <= 180) {
B3_phase_Y = 180 - B3_phase}
if (B3_phase <= 270) {
B3_phase_Y = B3_phase - 180}
if (B3_phase <= 360) {
B3_phase_Y = 360 - B3_phase}
// определение координат вектора B3
var xB3_array = []; // массив координат точек вектора B3 по оси X
var yB3_array = []; // массив координат точек вектора B3 по оси Y
B3_1_X = 0;
if (B3_phase <= 180) {B3_2_X = Math.abs(Math.cos(B3_phase_X * 3.1415/180)) * B3
} else {B3_2_X = Math.abs(Math.cos(B3_phase_X * 3.1415/180)) * B3 * (-1)}
B3_1_Y = 0;
if (B3_phase <= 90 || B3_phase >= 270) {B3_2_Y = Math.abs(Math.cos(B3_phase_Y * 3.1415/180)) * B3
} else {B3_2_Y = Math.abs(Math.cos(B3_phase_Y * 3.1415/180)) * B3 * (-1)}
xB3_array[0] = B3_1_X;
xB3_array[1] = B3_2_X;
yB3_array[0] = B3_1_Y;
yB3_array[1] = B3_2_Y;
// определение модуля вектора dB3
var xdB3_array = []; // массив координат точек вектора dB3 по оси X
var ydB3_array = []; // массив координат точек вектора dB3 по оси Y
dB3_1_X = B0_2_X;
dB3_2_X = B3_2_X;
dB3_1_Y = B0_2_Y;
dB3_2_Y = B3_2_Y;
dB3 = Math.sqrt(Math.pow(dB3_2_X - dB3_1_X, 2) + Math.pow(dB3_2_Y - dB3_1_Y, 2))
xdB3_array[0] = dB3_1_X;
xdB3_array[1] = dB3_2_X;
ydB3_array[0] = dB3_1_Y;
ydB3_array[1] = dB3_2_Y;
// определение фазы вектора dB3
if ((dB3_2_Y < dB3_1_Y) && (dB3_2_X < dB3_1_X)) {
dB3_phase = 180 + (((Math.acos((Math.abs(dB3_2_Y - dB3_1_Y)) / dB3)) * 180 ) / 3.1415)}
if ((dB3_2_Y > dB3_1_Y) && (dB3_2_X > dB3_1_X)) {
dB3_phase = (((Math.acos((Math.abs(dB3_2_Y - dB3_1_Y)) / dB3)) * 180 ) / 3.1415)}
if ((dB3_2_Y > dB3_1_Y) && (dB3_2_X < dB3_1_X)) {
dB3_phase = 360 - (((Math.acos((Math.abs(dB3_2_Y - dB3_1_Y)) / dB3)) * 180 ) / 3.1415)}
if ((dB3_2_Y < dB3_1_Y) && (dB3_2_X > dB3_1_X)) {
dB3_phase = 180 - (((Math.acos((Math.abs(dB3_2_Y - dB3_1_Y)) / dB3)) * 180 ) / 3.1415)}
if (dB3_phase > 360) {dB3_phase = dB3_phase - 360}
// определение координат точек окружности графика для отображения векторов вибрации
var xV_array = []; // массив координат точек окружности V по оси X
var yV_array = []; // массив координат точек окружности V по оси Y
var x0V = 0; // центр в начале координат
var y0V = 0; // центр в начале координат
for (let i=0; i<=359; i++ ) {
xV_array.push(x0V + (Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.1) * (Math.sin((i) * Math.PI / 180)));
yV_array.push(y0V + (Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.1) * (Math.cos((i) * Math.PI / 180)));}
// Графики вибрации
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_A0",
x: xA0_array,
y: yA0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_A3",
x: xA3_array,
y: yA3_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dA3",
x: xdA3_array,
y: ydA3_array,
});
plot_vibr.add(
{
color: 0x0000ff,
name: "Вибрация_B0",
x: xB0_array,
y: yB0_array,
});
plot_vibr.add(
{
color: 0x00ff00,
name: "Вибрация_B3",
x: xB3_array,
y: yB3_array,
});
plot_vibr.add(
{
color: 0xff0000,
name: "Вибрация_dB3",
x: xdB3_array,
y: ydB3_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "График векторов вибрации",
x: xV_array,
y: yV_array,
});
plot_vibr.add(
{
color: 0x00ffffff,
name: "границы",
x: [-(Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2), -(Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2), (Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2), (Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2)],
y: [(Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2), -(Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2), -(Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2), (Math.max(A0,A3,dA3,B0,B3,dB3)+Math.max(A0,A3,dA3,B0,B3,dB3)*0.2)]
});
gtl.log.info("RMS_A",RMS_A.value);
gtl.log.info("A0",A0);
gtl.log.info("A0_phase",A0_phase);
gtl.log.info("A3",A3);
gtl.log.info("A3_phase",A3_phase);
gtl.log.info("F1_1_ph_A (фаза)",F1_1_ph_A);
gtl.log.info("F1_1_a_A (ампл)",F1_1_a_A);
gtl.log.info("F1_1_f_A (част)",F1_1_f_A);
gtl.log.info("RMS_B",RMS_B.value);
gtl.log.info("B0",B0);
gtl.log.info("B0_phase",B0_phase);
gtl.log.info("B3",B3);
gtl.log.info("B3_phase",B3_phase);
gtl.log.info("F1_1_ph_B (фаза)",F1_1_ph_B);
gtl.log.info("F1_1_a_B (ампл)",F1_1_a_B);
gtl.log.info("F1_1_f_B (част)",F1_1_f_B);
gtl.log.info("Частота вращения, Гц", freq.value);
gtl.log.info("Нестабильность частоты вращения, %", instability*100);
gtl.log.info("Необходимость проведения балансировки",test_balance);
// Выдача результата (results)
let __result = {
_001_Ампл_гарм_1F1_A: F1_1_a_A,
_002азаастращ_F1_A: F1_1_ph_A,
_003_Ампл_вибр_пуска_A0: A0,
_004аза_вибр_пуска_A0: A0_phase,
_005_Ампл_вибр_пуска_A3: A3,
_006аза_вибр_пуска_A3: A3_phase,
_007_СКЗ_вибр_A: RMS_A.value,
_008_Ампл_гарм_1F1_B: F1_1_a_B,
_009азаастращ_F1_B: F1_1_ph_B,
_010_Ампл_вибр_пуска_B0: B0,
_011аза_вибр_пуска_B0: B0_phase,
_012_Ампл_вибр_пуска_B3: B3,
_013аза_вибр_пуска_B3: B3_phase,
_014_СКЗ_вибр_B: RMS_B.value,
_015астотаращения_F1: freq.value,
_016_Нестабастращ: instability*100,
_017_Тестирование: test_balance,
};
gtl.results = {"result": __result};
gtl.diagnostic.stop();
break;
default:
break;
}
}

File diff suppressed because it is too large Load Diff

1861
scripts/2 пл - шаг 8.js Normal file

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More