From 87e360e1a99c50dfc335e466976d0cdcfd9699f0 Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Wed, 12 Nov 2025 20:47:35 +0300 Subject: [PATCH 01/10] =?UTF-8?q?=D0=9F=D0=BE=D1=81=D0=BB=D0=B5=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8,=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BD=D0=B4?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B8=20=D1=81=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=8F=D0=BD=D0=B8=D0=B9=20=D1=8D=D0=BC=D1=81=20=D1=8F?= =?UTF-8?q?=D1=87=D0=B5=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.gd | 16 +++- scenes/pribor-prd-k/pribor-prd-k.tscn | 65 +++++++++++++- scenes/pribor-prd-n/pribor-prd-n.gd | 13 ++- scenes/pribor-prd-n/pribor-prd-n.tscn | 56 +++++++++++- scenes/pribor-prd-v/pribor-prd-v.gd | 61 ++++++++++++- scenes/pribor-prd-v/pribor-prd-v.tscn | 56 +++++++++++- scenes/tilemap/tilemap.gd | 12 +-- scenes/работа/работа.gd | 6 +- scripts/interfer.gd | 5 +- scripts/pribor-prd.gd | 123 +++++++++++--------------- 10 files changed, 323 insertions(+), 90 deletions(-) diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index 2bd6f78..651fd03 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -18,9 +18,23 @@ func _ready() -> void: for temp in power_amplifier: temp.value1 = -70 unit_prd_k.connect('control_is_over', Callable(self, 'on_press_device')) + #unit_prd_k.power_amplify = power_amplifier on_press_device() +func _process(delta: float) -> void: + set_frame($input_0, unit_prd_k.ems_input_1) + set_frame($input_1, unit_prd_k.ems_input_2) + set_frame($input_2, unit_prd_k.ems_input_lit_1) + set_frame($output_0, unit_prd_k.ems_output_1) + set_frame($output_1, unit_prd_k.ems_output_2) + set_frame($output_2, unit_prd_k.ems_output_lit_1) + + + +func set_frame(node_frame: Node, val: int): node_frame.set_frame(val) + + func start_control() -> void: set_default_state() find_labels(self) @@ -139,7 +153,7 @@ func on_control_result(for_result_dic: Dictionary) -> void: for_result_dic.dou_7.state = STATE_VAL.GOOD if result_dic.dou_7 else STATE_VAL.ERROR else: result_dic.fs_7 = 0 - + power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) var result: bool = true diff --git a/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index b56036d..0096012 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.tscn +++ b/scenes/pribor-prd-k/pribor-prd-k.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=10 format=3 uid="uid://m5s87q7m66lj"] +[gd_scene load_steps=15 format=3 uid="uid://m5s87q7m66lj"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="1_8dmgr"] [ext_resource type="Script" uid="uid://cwvikiygf8b1m" path="res://scenes/pribor-prd-k/pribor-prd-k.gd" id="1_tpdyp"] @@ -9,6 +9,30 @@ [ext_resource type="Script" uid="uid://crpedygm3gohi" path="res://scenes/контроль/кассета.gd" id="7_xpa2n"] [ext_resource type="PackedScene" uid="uid://dq31j24gv5vi4" path="res://scenes/контроль/кассета-п-2.tscn" id="8_6fdp7"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="8_la5yt"] +[ext_resource type="Texture2D" uid="uid://belwchvdktrw0" path="res://data/эмс-бланк.png" id="10_c7lv8"] +[ext_resource type="Texture2D" uid="uid://bwddxs24es81u" path="res://data/эмс-бланк-пост.png" id="11_wd1vi"] +[ext_resource type="Texture2D" uid="uid://pfoscstbm025" path="res://data/эмс-бланк-перем.png" id="12_bjebg"] +[ext_resource type="Texture2D" uid="uid://dvl3sq036gn75" path="res://data/эмс-бланк-замыкание.png" id="13_kc77u"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_di0aa"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("10_c7lv8") +}, { +"duration": 1.0, +"texture": ExtResource("11_wd1vi") +}, { +"duration": 1.0, +"texture": ExtResource("12_bjebg") +}, { +"duration": 1.0, +"texture": ExtResource("13_kc77u") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] [node name="pribor_prd_k" type="Control"] layout_mode = 3 @@ -322,3 +346,42 @@ offset_bottom = 1003.0 text = "Прибор ПРД- неисправен" horizontal_alignment = 1 metadata/_edit_lock_ = true + +[node name="input_0" type="AnimatedSprite2D" parent="."] +position = Vector2(234, 177) +sprite_frames = SubResource("SpriteFrames_di0aa") + +[node name="Label" type="Label" parent="input_0"] +offset_left = -38.0 +offset_top = 16.0 +offset_right = 30.0 +offset_bottom = 35.0 +text = "Вход ЕМС" + +[node name="input_1" type="AnimatedSprite2D" parent="."] +position = Vector2(277, 177) +sprite_frames = SubResource("SpriteFrames_di0aa") + +[node name="input_2" type="AnimatedSprite2D" parent="."] +position = Vector2(188, 177) +sprite_frames = SubResource("SpriteFrames_di0aa") + +[node name="output_0" type="AnimatedSprite2D" parent="."] +position = Vector2(421, 177) +sprite_frames = SubResource("SpriteFrames_di0aa") + +[node name="Label" type="Label" parent="output_0"] +offset_left = -40.0 +offset_top = 14.0 +offset_right = 36.0 +offset_bottom = 33.0 +text = "Модуляция" +metadata/_edit_use_anchors_ = true + +[node name="output_1" type="AnimatedSprite2D" parent="."] +position = Vector2(462, 177) +sprite_frames = SubResource("SpriteFrames_di0aa") + +[node name="output_2" type="AnimatedSprite2D" parent="."] +position = Vector2(383, 177) +sprite_frames = SubResource("SpriteFrames_di0aa") diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd index 842b539..84b2b56 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.gd +++ b/scenes/pribor-prd-n/pribor-prd-n.gd @@ -18,9 +18,20 @@ func _ready() -> void: for temp in power_amplifier: temp.value1 = -70 unit_prd_n.connect('control_is_over', Callable(self, 'on_press_device')) + #unit_prd_n.power_amplify = power_amplifier on_press_device() +func _process(delta: float) -> void: + set_frame($input_0, unit_prd_n.ems_input_1) + set_frame($input_1, unit_prd_n.ems_input_2) + set_frame($output_0, unit_prd_n.ems_output_1) + set_frame($output_1, unit_prd_n.ems_output_2) + + +func set_frame(node_frame: Node, val: int): node_frame.set_frame(val) + + func start_control() -> void: set_default_state() find_labels(self) @@ -129,7 +140,7 @@ func on_control_result(for_result_dic: Dictionary) -> void: for_result_dic.dou_3.state = STATE_VAL.GOOD if result_dic.dou_3 else STATE_VAL.ERROR else: result_dic.fs_3 = 0 - + power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) var result: bool = true diff --git a/scenes/pribor-prd-n/pribor-prd-n.tscn b/scenes/pribor-prd-n/pribor-prd-n.tscn index a52ce38..899c973 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.tscn +++ b/scenes/pribor-prd-n/pribor-prd-n.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=8 format=3 uid="uid://dnuexoef2nnv5"] +[gd_scene load_steps=13 format=3 uid="uid://dnuexoef2nnv5"] [ext_resource type="Script" uid="uid://cto2r4ipew65m" path="res://scenes/pribor-prd-n/pribor-prd-n.gd" id="1_bnnv3"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_is25t"] @@ -7,6 +7,30 @@ [ext_resource type="Script" uid="uid://crpedygm3gohi" path="res://scenes/контроль/кассета.gd" id="6_b5wvk"] [ext_resource type="PackedScene" uid="uid://bcyxqni7gxvtq" path="res://scenes/контроль/блок-в.tscn" id="7_bnnv3"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="7_eoqf2"] +[ext_resource type="Texture2D" uid="uid://belwchvdktrw0" path="res://data/эмс-бланк.png" id="8_bnnv3"] +[ext_resource type="Texture2D" uid="uid://bwddxs24es81u" path="res://data/эмс-бланк-пост.png" id="9_is25t"] +[ext_resource type="Texture2D" uid="uid://pfoscstbm025" path="res://data/эмс-бланк-перем.png" id="10_meukj"] +[ext_resource type="Texture2D" uid="uid://dvl3sq036gn75" path="res://data/эмс-бланк-замыкание.png" id="11_xkifg"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_1wf07"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("8_bnnv3") +}, { +"duration": 1.0, +"texture": ExtResource("9_is25t") +}, { +"duration": 1.0, +"texture": ExtResource("10_meukj") +}, { +"duration": 1.0, +"texture": ExtResource("11_xkifg") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] [node name="pribor_prd_n" type="Control"] layout_mode = 3 @@ -350,3 +374,33 @@ offset_right = 649.0 offset_bottom = 1003.0 horizontal_alignment = 1 metadata/_edit_lock_ = true + +[node name="input_0" type="AnimatedSprite2D" parent="."] +position = Vector2(234, 177) +sprite_frames = SubResource("SpriteFrames_1wf07") + +[node name="Label" type="Label" parent="input_0"] +offset_left = -15.0 +offset_top = 15.0 +offset_right = 53.0 +offset_bottom = 34.0 +text = "Вход ЕМС" + +[node name="input_1" type="AnimatedSprite2D" parent="."] +position = Vector2(277, 177) +sprite_frames = SubResource("SpriteFrames_1wf07") + +[node name="output_0" type="AnimatedSprite2D" parent="."] +position = Vector2(381, 177) +sprite_frames = SubResource("SpriteFrames_1wf07") + +[node name="Label" type="Label" parent="output_0"] +offset_left = -19.0 +offset_top = 14.0 +offset_right = 57.0 +offset_bottom = 33.0 +text = "Модуляция" + +[node name="output_1" type="AnimatedSprite2D" parent="."] +position = Vector2(422, 177) +sprite_frames = SubResource("SpriteFrames_1wf07") diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index 76c3950..081214b 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -21,6 +21,18 @@ func _ready() -> void: on_press_device() +func _process(_delta: float) -> void: + if Engine.is_editor_hint(): + return + set_frame($input_0, unit_prd_v.ems_input_1) + set_frame($input_1, unit_prd_v.ems_input_2) + set_frame($output_0, unit_prd_v.ems_output_1) + set_frame($output_1, unit_prd_v.ems_output_2) + + +func set_frame(node_frame: Node, val: int): node_frame.set_frame(val) + + func start_control() -> void: set_default_state() find_labels(self) @@ -64,6 +76,53 @@ static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifi i_powapm.state = status +## Проверка температур УМ от УКП +static func check_temperature_um(status_prd: PackedByteArray, power_amplifier: Array) -> bool: + if power_amplifier.size() < 1: return false + const Constants: Dictionary = { + 'CONST_MIN_TEMP': -25, + 'MAXIMUM_CODE_ADC': 3796, + 'MINIMUM_CODE_AD': 2660, + 'TEMPERATURE_UKP_1': 47, + 'TEMPERATURE_UKP_2': 79, + } + const TEMP: float = 115.0 / (Constants.MAXIMUM_CODE_ADC - Constants.MINIMUM_CODE_AD) + var ukp1_online: int = (status_prd[0] >> 2) & 1 + var ukp2_online = (status_prd[0] >> 3) & 1 + var all_temp_is_ok: bool = true + + if ukp1_online: + var tmp_1: int + var temperature_ukp_1: int + for i_temp in 6: + temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * i_temp) + tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) + power_amplifier[i_temp].value1 = tmp_1 + if tmp_1>70: + all_temp_is_ok = false + + if power_amplifier.size() > 12: # Темпуратура от УМ литеры 1 + temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * 7) + tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) + power_amplifier[6].value1 = tmp_1 + if tmp_1>70: + all_temp_is_ok = false + + if ukp2_online: + for i_temp in 6: + var temperature_ukp_2: int = status_prd.decode_u16(Constants.TEMPERATURE_UKP_2 + 2 * i_temp) + var tmp_2: int = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3) + if power_amplifier.size() > 12: + power_amplifier[i_temp+7].value1 = tmp_2 + if tmp_2>70: + all_temp_is_ok = false + else: + power_amplifier[i_temp+6].value1 = tmp_2 + if tmp_2>70: + all_temp_is_ok = false + return all_temp_is_ok + + func on_press_device() -> void: var nodes_y5: Array = get_tree().get_nodes_in_group('y-5') var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') @@ -128,7 +187,7 @@ static func on_control_result(for_result_dic: Dictionary) -> void: for_result_dic.dou_4.state = STATE_VAL.GOOD if result_dic.dou_4 else STATE_VAL.ERROR else: result_dic.fs_4 = 0 - + power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) var result: bool = true diff --git a/scenes/pribor-prd-v/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index bf501cb..e53a2ae 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.tscn +++ b/scenes/pribor-prd-v/pribor-prd-v.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=9 format=3 uid="uid://cvskpe1ti3p45"] +[gd_scene load_steps=14 format=3 uid="uid://cvskpe1ti3p45"] [ext_resource type="Script" uid="uid://cvuosuvjaci1h" path="res://scenes/pribor-prd-v/pribor-prd-v.gd" id="1_c20s6"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_xpo4b"] @@ -8,6 +8,30 @@ [ext_resource type="Script" uid="uid://crpedygm3gohi" path="res://scenes/контроль/кассета.gd" id="6_os4mt"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="7_38u2b"] [ext_resource type="PackedScene" uid="uid://bcyxqni7gxvtq" path="res://scenes/контроль/блок-в.tscn" id="8_4e87c"] +[ext_resource type="Texture2D" uid="uid://belwchvdktrw0" path="res://data/эмс-бланк.png" id="9_4e87c"] +[ext_resource type="Texture2D" uid="uid://bwddxs24es81u" path="res://data/эмс-бланк-пост.png" id="10_g8fvp"] +[ext_resource type="Texture2D" uid="uid://pfoscstbm025" path="res://data/эмс-бланк-перем.png" id="11_gsby4"] +[ext_resource type="Texture2D" uid="uid://dvl3sq036gn75" path="res://data/эмс-бланк-замыкание.png" id="12_vxfkm"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_s5gcy"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("9_4e87c") +}, { +"duration": 1.0, +"texture": ExtResource("10_g8fvp") +}, { +"duration": 1.0, +"texture": ExtResource("11_gsby4") +}, { +"duration": 1.0, +"texture": ExtResource("12_vxfkm") +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] [node name="pribor_prd_v" type="Control"] layout_mode = 3 @@ -299,3 +323,33 @@ offset_right = 649.0 offset_bottom = 1003.0 horizontal_alignment = 1 metadata/_edit_lock_ = true + +[node name="input_0" type="AnimatedSprite2D" parent="."] +position = Vector2(234, 177) +sprite_frames = SubResource("SpriteFrames_s5gcy") + +[node name="Label" type="Label" parent="input_0"] +offset_left = -15.0 +offset_top = 15.0 +offset_right = 53.0 +offset_bottom = 34.0 +text = "Вход ЕМС" + +[node name="input_1" type="AnimatedSprite2D" parent="."] +position = Vector2(277, 177) +sprite_frames = SubResource("SpriteFrames_s5gcy") + +[node name="output_0" type="AnimatedSprite2D" parent="."] +position = Vector2(381, 177) +sprite_frames = SubResource("SpriteFrames_s5gcy") + +[node name="Label" type="Label" parent="output_0"] +offset_left = -19.0 +offset_top = 14.0 +offset_right = 57.0 +offset_bottom = 33.0 +text = "Модуляция" + +[node name="output_1" type="AnimatedSprite2D" parent="."] +position = Vector2(422, 177) +sprite_frames = SubResource("SpriteFrames_s5gcy") diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index b143c97..74d15ae 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -368,12 +368,12 @@ func _process(delta) -> void: _queue.erase(tile.i) req.request_completed.connect(_response.bind(req, tile)) - #if req.request(tile.url) != OK: - #tile.t = now - #remove_child(req) - #req.queue_free() - #_req_count -= 1 - # push_error('запрос \"%s\" не отправлен' % tile.url) TODO: For Deugs + if req.request(tile.url) != OK: + tile.t = now + remove_child(req) + req.queue_free() + _req_count -= 1 + push_error('запрос \"%s\" не отправлен' % tile.url) #TODO: For Deugs if _queue.is_empty(): emit_signal('load_completed') diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index efec4e6..98bb536 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -98,7 +98,7 @@ func on_settings_changed(): color_closed = ProjectSettings.get_setting('application/interfer/closed_sectors', Color(0.0, 0.0, 0.0, 1.0)) color_emit_sel = color_select color_closed_emit = color_closed - + color_select *= Color(1.0, 1.0, 1.0, 0.0) color_ecm *= Color(1.0, 1.0, 1.0, 0.0) color_emit_sel *= Color(1.0, 1.0, 1.0, 0.2) @@ -529,7 +529,7 @@ func update_fs_colors(): $btn_activate.self_modulate = Color.WHITE else: $btn_activate.self_modulate = Color.WHITE - + func unsel_fs_all(need_btns_off: bool): @@ -565,7 +565,7 @@ func set_btns_disabled(value: bool, btn): btn.set_disabled(value) -func on_interfer_prinuditelno (prenuditelno_sectors, btns): +func on_interfer_prinuditelno(prenuditelno_sectors, btns): for key in prenuditelno_sectors: var sectors = [] for sector in prenuditelno_sectors[key]: diff --git a/scripts/interfer.gd b/scripts/interfer.gd index cacda5d..3381836 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -266,7 +266,7 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v thr.nmfs = nmfs if (thr.proto in gos_protocols) and thr.fflags.proto and (not gos_flag): gos_nmfs.append(nmfs) - + thr.emit_state = 0 for ecm in ecms.values(): if thr.nmfs == ecm.nmfs: @@ -278,7 +278,7 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v ecm_active = false if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed): interfer_off(ecm, unit_instance) - + var th_id = thr.id for ecm_i in thrs.keys(): if thrs[ecm_i] == th_id: @@ -675,4 +675,3 @@ func set_th_emit(th: threats.Threat, ecm: Interfer): return else: th.emit_state = 1 - diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index d5d7957..a5a7d3d 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -182,7 +182,7 @@ class TestPRD extends Node: 'ip5_25': [7, false], } #### - + const RAY_m5:= 'RAY_m5' const RAY_5:= 'RAY_5' const RAY_15:= 'RAY_15' @@ -263,17 +263,16 @@ class TestPRD extends Node: var flag_si_fs_input: bool = false var flag_si_fs_output: bool = false var unit_prd: Object - var power_amplify: Array var power_result: Dictionary - #var control_label: Label var control_timer: Timer = Timer.new() var ems_6666_timer: Timer = Timer.new() var machine_timer: Timer = Timer.new() + var cc: int = 0 + var cmd_array: Array + signal control_is_over() signal update_progress(progress_value: float) signal update_max_value_progress(max_progress_value: int) - var cc: int = 0 - var cmd_array: Array var progress_value: float: set(v): @@ -302,14 +301,14 @@ class TestPRD extends Node: ## Пакеты от ЯУ-07 func on_data_received(unit_pribor: Object) -> void: + var status: PackedByteArray = unit_pribor.status + socket_status_ems_g(status) if machine_timer.is_stopped(): return - var status: PackedByteArray = unit_pribor.status block_kasseta_y5_config = check_block_kasseta_y5(status, block_kasseta_y5_config) block_ip_config = check_block_ip(status, block_ip_config) - control_results.temperature = check_temperature_um(status, power_amplify) - socket_status_ems_g(status) + _process_dkm_status(status) if current_litera != 0: var tek_litera: Dictionary = power_for_litera[current_litera] @@ -318,8 +317,29 @@ class TestPRD extends Node: tek_litera[_get_ray_key(state)] = power_um_ukp(status, current_litera, tek_litera[_get_ray_key(state)]) power_for_litera[current_litera] = tek_litera + var ems_input_1: int + var ems_input_2: int + var ems_input_lit_1: int + var ems_output_1: int + var ems_output_2: int + var ems_output_lit_1: int func socket_status_ems_g(packet_form_yau_07: PackedByteArray) -> void: + if self_name in ['1н', '2н', '3н', '4н']: + ems_input_1 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 9)) != 0 + ems_input_2 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 10)) != 0 + if self_name in ['1в', '2в', '3в', '4в']: + ems_input_1 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 11)) != 0 + ems_input_1 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 12)) != 0 + if self_name in ['1к', '2к', '3к', '4к']: + ems_input_1 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 13)) != 0 + ems_input_1 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 14)) != 0 + ems_input_lit_1 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 8)) != 0 + + ems_output_1 = (packet_form_yau_07.decode_u16(DataIndices.OUT_BLANK_PRD) & (1 << 4)) != 0 + ems_output_2 = (packet_form_yau_07.decode_u16(DataIndices.OUT_BLANK_PRD) & (1 << 5)) != 0 + ems_output_lit_1 = (packet_form_yau_07.decode_u16(DataIndices.OUT_BLANK_PRD) & (1 << 3)) != 0 + var number_socket_input: int if current_litera >= 1 and current_litera <= 7: number_socket_input = current_litera + 7 @@ -327,6 +347,8 @@ class TestPRD extends Node: var in_blank: int = packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) flag_si_fs_input = (in_blank & (1 << number_socket_input)) != 0 ## Флаг СИ от ФС входа в ЭМС-Г для текущей литеры + + var number_socket_output: int number_socket_output = 4 if current_litera in [2, 4, 6] else 3 if current_litera == 1 else 5 @@ -344,7 +366,7 @@ class TestPRD extends Node: fs_result = on_fs_state(packet_type_7, fs_mapping, fs_result) control_results[fs_key] = fs_result[fs_key] flag_fs_status_ok = control_results[fs_key] == 1 - + ## func state_control_machine() -> void: match state: @@ -354,11 +376,14 @@ class TestPRD extends Node: _handle_fs_turn_on_state() state = STATE_MACHINE.FS_WORK STATE_MACHINE.FS_WORK: - for key in ecms.keys(): - pass - #print([fs_parameters, current_litera]) - #print('ecms: %s %s' % [ecms[key].kni, ecms[key].params.freq]) - if ecms.size() and flag_fs_status_ok: + var flag_ecm: bool = false + for key in ecms: + var params = ecms[key].params.freq + if fs_parameters[current_litera].freq == params: + var kni = ecms[key].kni + if pribor_config[self_name].angle == kni: + flag_ecm = true + if flag_ecm and flag_fs_status_ok: ems_6666_timer.start() _handle_fs_work_state() STATE_MACHINE.CHEK_KASSETA_Y5: @@ -490,13 +515,13 @@ class TestPRD extends Node: ## Таймер отправки команды в ЭМС-Г для модуляции func _on_ems_6666_timer() -> void: cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]]) - - + + ## Таймер вызова машины состояний func on_state_mashine(): state_control_machine() - - + + func progressbar_status() -> void: match state: STATE_MACHINE.INIT: @@ -546,8 +571,8 @@ class TestPRD extends Node: func on_interfer_resized(ecms_dic: Dictionary) -> void: ecms = ecms_dic - - + + func _on_start_contol_device()-> void: _determine_self_name() machine_timer.wait_time = constants.STATE_MASHINE_TIMER @@ -601,13 +626,13 @@ class TestPRD extends Node: add_child(ems_6666_timer) ems_6666_timer.timeout.connect(_on_ems_6666_timer) ems_6666_timer.wait_time = 1.0 - + add_child(machine_timer) machine_timer.connect('timeout', Callable(self, 'on_state_mashine')) - - + + func on_mode_changed(in_tree: bool) -> void: - if not in_tree: + if not in_tree: ## TODO: Дополнительная проверка если контроль идет, если нет, то смысла вызывать нет progress_value = 0 machine_timer.stop() state = STATE_MACHINE.INIT @@ -615,7 +640,7 @@ class TestPRD extends Node: #prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]]) else: pass - + func _process_dkm_status(status: PackedByteArray) -> void: if not control_results.has(_get_current_fs_key()): @@ -722,7 +747,7 @@ class TestPRD extends Node: params.width, sectors[litera - 1] if litera == 1 else sectors[litera - 5] if litera > 5 else sectors[litera - 4] if litera > 3 else sectors[litera - 2] ]) - signaller.emit_signal('emit_changed', mode) + #signaller.emit_signal('emit_changed', mode) signaller.emit_signal('interfer_init', interfer_name, fs_arr, power_um) @@ -749,52 +774,6 @@ class TestPRD extends Node: return y5_config - ## Проверка температур УМ от УКП - static func check_temperature_um(status_prd: PackedByteArray, power_amplifier: Array) -> bool: - const Constants: Dictionary = { - 'CONST_MIN_TEMP': -25, - 'MAXIMUM_CODE_ADC': 3796, - 'MINIMUM_CODE_AD': 2660, - 'TEMPERATURE_UKP_1': 47, - 'TEMPERATURE_UKP_2': 79, - } - const TEMP: float = 115.0 / (Constants.MAXIMUM_CODE_ADC - Constants.MINIMUM_CODE_AD) - var ukp1_online: int = (status_prd[0] >> 2) & 1 - var ukp2_online = (status_prd[0] >> 3) & 1 - var all_temp_is_ok: bool = true - - if ukp1_online: - var tmp_1: int - var temperature_ukp_1: int - for i_temp in 6: - temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * i_temp) - tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) - #power_amplifier[i_temp].value1 = tmp_1 - if tmp_1>70: - all_temp_is_ok = false - - if power_amplifier.size() > 12: # Темпуратура от УМ литеры 1 - temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * 7) - tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) - #power_amplifier[6].value1 = tmp_1 - if tmp_1>70: - all_temp_is_ok = false - - if ukp2_online: - for i_temp in 6: - var temperature_ukp_2: int = status_prd.decode_u16(Constants.TEMPERATURE_UKP_2 + 2 * i_temp) - var tmp_2: int = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3) - if power_amplifier.size() > 12: - #power_amplifier[i_temp+7].value1 = tmp_2 - if tmp_2>70: - all_temp_is_ok = false - else: - #power_amplifier[i_temp+6].value1 = tmp_2 - if tmp_2>70: - all_temp_is_ok = false - return all_temp_is_ok - - ## Проверка ДКМ static func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> bool: var dkm: int = 28 From 9856e300e94d3664b41074a6b95f128d094c7679 Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Wed, 12 Nov 2025 21:40:57 +0300 Subject: [PATCH 02/10] =?UTF-8?q?=D0=9E=D1=82=D0=BB=D0=B0=D0=B4=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8F?= =?UTF-8?q?=20=D1=84=D1=81=20=D0=B8=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=BE=D1=82=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B7=D0=B0=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.gd | 30 +++++++++++++---------------- scenes/pribor-prd-n/pribor-prd-n.gd | 24 +++++++++++------------ scenes/pribor-prd-v/pribor-prd-v.gd | 18 +++++++---------- scripts/pribor-prd.gd | 17 ++++++++-------- 4 files changed, 39 insertions(+), 50 deletions(-) diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index 651fd03..3cb2020 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -22,7 +22,9 @@ func _ready() -> void: on_press_device() -func _process(delta: float) -> void: +func _process(_delta: float) -> void: + if Engine.is_editor_hint(): + return set_frame($input_0, unit_prd_k.ems_input_1) set_frame($input_1, unit_prd_k.ems_input_2) set_frame($input_2, unit_prd_k.ems_input_lit_1) @@ -31,7 +33,6 @@ func _process(delta: float) -> void: set_frame($output_2, unit_prd_k.ems_output_lit_1) - func set_frame(node_frame: Node, val: int): node_frame.set_frame(val) @@ -119,7 +120,7 @@ func on_control_result(for_result_dic: Dictionary) -> void: for node_y5 in nodes_y5: var meta_y5 = node_y5.get_meta('y5') if block_kasseta_y5_prd_config_k.has(meta_y5): - if block_kasseta_y5_prd_config_k['yau07'] == false: + if not block_kasseta_y5_prd_config_k['yau07']: node_y5.state = STATE_VAL.ERROR if meta_y5 == 'yau07' else STATE_VAL.NONE break node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_k[meta_y5] else STATE_VAL.ERROR @@ -135,26 +136,21 @@ func on_control_result(for_result_dic: Dictionary) -> void: for f in for_result_dic.fs_nodes: var fs_meta: String = f.get_meta('fs') if result_dic.has(fs_meta): - var new_state = result_dic[fs_meta] - f.state = new_state - result_dic[fs_meta] = new_state + f.state = result_dic[fs_meta] - if result_dic.fs_1 == 1: + if result_dic.fs_1 == 1 and block_kasseta_y5_prd_config_k['yau07']: for_result_dic.module_fs_1.state = STATE_VAL.GOOD if result_dic.dkm_1 else STATE_VAL.ERROR - else: - result_dic.fs_1 = 0 - if result_dic.fs_6 == 1: + + if result_dic.fs_6 == 1 and block_kasseta_y5_prd_config_k['yau07']: for_result_dic.module_fs_6.state = STATE_VAL.GOOD if result_dic.dkm_6 else STATE_VAL.ERROR for_result_dic.dou_6.state = STATE_VAL.GOOD if result_dic.dou_6 else STATE_VAL.ERROR - else: - result_dic.fs_6 = 0 - if result_dic.fs_7 == 1: + + if result_dic.fs_7 == 1 and block_kasseta_y5_prd_config_k['yau07']: for_result_dic.module_fs_7.state = STATE_VAL.GOOD if result_dic.dkm_7 else STATE_VAL.ERROR for_result_dic.dou_7.state = STATE_VAL.GOOD if result_dic.dou_7 else STATE_VAL.ERROR - else: - result_dic.fs_7 = 0 - - power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) + + if block_kasseta_y5_prd_config_k['yau07']: + power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) var result: bool = true for device in result_dic.values(): diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd index 84b2b56..fb0046c 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.gd +++ b/scenes/pribor-prd-n/pribor-prd-n.gd @@ -22,7 +22,9 @@ func _ready() -> void: on_press_device() -func _process(delta: float) -> void: +func _process(_delta: float) -> void: + if Engine.is_editor_hint(): + return set_frame($input_0, unit_prd_n.ems_input_1) set_frame($input_1, unit_prd_n.ems_input_2) set_frame($output_0, unit_prd_n.ems_output_1) @@ -110,7 +112,7 @@ func on_control_result(for_result_dic: Dictionary) -> void: for node_y5 in nodes_y5: var meta_y5 = node_y5.get_meta('y5') if block_kasseta_y5_prd_config_n.has(meta_y5): - if block_kasseta_y5_prd_config_n['yau07'] == false: + if not block_kasseta_y5_prd_config_n['yau07']: node_y5.state = STATE_VAL.ERROR if meta_y5 == 'yau07' else STATE_VAL.NONE break node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_n[meta_y5] else STATE_VAL.ERROR @@ -126,22 +128,18 @@ func on_control_result(for_result_dic: Dictionary) -> void: for f in for_result_dic.fs_nodes: var fs_meta: String = f.get_meta('fs') if result_dic.has(fs_meta): - var new_state = result_dic[fs_meta] - f.state = new_state - result_dic[fs_meta] = new_state + f.state = result_dic[fs_meta] - if result_dic.fs_2 == 1: + if result_dic.fs_2 == 1 and block_kasseta_y5_prd_config_n['yau07']: for_result_dic.module_fs_2.state = STATE_VAL.GOOD if result_dic.dkm_2 else STATE_VAL.ERROR for_result_dic.dou_2.state = STATE_VAL.GOOD if result_dic.dou_2 else STATE_VAL.ERROR - else: - result_dic.fs_2 = 0 - if result_dic.fs_3 == 1: + + if result_dic.fs_3 == 1 and block_kasseta_y5_prd_config_n['yau07']: for_result_dic.module_fs_3.state = STATE_VAL.GOOD if result_dic.dkm_3 else STATE_VAL.ERROR for_result_dic.dou_3.state = STATE_VAL.GOOD if result_dic.dou_3 else STATE_VAL.ERROR - else: - result_dic.fs_3 = 0 - - power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) + + if block_kasseta_y5_prd_config_n['yau07']: + power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) var result: bool = true for device in result_dic.values(): diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index 081214b..b01521e 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -173,22 +173,18 @@ static func on_control_result(for_result_dic: Dictionary) -> void: for f in for_result_dic.fs_nodes: var fs_meta: String = f.get_meta('fs') if result_dic.has(fs_meta): - var new_state = result_dic[fs_meta] - f.state = new_state - result_dic[fs_meta] = new_state + f.state = result_dic[fs_meta] - if result_dic.fs_5 == 1: + if result_dic.fs_5 == 1 and block_kasseta_y5_prd_config_v['yau07']: for_result_dic.module_fs_5.state = STATE_VAL.GOOD if result_dic.dkm_5 else STATE_VAL.ERROR for_result_dic.dou_5.state = STATE_VAL.GOOD if result_dic.dou_5 else STATE_VAL.ERROR - else: - result_dic.fs_5 = 0 - if result_dic.fs_4 == 1: + + if result_dic.fs_4 == 1 and block_kasseta_y5_prd_config_v['yau07']: for_result_dic.module_fs_4.state = STATE_VAL.GOOD if result_dic.dkm_4 else STATE_VAL.ERROR for_result_dic.dou_4.state = STATE_VAL.GOOD if result_dic.dou_4 else STATE_VAL.ERROR - else: - result_dic.fs_4 = 0 - - power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) + + if block_kasseta_y5_prd_config_v['yau07']: + power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) var result: bool = true for device in result_dic.values(): diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index a5a7d3d..3ba55b9 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -122,8 +122,8 @@ class TestPRD extends Node: 'dkm_3': false, 'dou_2': false, 'dou_3': false, - 'fs_2': 2, - 'fs_3': 2, + 'fs_2': 0, + 'fs_3': 0, } #### var block_ip_config_v := { @@ -148,8 +148,8 @@ class TestPRD extends Node: 'dkm_5': false, 'dou_4': false, 'dou_5': false, - 'fs_4': 2, - 'fs_5': 2, + 'fs_4': 0, + 'fs_5': 0, } #### var block_kasseta_y5_prd_config_k: = { @@ -167,9 +167,9 @@ class TestPRD extends Node: 'dkm_7': false, 'dou_6': false, 'dou_7': false, - 'fs_1': 2, - 'fs_6': 2, - 'fs_7': 2, + 'fs_1': 0, + 'fs_6': 0, + 'fs_7': 0, } var block_ip_config_k := { 'maa2000_1': [0, false], @@ -347,8 +347,6 @@ class TestPRD extends Node: var in_blank: int = packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) flag_si_fs_input = (in_blank & (1 << number_socket_input)) != 0 ## Флаг СИ от ФС входа в ЭМС-Г для текущей литеры - - var number_socket_output: int number_socket_output = 4 if current_litera in [2, 4, 6] else 3 if current_litera == 1 else 5 @@ -371,6 +369,7 @@ class TestPRD extends Node: func state_control_machine() -> void: match state: STATE_MACHINE.INIT: + print("Start control for %s device %s litera" % [self_name, current_litera]) _handle_init_state() STATE_MACHINE.FS_TURN_ON: _handle_fs_turn_on_state() From 69b455f811429da69dcc5c5556bbd6eff60ffe1d Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Thu, 13 Nov 2025 00:23:39 +0300 Subject: [PATCH 03/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B0=D0=BD=D0=B8=D0=BC=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/контроль/control_prd.gd | 79 ++++++++++++++++++++++++++++++ scenes/контроль/control_prd.gd.uid | 1 + scenes/контроль/контроль.tscn | 4 +- 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 scenes/контроль/control_prd.gd create mode 100644 scenes/контроль/control_prd.gd.uid diff --git a/scenes/контроль/control_prd.gd b/scenes/контроль/control_prd.gd new file mode 100644 index 0000000..1d1baaf --- /dev/null +++ b/scenes/контроль/control_prd.gd @@ -0,0 +1,79 @@ +extends Button + +var base_style: StyleBoxFlat +var tween +var pulsing: bool = false +var original_text: String + + +func _ready(): + original_text = text + _setup_styles() + _setup_signals() + + +func _setup_styles() -> void: + if get("theme_override_styles/disabled") == null: + base_style = StyleBoxFlat.new() + base_style.border_color = Color(1.0, 0.5, 0.0) + base_style.border_width_top = 4 + base_style.border_width_bottom = 4 + base_style.border_width_left = 4 + base_style.border_width_right = 4 + base_style.bg_color = Color(0.2, 0.2, 0.2) + set("theme_override_styles/disabled", base_style) + else: + base_style = get("theme_override_styles/disabled") + set("theme_override_colors/font_disabled_color", Color(1.0, 1.0, 1.0)) + + +func _setup_signals() -> void: + connect("pressed", Callable(self, "_on_pressed")) + + if not signaller: + return + var signals_to_connect := ["режим_работа", "режим_журнал", "режим_эмс", "режим_настройки", "режим_контроль"] + for signal_name in signals_to_connect: + if signaller.has_signal(signal_name): + signaller.connect(signal_name, Callable(self, "_on_status_change")) + + +func _on_pressed(): + disabled = true + text = "Идет выполнение контроля" + _start_pulse() + + +func _start_pulse(): + if pulsing: + return + pulsing = true + tween = create_tween() + tween.set_loops() + var color1 = Color(1.0, 0.5, 0.0) # оранжевый + var color2 = Color(0.4, 0.4, 0.4) # серый + tween.tween_property(base_style, "border_color", color2, 0.5)\ + .set_trans(Tween.TRANS_SINE)\ + .set_ease(Tween.EASE_IN_OUT) + tween.tween_property(base_style, "border_color", color1, 0.5)\ + .set_trans(Tween.TRANS_SINE)\ + .set_ease(Tween.EASE_IN_OUT) + + +func _stop_pulse(): + if tween: + tween.kill() + tween = null + base_style.border_color = Color(1.0, 0.5, 0.0) + pulsing = false + disabled = false + text = original_text + + +func _on_status_change(): + _stop_pulse() + + +func _exit_tree() -> void: + if tween: + tween.kill() diff --git a/scenes/контроль/control_prd.gd.uid b/scenes/контроль/control_prd.gd.uid new file mode 100644 index 0000000..d2330c1 --- /dev/null +++ b/scenes/контроль/control_prd.gd.uid @@ -0,0 +1 @@ +uid://xjs7owe2iexn diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index 0f29107..5a3a92e 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=20 format=3 uid="uid://lwmw4egynmd1"] +[gd_scene load_steps=21 format=3 uid="uid://lwmw4egynmd1"] [ext_resource type="Texture2D" uid="uid://bar8k5qef7kch" path="res://data/УФ.png" id="2_0nvm1"] [ext_resource type="Script" uid="uid://q3gmpsqspjfp" path="res://scenes/контроль/внешний.gd" id="2_8r80x"] @@ -17,6 +17,7 @@ [ext_resource type="Texture2D" uid="uid://00871pb6moln" path="res://data/прогресс-фон-1.png" id="9_w6m6a"] [ext_resource type="Texture2D" uid="uid://c1k856fxhrjnh" path="res://data/прогресс-заполнение-1.png" id="10_lbx5w"] [ext_resource type="Script" uid="uid://bncy1x53jp73d" path="res://scenes/контроль/connect_pribor.gd" id="11_u7tym"] +[ext_resource type="Script" uid="uid://xjs7owe2iexn" path="res://scenes/контроль/control_prd.gd" id="18_lbx5w"] [sub_resource type="GDScript" id="GDScript_iqgf5"] script/source = "extends Panel @@ -1687,6 +1688,7 @@ offset_right = 1326.0 offset_bottom = 104.0 focus_mode = 0 text = "Запуск контроля" +script = ExtResource("18_lbx5w") [connection signal="toggled" from="pribor_prd_n_1" to="pribor_prd_n_1" method="_on_toggled"] [connection signal="toggled" from="pribor_uf" to="pribor_uf" method="_on_toggled"] From 9727eb04a9019fa5afa456f8d8a3f4f03d4be9ae Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Sun, 16 Nov 2025 14:05:57 +0300 Subject: [PATCH 04/10] =?UTF-8?q?=D0=9A=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B8=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B0=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/kasseta-fs-kd.tscn | 8 +- scenes/pribor-prd-k/pribor-prd-k.tscn | 203 +++++++++++++++++++++++-- scenes/pribor-prd-n/pribor-prd-n.tscn | 86 ++++++++++- scenes/pribor-prd-v/pribor-prd-v.tscn | 78 +++++++++- scenes/контроль/блок-в.tscn | 8 +- scenes/контроль/кассета-п-2.tscn | 5 +- scenes/контроль/кассета-у-5-нв.tscn | 12 +- 7 files changed, 358 insertions(+), 42 deletions(-) diff --git a/scenes/pribor-prd-k/kasseta-fs-kd.tscn b/scenes/pribor-prd-k/kasseta-fs-kd.tscn index ac2d952..3fcc635 100644 --- a/scenes/pribor-prd-k/kasseta-fs-kd.tscn +++ b/scenes/pribor-prd-k/kasseta-fs-kd.tscn @@ -49,7 +49,7 @@ offset_top = 33.0 offset_right = 155.0 offset_bottom = 183.0 fname = "Блок ФС-2" -rname = "A2" +rname = "A6" [node name="ref_A6" parent="." groups=["default_reset", "fs_group"] instance=ExtResource("3_kqnvt")] offset_left = 155.0 @@ -57,7 +57,7 @@ offset_top = 33.0 offset_right = 205.0 offset_bottom = 183.0 fname = "Модуль ФС" -rname = "A5" +rname = "A3" metadata/fs = "fs_6" [node name="ref_A5" parent="." groups=["default_reset", "fs_group"] instance=ExtResource("3_kqnvt")] @@ -66,7 +66,7 @@ offset_top = 33.0 offset_right = 255.0 offset_bottom = 183.0 fname = "Модуль ФС" -rname = "A3" +rname = "A2" metadata/fs = "fs_7" [node name="ref_A7" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")] @@ -75,4 +75,4 @@ offset_top = 33.0 offset_right = 305.0 offset_bottom = 183.0 fname = "Блок ФС-6" -rname = "A6" +rname = "A5" diff --git a/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index 0096012..55af137 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.tscn +++ b/scenes/pribor-prd-k/pribor-prd-k.tscn @@ -1,19 +1,59 @@ -[gd_scene load_steps=15 format=3 uid="uid://m5s87q7m66lj"] +[gd_scene load_steps=25 format=3 uid="uid://m5s87q7m66lj"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="1_8dmgr"] [ext_resource type="Script" uid="uid://cwvikiygf8b1m" path="res://scenes/pribor-prd-k/pribor-prd-k.gd" id="1_tpdyp"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="2_14h25"] [ext_resource type="PackedScene" uid="uid://cm5jd4gjrrpba" path="res://scenes/контроль/кассета-у-5-к.tscn" id="2_tb85r"] [ext_resource type="PackedScene" uid="uid://bcyxqni7gxvtq" path="res://scenes/контроль/блок-в.tscn" id="5_c7lv8"] +[ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="6_l0j7c"] [ext_resource type="PackedScene" uid="uid://bmagw8nd0ulhj" path="res://scenes/pribor-prd-k/kasseta-fs-kd.tscn" id="7_ia27q"] [ext_resource type="Script" uid="uid://crpedygm3gohi" path="res://scenes/контроль/кассета.gd" id="7_xpa2n"] [ext_resource type="PackedScene" uid="uid://dq31j24gv5vi4" path="res://scenes/контроль/кассета-п-2.tscn" id="8_6fdp7"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="8_la5yt"] +[ext_resource type="Texture2D" uid="uid://00871pb6moln" path="res://data/прогресс-фон-1.png" id="9_0ba6e"] +[ext_resource type="Texture2D" uid="uid://c1k856fxhrjnh" path="res://data/прогресс-заполнение-1.png" id="10_b3870"] [ext_resource type="Texture2D" uid="uid://belwchvdktrw0" path="res://data/эмс-бланк.png" id="10_c7lv8"] [ext_resource type="Texture2D" uid="uid://bwddxs24es81u" path="res://data/эмс-бланк-пост.png" id="11_wd1vi"] [ext_resource type="Texture2D" uid="uid://pfoscstbm025" path="res://data/эмс-бланк-перем.png" id="12_bjebg"] [ext_resource type="Texture2D" uid="uid://dvl3sq036gn75" path="res://data/эмс-бланк-замыкание.png" id="13_kc77u"] +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3nd2u"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_rceim"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8yvwo"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_6qu57"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_mlxje"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3dspb"] + +[sub_resource type="GDScript" id="GDScript_45hqb"] +script/source = "@tool + +extends MarginContainer + + +func _enter_tree() -> void: + margins = [8, 8, 8, 8] + + +@export var margins: Array: + set(vals): + add_theme_constant_override('margin_top', vals[0]) + add_theme_constant_override('margin_left', vals[1]) + add_theme_constant_override('margin_bottom', vals[2]) + add_theme_constant_override('margin_right', vals[3]) + get: + var vals = [0, 0, 0, 0] + vals[0] = get_theme_constant('margin_top') + vals[1] = get_theme_constant('margin_left') + vals[2] = get_theme_constant('margin_bottom') + vals[3] = get_theme_constant('margin_right') + return vals +" + [sub_resource type="SpriteFrames" id="SpriteFrames_di0aa"] animations = [{ "frames": [{ @@ -185,25 +225,158 @@ value0_info = "Мощность, Вт" value1_info = "Температура,°C" metadata/um = "um_6" -[node name="utm80_A9" parent="." groups=["power_amplifier"] instance=ExtResource("5_c7lv8")] +[node name="utm80_A9" type="PanelContainer" parent="."] +editor_description = "Элемент замены из ЗИП" layout_mode = 0 offset_left = 485.0 offset_top = 812.0 offset_right = 652.0 offset_bottom = 907.0 -fname = "УТМ80" -rname = "A9" -value0_info = "Мощность, Вт" -value1_info = "Температура,°C" +theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u") metadata/um = "um_7" +[node name="button" type="Button" parent="utm80_A9"] +layout_mode = 2 +theme_override_styles/focus = SubResource("StyleBoxEmpty_rceim") +theme_override_styles/disabled = SubResource("StyleBoxEmpty_8yvwo") +theme_override_styles/hover = SubResource("StyleBoxEmpty_6qu57") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_mlxje") +theme_override_styles/normal = SubResource("StyleBoxEmpty_3dspb") + +[node name="rect" type="NinePatchRect" parent="utm80_A9"] +layout_mode = 2 +texture = ExtResource("2_14h25") +draw_center = false +region_rect = Rect2(0, 0, 63, 63) +patch_margin_left = 17 +patch_margin_top = 17 +patch_margin_right = 17 +patch_margin_bottom = 15 + +[node name="margin" type="MarginContainer" parent="utm80_A9"] +layout_mode = 2 +theme_override_constants/margin_left = 8 +theme_override_constants/margin_top = 8 +theme_override_constants/margin_right = 8 +theme_override_constants/margin_bottom = 8 +script = SubResource("GDScript_45hqb") +margins = [8, 8, 8, 8] + +[node name="vbox" type="VBoxContainer" parent="utm80_A9/margin"] +layout_mode = 2 + +[node name="grid0" type="GridContainer" parent="utm80_A9/margin/vbox"] +layout_mode = 2 +columns = 3 + +[node name="state" type="TextureRect" parent="utm80_A9/margin/vbox/grid0"] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +size_flags_horizontal = 2 +size_flags_vertical = 6 +texture = ExtResource("6_l0j7c") +expand_mode = 1 + +[node name="fname" type="Label" parent="utm80_A9/margin/vbox/grid0"] +self_modulate = Color(1, 1, 1, 0.627451) +custom_minimum_size = Vector2(0, 20) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_font_sizes/font_size = 17 +text = "УТМ80" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="rname" type="Label" parent="utm80_A9/margin/vbox/grid0"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 6 +theme_override_font_sizes/font_size = 18 +text = "A9" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="grid1" type="GridContainer" parent="utm80_A9/margin/vbox"] +custom_minimum_size = Vector2(80, 0) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 3 +columns = 2 + +[node name="level1" type="TextureProgressBar" parent="utm80_A9/margin/vbox/grid1" groups=["уровни"]] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +tooltip_text = "Мощность, Вт +Текущее: 0.00 +Диапазон: 0.00…1400.00" +mouse_filter = 0 +max_value = 1400.0 +fill_mode = 3 +nine_patch_stretch = true +stretch_margin_left = 8 +stretch_margin_top = 8 +stretch_margin_right = 8 +stretch_margin_bottom = 8 +texture_under = ExtResource("9_0ba6e") +texture_progress = ExtResource("10_b3870") +tint_under = Color(1, 1, 1, 0.419608) +tint_progress = Color(0.890196, 0.486275, 0.196078, 1) + +[node name="level7" type="TextureProgressBar" parent="utm80_A9/margin/vbox/grid1"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +tooltip_text = "Температура,°C +Текущее: 56.00 +Диапазон: -50.00…120.00" +mouse_filter = 0 +min_value = -50.0 +max_value = 120.0 +value = 56.0 +fill_mode = 3 +nine_patch_stretch = true +stretch_margin_left = 8 +stretch_margin_top = 8 +stretch_margin_right = 8 +stretch_margin_bottom = 8 +texture_under = ExtResource("9_0ba6e") +texture_progress = ExtResource("10_b3870") +tint_under = Color(0.890196, 0.486275, 0.196078, 1) +tint_over = Color(0.890196, 0.486275, 0.196078, 1) + +[node name="grid2" type="GridContainer" parent="utm80_A9/margin/vbox"] +clip_contents = true +custom_minimum_size = Vector2(80, 0) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +columns = 2 + +[node name="lbl6" type="Label" parent="utm80_A9/margin/vbox/grid2" groups=["названия"]] +clip_contents = true +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 8 +text = "P,%" +horizontal_alignment = 1 + +[node name="lbl7" type="Label" parent="utm80_A9/margin/vbox/grid2"] +clip_contents = true +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 8 +text = "°C" +horizontal_alignment = 1 + [node name="rm1620m_A16" parent="." groups=["power_amplifier"] instance=ExtResource("5_c7lv8")] layout_mode = 0 offset_left = 8.0 offset_top = 242.0 offset_right = 175.0 offset_bottom = 337.0 -fname = "УМ1535Б" +fname = "РМ16-20М" rname = "A16" value0_info = "Мощность, Вт" value1_info = "Температура,°C" @@ -215,7 +388,7 @@ offset_left = 8.0 offset_top = 337.0 offset_right = 173.0 offset_bottom = 432.0 -fname = "УМ1535Б" +fname = "РМ16-20М" rname = "A17" value0_info = "Мощность, Вт" value1_info = "Температура,°C" @@ -227,7 +400,7 @@ offset_left = 8.0 offset_top = 432.0 offset_right = 175.0 offset_bottom = 527.0 -fname = "УМ1535Б" +fname = "РМ16-20М" rname = "A18" value0_info = "Мощность, Вт" value1_info = "Температура,°C" @@ -239,7 +412,7 @@ offset_left = 8.0 offset_top = 527.0 offset_right = 175.0 offset_bottom = 622.0 -fname = "УМ1535Б" +fname = "РМ16-20М" rname = "A19" value0_info = "Мощность, Вт" value1_info = "Температура,°C" @@ -251,7 +424,7 @@ offset_left = 8.0 offset_top = 622.0 offset_right = 175.0 offset_bottom = 717.0 -fname = "УМ1535Б" +fname = "РМ16-20М" rname = "A20" value0_info = "Мощность, Вт" value1_info = "Температура,°C" @@ -263,7 +436,7 @@ offset_left = 8.0 offset_top = 717.0 offset_right = 175.0 offset_bottom = 812.0 -fname = "УМ1535Б" +fname = "РМ16-20М" rname = "A21" value0_info = "Мощность, Вт" value1_info = "Температура,°C" @@ -321,9 +494,9 @@ metadata/ip = "ip12_50_1" [node name="lbl_fname" type="Label" parent="kasseta_p_1"] self_modulate = Color(1, 1, 1, 0.62) layout_mode = 0 -offset_left = 7.0 +offset_left = 2.0 offset_top = 8.0 -offset_right = 159.0 +offset_right = 162.0 offset_bottom = 33.0 text = "Кассета П-1" horizontal_alignment = 1 @@ -385,3 +558,5 @@ sprite_frames = SubResource("SpriteFrames_di0aa") [node name="output_2" type="AnimatedSprite2D" parent="."] position = Vector2(383, 177) sprite_frames = SubResource("SpriteFrames_di0aa") + +[connection signal="pressed" from="utm80_A9/button" to="utm80_A9" method="_on_button_pressed"] diff --git a/scenes/pribor-prd-n/pribor-prd-n.tscn b/scenes/pribor-prd-n/pribor-prd-n.tscn index 899c973..a12b1ab 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.tscn +++ b/scenes/pribor-prd-n/pribor-prd-n.tscn @@ -1,9 +1,8 @@ -[gd_scene load_steps=13 format=3 uid="uid://dnuexoef2nnv5"] +[gd_scene load_steps=12 format=3 uid="uid://dnuexoef2nnv5"] [ext_resource type="Script" uid="uid://cto2r4ipew65m" path="res://scenes/pribor-prd-n/pribor-prd-n.gd" id="1_bnnv3"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_is25t"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="3_meukj"] -[ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5-нв.tscn" id="4_xkifg"] [ext_resource type="Script" uid="uid://crpedygm3gohi" path="res://scenes/контроль/кассета.gd" id="6_b5wvk"] [ext_resource type="PackedScene" uid="uid://bcyxqni7gxvtq" path="res://scenes/контроль/блок-в.tscn" id="7_bnnv3"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="7_eoqf2"] @@ -103,12 +102,83 @@ text = "Панель horizontal_alignment = 1 vertical_alignment = 1 -[node name="kasseta_U5" parent="." instance=ExtResource("4_xkifg")] +[node name="kasseta_U5" type="NinePatchRect" parent="."] layout_mode = 0 offset_left = 175.0 offset_top = 242.0 offset_right = 485.0 offset_bottom = 432.0 +texture = ExtResource("3_meukj") +patch_margin_left = 16 +patch_margin_top = 16 +patch_margin_right = 16 +patch_margin_bottom = 16 +script = ExtResource("6_b5wvk") + +[node name="lbl_fname" type="Label" parent="kasseta_U5"] +self_modulate = Color(1, 1, 1, 0.62) +layout_mode = 0 +offset_left = 5.0 +offset_top = 7.0 +offset_right = 305.0 +offset_bottom = 35.0 +text = "Кассета У5" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="ref_A24" parent="kasseta_U5" groups=["power_supply"] instance=ExtResource("7_eoqf2")] +offset_left = 5.0 +offset_top = 32.0 +offset_right = 55.0 +offset_bottom = 182.0 +fname = "ИП5-25" +rname = "A24" +metadata/ip = "ip5_25" + +[node name="ref_A30" parent="kasseta_U5" groups=["y-5"] instance=ExtResource("7_eoqf2")] +offset_left = 55.0 +offset_top = 32.0 +offset_right = 105.0 +offset_bottom = 182.0 +fname = "ЯУ-07Б" +rname = "A30" +metadata/y5 = "yau07" + +[node name="ref_A26" parent="kasseta_U5" groups=["y-5"] instance=ExtResource("7_eoqf2")] +offset_left = 105.0 +offset_top = 32.0 +offset_right = 155.0 +offset_bottom = 182.0 +fname = "ЭМС-Г" +rname = "A26" +metadata/y5 = "ems" + +[node name="ref_A27" parent="kasseta_U5" groups=["y-5"] instance=ExtResource("7_eoqf2")] +offset_left = 155.0 +offset_top = 32.0 +offset_right = 205.0 +offset_bottom = 182.0 +fname = "УГ" +rname = "A27" +metadata/y5 = "ug" + +[node name="ref_A28" parent="kasseta_U5" groups=["y-5"] instance=ExtResource("7_eoqf2")] +offset_left = 205.0 +offset_top = 32.0 +offset_right = 255.0 +offset_bottom = 182.0 +fname = "УКП" +rname = "A28" +metadata/y5 = "ukp1" + +[node name="ref_A29" parent="kasseta_U5" groups=["y-5"] instance=ExtResource("7_eoqf2")] +offset_left = 254.0 +offset_top = 32.0 +offset_right = 304.0 +offset_bottom = 182.0 +fname = "УКП" +rname = "A29" +metadata/y5 = "ukp2" [node name="kasseta_FS_ND" type="NinePatchRect" parent="."] layout_mode = 0 @@ -142,7 +212,7 @@ offset_top = 32.0 offset_right = 105.0 offset_bottom = 182.0 fname = "Блок ФС-3" -rname = "A3" +rname = "A4" [node name="ref_A1" parent="kasseta_FS_ND" groups=["default_reset", "fs_group"] instance=ExtResource("7_eoqf2")] offset_left = 105.0 @@ -150,7 +220,7 @@ offset_top = 32.0 offset_right = 155.0 offset_bottom = 182.0 fname = "Модуль ФС" -rname = "A1" +rname = "A2" metadata/fs = "fs_3" [node name="ref_A2" parent="kasseta_FS_ND" groups=["default_reset", "fs_group"] instance=ExtResource("7_eoqf2")] @@ -159,7 +229,7 @@ offset_top = 32.0 offset_right = 205.0 offset_bottom = 182.0 fname = "Модуль ФС" -rname = "A2" +rname = "A1" metadata/fs = "fs_2" [node name="ref_A4" parent="kasseta_FS_ND" groups=["default_reset"] instance=ExtResource("7_eoqf2")] @@ -168,7 +238,7 @@ offset_top = 32.0 offset_right = 255.0 offset_bottom = 182.0 fname = "Блок ФС-2" -rname = "A4" +rname = "A3" [node name="kasseta_P_1" type="NinePatchRect" parent="."] layout_mode = 0 @@ -228,7 +298,7 @@ offset_left = 485.0 offset_top = 242.0 offset_right = 652.0 offset_bottom = 337.0 -fname = "УМ1535Б" +fname = "УМ1535А" rname = "A7" value0_info = "Мощность, Вт" value1_info = "Температура,°C" diff --git a/scenes/pribor-prd-v/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index e53a2ae..3d9bd2e 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.tscn +++ b/scenes/pribor-prd-v/pribor-prd-v.tscn @@ -1,9 +1,8 @@ -[gd_scene load_steps=14 format=3 uid="uid://cvskpe1ti3p45"] +[gd_scene load_steps=13 format=3 uid="uid://cvskpe1ti3p45"] [ext_resource type="Script" uid="uid://cvuosuvjaci1h" path="res://scenes/pribor-prd-v/pribor-prd-v.gd" id="1_c20s6"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_xpo4b"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="3_wyy1b"] -[ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5-нв.tscn" id="4_gl2bl"] [ext_resource type="PackedScene" uid="uid://cd5sue1e8iyrv" path="res://scenes/pribor-prd-n/kasseta-fs-nd.tscn" id="5_nhd2k"] [ext_resource type="Script" uid="uid://crpedygm3gohi" path="res://scenes/контроль/кассета.gd" id="6_os4mt"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="7_38u2b"] @@ -104,12 +103,83 @@ text = "Панель horizontal_alignment = 1 vertical_alignment = 1 -[node name="kasseta_U5" parent="." instance=ExtResource("4_gl2bl")] +[node name="kasseta_U5" type="NinePatchRect" parent="."] layout_mode = 0 offset_left = 175.0 offset_top = 242.0 offset_right = 485.0 offset_bottom = 432.0 +texture = ExtResource("3_wyy1b") +patch_margin_left = 16 +patch_margin_top = 16 +patch_margin_right = 16 +patch_margin_bottom = 16 +script = ExtResource("6_os4mt") + +[node name="lbl_fname" type="Label" parent="kasseta_U5"] +self_modulate = Color(1, 1, 1, 0.62) +layout_mode = 0 +offset_left = 5.0 +offset_top = 7.0 +offset_right = 305.0 +offset_bottom = 35.0 +text = "Кассета У5" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="ref_A24" parent="kasseta_U5" groups=["power_supply"] instance=ExtResource("7_38u2b")] +offset_left = 5.0 +offset_top = 32.0 +offset_right = 55.0 +offset_bottom = 182.0 +fname = "ИП5-25" +rname = "A24" +metadata/ip = "ip5_25" + +[node name="ref_A30" parent="kasseta_U5" groups=["y-5"] instance=ExtResource("7_38u2b")] +offset_left = 55.0 +offset_top = 32.0 +offset_right = 105.0 +offset_bottom = 182.0 +fname = "ЯУ-07Б" +rname = "A30" +metadata/y5 = "yau07" + +[node name="ref_A26" parent="kasseta_U5" groups=["y-5"] instance=ExtResource("7_38u2b")] +offset_left = 105.0 +offset_top = 32.0 +offset_right = 155.0 +offset_bottom = 182.0 +fname = "ЭМС-Г" +rname = "A26" +metadata/y5 = "ems" + +[node name="ref_A27" parent="kasseta_U5" groups=["y-5"] instance=ExtResource("7_38u2b")] +offset_left = 155.0 +offset_top = 32.0 +offset_right = 205.0 +offset_bottom = 182.0 +fname = "УГ" +rname = "A27" +metadata/y5 = "ug" + +[node name="ref_A28" parent="kasseta_U5" groups=["y-5"] instance=ExtResource("7_38u2b")] +offset_left = 205.0 +offset_top = 32.0 +offset_right = 255.0 +offset_bottom = 182.0 +fname = "УКП" +rname = "A28" +metadata/y5 = "ukp1" + +[node name="ref_A29" parent="kasseta_U5" groups=["y-5"] instance=ExtResource("7_38u2b")] +offset_left = 254.0 +offset_top = 32.0 +offset_right = 304.0 +offset_bottom = 182.0 +fname = "УКП" +rname = "A29" +metadata/y5 = "ukp2" [node name="kasseta_FS_VD" parent="." instance=ExtResource("5_nhd2k")] layout_mode = 0 @@ -177,7 +247,7 @@ offset_left = 485.0 offset_top = 242.0 offset_right = 652.0 offset_bottom = 337.0 -fname = "УМ1535Б" +fname = "УМ1535А" rname = "A7" value0_info = "Мощность, Вт" value1_info = "Температура,°C" diff --git a/scenes/контроль/блок-в.tscn b/scenes/контроль/блок-в.tscn index 06dcfa8..578fee5 100644 --- a/scenes/контроль/блок-в.tscn +++ b/scenes/контроль/блок-в.tscn @@ -145,10 +145,10 @@ func _enter_tree() -> void: call_deferred('_enter_tree_defered') func _ready(): - var items: Array = get_level_nodes() - for item in items: - item.connect('value_changed', on_level_changed.bind(item, value0_info)) - on_level_changed(item.value, item, value0_info) + #var items: Array = get_level_nodes() + #for item in items: + #item.connect('value_changed', on_level_changed.bind(item, value0_info)) + #on_level_changed(item.value, item, value0_info) var level7: = $margin/vbox/grid1/level7 level7.connect('value_changed', on_level_changed.bind(level7, value1_info)) on_level_changed(level7.value, level7, value1_info) diff --git a/scenes/контроль/кассета-п-2.tscn b/scenes/контроль/кассета-п-2.tscn index a265d9d..abe840d 100644 --- a/scenes/контроль/кассета-п-2.tscn +++ b/scenes/контроль/кассета-п-2.tscn @@ -35,9 +35,10 @@ metadata/ip = "ip12_50_2" [node name="lbl_fname" type="Label" parent="."] self_modulate = Color(1, 1, 1, 0.62) layout_mode = 0 -offset_left = 5.0 +offset_left = 8.0 offset_top = 5.0 -offset_right = 105.0 +offset_right = 112.0 offset_bottom = 30.0 +text = "Касета П-2" horizontal_alignment = 1 vertical_alignment = 1 diff --git a/scenes/контроль/кассета-у-5-нв.tscn b/scenes/контроль/кассета-у-5-нв.tscn index dad7c79..011731b 100644 --- a/scenes/контроль/кассета-у-5-нв.tscn +++ b/scenes/контроль/кассета-у-5-нв.tscn @@ -31,7 +31,7 @@ offset_top = 32.0 offset_right = 55.0 offset_bottom = 182.0 fname = "ИП5-25" -rname = "A24" +rname = "A31" metadata/ip = "ip5_25" [node name="ref_A30" parent="." groups=["y-5"] instance=ExtResource("3_picsk")] @@ -40,7 +40,7 @@ offset_top = 32.0 offset_right = 105.0 offset_bottom = 182.0 fname = "ЯУ-07Б" -rname = "A30" +rname = "A37" metadata/y5 = "yau07" [node name="ref_A26" parent="." groups=["y-5"] instance=ExtResource("3_picsk")] @@ -49,7 +49,7 @@ offset_top = 32.0 offset_right = 155.0 offset_bottom = 182.0 fname = "ЭМС-Г" -rname = "A26" +rname = "A33" metadata/y5 = "ems" [node name="ref_A27" parent="." groups=["y-5"] instance=ExtResource("3_picsk")] @@ -58,7 +58,7 @@ offset_top = 32.0 offset_right = 205.0 offset_bottom = 182.0 fname = "УГ" -rname = "A27" +rname = "A34" metadata/y5 = "ug" [node name="ref_A28" parent="." groups=["y-5"] instance=ExtResource("3_picsk")] @@ -67,7 +67,7 @@ offset_top = 32.0 offset_right = 255.0 offset_bottom = 182.0 fname = "УКП" -rname = "A28" +rname = "A36" metadata/y5 = "ukp1" [node name="ref_A29" parent="." groups=["y-5"] instance=ExtResource("3_picsk")] @@ -76,5 +76,5 @@ offset_top = 32.0 offset_right = 304.0 offset_bottom = 182.0 fname = "УКП" -rname = "A29" +rname = "A35" metadata/y5 = "ukp2" From de86d281cacc61e59fc4233d456d0ec1853efb65 Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Sun, 16 Nov 2025 16:43:32 +0300 Subject: [PATCH 05/10] =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B0=20json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/prd.gd | 3 +- scripts/pribor-prd.gd | 1728 +++++++++++++++++++---------------------- 2 files changed, 783 insertions(+), 948 deletions(-) diff --git a/scripts/prd.gd b/scripts/prd.gd index 5e4f796..c1b56b0 100644 --- a/scripts/prd.gd +++ b/scripts/prd.gd @@ -285,8 +285,7 @@ func _ready() -> void: var unit_prd = network.get_unit_instance(prd_name) var new_prd = PRD.new(prd_name, unit_prd) prd_dict[prd_name] = new_prd - var control_pribor_prd = preload('res://scripts/pribor-prd.gd') - var unit_control = control_pribor_prd.TestPRD.new({'unit_prd': unit_prd}, new_prd.cmd_array) + var unit_control = TestPRD.new({'unit_prd': unit_prd}, new_prd.cmd_array) add_child(unit_control) new_prd.unit_control = unit_control for key in FS_PRD.keys(): diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index 3ba55b9..a92df2a 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -1,983 +1,819 @@ -class TestPRD extends Node: - const DEVICE_CONSTANT: Dictionary = { - 'PRD_N': { - CONSTANTS = { - 'POWER_UKP_1': 31, - 'POWER_UKP_2': 63, - 'DKM_BIT_2': 1, - 'DKM_BIT_3': 2, - 'BASE_ADDR_EMS_G': 0x120, - 'ADDR_UG_LITERA_1': 0x106, - 'ADDR_UG_LITERA_2': 0x108, - 'ADDR_UG_LITERA_3': 0x10A, - 'TEMP_THRESHOLD': 70, - 'POWER_THRESHOLD': 40, - 'RAY_DOU_NUM': 0x3, - 'ATT_UM_2': 0x2, - 'ATT_UM_3': 0x3, - 'POWER_UM': 100, - 'TIMER_DELAY': 10.0, - 'STATE_MASHINE_TIMER': 0.3, - }, - PRIBOR_CONFIG = { - '1н': {'angle': 0.0, 'sectors': [4, 8]}, - '2н': {'angle': 90.0, 'sectors': [7, 11]}, - '3н': {'angle': 180.0, 'sectors': [6, 10]}, - '4н': {'angle': 270.0, 'sectors': [5, 9]}, - }, - FS_PARAMS = { - 2: {'freq': 932.0, 'width': 100.0}, - 3: {'freq': 1157.0, 'width': 100.0} - }, - START_LITERA = 2 - }, - 'PRD_V': { - CONSTANTS = { - 'POWER_UKP_1': 31, - 'POWER_UKP_2': 63, - 'DKM_BIT_4': 3, - 'DKM_BIT_5': 4, - 'BASE_ADDR_EMS_G': 0x120, - 'ADDR_UG_LITERA_1': 0x106, - 'ADDR_UG_LITERA_2': 0x108, - 'ADDR_UG_LITERA_3': 0x10A, - 'TEMP_THRESHOLD': 70, - 'POWER_THRESHOLD': 40, - 'RAY_DOU_NUM': 0x3, - 'ATT_UM_4': 0x2, - 'ATT_UM_5': 0x3, - 'POWER_UM': 100, - 'TIMER_DELAY': 10.0, - 'STATE_MASHINE_TIMER': 0.3, - }, - PRIBOR_CONFIG = { - '1в': {'angle': 0.0, 'sectors': [12, 16]}, - '2в': {'angle': 90.0, 'sectors': [15, 19]}, - '3в': {'angle': 180.0, 'sectors': [14, 18]}, - '4в': {'angle': 270.0, 'sectors': [13, 17]}, - }, - FS_PARAMS = { - 4: {'freq': 1227.0, 'width': 100.0}, - 5: {'freq': 1575.0, 'width': 110.0}, - }, - START_LITERA = 4 - }, - 'PRD_K': { - CONSTANTS = { - 'POWER_UKP_1': 31, - 'POWER_UKP_2': 63, - 'DKM_BIT_1': 0, - 'DKM_BIT_6': 5, - 'DKM_BIT_7': 6, - 'BASE_ADDR_EMS_G': 0x120, - 'ADDR_UG_LITERA_1': 0x106, - 'ADDR_UG_LITERA_2': 0x108, - 'ADDR_UG_LITERA_3': 0x10A, - 'TEMP_THRESHOLD': 40, - 'POWER_THRESHOLD': 40, - 'RAY_DOU_NUM': 0x3, - 'ATT_UM_1': 0x0, - 'ATT_UM_6': 0x3, - 'ATT_UM_7': 0x2, - 'POWER_UM': 100, - 'TIMER_DELAY': 10.0, - 'STATE_MASHINE_TIMER': 0.3, - }, - PRIBOR_CONFIG = { # Конфигурация параметров для каждого прибора - '1к': {'angle': 0.0, 'sectors': [0, 20, 24]}, - '2к': {'angle': 90.0, 'sectors': [3, 23, 27]}, - '3к': {'angle': 180.0, 'sectors': [2, 22, 26]}, - '4к': {'angle': 270.0, 'sectors': [1, 21, 25]}, - }, - FS_PARAMS = { # Конфигурация частот и ширин для каждого ФС - 1: {'freq': 450.0, 'width': 80.0}, - 6: {'freq': 2450.0, 'width': 110.0}, - 7: {'freq': 4750.0, 'width': 110.0} - }, - START_LITERA = 1 - } +class_name TestPRD +extends Node +# Константы +const CONFIG_PATH = "user://config/setting_prd_control.json" + +const RAY_m5: String = "RAY_m5" +const RAY_5: String = "RAY_5" +const RAY_15: String = "RAY_15" +const RAY_25: String = "RAY_25" +const RAY_35: String = "RAY_35" +const RAY_45: String = "RAY_45" + +const RAY_TYPES := [RAY_m5, RAY_5, RAY_15, RAY_25, RAY_35, RAY_45] + +# Загруженные конфигурации +var config_data: Dictionary +var device_constants: Dictionary +var base_configs: Dictionary +var device_configs: Dictionary +var data_indices: Dictionary +var state_machine_enum: Dictionary +var fs_keys: Dictionary +var temperature_constants: Dictionary +var ems_input_bits_config: Dictionary +var fs_rules: Array + +var _ray_state_mapping: Dictionary +# Переменные класса +var constants: Dictionary +var pribor_config: Dictionary +var fs_parameters: Dictionary +var block_ip_config: Dictionary +var block_kasseta_y5_config: Dictionary +var control_results: Dictionary +var self_name: String +var state: int = 0 +var current_litera: int +var flag_write_isa: bool = false +var flag_fs_status_ok: bool = false +var flag_si_fs_input: bool = false +var flag_si_fs_output: bool = false +var unit_prd: Object +var power_result: Dictionary +var control_timer: Timer = Timer.new() +var ems_6666_timer: Timer = Timer.new() +var machine_timer: Timer = Timer.new() +var cc: int = 0 +var cmd_array: Array + +signal control_is_over() +signal update_progress(progress_value: float) +signal update_max_value_progress(max_progress_value: int) + +var progress_value: float: + set(v): + if progress_value != v: + progress_value = v + call_deferred('emit_signal', 'update_progress', v) + +var ecms: Dictionary +var power_for_litera: Dictionary + + +## Инициализация аргуметнов +func _init(init_data: Dictionary, cmd_array_from_prd: Array) -> void: + unit_prd = init_data['unit_prd'] + cmd_array = cmd_array_from_prd + _load_configuration() + _initialize_ray_mapping() + _initialize_power_structure() + + +func _initialize_power_structure() -> void: + power_for_litera = {} + for litera in range(1, 8): + power_for_litera[litera] = {} + for ray_type in RAY_TYPES: + power_for_litera[litera][ray_type] = [] + + +func _ready() -> void: + _determine_self_name() + initialize_connections() + setup_timer() + + +func _get_ray_key(machine_state: int) -> String: + return _ray_state_mapping.get(machine_state, "") + + +func _load_configuration() -> void: + var config_file = FileAccess.open(CONFIG_PATH, FileAccess.READ) + if config_file: + var json_text = config_file.get_as_text() + config_file.close() + + var json = JSON.new() + var parse_result = json.parse(json_text) + if parse_result == OK: + config_data = json.data + _parse_config_data() + else: + push_error("Failed to parse JSON config: " + json.get_error_message()) + else: + push_error("Failed to load config file: " + CONFIG_PATH) + + +func _parse_config_data() -> void: + device_constants = config_data.get("device_constants", {}) + base_configs = config_data.get("base_configs", {}) + device_configs = config_data.get("device_configs", {}) + data_indices = config_data.get("data_indices", {}) + state_machine_enum = config_data.get("state_machine", {}) + fs_keys = config_data.get("fs_keys", {}) + temperature_constants = config_data.get("temperature_constants", {}) + ems_input_bits_config = config_data.get("ems_input_bits_config", {}) + fs_rules = config_data.get("fs_rules", []) + + +func _initialize_ray_mapping() -> void: + _ray_state_mapping = { + state_machine_enum.get("UG_SET_RAY_0", 7): RAY_m5, + state_machine_enum.get("UG_SET_RAY_1", 8): RAY_5, + state_machine_enum.get("UG_SET_RAY_2", 9): RAY_15, + state_machine_enum.get("UG_SET_RAY_3", 10): RAY_25, + state_machine_enum.get("UG_SET_RAY_4", 11): RAY_35, + state_machine_enum.get("UG_SET_RAY_5", 12): RAY_45 } - var block_ip_config_n:= { - 'maa2000_1': [0, false], - 'maa2000_2': [1, false], - 'ip9_50_1': [2, false], - 'ip9_50_2': [3, false], - 'ip12_50_1': [4, false], - 'ip5_25': [7, false], + +func _process(_delta: float) -> void: + pass + + +## Пакеты от ЯУ-07 +func on_data_received(unit_pribor: Object) -> void: + var status: PackedByteArray = unit_pribor.status + socket_status_ems_g(status) + block_kasseta_y5_config = check_block_kasseta_y5(status, block_kasseta_y5_config) + block_ip_config = check_block_ip(status, block_ip_config) + + if machine_timer.is_stopped(): + return + + _process_dkm_status(status) + if current_litera != 0: + var tek_litera: Dictionary = power_for_litera[current_litera] + var interes = _get_ray_key(state) + if interes != '': + tek_litera[_get_ray_key(state)] = power_um_ukp(status, current_litera, tek_litera[_get_ray_key(state)]) + power_for_litera[current_litera] = tek_litera + +var ems_input_1: int +var ems_input_2: int +var ems_input_lit_1: int +var ems_output_1: int +var ems_output_2: int +var ems_output_lit_1: int + +# Методы для работы с DataIndices из JSON +func _get_data_index(key: String) -> int: + return data_indices.get(key, -1) + +func socket_status_ems_g(packet_form_yau_07: PackedByteArray) -> void: + if self_name in ['1н', '2н', '3н', '4н']: + ems_input_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 9)) != 0 + ems_input_2 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 10)) != 0 + if self_name in ['1в', '2в', '3в', '4в']: + ems_input_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 11)) != 0 + ems_input_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 12)) != 0 + if self_name in ['1к', '2к', '3к', '4к']: + ems_input_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 13)) != 0 + ems_input_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 14)) != 0 + ems_input_lit_1 = (packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) & (1 << 8)) != 0 + + ems_output_1 = (packet_form_yau_07.decode_u16(_get_data_index('OUT_BLANK_PRD')) & (1 << 4)) != 0 + ems_output_2 = (packet_form_yau_07.decode_u16(_get_data_index('OUT_BLANK_PRD')) & (1 << 5)) != 0 + ems_output_lit_1 = (packet_form_yau_07.decode_u16(_get_data_index('OUT_BLANK_PRD')) & (1 << 3)) != 0 + + var number_socket_input: int + if current_litera >= 1 and current_litera <= 7: + number_socket_input = current_litera + 7 + + var in_blank: int = packet_form_yau_07.decode_u16(_get_data_index('IN_BLANK_PRD')) + flag_si_fs_input = (in_blank & (1 << number_socket_input)) != 0 ## Флаг СИ от ФС входа в ЭМС-Г для текущей литеры + + var number_socket_output: int + number_socket_output = 4 if current_litera in [2, 4, 6] else 3 if current_litera == 1 else 5 + + var out_blank: int = packet_form_yau_07.decode_u16(_get_data_index('OUT_BLANK_PRD')) + flag_si_fs_output = (out_blank & (1 << number_socket_output)) != 0 ## Флаг Модуляции УМ ЭМС-Г для текущей литеры + + +## Пакеты от MP550Service +func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary) -> void: + var fs_key: String = fs_keys.get(str(current_litera), '') + if fs_key.is_empty(): + return + + var fs_result := {fs_key: 0} + fs_result = on_fs_state(packet_type_7, fs_mapping, fs_result, fs_rules) + control_results[fs_key] = fs_result[fs_key] + flag_fs_status_ok = control_results[fs_key] == 1 + +## +func state_control_machine() -> void: + match state: + state_machine_enum.INIT: + print("Start control for %s device %s litera" % [self_name, current_litera]) + _handle_init_state() + state_machine_enum.FS_TURN_ON: + _handle_fs_turn_on_state() + state = state_machine_enum.FS_WORK + state_machine_enum.FS_WORK: + var flag_ecm: bool = false + for key in ecms: + var params = ecms[key].params.freq + if fs_parameters[current_litera].freq == params: + var kni = ecms[key].kni + if pribor_config[self_name].angle == kni: + flag_ecm = true + if flag_ecm and flag_fs_status_ok: + ems_6666_timer.start() + _handle_fs_work_state() + state_machine_enum.CHEK_KASSETA_Y5: + if block_kasseta_y5_config['yau07']: + state = state_machine_enum.WRITE_ISA + state_machine_enum.WRITE_ISA: + if not flag_write_isa: + _handle_ug_set_state(0x6) + state = state_machine_enum.READ_ISA + state_machine_enum.READ_ISA: + if (unit_prd.cmd_state == unit_prd.CmdState.DONE) or (unit_prd.cmd_state == unit_prd.CmdState.FAIL): + _handle_read_isa(unit_prd, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3], cmd_array) + flag_write_isa = false + state = state_machine_enum.UG_SET_RAY + state_machine_enum.UG_SET_RAY: + var addr: int = constants.ADDR_UG_LITERA_1 + if current_litera == 3 or current_litera == 5 or current_litera == 7: + addr = constants.ADDR_UG_LITERA_2 + if unit_prd.isa_ports.has(addr) and (unit_prd.cmd_state == unit_prd.CmdState.DONE): + if unit_prd.isa_ports[addr] & 0x07 == 0: + state = state_machine_enum.UG_SET_RAY_1 + elif unit_prd.isa_ports[addr] & 0x07 == 1: + state = state_machine_enum.UG_SET_RAY_2 + elif unit_prd.isa_ports[addr] & 0x07 == 2: + state = state_machine_enum.UG_SET_RAY_3 + elif unit_prd.isa_ports[addr] & 0x07 == 3: + state = state_machine_enum.UG_SET_RAY_4 + elif unit_prd.isa_ports[addr] & 0x07 == 4: + state = state_machine_enum.UG_SET_RAY_5 + elif unit_prd.isa_ports[addr] & 0x07 == 5: + if not current_litera == 1: + control_results = check_dou_result(control_results, power_for_litera, self_name, current_litera, constants) + state = state_machine_enum.IN_EMS_STOP + elif unit_prd.isa_ports[addr] & 0x07 == 6: + state = state_machine_enum.UG_SET_RAY_0 + + state_machine_enum.UG_SET_RAY_0: + if flag_si_fs_input and not flag_write_isa: + control_timer.stop() + _handle_ug_set_state(0x0) + await get_tree().create_timer(0.5).timeout + state = state_machine_enum.READ_ISA + state_machine_enum.UG_SET_RAY_1: + if not flag_write_isa: + _handle_ug_set_state(0x1) + state = state_machine_enum.READ_ISA + state_machine_enum.UG_SET_RAY_2: + if not flag_write_isa: + _handle_ug_set_state(0x2) + state = state_machine_enum.READ_ISA + state_machine_enum.UG_SET_RAY_3: + if not flag_write_isa: + _handle_ug_set_state(0x3) + state = state_machine_enum.READ_ISA + state_machine_enum.UG_SET_RAY_4: + if not flag_write_isa: + _handle_ug_set_state(0x4) + state = state_machine_enum.READ_ISA + state_machine_enum.UG_SET_RAY_5: + if not flag_write_isa: + _handle_ug_set_state(0x5) + state = state_machine_enum.READ_ISA + state_machine_enum.IN_EMS_STOP: + ems_6666_timer.stop() + state = state_machine_enum.FS_TURN_OFF + state_machine_enum.FS_TURN_OFF: + ems_6666_timer.stop() + _handle_fs_turn_off_state() + state = state_machine_enum.STOP_CONTROL + state_machine_enum.STOP_CONTROL: + _handle_stop_control_state() + ## В машине состояний вызов изменения состояния прогресс бара контроля + progressbar_status() + + +## 'Выполняется инициализация ФС-%s' % current_litera +func _handle_init_state() -> void: + if current_litera in [1, 2, 3, 4, 5, 6, 7]: + if not ecms.size(): + state = state_machine_enum.FS_TURN_ON + else: + control_results = on_control_result(block_ip_config, control_results) + power_result = prep_power(power_for_litera, self_name) + emit_signal('control_is_over') + machine_timer.stop() + + +##'Выполняется включение ФС-%s' % current_litera +func _handle_fs_turn_on_state() -> void: + manage_fs(true, self_name, pribor_config, fs_parameters, current_litera, constants.POWER_UM) + control_timer.wait_time = constants.TIMER_DELAY + control_timer.start() + + +##'Выполняется проверка ФС-%s' % current_litera +func _handle_fs_work_state() -> void: + if (current_litera == 2 and control_results.fs_2) or \ + (current_litera == 3 and control_results.fs_3) or \ + (current_litera == 4 and control_results.fs_4) or \ + (current_litera == 5 and control_results.fs_5) or \ + (current_litera == 6 and control_results.fs_6) or \ + (current_litera == 7 and control_results.fs_7) or \ + (current_litera == 1 and control_results.fs_1): + state = state_machine_enum.CHEK_KASSETA_Y5 + + +func _handle_ug_set_state(RAY_DOU_NUM: int) -> void: + var dic_att := { + 'RAY_DOU_NUM': RAY_DOU_NUM, + 'ADDR_UG_LITERA_1': constants.ADDR_UG_LITERA_1, + 'ADDR_UG_LITERA_2': constants.ADDR_UG_LITERA_2, + 'ADDR_UG_LITERA_3': constants.ADDR_UG_LITERA_3, + 'ATT_UM_3': 0x00, + 'BASE_EMS_G': constants.BASE_ADDR_EMS_G } - var block_kasseta_y5_prd_config_n: = { - 'yau07': false, - 'ems': false, - 'ug': false, - 'ukp1': false, - 'ukp2': false, - } - - # Результаты контроля - var control_results_n: Dictionary = { - 'block_ip': false, # Проверка касет П1 и ИП МА2000 - 'temperature': true, # Проверка температур УМ - 'dkm_2': false, - 'dkm_3': false, - 'dou_2': false, - 'dou_3': false, - 'fs_2': 0, - 'fs_3': 0, - } - #### - var block_ip_config_v := { - 'maa2000_1': [0, false], - 'maa2000_2': [1, false], - 'ip9_50_1': [2, false], - 'ip9_50_2': [3, false], - 'ip12_50_1': [4, false], - 'ip5_25': [7, false], - } - var block_kasseta_y5_prd_config_v: = { - 'yau07': false, - 'ems': false, - 'ug': false, - 'ukp1': false, - 'ukp2': false, - } - var control_results_v: Dictionary = { - 'block_ip': false, # Проверка касет П1 и ИП МА2000 - 'temperature': true, # Проверка температур УМ - 'dkm_4': false, - 'dkm_5': false, - 'dou_4': false, - 'dou_5': false, - 'fs_4': 0, - 'fs_5': 0, - } - #### - var block_kasseta_y5_prd_config_k: = { - 'yau07': false, - 'ems': false, - 'ug': false, - 'ukp1': false, - 'ukp2': false, - } - var control_results_k: Dictionary = { - 'block_ip': false, # Проверка касет П1 и ИП МА2000 - 'temperature': true, - 'dkm_1': false, - 'dkm_6': false, - 'dkm_7': false, - 'dou_6': false, - 'dou_7': false, - 'fs_1': 0, - 'fs_6': 0, - 'fs_7': 0, - } - var block_ip_config_k := { - 'maa2000_1': [0, false], - 'maa2000_2': [1, false], - 'ip9_50_1': [2, false], - 'ip9_50_2': [3, false], - 'ip12_50_1': [4, false], - 'ip9_50_3': [5, false], - 'ip12_50_2': [6, false], - 'ip5_25': [7, false], - } - #### - - const RAY_m5:= 'RAY_m5' - const RAY_5:= 'RAY_5' - const RAY_15:= 'RAY_15' - const RAY_25:= 'RAY_25' - const RAY_35:= 'RAY_35' - const RAY_45:= 'RAY_45' - enum DataIndices { - STATUS_BOARD = 0, - IN_BLANK_PRD = 1, - IN_IMPULS_PRD = 7, - OUT_BLANK_PRD = 13, - OUT_IMPULS_PRD = 19, - DRY_CONTACT = 27, - DKM = 28, - POWER_UKP_1 = 31, - TEMPERATURE_UKP_1 = 47, - POWER_UKP_2 = 63, - TEMPERATURE_UKP_2 = 79, - } - - enum STATE_MACHINE { - INIT, - FS_TURN_ON, - FS_WORK, - WRITE_ISA, - READ_ISA, - CHEK_KASSETA_Y5, - UG_SET_RAY, - UG_SET_RAY_0, - UG_SET_RAY_1, - UG_SET_RAY_2, - UG_SET_RAY_3, - UG_SET_RAY_4, - UG_SET_RAY_5, - IN_EMS_RUN, - IN_EMS_STOP, - FS_TURN_OFF, - STOP_CONTROL, - AWAIT - } - const FS_KEYS := { - 1: 'fs_1', - 2: 'fs_2', - 3: 'fs_3', - 4: 'fs_4', - 5: 'fs_5', - 6: 'fs_6', - 7: 'fs_7' - } - const TEMPERATURE_CONSTANTS := { - 'CONST_MIN_TEMP': -25, - 'MAXIMUM_CODE_ADC': 3796, - 'MINIMUM_CODE_AD': 2660, - 'TEMPERATURE_UKP_1': 47, - 'TEMPERATURE_UKP_2': 79, - } - - var power_for_litera: Dictionary = { - 1: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],}, - 2: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],}, - 3: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],}, - 4: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],}, - 5: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],}, - 6: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],}, - 7: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],}, - } - var constants: Dictionary - var pribor_config: Dictionary - var fs_parameters: Dictionary - var block_ip_config: Dictionary - var block_kasseta_y5_config: Dictionary - var control_results: Dictionary - var self_name: String - var state: int = STATE_MACHINE.INIT - var current_litera: int - var flag_write_isa: bool = false - var flag_fs_status_ok: bool = false - var flag_si_fs_input: bool = false - var flag_si_fs_output: bool = false - var unit_prd: Object - var power_result: Dictionary - var control_timer: Timer = Timer.new() - var ems_6666_timer: Timer = Timer.new() - var machine_timer: Timer = Timer.new() - var cc: int = 0 - var cmd_array: Array - - signal control_is_over() - signal update_progress(progress_value: float) - signal update_max_value_progress(max_progress_value: int) - - var progress_value: float: - set(v): - if progress_value != v: - progress_value = v - call_deferred('emit_signal', 'update_progress', v) + if self_name == '1к' or self_name == '2к' or self_name == '3к' or self_name == '4к': + dic_att['ATT_UM_1'] = constants.ATT_UM_6 + dic_att['ATT_UM_2'] = constants.ATT_UM_7 + dic_att['ATT_UM_3'] = constants.ATT_UM_1 + elif self_name == '1в' or self_name == '2в' or self_name == '3в' or self_name == '4в': + dic_att['ATT_UM_1'] = constants.ATT_UM_4 + dic_att['ATT_UM_2'] = constants.ATT_UM_5 + elif self_name == '1н' or self_name == '2н' or self_name == '3н' or self_name == '4н': + dic_att['ATT_UM_1'] = constants.ATT_UM_2 + dic_att['ATT_UM_2'] = constants.ATT_UM_3 + flag_write_isa = on_ug_setting(unit_prd, dic_att, cmd_array) - var ecms: Dictionary ## Словарь помеховых воздействий - - ## Инициализация аргуметнов - func _init(init_data: Dictionary, cmd_array_from_prd: Array) -> void: - unit_prd = init_data['unit_prd'] - cmd_array = cmd_array_from_prd +## Таймер отправки команды в ЭМС-Г для модуляции +func _on_ems_6666_timer() -> void: + cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]]) - func _ready() -> void: - _determine_self_name() - initialize_connections() - setup_timer() +## Таймер вызова машины состояний +func on_state_mashine(): + state_control_machine() - func _process(_delta: float) -> void: +func progressbar_status() -> void: + match state: + state_machine_enum.INIT: + cc += 10 if current_litera in [3, 5, 6, 7] else 0 + if control_timer.get_time_left() > 0: + progress_value = cc + control_timer.get_wait_time() - control_timer.get_time_left() + if current_litera == 0: + progress_value = 0 + + +##'Выполняется отключение ФС-%s' % current_litera +func _handle_fs_turn_off_state() -> void: + flag_fs_status_ok = false + manage_fs(false, self_name, pribor_config, fs_parameters, current_litera, constants.POWER_UM) + + +##'Выполняется завершение проверки ФС-%s' % current_litera +func _handle_stop_control_state() -> void: + _advance_to_next_fs() + state = state_machine_enum.INIT + + +func _advance_to_next_fs() -> void: + match current_litera: + 1: current_litera = 6 + 2: current_litera = 3 + 3: current_litera = 0 + 4: current_litera = 5 + 5: current_litera = 0 + 6: current_litera = 7 + 7: current_litera = 0 + + +###################################### +func initialize_connections() -> void: + var fs_mapping = _create_fs_mapping(self_name) + signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state').bind(fs_mapping)) + signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_contol_device')) + interfer.connect('interfer_resized', Callable(self, 'on_interfer_resized')) + unit_prd.connect('data_received', Callable(self, 'on_data_received')) + + var mode_signals = ['режим_работа', 'режим_журнал', 'режим_эмс', 'режим_настройки'] + for signal_name in mode_signals: + signaller.connect(signal_name, Callable(self, 'on_mode_changed').bind(false)) + signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(true)) + + +func on_interfer_resized(ecms_dic: Dictionary) -> void: + ecms = ecms_dic + + +func _on_start_contol_device()-> void: + _determine_self_name() + machine_timer.wait_time = constants.STATE_MASHINE_TIMER + machine_timer.start() + + +func _determine_self_name() -> void: + cc = 0 + state = state_machine_enum.get("INIT", 0) + var current_unit = unit_prd.name + var parts = current_unit.split('-') + self_name = parts[-1] + + var device_type: String = _get_device_type() + if device_type.is_empty(): + return + + var device_config = device_constants.get(device_type, {}) + var device_data_config = device_configs.get(device_type, {}) + + # Загружаем конфигурацию устройства + constants = device_config.get("constants", {}) + pribor_config = device_config.get("pribor_config", {}) + + # Конвертируем fs_params ключи в int + var raw_fs_params = device_config.get("fs_params", {}) + fs_parameters = {} + for key in raw_fs_params: + fs_parameters[int(key)] = raw_fs_params[key] + + # Загружаем конфигурации блоков + block_ip_config = _load_block_config(device_data_config.get("block_ip", {}), "block_ip") + block_kasseta_y5_config = _load_block_config(device_data_config.get("block_kasseta", {}), "block_kasseta") + control_results = device_data_config.get("control_results", {}) + current_litera = device_config.get("start_litera", 0) + + progress_value = 0 + call_deferred('emit_signal', 'update_max_value_progress', device_config.get("progress_max", 20)) + + +func _load_block_config(config, config_type: String) -> Dictionary: + if config is String and config == "base": + return base_configs.get(config_type, {}).duplicate(true) + elif config is Dictionary: + return config.duplicate(true) + return {} + + +func _get_device_type() -> String: + if self_name.ends_with('н'): return 'PRD_N' + elif self_name.ends_with('в'): return 'PRD_V' + elif self_name.ends_with('к'): return 'PRD_K' + return '' + + +func setup_timer() -> void: + add_child(control_timer) + control_timer.timeout.connect(on_stop_control) + control_timer.one_shot = true + control_timer.wait_time = constants.get("TIMER_DELAY", 10.0) + + add_child(ems_6666_timer) + ems_6666_timer.timeout.connect(_on_ems_6666_timer) + ems_6666_timer.wait_time = 1.0 + + add_child(machine_timer) + machine_timer.connect('timeout', Callable(self, 'on_state_mashine')) + + +func on_mode_changed(in_tree: bool) -> void: + if not in_tree: ## TODO: Дополнительная проверка если контроль идет, если нет, то смысла вызывать нет + progress_value = 0 + machine_timer.stop() + state = state_machine_enum.INIT + _handle_fs_turn_off_state() + #prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]]) + else: pass - ## Пакеты от ЯУ-07 - func on_data_received(unit_pribor: Object) -> void: - var status: PackedByteArray = unit_pribor.status - socket_status_ems_g(status) - if machine_timer.is_stopped(): - return - - block_kasseta_y5_config = check_block_kasseta_y5(status, block_kasseta_y5_config) - block_ip_config = check_block_ip(status, block_ip_config) - - _process_dkm_status(status) - if current_litera != 0: - var tek_litera: Dictionary = power_for_litera[current_litera] - var interes = _get_ray_key(state) - if interes != '': - tek_litera[_get_ray_key(state)] = power_um_ukp(status, current_litera, tek_litera[_get_ray_key(state)]) - power_for_litera[current_litera] = tek_litera - - var ems_input_1: int - var ems_input_2: int - var ems_input_lit_1: int - var ems_output_1: int - var ems_output_2: int - var ems_output_lit_1: int - - func socket_status_ems_g(packet_form_yau_07: PackedByteArray) -> void: - if self_name in ['1н', '2н', '3н', '4н']: - ems_input_1 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 9)) != 0 - ems_input_2 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 10)) != 0 - if self_name in ['1в', '2в', '3в', '4в']: - ems_input_1 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 11)) != 0 - ems_input_1 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 12)) != 0 - if self_name in ['1к', '2к', '3к', '4к']: - ems_input_1 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 13)) != 0 - ems_input_1 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 14)) != 0 - ems_input_lit_1 = (packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) & (1 << 8)) != 0 - - ems_output_1 = (packet_form_yau_07.decode_u16(DataIndices.OUT_BLANK_PRD) & (1 << 4)) != 0 - ems_output_2 = (packet_form_yau_07.decode_u16(DataIndices.OUT_BLANK_PRD) & (1 << 5)) != 0 - ems_output_lit_1 = (packet_form_yau_07.decode_u16(DataIndices.OUT_BLANK_PRD) & (1 << 3)) != 0 - - var number_socket_input: int - if current_litera >= 1 and current_litera <= 7: - number_socket_input = current_litera + 7 - - var in_blank: int = packet_form_yau_07.decode_u16(DataIndices.IN_BLANK_PRD) - flag_si_fs_input = (in_blank & (1 << number_socket_input)) != 0 ## Флаг СИ от ФС входа в ЭМС-Г для текущей литеры - - var number_socket_output: int - number_socket_output = 4 if current_litera in [2, 4, 6] else 3 if current_litera == 1 else 5 - - var out_blank: int = packet_form_yau_07.decode_u16(DataIndices.OUT_BLANK_PRD) - flag_si_fs_output = (out_blank & (1 << number_socket_output)) != 0 ## Флаг Модуляции УМ ЭМС-Г для текущей литеры - - - ## Пакеты от MP550Service - func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary) -> void: - var fs_key: String = FS_KEYS.get(current_litera, '') - if fs_key.is_empty(): - return - - var fs_result := {fs_key: 0} - fs_result = on_fs_state(packet_type_7, fs_mapping, fs_result) - control_results[fs_key] = fs_result[fs_key] - flag_fs_status_ok = control_results[fs_key] == 1 - - ## - func state_control_machine() -> void: - match state: - STATE_MACHINE.INIT: - print("Start control for %s device %s litera" % [self_name, current_litera]) - _handle_init_state() - STATE_MACHINE.FS_TURN_ON: - _handle_fs_turn_on_state() - state = STATE_MACHINE.FS_WORK - STATE_MACHINE.FS_WORK: - var flag_ecm: bool = false - for key in ecms: - var params = ecms[key].params.freq - if fs_parameters[current_litera].freq == params: - var kni = ecms[key].kni - if pribor_config[self_name].angle == kni: - flag_ecm = true - if flag_ecm and flag_fs_status_ok: - ems_6666_timer.start() - _handle_fs_work_state() - STATE_MACHINE.CHEK_KASSETA_Y5: - if block_kasseta_y5_config['yau07']: - state = STATE_MACHINE.WRITE_ISA - STATE_MACHINE.WRITE_ISA: - if not flag_write_isa: - _handle_ug_set_state(0x6) - state = STATE_MACHINE.READ_ISA - STATE_MACHINE.READ_ISA: - if (unit_prd.cmd_state == unit_prd.CmdState.DONE) or (unit_prd.cmd_state == unit_prd.CmdState.FAIL): - _handle_read_isa(unit_prd, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3], cmd_array) - flag_write_isa = false - state = STATE_MACHINE.UG_SET_RAY - STATE_MACHINE.UG_SET_RAY: - var addr: int = constants.ADDR_UG_LITERA_1 - if current_litera == 3 or current_litera == 5 or current_litera == 7: - addr = constants.ADDR_UG_LITERA_2 - if unit_prd.isa_ports.has(addr) and (unit_prd.cmd_state == unit_prd.CmdState.DONE): - if unit_prd.isa_ports[addr] & 0x07 == 0: - state = STATE_MACHINE.UG_SET_RAY_1 - elif unit_prd.isa_ports[addr] & 0x07 == 1: - state = STATE_MACHINE.UG_SET_RAY_2 - elif unit_prd.isa_ports[addr] & 0x07 == 2: - state = STATE_MACHINE.UG_SET_RAY_3 - elif unit_prd.isa_ports[addr] & 0x07 == 3: - state = STATE_MACHINE.UG_SET_RAY_4 - elif unit_prd.isa_ports[addr] & 0x07 == 4: - state = STATE_MACHINE.UG_SET_RAY_5 - elif unit_prd.isa_ports[addr] & 0x07 == 5: - if not current_litera == 1: - control_results = check_dou_result(control_results, power_for_litera, self_name, current_litera, constants) - state = STATE_MACHINE.IN_EMS_STOP - elif unit_prd.isa_ports[addr] & 0x07 == 6: - state = STATE_MACHINE.UG_SET_RAY_0 - - STATE_MACHINE.UG_SET_RAY_0: - if flag_si_fs_input and not flag_write_isa: - control_timer.stop() - _handle_ug_set_state(0x0) - await get_tree().create_timer(0.5).timeout - state = STATE_MACHINE.READ_ISA - STATE_MACHINE.UG_SET_RAY_1: - if not flag_write_isa: - _handle_ug_set_state(0x1) - state = STATE_MACHINE.READ_ISA - STATE_MACHINE.UG_SET_RAY_2: - if not flag_write_isa: - _handle_ug_set_state(0x2) - state = STATE_MACHINE.READ_ISA - STATE_MACHINE.UG_SET_RAY_3: - if not flag_write_isa: - _handle_ug_set_state(0x3) - state = STATE_MACHINE.READ_ISA - STATE_MACHINE.UG_SET_RAY_4: - if not flag_write_isa: - _handle_ug_set_state(0x4) - state = STATE_MACHINE.READ_ISA - STATE_MACHINE.UG_SET_RAY_5: - if not flag_write_isa: - _handle_ug_set_state(0x5) - state = STATE_MACHINE.READ_ISA - STATE_MACHINE.IN_EMS_STOP: - ems_6666_timer.stop() - state = STATE_MACHINE.FS_TURN_OFF - STATE_MACHINE.FS_TURN_OFF: - ems_6666_timer.stop() - _handle_fs_turn_off_state() - state = STATE_MACHINE.STOP_CONTROL - STATE_MACHINE.STOP_CONTROL: - _handle_stop_control_state() - ## В машине состояний вызов изменения состояния контроля - progressbar_status() - - - ## 'Выполняется инициализация ФС-%s' % current_litera - func _handle_init_state() -> void: - if current_litera in [1, 2, 3, 4, 5, 6, 7]: - if not ecms.size(): - state = STATE_MACHINE.FS_TURN_ON - else: - control_results = on_control_result(block_ip_config, control_results) - power_result = prep_power(power_for_litera, self_name) - emit_signal('control_is_over') - machine_timer.stop() - - - ##'Выполняется включение ФС-%s' % current_litera - func _handle_fs_turn_on_state() -> void: - manage_fs(true, self_name, pribor_config, fs_parameters, current_litera, constants.POWER_UM) - control_timer.wait_time = constants.TIMER_DELAY - control_timer.start() - - - ##'Выполняется проверка ФС-%s' % current_litera - func _handle_fs_work_state() -> void: - if (current_litera == 2 and control_results.fs_2) or \ - (current_litera == 3 and control_results.fs_3) or \ - (current_litera == 4 and control_results.fs_4) or \ - (current_litera == 5 and control_results.fs_5) or \ - (current_litera == 6 and control_results.fs_6) or \ - (current_litera == 7 and control_results.fs_7) or \ - (current_litera == 1 and control_results.fs_1): - state = STATE_MACHINE.CHEK_KASSETA_Y5 - - - func _handle_ug_set_state(RAY_DOU_NUM: int) -> void: - var dic_att := { - 'RAY_DOU_NUM': RAY_DOU_NUM, - 'ADDR_UG_LITERA_1': constants.ADDR_UG_LITERA_1, - 'ADDR_UG_LITERA_2': constants.ADDR_UG_LITERA_2, - 'ADDR_UG_LITERA_3': constants.ADDR_UG_LITERA_3, - 'ATT_UM_3': 0x00, - 'BASE_EMS_G': constants.BASE_ADDR_EMS_G - } - if self_name == '1к' or self_name == '2к' or self_name == '3к' or self_name == '4к': - dic_att['ATT_UM_1'] = constants.ATT_UM_6 - dic_att['ATT_UM_2'] = constants.ATT_UM_7 - dic_att['ATT_UM_3'] = constants.ATT_UM_1 - elif self_name == '1в' or self_name == '2в' or self_name == '3в' or self_name == '4в': - dic_att['ATT_UM_1'] = constants.ATT_UM_4 - dic_att['ATT_UM_2'] = constants.ATT_UM_5 - elif self_name == '1н' or self_name == '2н' or self_name == '3н' or self_name == '4н': - dic_att['ATT_UM_1'] = constants.ATT_UM_2 - dic_att['ATT_UM_2'] = constants.ATT_UM_3 - flag_write_isa = on_ug_setting(unit_prd, dic_att, cmd_array) - - - ## Таймер отправки команды в ЭМС-Г для модуляции - func _on_ems_6666_timer() -> void: - cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]]) - - - ## Таймер вызова машины состояний - func on_state_mashine(): - state_control_machine() - - - func progressbar_status() -> void: - match state: - STATE_MACHINE.INIT: - cc += 10 if current_litera in [3, 5, 6, 7] else 0 - if control_timer.get_time_left() > 0: - progress_value = cc + control_timer.get_wait_time() - control_timer.get_time_left() - if current_litera == 0: - progress_value = 0 - - - ##'Выполняется отключение ФС-%s' % current_litera - func _handle_fs_turn_off_state() -> void: - flag_fs_status_ok = false - manage_fs(false, self_name, pribor_config, fs_parameters, current_litera, constants.POWER_UM) - - - ##'Выполняется завершение проверки ФС-%s' % current_litera - func _handle_stop_control_state() -> void: - _advance_to_next_fs() - state = STATE_MACHINE.INIT - - - func _advance_to_next_fs() -> void: - match current_litera: - 1: current_litera = 6 - 2: current_litera = 3 - 3: current_litera = 0 - 4: current_litera = 5 - 5: current_litera = 0 - 6: current_litera = 7 - 7: current_litera = 0 - - - ###################################### - func initialize_connections() -> void: - var fs_mapping = _create_fs_mapping(self_name) - signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state').bind(fs_mapping)) - signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_contol_device')) - interfer.connect('interfer_resized', Callable(self, 'on_interfer_resized')) - unit_prd.connect('data_received', Callable(self, 'on_data_received')) - signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_журнал', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_эмс', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_настройки', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(true)) - - - func on_interfer_resized(ecms_dic: Dictionary) -> void: - ecms = ecms_dic - - - func _on_start_contol_device()-> void: - _determine_self_name() - machine_timer.wait_time = constants.STATE_MASHINE_TIMER - machine_timer.start() - - - func _determine_self_name() -> void: - cc = 0 - state = STATE_MACHINE.INIT - var current_unit = unit_prd.name - var parts = current_unit.split('-') - self_name = parts[-1] - if self_name == '1н' or self_name == '2н' or self_name == '3н' or self_name == '4н': - progress_value = 0 - call_deferred('emit_signal', 'update_max_value_progress', 20) - constants = DEVICE_CONSTANT.PRD_N.CONSTANTS - pribor_config = DEVICE_CONSTANT.PRD_N.PRIBOR_CONFIG - fs_parameters = DEVICE_CONSTANT.PRD_N.FS_PARAMS - block_ip_config = block_ip_config_n - block_kasseta_y5_config = block_kasseta_y5_prd_config_n - control_results = control_results_n - current_litera = DEVICE_CONSTANT.PRD_N.START_LITERA - if self_name == '1в' or self_name == '2в' or self_name == '3в' or self_name == '4в': - progress_value = 0 - call_deferred('emit_signal', 'update_max_value_progress', 20) - constants = DEVICE_CONSTANT.PRD_V.CONSTANTS - pribor_config = DEVICE_CONSTANT.PRD_V.PRIBOR_CONFIG - fs_parameters = DEVICE_CONSTANT.PRD_V.FS_PARAMS - block_ip_config = block_ip_config_v - block_kasseta_y5_config = block_kasseta_y5_prd_config_v - control_results = control_results_v - current_litera = DEVICE_CONSTANT.PRD_V.START_LITERA - if self_name == '1к' or self_name == '2к' or self_name == '3к' or self_name == '4к': - progress_value = 0 - call_deferred('emit_signal', 'update_max_value_progress', 30) - constants = DEVICE_CONSTANT.PRD_K.CONSTANTS - pribor_config = DEVICE_CONSTANT.PRD_K.PRIBOR_CONFIG - fs_parameters = DEVICE_CONSTANT.PRD_K.FS_PARAMS - block_ip_config = block_ip_config_k - block_kasseta_y5_config = block_kasseta_y5_prd_config_n - control_results = control_results_k - current_litera = DEVICE_CONSTANT.PRD_K.START_LITERA - - - func setup_timer() -> void: - add_child(control_timer) - control_timer.timeout.connect(on_stop_control) - control_timer.one_shot = true - control_timer.wait_time = constants.TIMER_DELAY - - add_child(ems_6666_timer) - ems_6666_timer.timeout.connect(_on_ems_6666_timer) - ems_6666_timer.wait_time = 1.0 - - add_child(machine_timer) - machine_timer.connect('timeout', Callable(self, 'on_state_mashine')) - - - func on_mode_changed(in_tree: bool) -> void: - if not in_tree: ## TODO: Дополнительная проверка если контроль идет, если нет, то смысла вызывать нет - progress_value = 0 - machine_timer.stop() - state = STATE_MACHINE.INIT - _handle_fs_turn_off_state() - #prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]]) - else: - pass - - - func _process_dkm_status(status: PackedByteArray) -> void: - if not control_results.has(_get_current_fs_key()): - return - var dkm_bit = _get_dkm_bit_for_current_fs(current_litera, constants) - if dkm_bit == 0: - control_results['dkm_1'] = check_dkm(status, dkm_bit) - - var addr: int = constants.ADDR_UG_LITERA_1 - if current_litera == 3 or current_litera == 5 or current_litera == 7: - addr = constants.ADDR_UG_LITERA_2 - if not unit_prd.isa_ports.has(addr) or not (unit_prd.cmd_state == unit_prd.CmdState.DONE): - return - if not unit_prd.isa_ports[addr] & 0x07 == 6: return - - if dkm_bit == 1: - control_results['dkm_2'] = check_dkm(status, dkm_bit) - elif dkm_bit == 2: - control_results['dkm_3'] = check_dkm(status, dkm_bit) - elif dkm_bit == 3: - control_results['dkm_4'] = check_dkm(status, dkm_bit) - elif dkm_bit == 4: - control_results['dkm_5'] = check_dkm(status, dkm_bit) - elif dkm_bit == 5: - control_results['dkm_6'] = check_dkm(status, dkm_bit) - elif dkm_bit == 6: - control_results['dkm_7'] = check_dkm(status, dkm_bit) - - - func _get_current_fs_key() -> String: - return FS_KEYS.get(current_litera, '') - - - static func _get_dkm_bit_for_current_fs(litera: int, constants_dic: Dictionary) -> int: - match litera: - 1: return constants_dic.DKM_BIT_1 - 2: return constants_dic.DKM_BIT_2 - 3: return constants_dic.DKM_BIT_3 - 4: return constants_dic.DKM_BIT_4 - 5: return constants_dic.DKM_BIT_5 - 6: return constants_dic.DKM_BIT_6 - 7: return constants_dic.DKM_BIT_7 - _: return -1 - - - static func _get_ray_key(machine_state: int) -> String: - match machine_state: - STATE_MACHINE.UG_SET_RAY_0: return RAY_m5 - STATE_MACHINE.UG_SET_RAY_1: return RAY_5 - STATE_MACHINE.UG_SET_RAY_2: return RAY_15 - STATE_MACHINE.UG_SET_RAY_3: return RAY_25 - STATE_MACHINE.UG_SET_RAY_4: return RAY_35 - STATE_MACHINE.UG_SET_RAY_5: return RAY_45 - _: return '' - - - func on_stop_control() -> void: - _handle_fs_turn_off_state() - state = STATE_MACHINE.FS_TURN_OFF - - - static func on_control_result(ip_config: Dictionary, ctrl_results: Dictionary) -> Dictionary: - var all_blocks_ip_ok = true - - for block in ip_config: - if not ip_config[block][1]: - all_blocks_ip_ok = false - ctrl_results['block_ip'] = all_blocks_ip_ok - return ctrl_results - - - ## Установка угла и аттенюации для УМ - static func on_ug_setting(prd_unit: Object, settings_ug: Dictionary, prd_cmd_array: Array) -> bool: - var result_1 = ((settings_ug.ATT_UM_1 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07) - var result_2 = ((settings_ug.ATT_UM_2 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07) - prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [ settings_ug.ADDR_UG_LITERA_1, result_1, - settings_ug.ADDR_UG_LITERA_2, result_2, - settings_ug.ADDR_UG_LITERA_3, settings_ug.ATT_UM_3, - ] +func _process_dkm_status(status: PackedByteArray) -> void: + if not control_results.has(_get_current_fs_key()): + return + var dkm_bit = _get_dkm_bit_for_current_fs(current_litera, constants) + if dkm_bit == 0: + control_results['dkm_1'] = check_dkm(status, dkm_bit) + + var addr: int = constants.ADDR_UG_LITERA_1 + if current_litera == 3 or current_litera == 5 or current_litera == 7: + addr = constants.ADDR_UG_LITERA_2 + if not unit_prd.isa_ports.has(addr) or not (unit_prd.cmd_state == unit_prd.CmdState.DONE): + return + if not unit_prd.isa_ports[addr] & 0x07 == 6: return + + if dkm_bit == 1: + control_results['dkm_2'] = check_dkm(status, dkm_bit) + elif dkm_bit == 2: + control_results['dkm_3'] = check_dkm(status, dkm_bit) + elif dkm_bit == 3: + control_results['dkm_4'] = check_dkm(status, dkm_bit) + elif dkm_bit == 4: + control_results['dkm_5'] = check_dkm(status, dkm_bit) + elif dkm_bit == 5: + control_results['dkm_6'] = check_dkm(status, dkm_bit) + elif dkm_bit == 6: + control_results['dkm_7'] = check_dkm(status, dkm_bit) + + +func _get_current_fs_key() -> String: + return fs_keys.get(str(current_litera), '') + + +static func _get_dkm_bit_for_current_fs(litera: int, constants_dic: Dictionary) -> int: + match litera: + 1: return constants_dic.DKM_BIT_1 + 2: return constants_dic.DKM_BIT_2 + 3: return constants_dic.DKM_BIT_3 + 4: return constants_dic.DKM_BIT_4 + 5: return constants_dic.DKM_BIT_5 + 6: return constants_dic.DKM_BIT_6 + 7: return constants_dic.DKM_BIT_7 + _: return -1 + + +func on_stop_control() -> void: + _handle_fs_turn_off_state() + state = state_machine_enum.FS_TURN_OFF + + +static func on_control_result(ip_config: Dictionary, ctrl_results: Dictionary) -> Dictionary: + var all_blocks_ip_ok = true + + for block in ip_config: + if not ip_config[block][1]: + all_blocks_ip_ok = false + ctrl_results['block_ip'] = all_blocks_ip_ok + return ctrl_results + + +## Установка угла и аттенюации для УМ +static func on_ug_setting(prd_unit: Object, settings_ug: Dictionary, prd_cmd_array: Array) -> bool: + var result_1 = ((settings_ug.ATT_UM_1 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07) + var result_2 = ((settings_ug.ATT_UM_2 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07) + prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [ settings_ug.ADDR_UG_LITERA_1, result_1, + settings_ug.ADDR_UG_LITERA_2, result_2, + settings_ug.ADDR_UG_LITERA_3, settings_ug.ATT_UM_3, + ] + ]) + return true + + +static func _handle_read_isa(prd_unit: Object, read_isa_ports: Array, prd_cmd_array) -> void: + prd_cmd_array.append([prd_unit.CmdCode.READ_ISA, read_isa_ports]) + + +## Управаление модулем фс (включить/отключить излучение) +static func manage_fs(mode: bool, pribor: String, p_conf: Dictionary, fs_params: Dictionary, litera: int, power_um: int) -> void: + # Получаем конфигурацию для текущего прибора + var config: Dictionary = p_conf[pribor] + var angle: float = config.angle + var sectors: Array = config.sectors + + # Формируем выходные данные + var interfer_name: String = 'k1' if mode else 'off' + var fs_arr: Array = [] + + if litera in fs_params: + var params = fs_params[litera] + fs_arr.append([ + angle, + params.freq, + params.width, + sectors[litera - 1] if litera == 1 else sectors[litera - 5] if litera > 5 else sectors[litera - 4] if litera > 3 else sectors[litera - 2] ]) - return true + #signaller.emit_signal('emit_changed', mode) + signaller.emit_signal('interfer_init', interfer_name, fs_arr, power_um) - static func _handle_read_isa(prd_unit: Object, read_isa_ports: Array, prd_cmd_array) -> void: - prd_cmd_array.append([prd_unit.CmdCode.READ_ISA, read_isa_ports]) +## Проверка касет П1 и ИП МА2000 +static func check_block_ip(status_prd: PackedByteArray, ip_config: Dictionary) -> Dictionary: + # Конфигурация проверяемых блоков + var byte_dry: int = 27 + var ug_valid: bool = (status_prd[0] >> 1) & 1 + for block in ip_config: + var bit: int = ip_config[block][0] + if ug_valid: + var status = status_prd[byte_dry] >> bit & 1 + ip_config[block][1] = false if status else true + return ip_config - ## Управаление модулем фс (включить/отключить излучение) - static func manage_fs(mode: bool, pribor: String, p_conf: Dictionary, fs_params: Dictionary, litera: int, power_um: int) -> void: - # Получаем конфигурацию для текущего прибора - var config: Dictionary = p_conf[pribor] - var angle: float = config.angle - var sectors: Array = config.sectors - - # Формируем выходные данные - var interfer_name: String = 'k1' if mode else 'off' - var fs_arr: Array = [] - - if litera in fs_params: - var params = fs_params[litera] - fs_arr.append([ - angle, - params.freq, - params.width, - sectors[litera - 1] if litera == 1 else sectors[litera - 5] if litera > 5 else sectors[litera - 4] if litera > 3 else sectors[litera - 2] - ]) - #signaller.emit_signal('emit_changed', mode) - signaller.emit_signal('interfer_init', interfer_name, fs_arr, power_um) +## Проверка кассеты у-5 (ЯУ-07Б, ЭМС-Г, УГ, УКП-1, УКП-2) +static func check_block_kasseta_y5(status_prd: PackedByteArray, y5_config: Dictionary) -> Dictionary: + y5_config.yau07 = true + y5_config.ems = (status_prd[0] & 1) and ((status_prd[0] >> 4) & 1) + y5_config.ug = (status_prd[0] >> 1) & 1 + y5_config.ukp1 = (status_prd[0] >> 2) & 1 + y5_config.ukp2 = (status_prd[0] >> 3) & 1 + return y5_config - ## Проверка касет П1 и ИП МА2000 - static func check_block_ip(status_prd: PackedByteArray, ip_config: Dictionary) -> Dictionary: - # Конфигурация проверяемых блоков - var byte_dry: int = 27 - var ug_valid: bool = (status_prd[0] >> 1) & 1 - for block in ip_config: - var bit: int = ip_config[block][0] +## Мониторинг температуры +static func check_temperature(status_prd: PackedByteArray, y5_config: Dictionary) -> Dictionary: + y5_config.yau07 = true + y5_config.ems = (status_prd[0] & 1) and ((status_prd[0] >> 4) & 1) + y5_config.ug = (status_prd[0] >> 1) & 1 + y5_config.ukp1 = (status_prd[0] >> 2) & 1 + y5_config.ukp2 = (status_prd[0] >> 3) & 1 + return y5_config + + +## Проверка ДКМ +static func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> bool: + var dkm: int = 28 + var status_dkm: bool = status_prd[dkm] >> bit_dkm & 1 + return status_dkm + + +## +static func _create_fs_mapping(s_name: String) -> Dictionary: + var suffixes: Dictionary = { + 0: '1к', 1: '4к', 2: '3к', 3: '2к', + 4: '1н', 5: '4н', 6: '3н', 7: '2н', + 8: '1н', 9: '4н', 10: '3н', 11: '2н', + 12: '1в', 13: '4в', 14: '3в', 15: '2в', + 16: '1в', 17: '4в', 18: '3в', 19: '2в', + 20: '1к', 21: '4к', 22: '3к', 23: '2к', + 24: '1к', 25: '4к', 26: '3к', 27: '2к', + } + + var mapping: Dictionary = {} + for fs_num in suffixes: + mapping[fs_num] = {'condition': s_name == suffixes[fs_num]} + return mapping + + +## +static func on_fs_state(packet_type_7: Dictionary, fs_mapping: Dictionary, fs_results: Dictionary, fs_rules_config: Array) -> Dictionary: + var updated_results := fs_results.duplicate() + for fs_num in packet_type_7: + if not (fs_num in fs_mapping and fs_mapping[fs_num]['condition']): + continue + var fs_data = packet_type_7[fs_num] + for rule in fs_rules_config: + if _should_apply_rule(fs_num, rule, updated_results): + updated_results[rule.key] = fs_data.isg + break + return updated_results + + +## Вспомогательная функция для проверки применения правила +static func _should_apply_rule(fs_num: int, rule: Dictionary, results: Dictionary) -> bool: + return bool(fs_num >= rule.min and fs_num < rule.max) and results.has(rule.key) + + +## +static func power_um_ukp(status: PackedByteArray, litera: int, pwr_result: Array) -> Array: + const Constants: Dictionary = {'POWER_UKP_1' : 31, 'POWER_UKP_2': 63} + var power_values: Array = [] + var base_offset = 0 + var iteration: int = 6 + var ug_valid: bool = (status[0] >> 2) & 1 + + match litera: + 1: + # Обработка для current_fs = 1 (одно значение) + var value = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7) if ug_valid: - var status = status_prd[byte_dry] >> bit & 1 - ip_config[block][1] = false if status else true - return ip_config + power_values = [value] + 2: + # Обработка для current_fs = 2 (6 значений из УКП1) + base_offset = Constants.POWER_UKP_1 + if ug_valid: + for i in iteration: + power_values.append(status.decode_u16(base_offset + 2 * i)) + 3: + # Обработка для current_fs = 3 (6 значений из УКП2) + base_offset = Constants.POWER_UKP_2 + if ug_valid: + for i in iteration: + power_values.append(status.decode_u16(base_offset + 2 * i)) + 4: + # Обработка для current_fs = 4 (6 значений из УКП1) + base_offset = Constants.POWER_UKP_1 + if ug_valid: + for i in iteration: + power_values.append(status.decode_u16(base_offset + 2 * i)) + 5: + # Обработка для current_fs = 5 (6 значений из УКП2) + base_offset = Constants.POWER_UKP_2 + if ug_valid: + for i in iteration: + power_values.append(status.decode_u16(base_offset + 2 * i)) + 6: + # Обработка для current_fs = 6 (6 значений из УКП1) + base_offset = Constants.POWER_UKP_1 + if ug_valid: + for i in iteration: + power_values.append(status.decode_u16(base_offset + 2 * i)) + 7: + # Обработка для current_fs = 7 (6 значений из УКП2) + base_offset = Constants.POWER_UKP_2 + if ug_valid: + for i in iteration: + power_values.append(status.decode_u16(base_offset + 2 * i)) + + power_values = update_max_power_values(power_values, pwr_result) + return power_values - ## Проверка кассеты у-5 (ЯУ-07Б, ЭМС-Г, УГ, УКП-1, УКП-2) - static func check_block_kasseta_y5(status_prd: PackedByteArray, y5_config: Dictionary) -> Dictionary: - y5_config.yau07 = true - y5_config.ems = (status_prd[0] & 1) and ((status_prd[0] >> 4) & 1) - y5_config.ug = (status_prd[0] >> 1) & 1 - y5_config.ukp1 = (status_prd[0] >> 2) & 1 - y5_config.ukp2 = (status_prd[0] >> 3) & 1 - return y5_config - - - ## Проверка ДКМ - static func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> bool: - var dkm: int = 28 - var status_dkm: bool = status_prd[dkm] >> bit_dkm & 1 - return status_dkm - - - ## - static func _create_fs_mapping(s_name: String) -> Dictionary: - var suffixes: Dictionary = { - 0: '1к', 1: '4к', 2: '3к', 3: '2к', - 4: '1н', 5: '4н', 6: '3н', 7: '2н', - 8: '1н', 9: '4н', 10: '3н', 11: '2н', - 12: '1в', 13: '4в', 14: '3в', 15: '2в', - 16: '1в', 17: '4в', 18: '3в', 19: '2в', - 20: '1к', 21: '4к', 22: '3к', 23: '2к', - 24: '1к', 25: '4к', 26: '3к', 27: '2к', - } - - var mapping: Dictionary = {} - for fs_num in suffixes: - mapping[fs_num] = {'condition': s_name == suffixes[fs_num]} - return mapping - - - ## - static func on_fs_state(packet_type_7: Dictionary, fs_mapping: Dictionary, fs_results: Dictionary) -> Dictionary: - var FS_RULES = [ - {'key': 'fs_1', 'min': 0, 'max': 4}, - {'key': 'fs_2', 'min': 4, 'max': 8}, - {'key': 'fs_3', 'min': 8, 'max': 12}, - {'key': 'fs_4', 'min': 12, 'max': 16}, - {'key': 'fs_5', 'min': 16, 'max': 20}, - {'key': 'fs_6', 'min': 20, 'max': 24}, - {'key': 'fs_7', 'min': 24, 'max': 27} - ] - - var updated_results := fs_results.duplicate() - for fs_num in packet_type_7: - if not (fs_num in fs_mapping and fs_mapping[fs_num]['condition']): - continue - var fs_data = packet_type_7[fs_num] - for rule_key in FS_RULES.size(): - var rule: Dictionary = FS_RULES[rule_key] - if _should_apply_rule(fs_num, rule, updated_results): - updated_results[rule.key] = fs_data.isg - break - return updated_results - - - ## Вспомогательная функция для проверки применения правила - static func _should_apply_rule(fs_num: int, rule: Dictionary, results: Dictionary) -> bool: - return bool(fs_num >= rule.min and fs_num < rule.max) and results.has(rule.key) - - - ## - static func power_um_ukp(status: PackedByteArray, litera: int, pwr_result: Array) -> Array: - const Constants: Dictionary = {'POWER_UKP_1' : 31, 'POWER_UKP_2': 63} - var power_values: Array = [] - var base_offset = 0 - var iteration: int = 6 - var ug_valid: bool = (status[0] >> 2) & 1 - - match litera: - 1: - # Обработка для current_fs = 1 (одно значение) - var value = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7) - if ug_valid: - power_values = [value] - 2: - # Обработка для current_fs = 2 (6 значений из УКП1) - base_offset = Constants.POWER_UKP_1 - if ug_valid: - for i in iteration: - power_values.append(status.decode_u16(base_offset + 2 * i)) - 3: - # Обработка для current_fs = 3 (6 значений из УКП2) - base_offset = Constants.POWER_UKP_2 - if ug_valid: - for i in iteration: - power_values.append(status.decode_u16(base_offset + 2 * i)) - 4: - # Обработка для current_fs = 4 (6 значений из УКП1) - base_offset = Constants.POWER_UKP_1 - if ug_valid: - for i in iteration: - power_values.append(status.decode_u16(base_offset + 2 * i)) - 5: - # Обработка для current_fs = 5 (6 значений из УКП2) - base_offset = Constants.POWER_UKP_2 - if ug_valid: - for i in iteration: - power_values.append(status.decode_u16(base_offset + 2 * i)) - 6: - # Обработка для current_fs = 6 (6 значений из УКП1) - base_offset = Constants.POWER_UKP_1 - if ug_valid: - for i in iteration: - power_values.append(status.decode_u16(base_offset + 2 * i)) - 7: - # Обработка для current_fs = 7 (6 значений из УКП2) - base_offset = Constants.POWER_UKP_2 - if ug_valid: - for i in iteration: - power_values.append(status.decode_u16(base_offset + 2 * i)) - - power_values = update_max_power_values(power_values, pwr_result) - return power_values - - - ## Обновление максимальных значений - static func update_max_power_values(power_data: Array, max_power_values: Array) -> Array: - if power_data.size() != 6: - if max_power_values.is_empty(): - max_power_values = power_data.duplicate() - elif power_data[0] > max_power_values[0]: - max_power_values = power_data.duplicate() - return max_power_values - +## Обновление максимальных значений +static func update_max_power_values(power_data: Array, max_power_values: Array) -> Array: + if power_data.size() != 6: if max_power_values.is_empty(): max_power_values = power_data.duplicate() - else: - for i in 6: - if power_data[i] > max_power_values[i]: - max_power_values[i] = power_data[i] + elif power_data[0] > max_power_values[0]: + max_power_values = power_data.duplicate() + return max_power_values - return max_power_values.duplicate() + if max_power_values.is_empty(): + max_power_values = power_data.duplicate() + else: + for i in 6: + if power_data[i] > max_power_values[i]: + max_power_values[i] = power_data[i] + + return max_power_values.duplicate() - static func check_dou_result(control_dic: Dictionary, power_dic: Dictionary, pribor: String, litera: int, cnst: Dictionary) -> Dictionary: - var all_dou_ok = true - var dou: String = 'dou_2' if litera == 2 else 'dou_3' - if pribor == '1к' or pribor == '2к' or pribor == '3к' or pribor == '4к': - dou = 'dou_6' if litera == 6 else 'dou_7' - elif pribor == '1в' or pribor == '2в' or pribor == '3в' or pribor == '4в': - dou = 'dou_4' if litera == 4 else 'dou_5' - - var ray_dic: Dictionary = power_dic[litera] - if ray_dic[RAY_m5].size() == 0 or \ - ray_dic[RAY_5 ].size() == 0 or \ - ray_dic[RAY_15].size() == 0 or \ - ray_dic[RAY_25].size() == 0 or \ - ray_dic[RAY_35].size() == 0 or \ - ray_dic[RAY_45].size() == 0: - control_dic[dou] = false - return control_dic - - for i_pow_arr in ray_dic.values(): - for i_pow in i_pow_arr.size(): - if i_pow_arr[i_pow] < cnst.POWER_THRESHOLD: - all_dou_ok = false - - control_dic[dou] = all_dou_ok +static func check_dou_result(control_dic: Dictionary, power_dic: Dictionary, pribor: String, litera: int, cnst: Dictionary) -> Dictionary: + var all_dou_ok = true + var dou: String = 'dou_2' if litera == 2 else 'dou_3' + if pribor == '1к' or pribor == '2к' or pribor == '3к' or pribor == '4к': + dou = 'dou_6' if litera == 6 else 'dou_7' + elif pribor == '1в' or pribor == '2в' or pribor == '3в' or pribor == '4в': + dou = 'dou_4' if litera == 4 else 'dou_5' + var ray_dic: Dictionary = power_dic[litera] + if ray_dic[RAY_m5].size() == 0 or \ + ray_dic[RAY_5 ].size() == 0 or \ + ray_dic[RAY_15].size() == 0 or \ + ray_dic[RAY_25].size() == 0 or \ + ray_dic[RAY_35].size() == 0 or \ + ray_dic[RAY_45].size() == 0: + control_dic[dou] = false return control_dic + for i_pow_arr in ray_dic.values(): + for i_pow in i_pow_arr.size(): + if i_pow_arr[i_pow] < cnst.POWER_THRESHOLD: + all_dou_ok = false - static func prep_power(power_dic: Dictionary, prd_name: String)-> Dictionary: - const RAY_KEYS := ["RAY_m5", "RAY_5", "RAY_15", "RAY_25", "RAY_35", "RAY_45"] - var prep_pow_dic: Dictionary = {} + control_dic[dou] = all_dou_ok - var arr_litera: Array[int] - match prd_name: - '1н', '2н', '3н', '4н': - arr_litera = [2, 3] - '1в', '2в', '3в', '4в': - arr_litera = [4, 5] - '1к', '2к', '3к', '4к': - arr_litera = [6, 7, 1] + return control_dic - if not arr_litera: - print_debug('Ошибка в prd_name') - return prep_pow_dic - var um_names: Array[Array] = [] - if arr_litera.size() != 3: - um_names = [ - ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'], - ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] - ] - else: - um_names = [ - ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'], - ['um_8', 'um_9', 'um_10', 'um_11', 'um_12', 'um_13'], - ['um_7'] # Особый случай для третьего элемента - ] +static func prep_power(power_dic: Dictionary, prd_name: String)-> Dictionary: + const RAY_KEYS := ["RAY_m5", "RAY_5", "RAY_15", "RAY_25", "RAY_35", "RAY_45"] + var prep_pow_dic: Dictionary = {} - for litera_index in arr_litera.size(): - var litera: int = arr_litera[litera_index] - var litera_data: Dictionary = power_dic.get(litera, {}) - var um_data: Array[Array] = [[], [], [], [], [], []] + var arr_litera: Array[int] + match prd_name: + '1н', '2н', '3н', '4н': + arr_litera = [2, 3] + '1в', '2в', '3в', '4в': + arr_litera = [4, 5] + '1к', '2к', '3к', '4к': + arr_litera = [6, 7, 1] - for i in range(RAY_KEYS.size()): - var ray_key: String = RAY_KEYS[i] - var ray_array: Array = litera_data.get(ray_key, []) - - if ray_array.size() == 1: - var single_value = ray_array[0] - for j in range(6): - um_data[j].append(single_value) - else: - for j in range(6): - um_data[j].append(ray_array[j] if j < ray_array.size() else 0) - - var current_um_names: Array = um_names[litera_index] - for um_index in range(current_um_names.size()): - prep_pow_dic[current_um_names[um_index]] = um_data[um_index] + if not arr_litera: + print_debug('Ошибка в prd_name') return prep_pow_dic + + var um_names: Array[Array] = [] + if arr_litera.size() != 3: + um_names = [ + ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'], + ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] + ] + else: + um_names = [ + ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'], + ['um_8', 'um_9', 'um_10', 'um_11', 'um_12', 'um_13'], + ['um_7'] # Особый случай для третьего элемента + ] + + for litera_index in arr_litera.size(): + var litera: int = arr_litera[litera_index] + var litera_data: Dictionary = power_dic.get(litera, {}) + var um_data: Array[Array] = [[], [], [], [], [], []] + + for i in range(RAY_KEYS.size()): + var ray_key: String = RAY_KEYS[i] + var ray_array: Array = litera_data.get(ray_key, []) + + if ray_array.size() == 1: + var single_value = ray_array[0] + for j in range(6): + um_data[j].append(single_value) + else: + for j in range(6): + um_data[j].append(ray_array[j] if j < ray_array.size() else 0) + + var current_um_names: Array = um_names[litera_index] + for um_index in range(current_um_names.size()): + prep_pow_dic[current_um_names[um_index]] = um_data[um_index] + return prep_pow_dic From 217281ce5170df5328269ae6d80892ae39766183 Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Sun, 16 Nov 2025 19:30:59 +0300 Subject: [PATCH 06/10] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D0=BC=D0=BE=D0=BD=D0=B8=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=D0=B0=20=D1=82=D0=B5=D0=BC=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=D1=82=D1=83=D1=80=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.gd | 13 +++++++- scenes/pribor-prd-n/pribor-prd-n.gd | 43 ++++++++++++++---------- scenes/pribor-prd-n/pribor-prd-n.tscn | 12 +++---- scenes/pribor-prd-v/pribor-prd-v.gd | 13 +++++++- scenes/tabs-switch/lbl_ready.gd | 2 +- scenes/tabs-switch/tab-switch.tscn | 30 ++++++++--------- scenes/контроль/блок-в.tscn | 8 ++--- scripts/pribor-prd.gd | 48 +++++++++++++++++++++------ 8 files changed, 113 insertions(+), 56 deletions(-) diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index 3cb2020..15b3f48 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -62,6 +62,14 @@ func _exit_tree() -> void: #prd_k_module.cmd_array.append([unit_prd_k.CmdCode.WRITE_ISA, [constants_k.ADDR_UG_LITERA_1, ug_work_1, constants_k.ADDR_UG_LITERA_2, ug_work_2, constants_k.ADDR_UG_LITERA_3, ug_work_3]]) +static func temperature_fill(temperature_arr_node: Array, temperature_dic: Dictionary)->void: + for i_node_temperature in temperature_arr_node: + var temperature_meta: String = i_node_temperature.get_meta('um') + var status = STATE_VAL.GOOD if temperature_dic else STATE_VAL.NONE + if not temperature_dic.has(temperature_meta): return + i_node_temperature.value1 = temperature_dic[temperature_meta] + + static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifier: Array, POWER_THRESHOLD: int) -> void: for i_powapm in power_amplifier: var powamp_meta: String = i_powapm.get_meta('um') @@ -98,6 +106,7 @@ func on_press_device() -> void: 'power_dic': unit_prd_k.power_result, 'block_kasseta_y5_config': unit_prd_k.block_kasseta_y5_config, 'block_ip_config': unit_prd_k.block_ip_config, + 'temperature_um' : unit_prd_k.temperature_um, 'nodes_y5': nodes_y5, 'node_ip_power_arr': node_ip_power_arr, 'fs_nodes': fs_nodes, @@ -114,7 +123,8 @@ func on_press_device() -> void: func on_control_result(for_result_dic: Dictionary) -> void: - ## If control is end + temperature_fill(for_result_dic.power_amplifier, for_result_dic.temperature_um) + var block_kasseta_y5_prd_config_k: Dictionary = for_result_dic.block_kasseta_y5_config var nodes_y5: Array = for_result_dic.nodes_y5 for node_y5 in nodes_y5: @@ -132,6 +142,7 @@ func on_control_result(for_result_dic: Dictionary) -> void: if block_ip_config_k.has(meta_ip) and block_kasseta_y5_prd_config_k.ug: power_supply.state = STATE_VAL.GOOD if block_ip_config_k[meta_ip][1] else STATE_VAL.ERROR + ## If control is end var result_dic: Dictionary = for_result_dic.result_dic for f in for_result_dic.fs_nodes: var fs_meta: String = f.get_meta('fs') diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd index fb0046c..6b58662 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.gd +++ b/scenes/pribor-prd-n/pribor-prd-n.gd @@ -17,6 +17,8 @@ func _ready() -> void: var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') for temp in power_amplifier: temp.value1 = -70 + temp.max_value1 = 70 + temp.min_value1 = -40 unit_prd_n.connect('control_is_over', Callable(self, 'on_press_device')) #unit_prd_n.power_amplify = power_amplifier on_press_device() @@ -60,28 +62,33 @@ func _exit_tree() -> void: #prd_n_module.cmd_array.append([unit_prd_n.CmdCode.WRITE_ISA, [constants_n.ADDR_UG_LITERA_1, ug_work_1, constants_n.ADDR_UG_LITERA_2, ug_work_2]]) -static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifier: Array, POWER_THRESHOLD: int) -> void: - for i_powapm in power_amplifier: - var powamp_meta: String = i_powapm.get_meta('um') +static func temperature_fill(temperature_arr_node: Array, temperature_dic: Dictionary)->void: + for i_node_temperature in temperature_arr_node: + var temperature_meta: String = i_node_temperature.get_meta('um') + var status = STATE_VAL.GOOD if temperature_dic else STATE_VAL.NONE + if not temperature_dic.has(temperature_meta): return + i_node_temperature.value1 = temperature_dic[temperature_meta] + + +static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifier_arr_node: Array, POWER_THRESHOLD: int) -> void: + for i_node_powapm in power_amplifier_arr_node: + var powamp_meta: String = i_node_powapm.get_meta('um') var status = STATE_VAL.GOOD if pow_dic else STATE_VAL.NONE if not pow_dic.has(powamp_meta): return - if pow_dic[powamp_meta].size() < 6: - status = STATE_VAL.ERROR - else: - if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_2: return - if powamp_meta in ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] and not fs_result.fs_3: return - i_powapm.value0 = pow_dic[powamp_meta] - for i_p in pow_dic[powamp_meta]: - if i_p < POWER_THRESHOLD: - status = STATE_VAL.ERROR - i_powapm.state = status + if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_2: return + if powamp_meta in ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] and not fs_result.fs_3: return + i_node_powapm.value0 = pow_dic[powamp_meta] + for i_p in pow_dic[powamp_meta]: + if i_p < POWER_THRESHOLD: + status = STATE_VAL.ERROR + i_node_powapm.state = status func on_press_device() -> void: var nodes_y5: Array = get_tree().get_nodes_in_group('y-5') var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + var power_amplifier_arr_node: Array = get_tree().get_nodes_in_group('power_amplifier') var module_fs_2: Node = $kasseta_FS_ND/ref_A4 var dou_2: Node = $dou2_A5 var module_fs_3: Node = $kasseta_FS_ND/ref_A3 @@ -91,10 +98,11 @@ func on_press_device() -> void: 'power_dic': unit_prd_n.power_result, 'block_kasseta_y5_config': unit_prd_n.block_kasseta_y5_config, 'block_ip_config': unit_prd_n.block_ip_config, + 'temperature_um' : unit_prd_n.temperature_um, 'nodes_y5': nodes_y5, 'node_ip_power_arr': node_ip_power_arr, 'fs_nodes': fs_nodes, - 'power_amplifier': power_amplifier, + 'power_amplifier': power_amplifier_arr_node, 'POWER_THRESHOLD': unit_prd_n.constants.POWER_THRESHOLD, 'name_prd': unit_prd_n.self_name, 'module_fs_2': module_fs_2, @@ -106,7 +114,8 @@ func on_press_device() -> void: func on_control_result(for_result_dic: Dictionary) -> void: - ## If control is end + temperature_fill(for_result_dic.power_amplifier, for_result_dic.temperature_um) + var block_kasseta_y5_prd_config_n: Dictionary = for_result_dic.block_kasseta_y5_config var nodes_y5: Array = for_result_dic.nodes_y5 for node_y5 in nodes_y5: @@ -124,6 +133,7 @@ func on_control_result(for_result_dic: Dictionary) -> void: if block_ip_config_n.has(meta_ip) and block_kasseta_y5_prd_config_n.ug: power_supply.state = STATE_VAL.GOOD if block_ip_config_n[meta_ip][1] else STATE_VAL.ERROR + ## If control is end var result_dic: Dictionary = for_result_dic.result_dic for f in for_result_dic.fs_nodes: var fs_meta: String = f.get_meta('fs') @@ -140,7 +150,6 @@ func on_control_result(for_result_dic: Dictionary) -> void: if block_kasseta_y5_prd_config_n['yau07']: power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) - var result: bool = true for device in result_dic.values(): if not device: diff --git a/scenes/pribor-prd-n/pribor-prd-n.tscn b/scenes/pribor-prd-n/pribor-prd-n.tscn index a12b1ab..68571ce 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.tscn +++ b/scenes/pribor-prd-n/pribor-prd-n.tscn @@ -374,7 +374,7 @@ fname = "УМ1535А" rname = "A13" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_7" +metadata/um = "um_9" [node name="um1535_A14" parent="." groups=["power_amplifier"] instance=ExtResource("7_bnnv3")] layout_mode = 0 @@ -386,7 +386,7 @@ fname = "УМ1535А" rname = "A14" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_8" +metadata/um = "um_10" [node name="um1535_A15" parent="." groups=["power_amplifier"] instance=ExtResource("7_bnnv3")] layout_mode = 0 @@ -398,7 +398,7 @@ fname = "УМ1535А" rname = "A15" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_9" +metadata/um = "um_11" [node name="um1535_A16" parent="." groups=["power_amplifier"] instance=ExtResource("7_bnnv3")] layout_mode = 0 @@ -410,7 +410,7 @@ fname = "УМ1535А" rname = "A16" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_10" +metadata/um = "um_12" [node name="um1535_A17" parent="." groups=["power_amplifier"] instance=ExtResource("7_bnnv3")] layout_mode = 0 @@ -422,7 +422,7 @@ fname = "УМ1535А" rname = "A17" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_11" +metadata/um = "um_13" [node name="um1535_A18" parent="." groups=["power_amplifier"] instance=ExtResource("7_bnnv3")] layout_mode = 0 @@ -434,7 +434,7 @@ fname = "УМ1535А" rname = "A18" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_12" +metadata/um = "um_14" [node name="control_result" type="Label" parent="."] layout_mode = 0 diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index b01521e..1993ed1 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -59,6 +59,14 @@ func _exit_tree() -> void: #prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]]) +static func temperature_fill(temperature_arr_node: Array, temperature_dic: Dictionary)->void: + for i_node_temperature in temperature_arr_node: + var temperature_meta: String = i_node_temperature.get_meta('um') + var status = STATE_VAL.GOOD if temperature_dic else STATE_VAL.NONE + if not temperature_dic.has(temperature_meta): return + i_node_temperature.value1 = temperature_dic[temperature_meta] + + static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifier: Array, POWER_THRESHOLD: int) -> void: for i_powapm in power_amplifier: var powamp_meta: String = i_powapm.get_meta('um') @@ -137,6 +145,7 @@ func on_press_device() -> void: 'power_dic': unit_prd_v.power_result, 'block_kasseta_y5_config': unit_prd_v.block_kasseta_y5_config, 'block_ip_config': unit_prd_v.block_ip_config, + 'temperature_um' : unit_prd_v.temperature_um, 'nodes_y5': nodes_y5, 'node_ip_power_arr': node_ip_power_arr, 'fs_nodes': fs_nodes, @@ -152,7 +161,8 @@ func on_press_device() -> void: static func on_control_result(for_result_dic: Dictionary) -> void: - ## If control is end + temperature_fill(for_result_dic.power_amplifier, for_result_dic.temperature_um) + var block_kasseta_y5_prd_config_v: Dictionary = for_result_dic.block_kasseta_y5_config var nodes_y5: Array = for_result_dic.nodes_y5 for node_y5 in nodes_y5: @@ -169,6 +179,7 @@ static func on_control_result(for_result_dic: Dictionary) -> void: if block_ip_config_v.has(meta_ip) and block_kasseta_y5_prd_config_v.ug: power_supply.state = STATE_VAL.GOOD if block_ip_config_v[meta_ip][1] else STATE_VAL.ERROR + ## If control is end var result_dic: Dictionary = for_result_dic.result_dic for f in for_result_dic.fs_nodes: var fs_meta: String = f.get_meta('fs') diff --git a/scenes/tabs-switch/lbl_ready.gd b/scenes/tabs-switch/lbl_ready.gd index f35d4ed..b089367 100644 --- a/scenes/tabs-switch/lbl_ready.gd +++ b/scenes/tabs-switch/lbl_ready.gd @@ -4,7 +4,7 @@ const STATUS_GOOD := {"text": "Исправно", "color": Color.GREEN, "font_co const STATUS_BAD := {"text": "Отказ", "color": Color.RED, "font_color": Color.WHITE} var _is_uf_status_initialized: bool = false var is_prd_operational: bool = true -var is_uf_operational: bool = false +var is_uf_operational: bool = true func _ready() -> void: diff --git a/scenes/tabs-switch/tab-switch.tscn b/scenes/tabs-switch/tab-switch.tscn index f8649de..6836d83 100644 --- a/scenes/tabs-switch/tab-switch.tscn +++ b/scenes/tabs-switch/tab-switch.tscn @@ -79,21 +79,6 @@ visible = false layout_mode = 2 metadata/_tab_index = 5 -[node name="lbl_ready" type="Label" parent="."] -layout_mode = 0 -offset_left = 1504.0 -offset_right = 1600.0 -offset_bottom = 27.0 -tooltip_text = "Готовность аппаратуры к работе" -mouse_filter = 0 -theme_override_font_sizes/font_size = 14 -theme_override_styles/normal = SubResource("StyleBoxFlat_o1r22") -text = "Нет связи" -horizontal_alignment = 1 -vertical_alignment = 1 -script = ExtResource("8_tidwt") -metadata/_edit_lock_ = true - [node name="remote_control" type="Label" parent="."] layout_mode = 2 offset_left = 1242.0 @@ -125,5 +110,20 @@ toggle_mode = true text = "Тренаж" script = ExtResource("9_41d34") +[node name="lbl_ready" type="Label" parent="."] +layout_mode = 0 +offset_left = 1504.0 +offset_right = 1600.0 +offset_bottom = 27.0 +tooltip_text = "Готовность аппаратуры к работе" +mouse_filter = 0 +theme_override_font_sizes/font_size = 14 +theme_override_styles/normal = SubResource("StyleBoxFlat_o1r22") +text = "Нет связи" +horizontal_alignment = 1 +vertical_alignment = 1 +script = ExtResource("8_tidwt") +metadata/_edit_lock_ = true + [connection signal="tab_changed" from="tab_switch" to="tab_switch" method="_on_tab_changed"] [connection signal="toggled" from="тренаж_режим" to="tab_switch" method="_on_button_trenaj_toggled"] diff --git a/scenes/контроль/блок-в.tscn b/scenes/контроль/блок-в.tscn index 578fee5..b55f585 100644 --- a/scenes/контроль/блок-в.tscn +++ b/scenes/контроль/блок-в.tscn @@ -35,7 +35,7 @@ signal pressed(control: PanelContainer) if not is_inside_tree(): return $margin/vbox/grid1/level7.value = v - $margin/vbox/grid1/level7.tint_progress = Color.RED if v > 70 else Color.WHITE + $margin/vbox/grid1/level7.tint_progress = Color.RED if v >= 70 else Color.GOLD if v >= 60 else Color.WHITE @export var min_value0: float: @@ -191,8 +191,8 @@ func _enter_tree_defered(): $margin/vbox/grid0/rname.text = rname $margin/vbox/grid0/fname.text = fname $margin/vbox/grid0/state.texture = textures[state] - else: - push_warning('обращение к %s вне дерева' % self) + #else: + #push_warning('обращение к %s вне дерева' % self) TODO: пишеться только когда заходишь в проект а дальше не используется func get_level_nodes() -> Array: @@ -477,7 +477,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 tooltip_text = " Текущее: 56.00 -Диапазон: -50.00…120.00" +Диапазон: -40.00…70.00" mouse_filter = 0 min_value = -50.0 max_value = 120.0 diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index a92df2a..23865d7 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -31,7 +31,9 @@ var pribor_config: Dictionary var fs_parameters: Dictionary var block_ip_config: Dictionary var block_kasseta_y5_config: Dictionary +var temperature_um: Dictionary var control_results: Dictionary +var power_result: Dictionary var self_name: String var state: int = 0 var current_litera: int @@ -39,8 +41,8 @@ var flag_write_isa: bool = false var flag_fs_status_ok: bool = false var flag_si_fs_input: bool = false var flag_si_fs_output: bool = false +var flag_in_control: bool = false var unit_prd: Object -var power_result: Dictionary var control_timer: Timer = Timer.new() var ems_6666_timer: Timer = Timer.new() var machine_timer: Timer = Timer.new() @@ -134,11 +136,12 @@ func _process(_delta: float) -> void: ## Пакеты от ЯУ-07 func on_data_received(unit_pribor: Object) -> void: + if not flag_in_control: return var status: PackedByteArray = unit_pribor.status socket_status_ems_g(status) block_kasseta_y5_config = check_block_kasseta_y5(status, block_kasseta_y5_config) block_ip_config = check_block_ip(status, block_ip_config) - + temperature_um = check_temperature_um(status) if machine_timer.is_stopped(): return @@ -479,14 +482,14 @@ func setup_timer() -> void: func on_mode_changed(in_tree: bool) -> void: + flag_in_control = in_tree if not in_tree: ## TODO: Дополнительная проверка если контроль идет, если нет, то смысла вызывать нет progress_value = 0 machine_timer.stop() state = state_machine_enum.INIT _handle_fs_turn_off_state() #prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]]) - else: - pass + func _process_dkm_status(status: PackedByteArray) -> void: @@ -611,13 +614,36 @@ static func check_block_kasseta_y5(status_prd: PackedByteArray, y5_config: Dicti ## Мониторинг температуры -static func check_temperature(status_prd: PackedByteArray, y5_config: Dictionary) -> Dictionary: - y5_config.yau07 = true - y5_config.ems = (status_prd[0] & 1) and ((status_prd[0] >> 4) & 1) - y5_config.ug = (status_prd[0] >> 1) & 1 - y5_config.ukp1 = (status_prd[0] >> 2) & 1 - y5_config.ukp2 = (status_prd[0] >> 3) & 1 - return y5_config +static func check_temperature_um(status_prd: PackedByteArray) -> Dictionary: + const Constants: Dictionary = { + 'CONST_MIN_TEMP': -25, + 'MAXIMUM_CODE_ADC': 3796, + 'MINIMUM_CODE_AD': 2660, + 'TEMPERATURE_UKP_1': 47, + 'TEMPERATURE_UKP_2': 79, + } + const arr_um: Array = ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6', 'um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12', 'um_13', 'um_14', 'um_15', 'um_16'] + const TEMP: float = 115.0 / (Constants.MAXIMUM_CODE_ADC - Constants.MINIMUM_CODE_AD) + var return_dic_temp: Dictionary + var ukp1_online: int = (status_prd[0] >> 2) & 1 + var ukp2_online = (status_prd[0] >> 3) & 1 + + if ukp1_online: + var tmp_1: int + var temperature_ukp_1: int + for i_temp in 8: + temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * i_temp) + tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) + return_dic_temp[arr_um[i_temp]] = tmp_1 + + + if ukp2_online: + for i_temp in 8: + var temperature_ukp_2: int = status_prd.decode_u16(Constants.TEMPERATURE_UKP_2 + 2 * i_temp) + var tmp_2: int = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3) + return_dic_temp[arr_um[i_temp+8]] = tmp_2 + + return return_dic_temp ## Проверка ДКМ From 9f32e293a07fa7b69e9da87a06683a3d75986752 Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Sun, 16 Nov 2025 20:12:44 +0300 Subject: [PATCH 07/10] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BA=D0=B0=20(=D0=B1=D0=BB=D0=BE=D0=BA-?= =?UTF-8?q?=D0=BA.tscn)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.gd | 1 - scenes/pribor-prd-k/pribor-prd-k.tscn | 200 +------------ scenes/pribor-prd-n/pribor-prd-n.gd | 1 - scenes/pribor-prd-v/pribor-prd-v.gd | 1 - scenes/контроль/блок-в.tscn | 22 +- scenes/контроль/блок-к.tscn | 406 ++++++++++++++++++++++++++ 6 files changed, 427 insertions(+), 204 deletions(-) create mode 100644 scenes/контроль/блок-к.tscn diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index 15b3f48..c4ef34c 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -65,7 +65,6 @@ func _exit_tree() -> void: static func temperature_fill(temperature_arr_node: Array, temperature_dic: Dictionary)->void: for i_node_temperature in temperature_arr_node: var temperature_meta: String = i_node_temperature.get_meta('um') - var status = STATE_VAL.GOOD if temperature_dic else STATE_VAL.NONE if not temperature_dic.has(temperature_meta): return i_node_temperature.value1 = temperature_dic[temperature_meta] diff --git a/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index 55af137..404443e 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.tscn +++ b/scenes/pribor-prd-k/pribor-prd-k.tscn @@ -1,59 +1,20 @@ -[gd_scene load_steps=25 format=3 uid="uid://m5s87q7m66lj"] +[gd_scene load_steps=16 format=3 uid="uid://m5s87q7m66lj"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="1_8dmgr"] [ext_resource type="Script" uid="uid://cwvikiygf8b1m" path="res://scenes/pribor-prd-k/pribor-prd-k.gd" id="1_tpdyp"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="2_14h25"] [ext_resource type="PackedScene" uid="uid://cm5jd4gjrrpba" path="res://scenes/контроль/кассета-у-5-к.tscn" id="2_tb85r"] [ext_resource type="PackedScene" uid="uid://bcyxqni7gxvtq" path="res://scenes/контроль/блок-в.tscn" id="5_c7lv8"] -[ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="6_l0j7c"] +[ext_resource type="PackedScene" uid="uid://ffi1njkjceb5" path="res://scenes/контроль/блок-к.tscn" id="6_wd1vi"] [ext_resource type="PackedScene" uid="uid://bmagw8nd0ulhj" path="res://scenes/pribor-prd-k/kasseta-fs-kd.tscn" id="7_ia27q"] [ext_resource type="Script" uid="uid://crpedygm3gohi" path="res://scenes/контроль/кассета.gd" id="7_xpa2n"] [ext_resource type="PackedScene" uid="uid://dq31j24gv5vi4" path="res://scenes/контроль/кассета-п-2.tscn" id="8_6fdp7"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="8_la5yt"] -[ext_resource type="Texture2D" uid="uid://00871pb6moln" path="res://data/прогресс-фон-1.png" id="9_0ba6e"] -[ext_resource type="Texture2D" uid="uid://c1k856fxhrjnh" path="res://data/прогресс-заполнение-1.png" id="10_b3870"] [ext_resource type="Texture2D" uid="uid://belwchvdktrw0" path="res://data/эмс-бланк.png" id="10_c7lv8"] [ext_resource type="Texture2D" uid="uid://bwddxs24es81u" path="res://data/эмс-бланк-пост.png" id="11_wd1vi"] [ext_resource type="Texture2D" uid="uid://pfoscstbm025" path="res://data/эмс-бланк-перем.png" id="12_bjebg"] [ext_resource type="Texture2D" uid="uid://dvl3sq036gn75" path="res://data/эмс-бланк-замыкание.png" id="13_kc77u"] -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3nd2u"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_rceim"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8yvwo"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_6qu57"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_mlxje"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3dspb"] - -[sub_resource type="GDScript" id="GDScript_45hqb"] -script/source = "@tool - -extends MarginContainer - - -func _enter_tree() -> void: - margins = [8, 8, 8, 8] - - -@export var margins: Array: - set(vals): - add_theme_constant_override('margin_top', vals[0]) - add_theme_constant_override('margin_left', vals[1]) - add_theme_constant_override('margin_bottom', vals[2]) - add_theme_constant_override('margin_right', vals[3]) - get: - var vals = [0, 0, 0, 0] - vals[0] = get_theme_constant('margin_top') - vals[1] = get_theme_constant('margin_left') - vals[2] = get_theme_constant('margin_bottom') - vals[3] = get_theme_constant('margin_right') - return vals -" - [sub_resource type="SpriteFrames" id="SpriteFrames_di0aa"] animations = [{ "frames": [{ @@ -225,150 +186,15 @@ value0_info = "Мощность, Вт" value1_info = "Температура,°C" metadata/um = "um_6" -[node name="utm80_A9" type="PanelContainer" parent="."] -editor_description = "Элемент замены из ЗИП" +[node name="блок-к" parent="." groups=["power_amplifier"] instance=ExtResource("6_wd1vi")] layout_mode = 0 offset_left = 485.0 offset_top = 812.0 offset_right = 652.0 offset_bottom = 907.0 -theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u") -metadata/um = "um_7" - -[node name="button" type="Button" parent="utm80_A9"] -layout_mode = 2 -theme_override_styles/focus = SubResource("StyleBoxEmpty_rceim") -theme_override_styles/disabled = SubResource("StyleBoxEmpty_8yvwo") -theme_override_styles/hover = SubResource("StyleBoxEmpty_6qu57") -theme_override_styles/pressed = SubResource("StyleBoxEmpty_mlxje") -theme_override_styles/normal = SubResource("StyleBoxEmpty_3dspb") - -[node name="rect" type="NinePatchRect" parent="utm80_A9"] -layout_mode = 2 -texture = ExtResource("2_14h25") -draw_center = false -region_rect = Rect2(0, 0, 63, 63) -patch_margin_left = 17 -patch_margin_top = 17 -patch_margin_right = 17 -patch_margin_bottom = 15 - -[node name="margin" type="MarginContainer" parent="utm80_A9"] -layout_mode = 2 -theme_override_constants/margin_left = 8 -theme_override_constants/margin_top = 8 -theme_override_constants/margin_right = 8 -theme_override_constants/margin_bottom = 8 -script = SubResource("GDScript_45hqb") -margins = [8, 8, 8, 8] - -[node name="vbox" type="VBoxContainer" parent="utm80_A9/margin"] -layout_mode = 2 - -[node name="grid0" type="GridContainer" parent="utm80_A9/margin/vbox"] -layout_mode = 2 -columns = 3 - -[node name="state" type="TextureRect" parent="utm80_A9/margin/vbox/grid0"] -custom_minimum_size = Vector2(24, 24) -layout_mode = 2 -size_flags_horizontal = 2 -size_flags_vertical = 6 -texture = ExtResource("6_l0j7c") -expand_mode = 1 - -[node name="fname" type="Label" parent="utm80_A9/margin/vbox/grid0"] -self_modulate = Color(1, 1, 1, 0.627451) -custom_minimum_size = Vector2(0, 20) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -theme_override_font_sizes/font_size = 17 -text = "УТМ80" -horizontal_alignment = 1 -vertical_alignment = 1 - -[node name="rname" type="Label" parent="utm80_A9/margin/vbox/grid0"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 6 -theme_override_font_sizes/font_size = 18 -text = "A9" -horizontal_alignment = 2 -vertical_alignment = 1 - -[node name="grid1" type="GridContainer" parent="utm80_A9/margin/vbox"] -custom_minimum_size = Vector2(80, 0) -layout_mode = 2 -size_flags_horizontal = 4 -size_flags_vertical = 3 -columns = 2 - -[node name="level1" type="TextureProgressBar" parent="utm80_A9/margin/vbox/grid1" groups=["уровни"]] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -tooltip_text = "Мощность, Вт -Текущее: 0.00 -Диапазон: 0.00…1400.00" -mouse_filter = 0 -max_value = 1400.0 -fill_mode = 3 -nine_patch_stretch = true -stretch_margin_left = 8 -stretch_margin_top = 8 -stretch_margin_right = 8 -stretch_margin_bottom = 8 -texture_under = ExtResource("9_0ba6e") -texture_progress = ExtResource("10_b3870") -tint_under = Color(1, 1, 1, 0.419608) -tint_progress = Color(0.890196, 0.486275, 0.196078, 1) - -[node name="level7" type="TextureProgressBar" parent="utm80_A9/margin/vbox/grid1"] -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -tooltip_text = "Температура,°C -Текущее: 56.00 -Диапазон: -50.00…120.00" -mouse_filter = 0 -min_value = -50.0 -max_value = 120.0 -value = 56.0 -fill_mode = 3 -nine_patch_stretch = true -stretch_margin_left = 8 -stretch_margin_top = 8 -stretch_margin_right = 8 -stretch_margin_bottom = 8 -texture_under = ExtResource("9_0ba6e") -texture_progress = ExtResource("10_b3870") -tint_under = Color(0.890196, 0.486275, 0.196078, 1) -tint_over = Color(0.890196, 0.486275, 0.196078, 1) - -[node name="grid2" type="GridContainer" parent="utm80_A9/margin/vbox"] -clip_contents = true -custom_minimum_size = Vector2(80, 0) -layout_mode = 2 -size_flags_horizontal = 4 -size_flags_vertical = 4 -columns = 2 - -[node name="lbl6" type="Label" parent="utm80_A9/margin/vbox/grid2" groups=["названия"]] -clip_contents = true -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_font_sizes/font_size = 8 -text = "P,%" -horizontal_alignment = 1 - -[node name="lbl7" type="Label" parent="utm80_A9/margin/vbox/grid2"] -clip_contents = true -layout_mode = 2 -size_flags_horizontal = 3 -theme_override_font_sizes/font_size = 8 -text = "°C" -horizontal_alignment = 1 +fname = "УТМ80" +rname = "A9" +metadata/um = "um_8" [node name="rm1620m_A16" parent="." groups=["power_amplifier"] instance=ExtResource("5_c7lv8")] layout_mode = 0 @@ -380,7 +206,7 @@ fname = "РМ16-20М" rname = "A16" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_8" +metadata/um = "um_9" [node name="rm1620m_A17" parent="." groups=["power_amplifier"] instance=ExtResource("5_c7lv8")] layout_mode = 0 @@ -392,7 +218,7 @@ fname = "РМ16-20М" rname = "A17" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_9" +metadata/um = "um_10" [node name="rm1620m_A18" parent="." groups=["power_amplifier"] instance=ExtResource("5_c7lv8")] layout_mode = 0 @@ -404,7 +230,7 @@ fname = "РМ16-20М" rname = "A18" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_10" +metadata/um = "um_11" [node name="rm1620m_A19" parent="." groups=["power_amplifier"] instance=ExtResource("5_c7lv8")] layout_mode = 0 @@ -416,7 +242,7 @@ fname = "РМ16-20М" rname = "A19" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_11" +metadata/um = "um_12" [node name="rm1620m_A20" parent="." groups=["power_amplifier"] instance=ExtResource("5_c7lv8")] layout_mode = 0 @@ -428,7 +254,7 @@ fname = "РМ16-20М" rname = "A20" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_12" +metadata/um = "um_13" [node name="rm1620m_A21" parent="." groups=["power_amplifier"] instance=ExtResource("5_c7lv8")] layout_mode = 0 @@ -440,7 +266,7 @@ fname = "РМ16-20М" rname = "A21" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_13" +metadata/um = "um_14" [node name="kasseta_fs_kd" parent="." instance=ExtResource("7_ia27q")] layout_mode = 0 @@ -558,5 +384,3 @@ sprite_frames = SubResource("SpriteFrames_di0aa") [node name="output_2" type="AnimatedSprite2D" parent="."] position = Vector2(383, 177) sprite_frames = SubResource("SpriteFrames_di0aa") - -[connection signal="pressed" from="utm80_A9/button" to="utm80_A9" method="_on_button_pressed"] diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd index 6b58662..8f7ad06 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.gd +++ b/scenes/pribor-prd-n/pribor-prd-n.gd @@ -65,7 +65,6 @@ func _exit_tree() -> void: static func temperature_fill(temperature_arr_node: Array, temperature_dic: Dictionary)->void: for i_node_temperature in temperature_arr_node: var temperature_meta: String = i_node_temperature.get_meta('um') - var status = STATE_VAL.GOOD if temperature_dic else STATE_VAL.NONE if not temperature_dic.has(temperature_meta): return i_node_temperature.value1 = temperature_dic[temperature_meta] diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index 1993ed1..b932aa2 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -62,7 +62,6 @@ func _exit_tree() -> void: static func temperature_fill(temperature_arr_node: Array, temperature_dic: Dictionary)->void: for i_node_temperature in temperature_arr_node: var temperature_meta: String = i_node_temperature.get_meta('um') - var status = STATE_VAL.GOOD if temperature_dic else STATE_VAL.NONE if not temperature_dic.has(temperature_meta): return i_node_temperature.value1 = temperature_dic[temperature_meta] diff --git a/scenes/контроль/блок-в.tscn b/scenes/контроль/блок-в.tscn index b55f585..669b072 100644 --- a/scenes/контроль/блок-в.tscn +++ b/scenes/контроль/блок-в.tscn @@ -145,10 +145,10 @@ func _enter_tree() -> void: call_deferred('_enter_tree_defered') func _ready(): - #var items: Array = get_level_nodes() - #for item in items: - #item.connect('value_changed', on_level_changed.bind(item, value0_info)) - #on_level_changed(item.value, item, value0_info) + var items: Array = get_level_nodes() + for item in items: + item.connect('value_changed', on_level_changed.bind(item, value0_info)) + on_level_changed(item.value, item, value0_info) var level7: = $margin/vbox/grid1/level7 level7.connect('value_changed', on_level_changed.bind(level7, value1_info)) on_level_changed(level7.value, level7, value1_info) @@ -273,10 +273,8 @@ theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u") script = SubResource("GDScript_oj3k3") textures = [ExtResource("1_n1aqt"), ExtResource("2_rim3u"), ExtResource("3_3w8fg")] value0 = [20.0, 30.0, 40.0, 50.0, 60.0, 70.0] -value1 = 56.0 -min_value1 = -50.0 -max_value0 = 100.0 -max_value1 = 120.0 +max_value0 = 1400.0 +max_value1 = 70.0 step0 = 1.0 step1 = 1.0 value_name0 = "P,%" @@ -476,12 +474,10 @@ layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 3 tooltip_text = " -Текущее: 56.00 -Диапазон: -40.00…70.00" +Текущее: 0.00 +Диапазон: 0.00…70.00" mouse_filter = 0 -min_value = -50.0 -max_value = 120.0 -value = 56.0 +max_value = 70.0 fill_mode = 3 nine_patch_stretch = true stretch_margin_left = 8 diff --git a/scenes/контроль/блок-к.tscn b/scenes/контроль/блок-к.tscn new file mode 100644 index 0000000..9156160 --- /dev/null +++ b/scenes/контроль/блок-к.tscn @@ -0,0 +1,406 @@ +[gd_scene load_steps=15 format=3 uid="uid://ffi1njkjceb5"] + +[ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="1_uojqc"] +[ext_resource type="Texture2D" uid="uid://dnreyfh3cd1k2" path="res://data/состояние-исправности-1.png" id="2_a8ar3"] +[ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="3_xwd13"] +[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_eobkx"] +[ext_resource type="Texture2D" uid="uid://00871pb6moln" path="res://data/прогресс-фон-1.png" id="5_mg57e"] +[ext_resource type="Texture2D" uid="uid://c1k856fxhrjnh" path="res://data/прогресс-заполнение-1.png" id="6_of7rd"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3nd2u"] + +[sub_resource type="GDScript" id="GDScript_oj3k3"] +script/source = "@tool +class_name blok_v extends PanelContainer + +@export var textures: Array +@export var animation_duration: float = 1.5 +signal pressed(control: PanelContainer) + + +## Значения уровней +@export var value0: Array: + set(v): + value0.assign(v) + var items: Array = get_level_nodes() + var count: int = min(items.size(), v.size()) + for i in count: + set_value0_animated(items[i], v[i]) + + +## Значение уровня +@export var value1: float: + set(v): + value1 = v + if not is_inside_tree(): + return + $margin/vbox/grid1/level7.value = v + $margin/vbox/grid1/level7.tint_progress = Color.RED if v >= 70 else Color.GOLD if v >= 60 else Color.WHITE + + +@export var min_value0: float: + set(v): + min_value0 = v + var items: = get_level_nodes() + set_group_param(items, 'min_value', v) + + +@export var min_value1: float: + set(v): + min_value1 = v + if not is_inside_tree(): + return + $margin/vbox/grid1/level7.min_value = v + + +@export var max_value0: float: + set(v): + max_value0 = v + var items: = get_level_nodes() + set_group_param(items, 'max_value', v) + + +@export var max_value1: float: + set(v): + max_value1 = v + if not is_inside_tree(): + return + $margin/vbox/grid1/level7.max_value = v + + +@export var step0: float: + set(v): + step0 = v + var items: = get_level_nodes() + set_group_param(items, 'step', v) + + +@export var step1: float: + set(v): + step1 = v + if not is_inside_tree(): + return + $margin/vbox/grid1/level7.step = v + + +@export var value_name0: String: + set(v): + value_name0 = v + var items: Array = get_name_nodes() + set_group_param(items, 'text', v) + + +@export var value_name1: String: + set(v): + value_name1 = v + if not is_inside_tree(): + return + $margin/vbox/grid2/lbl7.text = v + + +@export var fname: String: + set(v): + fname = v + if not is_inside_tree(): + return + $margin/vbox/grid0/fname.text = v + + +@export var rname: String: + set(v): + rname = v + if not is_inside_tree(): + return + $margin/vbox/grid0/rname.text = v + + +@export var state: int: + set(v): + state = tools.clip_value(v, 0, textures.size() - 1) + if not is_inside_tree(): + return + $margin/vbox/grid0/state.texture = textures[state] + + +@export var alignment: int: + set(v): + alignment = v + if is_inside_tree(): + $margin/vbox.alignment = v + + +@export var value0_info: String: + set(v): + value0_info = v + + +@export var value1_info: String: + set(v): + value1_info = v + + +func _on_button_pressed(): emit_signal('pressed', self) +func set_value0(value: Array): value0.assign(value) +func _enter_tree() -> void: call_deferred('_enter_tree_defered') + + +func _ready(): + var items: Array = get_level_nodes() + for item in items: + item.connect('value_changed', on_level_changed.bind(item, value0_info)) + on_level_changed(item.value, item, value0_info) + var level7: = $margin/vbox/grid1/level7 + level7.connect('value_changed', on_level_changed.bind(level7, value1_info)) + on_level_changed(level7.value, level7, value1_info) + + +func on_level_changed(_val: float, item: TextureProgressBar, info: String): + item.tooltip_text = '%s\\nТекущее: %0.2f\\nДиапазон: %0.2f…%0.2f' % [info, item.value, item.min_value, item.max_value] + + +func set_group_param(items: Array, param: StringName, v) -> void: + if not is_inside_tree(): + return + if not get_tree(): + return + for i in items.size(): + items[i].set(param, v) + + +func set_value0_by_index(index: int, value: float) -> void: + var items: Array = get_level_nodes() + items[index].value = value + + +func _enter_tree_defered(): + var items: Array = get_level_nodes() + var count: int = min(items.size(), value0.size()) + for i in count: + items[i].min_value = min_value0 + items[i].max_value = 1400 # max_value0: TODO для отладки + items[i].step = step0 + items = get_name_nodes() + set_group_param(items, 'text', value_name0) + if is_inside_tree(): + $margin/vbox/grid1/level7.value = value1 + $margin/vbox/grid1/level7.min_value = min_value1 + $margin/vbox/grid1/level7.max_value = max_value1 + $margin/vbox/grid1/level7.step = step1 + $margin/vbox/grid2/lbl7.text = value_name1 + $margin/vbox.alignment = alignment + $margin/vbox/grid0/rname.text = rname + $margin/vbox/grid0/fname.text = fname + $margin/vbox/grid0/state.texture = textures[state] + + +func get_level_nodes() -> Array: + if not is_inside_tree(): + return [] + if not get_tree(): + return [] + return [$margin/vbox/grid1/level1] + + +func get_name_nodes() -> Array: + if not is_inside_tree(): + return [] + if not get_tree(): + return [] + return [$margin/vbox/grid2/lbl1] + + +func set_value0_animated(target_node, target_value: float) -> void: + var tween: Tween = create_tween() + tween.set_ease(Tween.EASE_OUT) + tween.set_trans(Tween.TRANS_QUINT) + tween.tween_property(target_node, 'value', target_value, animation_duration) +" + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_rceim"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8yvwo"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_6qu57"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_mlxje"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3dspb"] + +[sub_resource type="GDScript" id="GDScript_45hqb"] +script/source = "@tool + +extends MarginContainer + + +func _enter_tree() -> void: + margins = [8, 8, 8, 8] + + +@export var margins: Array: + set(vals): + add_theme_constant_override('margin_top', vals[0]) + add_theme_constant_override('margin_left', vals[1]) + add_theme_constant_override('margin_bottom', vals[2]) + add_theme_constant_override('margin_right', vals[3]) + get: + var vals = [0, 0, 0, 0] + vals[0] = get_theme_constant('margin_top') + vals[1] = get_theme_constant('margin_left') + vals[2] = get_theme_constant('margin_bottom') + vals[3] = get_theme_constant('margin_right') + return vals +" + +[node name="блок-к" type="PanelContainer"] +editor_description = "Элемент замены из ЗИП" +offset_right = 160.0 +offset_bottom = 88.0 +theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u") +script = SubResource("GDScript_oj3k3") +textures = [ExtResource("1_uojqc"), ExtResource("2_a8ar3"), ExtResource("3_xwd13")] +value0 = [20.0, 30.0, 40.0, 50.0, 60.0, 70.0] +max_value0 = 1400.0 +max_value1 = 70.0 +step0 = 1.0 +step1 = 1.0 +value_name0 = "P,%" +value_name1 = "°C" +fname = "Блок В" +rname = "A1" + +[node name="button" type="Button" parent="."] +layout_mode = 2 +theme_override_styles/focus = SubResource("StyleBoxEmpty_rceim") +theme_override_styles/disabled = SubResource("StyleBoxEmpty_8yvwo") +theme_override_styles/hover = SubResource("StyleBoxEmpty_6qu57") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_mlxje") +theme_override_styles/normal = SubResource("StyleBoxEmpty_3dspb") + +[node name="rect" type="NinePatchRect" parent="."] +layout_mode = 2 +texture = ExtResource("4_eobkx") +draw_center = false +region_rect = Rect2(0, 0, 63, 63) +patch_margin_left = 17 +patch_margin_top = 17 +patch_margin_right = 17 +patch_margin_bottom = 15 + +[node name="margin" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 8 +theme_override_constants/margin_top = 8 +theme_override_constants/margin_right = 8 +theme_override_constants/margin_bottom = 8 +script = SubResource("GDScript_45hqb") +margins = [8, 8, 8, 8] + +[node name="vbox" type="VBoxContainer" parent="margin"] +layout_mode = 2 + +[node name="grid0" type="GridContainer" parent="margin/vbox"] +layout_mode = 2 +columns = 3 + +[node name="state" type="TextureRect" parent="margin/vbox/grid0"] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +size_flags_horizontal = 2 +size_flags_vertical = 6 +texture = ExtResource("1_uojqc") +expand_mode = 1 + +[node name="fname" type="Label" parent="margin/vbox/grid0"] +self_modulate = Color(1, 1, 1, 0.627451) +custom_minimum_size = Vector2(0, 20) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_font_sizes/font_size = 17 +text = "Блок В" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="rname" type="Label" parent="margin/vbox/grid0"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 6 +theme_override_font_sizes/font_size = 18 +text = "A1" +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="grid1" type="GridContainer" parent="margin/vbox"] +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 3 +columns = 7 + +[node name="level1" type="TextureProgressBar" parent="margin/vbox/grid1" groups=["уровни"]] +custom_minimum_size = Vector2(30, 0) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +tooltip_text = " +Текущее: 0.00 +Диапазон: 0.00…1400.00" +mouse_filter = 0 +max_value = 1400.0 +fill_mode = 3 +nine_patch_stretch = true +stretch_margin_left = 8 +stretch_margin_top = 8 +stretch_margin_right = 8 +stretch_margin_bottom = 8 +texture_under = ExtResource("5_mg57e") +texture_progress = ExtResource("6_of7rd") +tint_under = Color(1, 1, 1, 0.419608) +tint_progress = Color(0.890196, 0.486275, 0.196078, 1) + +[node name="level7" type="TextureProgressBar" parent="margin/vbox/grid1"] +custom_minimum_size = Vector2(30, 0) +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +tooltip_text = " +Текущее: 0.00 +Диапазон: 0.00…70.00" +mouse_filter = 0 +max_value = 70.0 +fill_mode = 3 +nine_patch_stretch = true +stretch_margin_left = 8 +stretch_margin_top = 8 +stretch_margin_right = 8 +stretch_margin_bottom = 8 +texture_under = ExtResource("5_mg57e") +texture_progress = ExtResource("6_of7rd") +tint_under = Color(0.890196, 0.486275, 0.196078, 1) +tint_over = Color(0.890196, 0.486275, 0.196078, 1) + +[node name="grid2" type="GridContainer" parent="margin/vbox"] +clip_contents = true +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +columns = 7 + +[node name="lbl1" type="Label" parent="margin/vbox/grid2" groups=["названия"]] +clip_contents = true +custom_minimum_size = Vector2(30, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 8 +text = "P,%" +horizontal_alignment = 1 + +[node name="lbl7" type="Label" parent="margin/vbox/grid2"] +clip_contents = true +custom_minimum_size = Vector2(30, 0) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_font_sizes/font_size = 8 +text = "°C" +horizontal_alignment = 1 + +[connection signal="pressed" from="button" to="." method="_on_button_pressed"] From 89bc19ec9832bce78f6539d987e0c4e5740da1dd Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Sun, 16 Nov 2025 20:17:15 +0300 Subject: [PATCH 08/10] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D1=8F=20=D0=BF=D1=80=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/setting_prd_control.json | 239 ++++++++++++++++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 config/setting_prd_control.json diff --git a/config/setting_prd_control.json b/config/setting_prd_control.json new file mode 100644 index 0000000..2c331fb --- /dev/null +++ b/config/setting_prd_control.json @@ -0,0 +1,239 @@ +{ + "device_constants": { + "PRD_N": { + "constants": { + "POWER_UKP_1": 31, + "POWER_UKP_2": 63, + "DKM_BIT_2": 1, + "DKM_BIT_3": 2, + "BASE_ADDR_EMS_G": 288, + "ADDR_UG_LITERA_1": 262, + "ADDR_UG_LITERA_2": 264, + "ADDR_UG_LITERA_3": 266, + "TEMP_THRESHOLD": 70, + "POWER_THRESHOLD": 40, + "RAY_DOU_NUM": 3, + "ATT_UM_2": 2, + "ATT_UM_3": 3, + "POWER_UM": 100, + "TIMER_DELAY": 10.0, + "STATE_MASHINE_TIMER": 0.3 + }, + "pribor_config": { + "1н": {"angle": 0.0, "sectors": [4, 8]}, + "2н": {"angle": 90.0, "sectors": [7, 11]}, + "3н": {"angle": 180.0, "sectors": [6, 10]}, + "4н": {"angle": 270.0, "sectors": [5, 9]} + }, + "fs_params": { + "2": {"freq": 932.0, "width": 100.0}, + "3": {"freq": 1157.0, "width": 100.0} + }, + "start_litera": 2, + "progress_max": 20 + }, + "PRD_V": { + "constants": { + "POWER_UKP_1": 31, + "POWER_UKP_2": 63, + "DKM_BIT_4": 3, + "DKM_BIT_5": 4, + "BASE_ADDR_EMS_G": 288, + "ADDR_UG_LITERA_1": 262, + "ADDR_UG_LITERA_2": 264, + "ADDR_UG_LITERA_3": 266, + "TEMP_THRESHOLD": 70, + "POWER_THRESHOLD": 40, + "RAY_DOU_NUM": 3, + "ATT_UM_4": 2, + "ATT_UM_5": 3, + "POWER_UM": 100, + "TIMER_DELAY": 10.0, + "STATE_MASHINE_TIMER": 0.3 + }, + "pribor_config": { + "1в": {"angle": 0.0, "sectors": [12, 16]}, + "2в": {"angle": 90.0, "sectors": [15, 19]}, + "3в": {"angle": 180.0, "sectors": [14, 18]}, + "4в": {"angle": 270.0, "sectors": [13, 17]} + }, + "fs_params": { + "4": {"freq": 1227.0, "width": 100.0}, + "5": {"freq": 1575.0, "width": 110.0} + }, + "start_litera": 4, + "progress_max": 20 + }, + "PRD_K": { + "constants": { + "POWER_UKP_1": 31, + "POWER_UKP_2": 63, + "DKM_BIT_1": 0, + "DKM_BIT_6": 5, + "DKM_BIT_7": 6, + "BASE_ADDR_EMS_G": 288, + "ADDR_UG_LITERA_1": 262, + "ADDR_UG_LITERA_2": 264, + "ADDR_UG_LITERA_3": 266, + "TEMP_THRESHOLD": 40, + "POWER_THRESHOLD": 40, + "RAY_DOU_NUM": 3, + "ATT_UM_1": 0, + "ATT_UM_6": 3, + "ATT_UM_7": 2, + "POWER_UM": 100, + "TIMER_DELAY": 10.0, + "STATE_MASHINE_TIMER": 0.3 + }, + "pribor_config": { + "1к": {"angle": 0.0, "sectors": [0, 20, 24]}, + "2к": {"angle": 90.0, "sectors": [3, 23, 27]}, + "3к": {"angle": 180.0, "sectors": [2, 22, 26]}, + "4к": {"angle": 270.0, "sectors": [1, 21, 25]} + }, + "fs_params": { + "1": {"freq": 450.0, "width": 80.0}, + "6": {"freq": 2450.0, "width": 110.0}, + "7": {"freq": 4750.0, "width": 110.0} + }, + "start_litera": 1, + "progress_max": 30 + } + }, + "base_configs": { + "block_ip": { + "maa2000_1": [0, false], + "maa2000_2": [1, false], + "ip9_50_1": [2, false], + "ip9_50_2": [3, false], + "ip12_50_1": [4, false], + "ip5_25": [7, false] + }, + "block_kasseta": { + "yau07": false, + "ems": false, + "ug": false, + "ukp1": false, + "ukp2": false + } + }, + "device_configs": { + "PRD_N": { + "block_ip": "base", + "block_kasseta": "base", + "control_results": { + "block_ip": false, + "temperature": true, + "dkm_2": false, + "dkm_3": false, + "dou_2": false, + "dou_3": false, + "fs_2": 0, + "fs_3": 0 + } + }, + "PRD_V": { + "block_ip": "base", + "block_kasseta": "base", + "control_results": { + "block_ip": false, + "temperature": true, + "dkm_4": false, + "dkm_5": false, + "dou_4": false, + "dou_5": false, + "fs_4": 0, + "fs_5": 0 + } + }, + "PRD_K": { + "block_ip": { + "maa2000_1": [0, false], + "maa2000_2": [1, false], + "ip9_50_1": [2, false], + "ip9_50_2": [3, false], + "ip12_50_1": [4, false], + "ip9_50_3": [5, false], + "ip12_50_2": [6, false], + "ip5_25": [7, false] + }, + "block_kasseta": "base", + "control_results": { + "block_ip": false, + "temperature": true, + "dkm_1": false, + "dkm_6": false, + "dkm_7": false, + "dou_6": false, + "dou_7": false, + "fs_1": 0, + "fs_6": 0, + "fs_7": 0 + } + } + }, + "ray_types": ["RAY_m5", "RAY_5", "RAY_15", "RAY_25", "RAY_35", "RAY_45"], + "data_indices": { + "STATUS_BOARD": 0, + "IN_BLANK_PRD": 1, + "IN_IMPULS_PRD": 7, + "OUT_BLANK_PRD": 13, + "OUT_IMPULS_PRD": 19, + "DRY_CONTACT": 27, + "DKM": 28, + "POWER_UKP_1": 31, + "TEMPERATURE_UKP_1": 47, + "POWER_UKP_2": 63, + "TEMPERATURE_UKP_2": 79 + }, + "state_machine": { + "INIT": 0, + "FS_TURN_ON": 1, + "FS_WORK": 2, + "WRITE_ISA": 3, + "READ_ISA": 4, + "CHEK_KASSETA_Y5": 5, + "UG_SET_RAY": 6, + "UG_SET_RAY_0": 7, + "UG_SET_RAY_1": 8, + "UG_SET_RAY_2": 9, + "UG_SET_RAY_3": 10, + "UG_SET_RAY_4": 11, + "UG_SET_RAY_5": 12, + "IN_EMS_RUN": 13, + "IN_EMS_STOP": 14, + "FS_TURN_OFF": 15, + "STOP_CONTROL": 16, + "AWAIT": 17 + }, + "fs_keys": { + "1": "fs_1", + "2": "fs_2", + "3": "fs_3", + "4": "fs_4", + "5": "fs_5", + "6": "fs_6", + "7": "fs_7" + }, + "temperature_constants": { + "CONST_MIN_TEMP": -25, + "MAXIMUM_CODE_ADC": 3796, + "MINIMUM_CODE_AD": 2660, + "TEMPERATURE_UKP_1": 47, + "TEMPERATURE_UKP_2": 79 + }, + "ems_input_bits_config": { + "PRD_N": {"bit1": 9, "bit2": 10}, + "PRD_V": {"bit1": 11, "bit2": 12}, + "PRD_K": {"bit1": 13, "bit2": 14, "bit_lit": 8} + }, + "fs_rules":[ + {"key": "fs_1", "min": 0, "max": 4}, + {"key": "fs_2", "min": 4, "max": 8}, + {"key": "fs_3", "min": 8, "max": 12}, + {"key": "fs_4", "min": 12, "max": 16}, + {"key": "fs_5", "min": 16, "max": 20}, + {"key": "fs_6", "min": 20, "max": 24}, + {"key": "fs_7", "min": 24, "max": 27} + ] +} From 04da0d0cfd8b7a735f929545b943013476b79dbc Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Sun, 16 Nov 2025 20:45:24 +0300 Subject: [PATCH 09/10] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B8=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8?= =?UTF-8?q?=20"=D1=82=D1=80=D0=B5=D0=BD=D0=B0=D0=B6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/setting_prd_control.json | 20 -------------------- scenes/tabs-switch/tab-switch.tscn | 2 +- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/config/setting_prd_control.json b/config/setting_prd_control.json index 2c331fb..31abe74 100644 --- a/config/setting_prd_control.json +++ b/config/setting_prd_control.json @@ -186,26 +186,6 @@ "POWER_UKP_2": 63, "TEMPERATURE_UKP_2": 79 }, - "state_machine": { - "INIT": 0, - "FS_TURN_ON": 1, - "FS_WORK": 2, - "WRITE_ISA": 3, - "READ_ISA": 4, - "CHEK_KASSETA_Y5": 5, - "UG_SET_RAY": 6, - "UG_SET_RAY_0": 7, - "UG_SET_RAY_1": 8, - "UG_SET_RAY_2": 9, - "UG_SET_RAY_3": 10, - "UG_SET_RAY_4": 11, - "UG_SET_RAY_5": 12, - "IN_EMS_RUN": 13, - "IN_EMS_STOP": 14, - "FS_TURN_OFF": 15, - "STOP_CONTROL": 16, - "AWAIT": 17 - }, "fs_keys": { "1": "fs_1", "2": "fs_2", diff --git a/scenes/tabs-switch/tab-switch.tscn b/scenes/tabs-switch/tab-switch.tscn index 6836d83..1c958ec 100644 --- a/scenes/tabs-switch/tab-switch.tscn +++ b/scenes/tabs-switch/tab-switch.tscn @@ -126,4 +126,4 @@ script = ExtResource("8_tidwt") metadata/_edit_lock_ = true [connection signal="tab_changed" from="tab_switch" to="tab_switch" method="_on_tab_changed"] -[connection signal="toggled" from="тренаж_режим" to="tab_switch" method="_on_button_trenaj_toggled"] +[connection signal="toggled" from="тренаж_режим" to="tab_switch" method="_on_button_trenazh_toggled"] From 5293313f0e6144d5b288343a589d94e01ec74a37 Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Sun, 16 Nov 2025 22:27:38 +0300 Subject: [PATCH 10/10] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=BE=D1=89=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B5=D0=B9=20=D0=B8=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B5?= =?UTF-8?q?=D1=80=D1=82=D0=B0=D1=86=D0=B8=D1=8E=20json=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D1=81=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.gd | 4 +- scenes/pribor-prd-n/pribor-prd-n.gd | 2 +- scenes/pribor-prd-v/pribor-prd-v.gd | 2 +- scenes/pribor-prd-v/pribor-prd-v.tscn | 12 +- scenes/контроль/контроль.tscn | 1 + scripts/pribor-prd.gd | 164 ++++++++++++++++---------- 6 files changed, 113 insertions(+), 72 deletions(-) diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index c4ef34c..a185a98 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -80,9 +80,9 @@ static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifi if pow_dic[powamp_meta].size() < 6: status = STATE_VAL.ERROR else: - if powamp_meta == 'um_7' and not fs_result.fs_1: return + if powamp_meta == 'um_8' and not fs_result.fs_1: return if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_6: return - if powamp_meta in ['um_8', 'um_9', 'um_10', 'um_11', 'um_12', 'um_13'] and not fs_result.fs_7: return + if powamp_meta in ['um_9', 'um_10', 'um_11', 'um_12', 'um_13', 'um_14'] and not fs_result.fs_7: return i_powapm.value0 = pow_dic[powamp_meta] for i_p in pow_dic[powamp_meta]: if i_p < POWER_THRESHOLD: diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd index 8f7ad06..c8b7fd7 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.gd +++ b/scenes/pribor-prd-n/pribor-prd-n.gd @@ -75,7 +75,7 @@ static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifi var status = STATE_VAL.GOOD if pow_dic else STATE_VAL.NONE if not pow_dic.has(powamp_meta): return if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_2: return - if powamp_meta in ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] and not fs_result.fs_3: return + if powamp_meta in ['um_9', 'um_10', 'um_11', 'um_12', 'um_13', 'um_14'] and not fs_result.fs_3: return i_node_powapm.value0 = pow_dic[powamp_meta] for i_p in pow_dic[powamp_meta]: if i_p < POWER_THRESHOLD: diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index b932aa2..6c32f5a 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -75,7 +75,7 @@ static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifi status = STATE_VAL.ERROR else: if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_4: return - if powamp_meta in ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] and not fs_result.fs_5: return + if powamp_meta in ['um_9', 'um_10', 'um_11', 'um_12', 'um_13', 'um_14'] and not fs_result.fs_5: return i_powapm.value0 = pow_dic[powamp_meta] for i_p in pow_dic[powamp_meta]: if i_p < POWER_THRESHOLD: diff --git a/scenes/pribor-prd-v/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index 3d9bd2e..1910aa1 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.tscn +++ b/scenes/pribor-prd-v/pribor-prd-v.tscn @@ -323,7 +323,7 @@ fname = "УМ1535А" rname = "A13" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_7" +metadata/um = "um_9" [node name="um1535_A14" parent="." groups=["power_amplifier"] instance=ExtResource("8_4e87c")] layout_mode = 0 @@ -335,7 +335,7 @@ fname = "УМ1535А" rname = "A14" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_8" +metadata/um = "um_10" [node name="um1535_A15" parent="." groups=["power_amplifier"] instance=ExtResource("8_4e87c")] layout_mode = 0 @@ -347,7 +347,7 @@ fname = "УМ1535А" rname = "A15" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_9" +metadata/um = "um_11" [node name="um1535_A16" parent="." groups=["power_amplifier"] instance=ExtResource("8_4e87c")] layout_mode = 0 @@ -359,7 +359,7 @@ fname = "УМ1535А" rname = "A16" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_10" +metadata/um = "um_12" [node name="um1535_A17" parent="." groups=["power_amplifier"] instance=ExtResource("8_4e87c")] layout_mode = 0 @@ -371,7 +371,7 @@ fname = "УМ1535А" rname = "A17" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_11" +metadata/um = "um_13" [node name="um1535_A18" parent="." groups=["power_amplifier"] instance=ExtResource("8_4e87c")] layout_mode = 0 @@ -383,7 +383,7 @@ fname = "УМ1535А" rname = "A18" value0_info = "Мощность, Вт" value1_info = "Температура,°C" -metadata/um = "um_12" +metadata/um = "um_14" [node name="control_result" type="Label" parent="."] layout_mode = 0 diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index 5a3a92e..0b8d870 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -1689,6 +1689,7 @@ offset_bottom = 104.0 focus_mode = 0 text = "Запуск контроля" script = ExtResource("18_lbx5w") +metadata/_edit_lock_ = true [connection signal="toggled" from="pribor_prd_n_1" to="pribor_prd_n_1" method="_on_toggled"] [connection signal="toggled" from="pribor_uf" to="pribor_uf" method="_on_toggled"] diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index 23865d7..23c6476 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -11,6 +11,26 @@ const RAY_35: String = "RAY_35" const RAY_45: String = "RAY_45" const RAY_TYPES := [RAY_m5, RAY_5, RAY_15, RAY_25, RAY_35, RAY_45] +enum STATE_MACHINE { + INIT, + FS_TURN_ON, + FS_WORK, + WRITE_ISA, + READ_ISA, + CHEK_KASSETA_Y5, + UG_SET_RAY, + UG_SET_RAY_0, + UG_SET_RAY_1, + UG_SET_RAY_2, + UG_SET_RAY_3, + UG_SET_RAY_4, + UG_SET_RAY_5, + IN_EMS_RUN, + IN_EMS_STOP, + FS_TURN_OFF, + STOP_CONTROL, + AWAIT + } # Загруженные конфигурации var config_data: Dictionary @@ -18,7 +38,6 @@ var device_constants: Dictionary var base_configs: Dictionary var device_configs: Dictionary var data_indices: Dictionary -var state_machine_enum: Dictionary var fs_keys: Dictionary var temperature_constants: Dictionary var ems_input_bits_config: Dictionary @@ -35,7 +54,7 @@ var temperature_um: Dictionary var control_results: Dictionary var power_result: Dictionary var self_name: String -var state: int = 0 +var state: int = STATE_MACHINE.INIT var current_litera: int var flag_write_isa: bool = false var flag_fs_status_ok: bool = false @@ -108,25 +127,44 @@ func _load_configuration() -> void: func _parse_config_data() -> void: - device_constants = config_data.get("device_constants", {}) - base_configs = config_data.get("base_configs", {}) - device_configs = config_data.get("device_configs", {}) - data_indices = config_data.get("data_indices", {}) - state_machine_enum = config_data.get("state_machine", {}) - fs_keys = config_data.get("fs_keys", {}) - temperature_constants = config_data.get("temperature_constants", {}) - ems_input_bits_config = config_data.get("ems_input_bits_config", {}) - fs_rules = config_data.get("fs_rules", []) + device_constants = _convert_numbers(config_data.get("device_constants", {})) + base_configs = _convert_numbers(config_data.get("base_configs", {})) + device_configs = _convert_numbers(config_data.get("device_configs", {})) + data_indices = _convert_numbers(config_data.get("data_indices", {})) + fs_keys = _convert_numbers(config_data.get("fs_keys", {})) + temperature_constants = _convert_numbers(config_data.get("temperature_constants", {})) + ems_input_bits_config = _convert_numbers(config_data.get("ems_input_bits_config", {})) + fs_rules = _convert_numbers(config_data.get("fs_rules", [])) + + +static func _convert_numbers(value): + if value is float: + # Если float без дробной части - конвертируем в int + if value == int(value): + return int(value) + return value + elif value is Dictionary: + var result = {} + for key in value: + result[key] = _convert_numbers(value[key]) + return result + elif value is Array: + var result = [] + for item in value: + result.append(_convert_numbers(item)) + return result + else: + return value func _initialize_ray_mapping() -> void: _ray_state_mapping = { - state_machine_enum.get("UG_SET_RAY_0", 7): RAY_m5, - state_machine_enum.get("UG_SET_RAY_1", 8): RAY_5, - state_machine_enum.get("UG_SET_RAY_2", 9): RAY_15, - state_machine_enum.get("UG_SET_RAY_3", 10): RAY_25, - state_machine_enum.get("UG_SET_RAY_4", 11): RAY_35, - state_machine_enum.get("UG_SET_RAY_5", 12): RAY_45 + STATE_MACHINE.UG_SET_RAY_0: "RAY_m5", + STATE_MACHINE.UG_SET_RAY_1: "RAY_5", + STATE_MACHINE.UG_SET_RAY_2: "RAY_15", + STATE_MACHINE.UG_SET_RAY_3: "RAY_25", + STATE_MACHINE.UG_SET_RAY_4: "RAY_35", + STATE_MACHINE.UG_SET_RAY_5: "RAY_45", } @@ -208,13 +246,13 @@ func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary) -> vo ## func state_control_machine() -> void: match state: - state_machine_enum.INIT: + STATE_MACHINE.INIT: print("Start control for %s device %s litera" % [self_name, current_litera]) _handle_init_state() - state_machine_enum.FS_TURN_ON: + STATE_MACHINE.FS_TURN_ON: _handle_fs_turn_on_state() - state = state_machine_enum.FS_WORK - state_machine_enum.FS_WORK: + state = STATE_MACHINE.FS_WORK + STATE_MACHINE.FS_WORK: var flag_ecm: bool = false for key in ecms: var params = ecms[key].params.freq @@ -225,74 +263,76 @@ func state_control_machine() -> void: if flag_ecm and flag_fs_status_ok: ems_6666_timer.start() _handle_fs_work_state() - state_machine_enum.CHEK_KASSETA_Y5: + STATE_MACHINE.CHEK_KASSETA_Y5: if block_kasseta_y5_config['yau07']: - state = state_machine_enum.WRITE_ISA - state_machine_enum.WRITE_ISA: + state = STATE_MACHINE.WRITE_ISA + STATE_MACHINE.WRITE_ISA: if not flag_write_isa: _handle_ug_set_state(0x6) - state = state_machine_enum.READ_ISA - state_machine_enum.READ_ISA: + state = STATE_MACHINE.READ_ISA + STATE_MACHINE.READ_ISA: if (unit_prd.cmd_state == unit_prd.CmdState.DONE) or (unit_prd.cmd_state == unit_prd.CmdState.FAIL): _handle_read_isa(unit_prd, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3], cmd_array) flag_write_isa = false - state = state_machine_enum.UG_SET_RAY - state_machine_enum.UG_SET_RAY: + state = STATE_MACHINE.UG_SET_RAY + STATE_MACHINE.UG_SET_RAY: var addr: int = constants.ADDR_UG_LITERA_1 if current_litera == 3 or current_litera == 5 or current_litera == 7: addr = constants.ADDR_UG_LITERA_2 if unit_prd.isa_ports.has(addr) and (unit_prd.cmd_state == unit_prd.CmdState.DONE): if unit_prd.isa_ports[addr] & 0x07 == 0: - state = state_machine_enum.UG_SET_RAY_1 + state = STATE_MACHINE.UG_SET_RAY_1 elif unit_prd.isa_ports[addr] & 0x07 == 1: - state = state_machine_enum.UG_SET_RAY_2 + state = STATE_MACHINE.UG_SET_RAY_2 elif unit_prd.isa_ports[addr] & 0x07 == 2: - state = state_machine_enum.UG_SET_RAY_3 + state = STATE_MACHINE.UG_SET_RAY_3 elif unit_prd.isa_ports[addr] & 0x07 == 3: - state = state_machine_enum.UG_SET_RAY_4 + state = STATE_MACHINE.UG_SET_RAY_4 elif unit_prd.isa_ports[addr] & 0x07 == 4: - state = state_machine_enum.UG_SET_RAY_5 + state = STATE_MACHINE.UG_SET_RAY_5 elif unit_prd.isa_ports[addr] & 0x07 == 5: if not current_litera == 1: control_results = check_dou_result(control_results, power_for_litera, self_name, current_litera, constants) - state = state_machine_enum.IN_EMS_STOP + state = STATE_MACHINE.IN_EMS_STOP elif unit_prd.isa_ports[addr] & 0x07 == 6: - state = state_machine_enum.UG_SET_RAY_0 + state = STATE_MACHINE.UG_SET_RAY_0 + if current_litera == 1: + state = STATE_MACHINE.UG_SET_RAY_5 - state_machine_enum.UG_SET_RAY_0: + STATE_MACHINE.UG_SET_RAY_0: if flag_si_fs_input and not flag_write_isa: control_timer.stop() _handle_ug_set_state(0x0) await get_tree().create_timer(0.5).timeout - state = state_machine_enum.READ_ISA - state_machine_enum.UG_SET_RAY_1: + state = STATE_MACHINE.READ_ISA + STATE_MACHINE.UG_SET_RAY_1: if not flag_write_isa: _handle_ug_set_state(0x1) - state = state_machine_enum.READ_ISA - state_machine_enum.UG_SET_RAY_2: + state = STATE_MACHINE.READ_ISA + STATE_MACHINE.UG_SET_RAY_2: if not flag_write_isa: _handle_ug_set_state(0x2) - state = state_machine_enum.READ_ISA - state_machine_enum.UG_SET_RAY_3: + state = STATE_MACHINE.READ_ISA + STATE_MACHINE.UG_SET_RAY_3: if not flag_write_isa: _handle_ug_set_state(0x3) - state = state_machine_enum.READ_ISA - state_machine_enum.UG_SET_RAY_4: + state = STATE_MACHINE.READ_ISA + STATE_MACHINE.UG_SET_RAY_4: if not flag_write_isa: _handle_ug_set_state(0x4) - state = state_machine_enum.READ_ISA - state_machine_enum.UG_SET_RAY_5: + state = STATE_MACHINE.READ_ISA + STATE_MACHINE.UG_SET_RAY_5: if not flag_write_isa: _handle_ug_set_state(0x5) - state = state_machine_enum.READ_ISA - state_machine_enum.IN_EMS_STOP: + state = STATE_MACHINE.READ_ISA + STATE_MACHINE.IN_EMS_STOP: ems_6666_timer.stop() - state = state_machine_enum.FS_TURN_OFF - state_machine_enum.FS_TURN_OFF: + state = STATE_MACHINE.FS_TURN_OFF + STATE_MACHINE.FS_TURN_OFF: ems_6666_timer.stop() _handle_fs_turn_off_state() - state = state_machine_enum.STOP_CONTROL - state_machine_enum.STOP_CONTROL: + state = STATE_MACHINE.STOP_CONTROL + STATE_MACHINE.STOP_CONTROL: _handle_stop_control_state() ## В машине состояний вызов изменения состояния прогресс бара контроля progressbar_status() @@ -302,7 +342,7 @@ func state_control_machine() -> void: func _handle_init_state() -> void: if current_litera in [1, 2, 3, 4, 5, 6, 7]: if not ecms.size(): - state = state_machine_enum.FS_TURN_ON + state = STATE_MACHINE.FS_TURN_ON else: control_results = on_control_result(block_ip_config, control_results) power_result = prep_power(power_for_litera, self_name) @@ -326,7 +366,7 @@ func _handle_fs_work_state() -> void: (current_litera == 6 and control_results.fs_6) or \ (current_litera == 7 and control_results.fs_7) or \ (current_litera == 1 and control_results.fs_1): - state = state_machine_enum.CHEK_KASSETA_Y5 + state = STATE_MACHINE.CHEK_KASSETA_Y5 func _handle_ug_set_state(RAY_DOU_NUM: int) -> void: @@ -363,7 +403,7 @@ func on_state_mashine(): func progressbar_status() -> void: match state: - state_machine_enum.INIT: + STATE_MACHINE.INIT: cc += 10 if current_litera in [3, 5, 6, 7] else 0 if control_timer.get_time_left() > 0: progress_value = cc + control_timer.get_wait_time() - control_timer.get_time_left() @@ -380,7 +420,7 @@ func _handle_fs_turn_off_state() -> void: ##'Выполняется завершение проверки ФС-%s' % current_litera func _handle_stop_control_state() -> void: _advance_to_next_fs() - state = state_machine_enum.INIT + state = STATE_MACHINE.INIT func _advance_to_next_fs() -> void: @@ -420,7 +460,7 @@ func _on_start_contol_device()-> void: func _determine_self_name() -> void: cc = 0 - state = state_machine_enum.get("INIT", 0) + state = STATE_MACHINE.get("INIT", 0) var current_unit = unit_prd.name var parts = current_unit.split('-') self_name = parts[-1] @@ -486,7 +526,7 @@ func on_mode_changed(in_tree: bool) -> void: if not in_tree: ## TODO: Дополнительная проверка если контроль идет, если нет, то смысла вызывать нет progress_value = 0 machine_timer.stop() - state = state_machine_enum.INIT + state = STATE_MACHINE.INIT _handle_fs_turn_off_state() #prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]]) @@ -538,7 +578,7 @@ static func _get_dkm_bit_for_current_fs(litera: int, constants_dic: Dictionary) func on_stop_control() -> void: _handle_fs_turn_off_state() - state = state_machine_enum.FS_TURN_OFF + state = STATE_MACHINE.FS_TURN_OFF static func on_control_result(ip_config: Dictionary, ctrl_results: Dictionary) -> Dictionary: @@ -813,13 +853,13 @@ static func prep_power(power_dic: Dictionary, prd_name: String)-> Dictionary: if arr_litera.size() != 3: um_names = [ ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'], - ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] + ['um_9', 'um_10', 'um_11', 'um_12', 'um_13', 'um_14'] ] else: um_names = [ ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'], - ['um_8', 'um_9', 'um_10', 'um_11', 'um_12', 'um_13'], - ['um_7'] # Особый случай для третьего элемента + ['um_9', 'um_10', 'um_11', 'um_12', 'um_13', 'um_14'], + ['um_8'] ] for litera_index in arr_litera.size():