diff --git a/project.godot b/project.godot index 348f45a..81344c9 100644 --- a/project.godot +++ b/project.godot @@ -144,6 +144,10 @@ map_server_addr=false center_offset=Vector2(0, 0) external_cu=false +[global_group] + +default_reset="" + [gui] theme/custom_font="res://data/secondary-font.tres" diff --git a/scenes/pribor-prd-k/kasseta-fs-kd.tscn b/scenes/pribor-prd-k/kasseta-fs-kd.tscn index 9bab5bf..9e71df4 100644 --- a/scenes/pribor-prd-k/kasseta-fs-kd.tscn +++ b/scenes/pribor-prd-k/kasseta-fs-kd.tscn @@ -26,7 +26,7 @@ text = "Кассета ФС-КД" horizontal_alignment = 1 vertical_alignment = 1 -[node name="ref_A2" parent="." instance=ExtResource("3_kqnvt")] +[node name="ref_A2" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")] offset_left = 5.0 offset_top = 33.0 offset_right = 55.0 @@ -42,7 +42,7 @@ offset_bottom = 183.0 fname = "Модуль ФС" rname = "A1" -[node name="ref_A4" parent="." instance=ExtResource("3_kqnvt")] +[node name="ref_A4" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")] offset_left = 105.0 offset_top = 33.0 offset_right = 155.0 @@ -66,7 +66,7 @@ offset_bottom = 183.0 fname = "Модуль ФС" rname = "A3" -[node name="ref_A7" parent="." instance=ExtResource("3_kqnvt")] +[node name="ref_A7" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")] offset_left = 255.0 offset_top = 33.0 offset_right = 305.0 diff --git a/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index ca1858b..004208e 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=11 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"] @@ -10,6 +10,31 @@ [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="11_c7lv8"] +[ext_resource type="Texture2D" uid="uid://bwddxs24es81u" path="res://data/эмс-бланк-пост.png" id="12_wd1vi"] +[ext_resource type="Texture2D" uid="uid://pfoscstbm025" path="res://data/эмс-бланк-перем.png" id="13_bjebg"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_kc77u"] + +[sub_resource type="SpriteFrames" id="SpriteFrames_di0aa"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("11_c7lv8") +}, { +"duration": 1.0, +"texture": ExtResource("12_wd1vi") +}, { +"duration": 1.0, +"texture": ExtResource("13_bjebg") +}, { +"duration": 1.0, +"texture": null +}], +"loop": true, +"name": &"default", +"speed": 5.0 +}] [node name="pribor_prd_k" type="Control"] layout_mode = 3 @@ -29,7 +54,7 @@ offset_bottom = 432.0 script = ExtResource("3_wip3a") fname = "Кассета У5" -[node name="maa2000_A22" parent="." instance=ExtResource("1_8dmgr")] +[node name="maa2000_A22" parent="." groups=["default_reset"] instance=ExtResource("1_8dmgr")] layout_mode = 0 offset_left = 485.0 offset_top = 907.0 @@ -38,7 +63,7 @@ offset_bottom = 949.0 fname = "MAA2000" rname = "A28" -[node name="dou2_A7" parent="." instance=ExtResource("1_8dmgr")] +[node name="dou6_A7" parent="." groups=["default_reset"] instance=ExtResource("1_8dmgr")] layout_mode = 0 offset_left = 8.0 offset_top = 862.0 @@ -47,7 +72,7 @@ offset_bottom = 907.0 fname = "ДОУ-6" rname = "A7" -[node name="maa2000_A23" parent="." instance=ExtResource("1_8dmgr")] +[node name="maa2000_A23" parent="." groups=["default_reset"] instance=ExtResource("1_8dmgr")] layout_mode = 0 offset_left = 8.0 offset_top = 907.0 @@ -56,7 +81,7 @@ offset_bottom = 949.0 fname = "MAA2000" rname = "A27" -[node name="dou2_A8" parent="." instance=ExtResource("1_8dmgr")] +[node name="dou7_A8" parent="." groups=["default_reset"] instance=ExtResource("1_8dmgr")] layout_mode = 0 offset_left = 8.0 offset_top = 812.0 @@ -89,7 +114,7 @@ text = "Панель horizontal_alignment = 1 vertical_alignment = 1 -[node name="um1535_A10" parent="." instance=ExtResource("6_fmhtx")] +[node name="um1535_A10" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 485.0 offset_top = 242.0 @@ -102,7 +127,7 @@ name_min_size1 = Vector2i(35, 20) fname = "УМ1535Б" rname = "A10" -[node name="um1535_A11" parent="." instance=ExtResource("6_fmhtx")] +[node name="um1535_A11" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 485.0 offset_top = 337.0 @@ -115,7 +140,7 @@ name_min_size1 = Vector2i(35, 20) fname = "УМ1535Б" rname = "A11" -[node name="um1535_A12" parent="." instance=ExtResource("6_fmhtx")] +[node name="um1535_A12" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 485.0 offset_top = 432.0 @@ -128,7 +153,7 @@ name_min_size1 = Vector2i(35, 20) fname = "УМ1535Б" rname = "A12" -[node name="um1535_A13" parent="." instance=ExtResource("6_fmhtx")] +[node name="um1535_A13" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 485.0 offset_top = 527.0 @@ -141,7 +166,7 @@ name_min_size1 = Vector2i(35, 20) fname = "УМ1535Б" rname = "A13" -[node name="um1535_A14" parent="." instance=ExtResource("6_fmhtx")] +[node name="um1535_A14" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 485.0 offset_top = 622.0 @@ -154,7 +179,7 @@ name_min_size1 = Vector2i(35, 20) fname = "УМ1535Б" rname = "A14" -[node name="um1535_A15" parent="." instance=ExtResource("6_fmhtx")] +[node name="um1535_A15" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 485.0 offset_top = 717.0 @@ -167,7 +192,7 @@ name_min_size1 = Vector2i(35, 20) fname = "УМ1535Б" rname = "A15" -[node name="utm80_A9" parent="." instance=ExtResource("6_fmhtx")] +[node name="utm80_A9" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 485.0 offset_top = 812.0 @@ -180,7 +205,7 @@ name_min_size1 = Vector2i(35, 20) fname = "УТМ80" rname = "A9" -[node name="um1535_A16" parent="." instance=ExtResource("6_fmhtx")] +[node name="um1535_A16" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 8.0 offset_top = 242.0 @@ -193,7 +218,7 @@ name_min_size1 = Vector2i(35, 20) fname = "РМ16-20М" rname = "A16" -[node name="um1535_A17" parent="." instance=ExtResource("6_fmhtx")] +[node name="um1535_A17" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 8.0 offset_top = 337.0 @@ -206,7 +231,7 @@ name_min_size1 = Vector2i(35, 20) fname = "РМ16-20М" rname = "A17" -[node name="um1535_A18" parent="." instance=ExtResource("6_fmhtx")] +[node name="um1535_A18" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 8.0 offset_top = 432.0 @@ -219,7 +244,7 @@ name_min_size1 = Vector2i(35, 20) fname = "РМ16-20М" rname = "A18" -[node name="um1535_A19" parent="." instance=ExtResource("6_fmhtx")] +[node name="um1535_A19" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 8.0 offset_top = 527.0 @@ -232,7 +257,7 @@ name_min_size1 = Vector2i(35, 20) fname = "РМ16-20М" rname = "A19" -[node name="um1535_A20" parent="." instance=ExtResource("6_fmhtx")] +[node name="um1535_A20" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 8.0 offset_top = 622.0 @@ -245,7 +270,7 @@ name_min_size1 = Vector2i(35, 20) fname = "РМ16-20М" rname = "A20" -[node name="um1535_A21" parent="." instance=ExtResource("6_fmhtx")] +[node name="um1535_A21" parent="." groups=["power_amplifier"] instance=ExtResource("6_fmhtx")] layout_mode = 0 offset_left = 8.0 offset_top = 717.0 @@ -280,7 +305,7 @@ patch_margin_bottom = 16 script = ExtResource("7_xpa2n") fname = "Кассета П-1" -[node name="ref_A26" parent="kasseta_p_1" instance=ExtResource("8_la5yt")] +[node name="ref_A26" parent="kasseta_p_1" groups=["default_reset"] instance=ExtResource("8_la5yt")] offset_left = 9.0 offset_top = 33.0 offset_right = 59.0 @@ -288,7 +313,7 @@ offset_bottom = 183.0 fname = "ИП9-50" rname = "A23" -[node name="ref_A23" parent="kasseta_p_1" instance=ExtResource("8_la5yt")] +[node name="ref_A23" parent="kasseta_p_1" groups=["default_reset"] instance=ExtResource("8_la5yt")] offset_left = 59.0 offset_top = 33.0 offset_right = 109.0 @@ -296,7 +321,7 @@ offset_bottom = 183.0 fname = "ИП9-50" rname = "A24" -[node name="ref_A24" parent="kasseta_p_1" instance=ExtResource("8_la5yt")] +[node name="ref_A24" parent="kasseta_p_1" groups=["default_reset"] instance=ExtResource("8_la5yt")] offset_left = 109.0 offset_top = 33.0 offset_right = 159.0 @@ -322,3 +347,128 @@ offset_top = 622.0 offset_right = 485.0 offset_bottom = 812.0 fname = "Кассета П-2" + +[node name="control_result" type="Label" parent="."] +layout_mode = 0 +offset_left = 9.0 +offset_top = 960.0 +offset_right = 649.0 +offset_bottom = 1003.0 +theme_override_colors/font_color = Color(0.862745, 0.0784314, 0.235294, 1) +theme_override_font_sizes/font_size = 28 +horizontal_alignment = 1 +metadata/_edit_lock_ = true + +[node name="Monitoring_panel" type="Panel" parent="."] +visible = false +layout_mode = 0 +offset_left = 496.0 +offset_top = 8.0 +offset_right = 496.0 +offset_bottom = 8.0 +theme_override_styles/panel = SubResource("StyleBoxTexture_kc77u") + +[node name="in_fs_1" type="AnimatedSprite2D" parent="Monitoring_panel"] +position = Vector2(206, 577) +scale = Vector2(1.2, 1.2) +sprite_frames = SubResource("SpriteFrames_di0aa") + +[node name="in_fs_1" type="Label" parent="Monitoring_panel/in_fs_1"] +offset_left = -15.1667 +offset_top = 14.0 +offset_right = 14.8333 +offset_bottom = 33.0 +theme_override_colors/font_color = Color(0.890196, 0.486275, 0.196078, 1) +theme_override_font_sizes/font_size = 10 +text = "In FS 1" +horizontal_alignment = 1 +metadata/_edit_use_anchors_ = true + +[node name="in_fs_2" type="AnimatedSprite2D" parent="Monitoring_panel"] +position = Vector2(319, 577) +scale = Vector2(1.2, 1.2) +sprite_frames = SubResource("SpriteFrames_di0aa") + +[node name="in_fs_3" type="Label" parent="Monitoring_panel/in_fs_2"] +offset_left = -15.1667 +offset_top = 14.0 +offset_right = 14.8333 +offset_bottom = 33.0 +theme_override_colors/font_color = Color(0.890196, 0.486275, 0.196078, 1) +theme_override_font_sizes/font_size = 10 +text = "In FS 3" +horizontal_alignment = 1 + +[node name="out_ems_1" type="AnimatedSprite2D" parent="Monitoring_panel"] +position = Vector2(206, 465) +scale = Vector2(1.2, 1.2) +sprite_frames = SubResource("SpriteFrames_di0aa") + +[node name="Out_ems_1" type="Label" parent="Monitoring_panel/out_ems_1"] +anchors_preset = -1 +anchor_left = 0.0185185 +anchor_right = 0.0185185 +anchor_bottom = 0.555556 +offset_left = -18.5 +offset_top = 14.0 +offset_right = 17.5 +offset_bottom = 33.0 +theme_override_colors/font_color = Color(0.890196, 0.486275, 0.196078, 1) +theme_override_font_sizes/font_size = 10 +text = "Out +ems 1" +horizontal_alignment = 1 +metadata/_edit_use_anchors_ = true + +[node name="out_ems_2" type="AnimatedSprite2D" parent="Monitoring_panel"] +position = Vector2(319, 465) +scale = Vector2(1.2, 1.2) +sprite_frames = SubResource("SpriteFrames_di0aa") + +[node name="Out_ems_1" type="Label" parent="Monitoring_panel/out_ems_2"] +offset_left = -15.1667 +offset_top = 14.0 +offset_right = 14.8333 +offset_bottom = 33.0 +theme_override_colors/font_color = Color(0.890196, 0.486275, 0.196078, 1) +theme_override_font_sizes/font_size = 10 +text = "Out +ems 2" +horizontal_alignment = 1 + +[node name="in_fs_3" type="AnimatedSprite2D" parent="Monitoring_panel"] +position = Vector2(264, 577) +scale = Vector2(1.2, 1.2) +sprite_frames = SubResource("SpriteFrames_di0aa") + +[node name="in_fs_2" type="Label" parent="Monitoring_panel/in_fs_3"] +offset_left = -15.1667 +offset_top = 14.0 +offset_right = 14.8333 +offset_bottom = 33.0 +theme_override_colors/font_color = Color(0.890196, 0.486275, 0.196078, 1) +theme_override_font_sizes/font_size = 10 +text = "In FS 2" +horizontal_alignment = 1 +metadata/_edit_use_anchors_ = true + +[node name="out_ems_3" type="AnimatedSprite2D" parent="Monitoring_panel"] +position = Vector2(264, 465) +scale = Vector2(1.2, 1.2) +sprite_frames = SubResource("SpriteFrames_di0aa") + +[node name="Out_ems_1" type="Label" parent="Monitoring_panel/out_ems_3"] +anchors_preset = -1 +anchor_left = 0.0185185 +anchor_right = 0.0185185 +anchor_bottom = 0.555556 +offset_left = -18.5 +offset_top = 14.0 +offset_right = 17.5 +offset_bottom = 33.0 +theme_override_colors/font_color = Color(0.890196, 0.486275, 0.196078, 1) +theme_override_font_sizes/font_size = 10 +text = "Out +ems 3" +horizontal_alignment = 1 +metadata/_edit_use_anchors_ = true diff --git a/scenes/pribor-prd-k/pribor_prd_k.gd b/scenes/pribor-prd-k/pribor_prd_k.gd index 0a10721..bcd55a5 100644 --- a/scenes/pribor-prd-k/pribor_prd_k.gd +++ b/scenes/pribor-prd-k/pribor_prd_k.gd @@ -1,32 +1,394 @@ @tool extends "res://scenes/контроль/прибор.gd" -enum STATE_VAL { - NONE = 0, - GOOD = 1, - ERROR = 2 } +const Constants = { + "IN_BLANK_PRD": 1, + "OUT_BLANK_PRD": 13, + "CI_1_OT_FS": 8, + "CI_6_OT_FS": 13, + "CI_7_OT_FS": 14, + "CI_1_B_UF": 3, + "CI_6_B_UF": 4, + "CI_7_B_UF": 5, + "CONST_MIN_TEMP": -25, + "MAXIMUM_CODE_ADC": 3796, + "MINIMUM_CODE_AD": 2660, + "TEMPERATURE_UKP_1": 47, + "TEMPERATURE_UKP_2": 79, + "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": 70, + "POWER_THRESHOLD": 40, + "TIMER_DELAY": 1.5, + "dou_ray_nuber": 0x3, + "attenutor_um_1": 0x7, + "attenutor_um_2": 0x7, + "attenutor_um_3": 0x7, +} +enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } +# Основные переменные +var count_packet_1:int = 0 +var count_packet_2:int = 0 +var power_array_1: Array = [] +var power_array_2: Array = [] +var currecnt_unit: String +var ug_work_1: int +var ug_work_2: int +var ug_work_3: int +# Флаги и таймеры +var control_timer: Timer = Timer.new() +var flag_timer_started: bool = false +# Результаты контроля +var _control_results: Dictionary = { + "block_ip": false, # Проверка касет П1 и ИП МА2000 + "temperature": true, # Проверка температур УМ + "dkm_1": false, # Проверка ДКМ + "dkm_2": false, # Проверка ДКМ + "power_ukp": false, # Мощность от УКП + "fs_1": false, # Проверка ФС + "fs_2": false, + "fs_3": false, +} func _ready() -> void: - pass - #var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) - #var unit_prd = network.units[unit_key] - #unit_prd.connect('data_received', Callable(self, 'on_data_received')) - #unit_prd.connect('line_changed', Callable(self, 'on_line_changed')) - #set_default_state() + initialize_connections() + setup_timer() + set_default_state() -func set_default_state(): - $utm80_A9.state = STATE_VAL.NONE - $um1535_A10.state = STATE_VAL.NONE - $um1535_A11.state = STATE_VAL.NONE - $um1535_A12.state = STATE_VAL.NONE - $um1535_A13.state = STATE_VAL.NONE - $um1535_A14.state = STATE_VAL.NONE - $um1535_A15.state = STATE_VAL.NONE - $um1535_A16.state = STATE_VAL.NONE - $um1535_A17.state = STATE_VAL.NONE - $um1535_A18.state = STATE_VAL.NONE - $um1535_A19.state = STATE_VAL.NONE - $um1535_A20.state = STATE_VAL.NONE - $um1535_A21.state = STATE_VAL.NONE +func initialize_connections() -> void: + signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state')) + var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) + var unit_prd = network.units[unit_key] + currecnt_unit = unit_prd.name + unit_prd.connect('data_received', Callable(self, 'on_data_received')) + unit_prd.connect('line_changed', Callable(self, 'on_line_changed')) + + +func setup_timer() -> void: + add_child(control_timer) + control_timer.connect('timeout', Callable(self, 'on_stop_control')) + control_timer.one_shot = true + control_timer.wait_time = 10.0 + control_timer.start() + + +func set_default_state() -> void: + for group in get_tree().get_nodes_in_group('default_reset'): + group.state = STATE_VAL.NONE + + for group in get_tree().get_nodes_in_group('power_amplifier'): + group.state = STATE_VAL.NONE + + +func _enter_tree() -> void: + $control_result.text = '' + signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) + _on_control_fs(true) + + +func _exit_tree() -> void: + var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) + var unit_prd = network.units[unit_key] + var prd_module = prd.prd_dict[unit_prd.name] + + prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, ug_work_1, Constants.ADDR_UG_LITERA_2, ug_work_2]]) + + +func on_line_changed(unit_prd: Object) -> void: + if not unit_prd.online: + set_default_state() + + +func on_data_received(unit_prd: Object) -> void: + if not is_inside_tree(): + return + + var status = unit_prd.status + check_block_ip(status) + check_temperature_um(status) + # Обработка данных ЭМС + _process_ems_data(status) + + if flag_timer_started: + check_dkm(status, Constants.DKM_BIT_1) + check_dkm(status, Constants.DKM_BIT_6) + check_dkm(status, Constants.DKM_BIT_7) + # Обработка мощности от УКП + _process_ukp_power(status) + + +# Обрабатывает данные ЭМС и обновляет UI панели +func _process_ems_data(status: PackedByteArray) -> void: + ## Контроль ЭМС + var in_blank: int = status.decode_u16(Constants.IN_BLANK_PRD) + var out_blank: int = status.decode_u16(Constants.OUT_BLANK_PRD) + + # Обновление фреймов для входных сигналов + $Monitoring_panel/in_fs_1.frame = (in_blank >> Constants.CI_6_OT_FS) & 1 + $Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_7_OT_FS) & 1 + $Monitoring_panel/in_fs_3.frame = (in_blank >> Constants.CI_1_OT_FS) & 1 + + # Обновление фреймов для выходных сигналов ЭМС + $Monitoring_panel/out_ems_1.frame = (out_blank >> Constants.CI_6_B_UF) & 1 + $Monitoring_panel/out_ems_2.frame = (out_blank >> Constants.CI_7_B_UF) & 1 + $Monitoring_panel/out_ems_3.frame = (out_blank >> Constants.CI_1_B_UF) & 1 + + +## Проверка касет П1 и ИП МА2000 +func check_block_ip(status_prd: PackedByteArray) -> void : + var ug_online: bool = (status_prd[0] >> 1) & 1 + if ug_online: + const BYTE_DRY_CONTACT: int = 27 + const BIT_MAA2000_1: int = 0 + const BIT_MAA2000_2: int = 1 + const BIT_IP9_50_1: int = 2 + const BIT_IP9_50_2: int = 3 + const BIT_IP12_50_1: int = 4 + const BIT_IP9_50_3: int = 5 + const BIT_IP12_50_2: int = 6 + + var maa2000_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_MAA2000_1 & 1 + var maa2000_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_MAA2000_2 & 1 + var ip9_50_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_1 & 1 + var ip9_50_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_2 & 1 + var ip12_50_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP12_50_1 & 1 + var ip9_50_3 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_3 & 1 + var ip12_50_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP12_50_2 & 1 + + $maa2000_A23.state = STATE_VAL.ERROR if maa2000_1 else STATE_VAL.GOOD + $maa2000_A22.state = STATE_VAL.ERROR if maa2000_2 else STATE_VAL.GOOD + $kasseta_p_1/ref_A26.state = STATE_VAL.ERROR if ip9_50_1 else STATE_VAL.GOOD + $kasseta_p_1/ref_A23.state = STATE_VAL.ERROR if ip9_50_2 else STATE_VAL.GOOD + $kasseta_p_1/ref_A24.state = STATE_VAL.ERROR if ip12_50_1 else STATE_VAL.GOOD + $kasseta_p_2/ref_A26.state = STATE_VAL.ERROR if ip9_50_3 else STATE_VAL.GOOD + $kasseta_p_2/ref_A23.state = STATE_VAL.ERROR if ip12_50_2 else STATE_VAL.GOOD + else: + $maa2000_A23.state = STATE_VAL.NONE + $maa2000_A22.state = STATE_VAL.NONE + $kasseta_p_1/ref_A26.state = STATE_VAL.NONE + $kasseta_p_1/ref_A23.state = STATE_VAL.NONE + $kasseta_p_1/ref_A24.state = STATE_VAL.NONE + $kasseta_p_2/ref_A26.state = STATE_VAL.NONE + $kasseta_p_2/ref_A23.state = STATE_VAL.NONE + + _control_results["block_ip"] = ( + $maa2000_A23.state == STATE_VAL.GOOD and + $maa2000_A22.state == STATE_VAL.GOOD and + $kasseta_p_1/ref_A26.state == STATE_VAL.GOOD and + $kasseta_p_1/ref_A23.state == STATE_VAL.GOOD and + $kasseta_p_1/ref_A24.state == STATE_VAL.GOOD and + $kasseta_p_2/ref_A26.state == STATE_VAL.GOOD and + $kasseta_p_2/ref_A23.state == STATE_VAL.GOOD + ) + + +## Проверка температур УМ от УКП +func check_temperature_um(status_prd: PackedByteArray) -> void: + var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + const TEMP: float = 115.0 / (Constants.MAXIMUM_CODE_ADC - Constants.MINIMUM_CODE_AD) + var ukp1_online: int = (status_prd[0] >> 2) & 1 + if ukp1_online: + var tmp_1: int + var temperature_ukp_1: int + for i_temp in range(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].value0 = tmp_1 + # Темпуратура от УМ литеры 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].value0 = tmp_1 + + var ukp2_online = (status_prd[0] >> 3) & 1 + if ukp2_online: + for i_temp in range(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) + power_amplifier[i_temp+7].value0 = tmp_2 + + +## Проверка ДКМ +func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> void: + const DKM: int = 28 + + var status_dkm = status_prd[DKM] >> bit_dkm & 1 + if bit_dkm == 5: + $dou6_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + _control_results["dkm_1"] = status_dkm + elif bit_dkm == 6: + $dou7_A8.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + _control_results["dkm_2"] = status_dkm + elif bit_dkm == 0: + $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + _control_results["dkm_3"] = status_dkm + + +func _process_ukp_power(status: PackedByteArray) -> void: + ## Мощность УМ от УКП 1 + var arr_power_ukp_1: Array = [] + + if (status[0] >> 2) & 1: + var power_ukp_1: int + for i_power in range(6): + power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * i_power) + arr_power_ukp_1.append(power_ukp_1) + # Мощность от УМ (УКП) литеры 3 + power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7) + arr_power_ukp_1.append(power_ukp_1) + + if count_packet_1 == 0: + power_array_1 = arr_power_ukp_1 + else: + for i in arr_power_ukp_1.size(): + if arr_power_ukp_1[i] > power_array_1[i]: + power_array_1[i] = arr_power_ukp_1[i] + + var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + for i in 7: + power_amplifier[i].value1 = '%d' % power_array_1[i] + power_amplifier[i].state = STATE_VAL.GOOD if power_array_1[i] > 40 else STATE_VAL.ERROR + count_packet_1 += 1 + + ## Мощность УМ от УКП 2 + var arr_power_ukp_2: Array = [] + if (status[0] >> 2) & 1: + for i_power in range(6): + var power_ukp_2 = status.decode_u16(Constants.POWER_UKP_2 + 2 * i_power) + arr_power_ukp_2.append(power_ukp_2) + + if count_packet_2 == 0: + power_array_2 = arr_power_ukp_2 + else: + for i in arr_power_ukp_2.size(): + if arr_power_ukp_2[i] > power_array_2[i]: + power_array_2[i] = arr_power_ukp_2[i] + + for i in 6: + power_amplifier[i+7].value1 = '%d' % power_array_2[i] + power_amplifier[i+7].state = STATE_VAL.GOOD if power_array_2[i] > 40 else STATE_VAL.ERROR + + count_packet_2 += 1 + + _control_results["power_ukp"] = true + for amp in power_amplifier: + if amp.state != STATE_VAL.GOOD: + _control_results["power_ukp"] = false + break + + +func _on_control_fs(mode: bool) -> void: + var interfer_name: String + var fs_arr: Array + if mode: + interfer_name = 'k1' + fs_arr = [[90.0, 2450.0, 1500.0, 23]] + else: + interfer_name = 'off' + fs_arr = [[90.0, 2450.0, 1500.0, 23]] + signaller.emit_signal('interfer_init', interfer_name, fs_arr) + + +func on_stop_control() -> void: + print_debug('Отсановка контроля ПРД') + _on_control_fs(false) + on_control_result() + + +func on_fs_update_state(packet_type_7: Dictionary) -> void: + var parts = currecnt_unit.split('-') + var last_part = parts[-1] # Прибор + + # Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора + var fs_mapping = { + 0: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '1к' }, + 1: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '4к' }, + 2: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '3к' }, + 3: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '2к' }, + 20: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '1к' }, + 21: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '4к' }, + 22: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '3к' }, + 23: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '2к' }, + 24: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '1к' }, + 25: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '4к' }, + 26: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '3к' }, + 27: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '2к' }, + } + for fs in packet_type_7: + if fs in fs_mapping and fs_mapping[fs]["condition"]: + var data = packet_type_7[fs] + var state = STATE_VAL.GOOD if data.isg == 1 else STATE_VAL.ERROR if data.isg == 0 else STATE_VAL.NONE + fs_mapping[fs]["node"].state = state + if fs < 4: + _control_results["fs_1"] = (data.isg == 1) + elif fs <24: + _control_results["fs_2"] = (data.isg == 1) + else: + _control_results["fs_3"] = (data.isg == 1) + if _control_results['fs_1'] and _control_results["fs_2"] and _control_results["fs_3"] and not flag_timer_started: + on_ug_setting() + control_timer.wait_time = Constants.TIMER_DELAY + control_timer.start() + flag_timer_started = true + + +func on_ug_setting() -> void: + var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) + var unit_prd = network.units[unit_key] + + if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_1): + ug_work_1 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_1] + if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_2): + ug_work_2 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_2] + if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_3): + ug_work_3 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_3] + + var result_1 = ((Constants.attenutor_um_1 & 0x07) << 3) | (Constants.dou_ray_nuber & 0x07) + var result_2 = ((Constants.attenutor_um_2 & 0x07) << 3) | (Constants.dou_ray_nuber & 0x07) + var prd_module = prd.prd_dict[unit_prd.name] + prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, result_1, + Constants.ADDR_UG_LITERA_2, result_2, + Constants.ADDR_UG_LITERA_3, Constants.attenutor_um_3, + Constants.BASE_ADDR_EMS_G, 6666]]) + + prd_module.cmd_array.append([unit_prd.CmdCode.READ_ISA, [Constants.ADDR_UG_LITERA_1, Constants.ADDR_UG_LITERA_2, Constants.ADDR_UG_LITERA_3]]) + +func on_mode_changed(in_tree: bool) -> void: + if not in_tree: + queue_free() + + +func on_control_result() -> void: + var result: bool = true + + for key in _control_results: + if not _control_results[key]: + if key == 'fs_1': + $kasseta_fs_kd/ref_A3.state = STATE_VAL.ERROR + if key == 'fs_2': + $kasseta_fs_kd/ref_A6.state = STATE_VAL.ERROR + if key == 'fs_3': + $kasseta_fs_kd/ref_A5.state = STATE_VAL.ERROR + result = false + print_debug('%s false' % key) + + var parts = currecnt_unit.split('-') + var last_part = parts[-1] # Прибор + if result: + $control_result.text = 'Прибор ПРД-%s исправен' % last_part + $control_result.add_theme_color_override("font_color", Color.AQUAMARINE) + else: + $control_result.text = 'Прибор ПРД-%s неисправен' % last_part + $control_result.add_theme_color_override("font_color", Color.CRIMSON) + await get_tree().create_timer(Constants.TIMER_DELAY).timeout + flag_timer_started = false diff --git a/scenes/pribor-prd-n/kasseta-fs-nd.tscn b/scenes/pribor-prd-n/kasseta-fs-nd.tscn index b69f57e..9ad7bd9 100644 --- a/scenes/pribor-prd-n/kasseta-fs-nd.tscn +++ b/scenes/pribor-prd-n/kasseta-fs-nd.tscn @@ -4,7 +4,7 @@ [ext_resource type="Script" uid="uid://crpedygm3gohi" path="res://scenes/контроль/кассета.gd" id="2_lxiqt"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="2_mkgdh"] -[node name="kasseta_fs_nd" type="NinePatchRect"] +[node name="kasseta_fs_vd" type="NinePatchRect"] offset_right = 310.0 offset_bottom = 190.0 texture = ExtResource("1_wgdti") @@ -26,7 +26,7 @@ text = "Кассета ФС-ВД" horizontal_alignment = 1 vertical_alignment = 1 -[node name="ref_A2" parent="." instance=ExtResource("2_mkgdh")] +[node name="ref_A2" parent="." groups=["default_reset"] instance=ExtResource("2_mkgdh")] offset_left = 55.0 offset_top = 32.0 offset_right = 105.0 diff --git a/scenes/pribor-prd-n/pribor-prd-n.tscn b/scenes/pribor-prd-n/pribor-prd-n.tscn index 1e23a7e..6db0e85 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.tscn +++ b/scenes/pribor-prd-n/pribor-prd-n.tscn @@ -43,7 +43,7 @@ offset_right = 15.0 offset_bottom = 30.0 script = ExtResource("1_bnnv3") -[node name="maa2000_A23" parent="." instance=ExtResource("2_is25t")] +[node name="maa2000_A23" parent="." groups=["default_reset"] instance=ExtResource("2_is25t")] layout_mode = 2 offset_left = 8.0 offset_top = 877.0 @@ -52,7 +52,7 @@ offset_bottom = 949.0 fname = "MAA2000" rname = "A23" -[node name="maa2000_A22" parent="." instance=ExtResource("2_is25t")] +[node name="maa2000_A22" parent="." groups=["default_reset"] instance=ExtResource("2_is25t")] layout_mode = 2 offset_left = 485.0 offset_top = 877.0 @@ -61,7 +61,7 @@ offset_bottom = 949.0 fname = "MAA2000" rname = "A22" -[node name="dou2_A5" parent="." instance=ExtResource("2_is25t")] +[node name="dou2_A5" parent="." groups=["default_reset"] instance=ExtResource("2_is25t")] layout_mode = 2 offset_left = 485.0 offset_top = 812.0 @@ -70,7 +70,7 @@ offset_bottom = 877.0 fname = "ДОУ-2" rname = "A5" -[node name="dou2_A6" parent="." instance=ExtResource("2_is25t")] +[node name="dou3_A6" parent="." groups=["default_reset"] instance=ExtResource("2_is25t")] layout_mode = 2 offset_left = 8.0 offset_top = 812.0 @@ -138,7 +138,7 @@ text = "Кассета ФС-НД" horizontal_alignment = 1 vertical_alignment = 1 -[node name="ref_A3" parent="kasseta_FS_ND" instance=ExtResource("7_eoqf2")] +[node name="ref_A3" parent="kasseta_FS_ND" groups=["default_reset"] instance=ExtResource("7_eoqf2")] offset_left = 55.0 offset_top = 32.0 offset_right = 105.0 @@ -153,6 +153,7 @@ offset_right = 155.0 offset_bottom = 182.0 fname = "Модуль ФС" rname = "A1" +state = 2 [node name="ref_A2" parent="kasseta_FS_ND" instance=ExtResource("7_eoqf2")] offset_left = 155.0 @@ -161,8 +162,9 @@ offset_right = 205.0 offset_bottom = 182.0 fname = "Модуль ФС" rname = "A2" +state = 2 -[node name="ref_A4" parent="kasseta_FS_ND" instance=ExtResource("7_eoqf2")] +[node name="ref_A4" parent="kasseta_FS_ND" groups=["default_reset"] instance=ExtResource("7_eoqf2")] offset_left = 205.0 offset_top = 32.0 offset_right = 255.0 @@ -184,7 +186,7 @@ patch_margin_bottom = 16 script = ExtResource("6_b5wvk") fname = "Кассета П-1" -[node name="ref_A21" parent="kasseta_P_1" instance=ExtResource("7_eoqf2")] +[node name="ref_A21" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_eoqf2")] offset_left = 9.0 offset_top = 33.0 offset_right = 59.0 @@ -192,7 +194,7 @@ offset_bottom = 183.0 fname = "ИП12-50" rname = "A21" -[node name="ref_A20" parent="kasseta_P_1" instance=ExtResource("7_eoqf2")] +[node name="ref_A20" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_eoqf2")] offset_left = 59.0 offset_top = 33.0 offset_right = 109.0 @@ -200,7 +202,7 @@ offset_bottom = 183.0 fname = "ИП9-50" rname = "A20" -[node name="ref_A19" parent="kasseta_P_1" instance=ExtResource("7_eoqf2")] +[node name="ref_A19" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_eoqf2")] offset_left = 109.0 offset_top = 33.0 offset_right = 159.0 @@ -376,6 +378,7 @@ fname = "УМ1535А" rname = "A18" [node name="Monitoring_panel" type="Panel" parent="."] +visible = false layout_mode = 0 theme_override_styles/panel = SubResource("StyleBoxTexture_bnnv3") @@ -446,3 +449,14 @@ theme_override_font_sizes/font_size = 10 text = "Out ems 2" horizontal_alignment = 1 + +[node name="control_result" type="Label" parent="."] +layout_mode = 0 +offset_left = 9.0 +offset_top = 960.0 +offset_right = 649.0 +offset_bottom = 1003.0 +theme_override_colors/font_color = Color(0.862745, 0.0784314, 0.235294, 1) +theme_override_font_sizes/font_size = 28 +horizontal_alignment = 1 +metadata/_edit_lock_ = true diff --git a/scenes/pribor-prd-n/pribor_prd_n.gd b/scenes/pribor-prd-n/pribor_prd_n.gd index 6f822dd..aecf3f1 100644 --- a/scenes/pribor-prd-n/pribor_prd_n.gd +++ b/scenes/pribor-prd-n/pribor_prd_n.gd @@ -1,43 +1,92 @@ @tool extends "res://scenes/контроль/прибор.gd" -const IN_BLANK_PRD: int = 1 -const OUT_BLANK_PRD: int = 13 -const CI_2_OT_FS: int = 9 -const CI_3_OT_FS: int = 10 -const CI_2_B_UF: int = 1 -const CI_3_B_UF: int = 2 -const POWER_UKP_1: int = 31 -const POWER_UKP_2: int = 63 - -var timer_03: Timer = Timer.new() +const Constants = { + "IN_BLANK_PRD": 1, + "OUT_BLANK_PRD": 13, + "CI_2_OT_FS": 9, + "CI_3_OT_FS": 10, + "CI_2_B_UF": 4, + "CI_3_B_UF": 5, + "POWER_UKP_1": 31, + "POWER_UKP_2": 63, + "DKM_BIT_2": 1, + "DKM_BIT_3": 2, + "ADDR_UG_LITERA_1": 0x106, + "ADDR_UG_LITERA_2": 0x108, + "TEMP_THRESHOLD": 70, + "POWER_THRESHOLD": 40, + "TIMER_DELAY": 1.0 +} +enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } +# Основные переменные var count_packet_1:int = 0 -var power_array_1: Array = [] var count_packet_2:int = 0 +var power_array_1: Array = [] var power_array_2: Array = [] - -enum STATE_VAL { - NONE = 0, - GOOD = 1, - ERROR = 2 } +var currecnt_unit: String +var ug_work_1: int +var ug_work_2: int +# Флаги и таймеры +var control_timer: Timer = Timer.new() +var flag_timer_started: bool = false +# Результаты контроля +var _control_results: Dictionary = { + "block_ip": false, # Проверка касет П1 и ИП МА2000 + "temperature": true, # Проверка температур УМ + "dkm_1": false, # Проверка ДКМ + "dkm_2": false, # Проверка ДКМ + "power_ukp": false, # Мощность от УКП + "fs_1": false, # Проверка ФС + "fs_2": false, +} func _ready() -> void: + initialize_connections() + setup_timer() + set_default_state() + + +func initialize_connections() -> void: + signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state')) var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) var unit_prd = network.units[unit_key] + currecnt_unit = unit_prd.name unit_prd.connect('data_received', Callable(self, 'on_data_received')) unit_prd.connect('line_changed', Callable(self, 'on_line_changed')) - set_default_state() - self.add_child(timer_03) - timer_03.connect('timeout', Callable(self, 'on_timer_03')) - #on_timer_03(unit_key) + + +func setup_timer() -> void: + add_child(control_timer) + control_timer.connect('timeout', Callable(self, 'on_stop_control')) + control_timer.one_shot = true + control_timer.wait_time = 10.0 + control_timer.start() func set_default_state() -> void: + for group in get_tree().get_nodes_in_group('default_reset'): + group.state = STATE_VAL.NONE + for group in get_tree().get_nodes_in_group('power_amplifier'): group.state = STATE_VAL.NONE +func _enter_tree() -> void: + $control_result.text = '' + signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) + _on_control_fs(true) + + +func _exit_tree() -> void: + var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) + var unit_prd = network.units[unit_key] + var prd_module = prd.prd_dict[unit_prd.name] + + prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, ug_work_1, Constants.ADDR_UG_LITERA_2, ug_work_2]]) + + func on_line_changed(unit_prd: Object) -> void: if not unit_prd.online: set_default_state() @@ -47,70 +96,32 @@ func on_data_received(unit_prd: Object) -> void: if not is_inside_tree(): return - check_block_ip(unit_prd.status) - check_temperature_um(unit_prd.status) + var status = unit_prd.status + check_block_ip(status) + check_temperature_um(status) + # Обработка данных ЭМС + _process_ems_data(status) + if flag_timer_started: + check_dkm(status, Constants.DKM_BIT_2) + check_dkm(status, Constants.DKM_BIT_3) + # Обработка мощности от УКП + _process_ukp_power(status) + + +# Обрабатывает данные ЭМС и обновляет UI панели +func _process_ems_data(status: PackedByteArray) -> void: ## Контроль ЭМС - #_process_ems_data(unit_prd) + var in_blank: int = status.decode_u16(Constants.IN_BLANK_PRD) + var out_blank: int = status.decode_u16(Constants.OUT_BLANK_PRD) - var in_blank: int = unit_prd.status.decode_u16(IN_BLANK_PRD) - var out_blank: int = unit_prd.status.decode_u16(OUT_BLANK_PRD) + # Обновление фреймов для входных сигналов + $Monitoring_panel/in_fs_1.frame = (in_blank >> Constants.CI_2_OT_FS) & 1 + $Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_3_OT_FS) & 1 - $Monitoring_panel/in_fs_1.frame = (in_blank >> CI_2_OT_FS) & 1 - $Monitoring_panel/in_fs_2.frame = (in_blank >> CI_3_OT_FS) & 1 - - $Monitoring_panel/out_ems_1.frame = (out_blank >> CI_2_B_UF) & 1 - $Monitoring_panel/out_ems_2.frame = (out_blank >> CI_3_B_UF) & 1 - - ## Мощность УМ от УКП 1 - if (in_blank >> CI_2_OT_FS) & 1: - const bit_dkm_1: int = 1 - check_dkm(unit_prd.status, bit_dkm_1) - - var arr_power_ukp_1: Array = [] - - if (unit_prd.status[0] >> 2) & 1: - for i_power in range(6): - var power_ukp_1 = unit_prd.status.decode_u16(POWER_UKP_1 + 2 * i_power) - arr_power_ukp_1.append(power_ukp_1) - - if count_packet_1 == 0: - power_array_1 = arr_power_ukp_1 - else: - for i in arr_power_ukp_1.size(): - if arr_power_ukp_1[i] > power_array_1[i]: - power_array_1[i] = arr_power_ukp_1[i] - - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - for i in 6: - power_amplifier[i].value1 = '%d' % power_array_1[i] - - count_packet_1 += 1 - - ## Мощность УМ от УКП 2 - if (in_blank >> CI_3_OT_FS) & 1: - const bit_dkm_2: int = 2 - check_dkm(unit_prd.status, bit_dkm_2) - - var arr_power_ukp_2: Array = [] - - if (unit_prd.status[0] >> 2) & 1: - for i_power in range(6): - var power_ukp_2 = unit_prd.status.decode_u16(POWER_UKP_2 + 2 * i_power) - arr_power_ukp_2.append(power_ukp_2) - - if count_packet_2 == 0: - power_array_2 = arr_power_ukp_2 - else: - for i in arr_power_ukp_2.size(): - if arr_power_ukp_2[i] > power_array_2[i]: - power_array_2[i] = arr_power_ukp_2[i] - - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - for i in 6: - power_amplifier[i+6].value1 = '%d' % power_array_2[i] - - count_packet_2 += 1 + # Обновление фреймов для выходных сигналов ЭМС + $Monitoring_panel/out_ems_1.frame = (out_blank >> Constants.CI_2_B_UF) & 1 + $Monitoring_panel/out_ems_2.frame = (out_blank >> Constants.CI_3_B_UF) & 1 ## Проверка касет П1 и ИП МА2000 @@ -142,6 +153,14 @@ func check_block_ip(status_prd: PackedByteArray) -> void : $kasseta_P_1/ref_A20.state = STATE_VAL.NONE $kasseta_P_1/ref_A21.state = STATE_VAL.NONE + _control_results["block_ip"] = ( + $maa2000_A23.state == STATE_VAL.GOOD and + $maa2000_A22.state == STATE_VAL.GOOD and + $kasseta_P_1/ref_A19.state == STATE_VAL.GOOD and + $kasseta_P_1/ref_A20.state == STATE_VAL.GOOD and + $kasseta_P_1/ref_A21.state == STATE_VAL.GOOD + ) + ## Проверка температур УМ от УКП func check_temperature_um(status_prd: PackedByteArray) -> void: @@ -173,14 +192,155 @@ func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> void: const DKM: int = 28 var status_dkm = status_prd[DKM] >> bit_dkm & 1 - if bit_dkm == 1: $dou2_A5.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR $kasseta_FS_ND/ref_A4.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + _control_results["dkm_1"] = status_dkm elif bit_dkm == 2: - $dou2_A6.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + $dou3_A6.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR $kasseta_FS_ND/ref_A3.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + _control_results["dkm_2"] = status_dkm -#func on_timer_03(unit_name): - #print(unit_name) +func _process_ukp_power(status: PackedByteArray) -> void: + ## Мощность УМ от УКП 1 + var arr_power_ukp_1: Array = [] + + if (status[0] >> 2) & 1: + for i_power in range(6): + var power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * i_power) + arr_power_ukp_1.append(power_ukp_1) + + if count_packet_1 == 0: + power_array_1 = arr_power_ukp_1 + else: + for i in arr_power_ukp_1.size(): + if arr_power_ukp_1[i] > power_array_1[i]: + power_array_1[i] = arr_power_ukp_1[i] + + var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + for i in 6: + power_amplifier[i].value1 = '%d' % power_array_1[i] + power_amplifier[i].state = STATE_VAL.GOOD if power_array_1[i] > 40 else STATE_VAL.ERROR + count_packet_1 += 1 + + ## Мощность УМ от УКП 2 + var arr_power_ukp_2: Array = [] + + if (status[0] >> 2) & 1: + for i_power in range(6): + var power_ukp_2 = status.decode_u16(Constants.POWER_UKP_2 + 2 * i_power) + arr_power_ukp_2.append(power_ukp_2) + + if count_packet_2 == 0: + power_array_2 = arr_power_ukp_2 + else: + for i in arr_power_ukp_2.size(): + if arr_power_ukp_2[i] > power_array_2[i]: + power_array_2[i] = arr_power_ukp_2[i] + + for i in 6: + power_amplifier[i+6].value1 = '%d' % power_array_2[i] + power_amplifier[i+6].state = STATE_VAL.GOOD if power_array_2[i] > 40 else STATE_VAL.ERROR + + count_packet_2 += 1 + + _control_results["power_ukp"] = true + for amp in power_amplifier: + if amp.state != STATE_VAL.GOOD: + _control_results["power_ukp"] = false + break + + +func _on_control_fs(mode: bool) -> void: + var interfer_name: String + var fs_arr: Array + if mode: + interfer_name = 'k1' + fs_arr = [[90.0, 2450.0, 1500.0, 23]] + else: + interfer_name = 'off' + fs_arr = [[90.0, 2450.0, 1500.0, 23]] + signaller.emit_signal('interfer_init', interfer_name, fs_arr) + + +func on_stop_control() -> void: + print_debug('Отсановка контроля ПРД') + _on_control_fs(false) + on_control_result() + +func on_fs_update_state(packet_type_7: Dictionary) -> void: + var parts = currecnt_unit.split('-') + var last_part = parts[-1] # Прибор + + # Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора + var fs_mapping = { + 4: { "node": $kasseta_FS_ND/ref_A1, "condition": last_part == '1н' }, + 5: { "node": $kasseta_FS_ND/ref_A1, "condition": last_part == '4н' }, + 6: { "node": $kasseta_FS_ND/ref_A1, "condition": last_part == '3н' }, + 7: { "node": $kasseta_FS_ND/ref_A1, "condition": last_part == '2н' }, + 8: { "node": $kasseta_FS_ND/ref_A2, "condition": last_part == '1н' }, + 9: { "node": $kasseta_FS_ND/ref_A2, "condition": last_part == '4н' }, + 10: { "node": $kasseta_FS_ND/ref_A2, "condition": last_part == '3н' }, + 11: { "node": $kasseta_FS_ND/ref_A2, "condition": last_part == '2н' } + } + for fs in packet_type_7: + if fs in fs_mapping and fs_mapping[fs]["condition"]: + var data = packet_type_7[fs] + var state = STATE_VAL.GOOD if data.isg == 1 else STATE_VAL.ERROR if data.isg == 0 else STATE_VAL.NONE + fs_mapping[fs]["node"].state = state + if fs < 8: + _control_results["fs_1"] = (data.isg == 1) + else: + _control_results["fs_2"] = (data.isg == 1) + if _control_results['fs_1'] and _control_results["fs_2"] and not flag_timer_started: + on_ug_setting() + control_timer.wait_time = Constants.TIMER_DELAY + control_timer.start() + flag_timer_started = true + + +func on_ug_setting() -> void: + var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) + var unit_prd = network.units[unit_key] + + if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_1): + ug_work_1 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_1] + if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_2): + ug_work_2 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_2] + + const dou = 0x3 + const att = 0x7 + var result = ((att & 0x07) << 3) | (dou & 0x07) + + var prd_module = prd.prd_dict[unit_prd.name] + prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, result, Constants.ADDR_UG_LITERA_2, result, 0x120, 6666]]) + + +func on_mode_changed(in_tree: bool) -> void: + if not in_tree: + queue_free() + + +func on_control_result() -> void: + var result: bool = true + + for key in _control_results: + if not _control_results[key]: + if key == 'fs_1': + $kasseta_FS_ND/ref_A1.state = STATE_VAL.ERROR + if key == 'fs_2': + $kasseta_FS_ND/ref_A2.state = STATE_VAL.ERROR + result = false + print_debug('%s false' % key) + + var parts = currecnt_unit.split('-') + var last_part = parts[-1] # Прибор + if result: + $control_result.text = 'Прибор ПРД-%s исправен' % last_part + $control_result.add_theme_color_override("font_color", Color.AQUAMARINE) + else: + $control_result.text = 'Прибор ПРД-%s неисправен' % last_part + $control_result.add_theme_color_override("font_color", Color.CRIMSON) + await get_tree().create_timer(Constants.TIMER_DELAY).timeout + flag_timer_started = false diff --git a/scenes/pribor-prd-v/kasseta-fs-vd.tscn b/scenes/pribor-prd-v/kasseta-fs-vd.tscn index 4f8ed66..71f8563 100644 --- a/scenes/pribor-prd-v/kasseta-fs-vd.tscn +++ b/scenes/pribor-prd-v/kasseta-fs-vd.tscn @@ -34,7 +34,7 @@ offset_bottom = 182.0 fname = "Модуль ФС" rname = "A1" -[node name="ref_A3" parent="." instance=ExtResource("3_w4hiq")] +[node name="ref_A3" parent="." groups=["default_reset"] instance=ExtResource("3_w4hiq")] offset_left = 105.0 offset_top = 32.0 offset_right = 155.0 @@ -50,7 +50,7 @@ offset_bottom = 182.0 fname = "Модуль ФС" rname = "A2" -[node name="ref_A4" parent="." instance=ExtResource("3_w4hiq")] +[node name="ref_A4" parent="." groups=["default_reset"] instance=ExtResource("3_w4hiq")] offset_left = 205.0 offset_top = 32.0 offset_right = 255.0 diff --git a/scenes/pribor-prd-v/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index 0b3bd17..7b44559 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.tscn +++ b/scenes/pribor-prd-v/pribor-prd-v.tscn @@ -44,7 +44,7 @@ offset_right = 15.0 offset_bottom = 30.0 script = ExtResource("1_c20s6") -[node name="maa2000_A22" parent="." instance=ExtResource("2_xpo4b")] +[node name="maa2000_A22" parent="." groups=["default_reset"] instance=ExtResource("2_xpo4b")] layout_mode = 2 offset_left = 485.0 offset_top = 877.0 @@ -53,7 +53,7 @@ offset_bottom = 949.0 fname = "MAA2000" rname = "A22" -[node name="dou4_A5" parent="." instance=ExtResource("2_xpo4b")] +[node name="dou4_A5" parent="." groups=["default_reset"] instance=ExtResource("2_xpo4b")] layout_mode = 2 offset_left = 485.0 offset_top = 812.0 @@ -62,7 +62,7 @@ offset_bottom = 877.0 fname = "ДОУ-4" rname = "A5" -[node name="maa2000_A23" parent="." instance=ExtResource("2_xpo4b")] +[node name="maa2000_A23" parent="." groups=["default_reset"] instance=ExtResource("2_xpo4b")] layout_mode = 2 offset_left = 8.0 offset_top = 877.0 @@ -71,7 +71,7 @@ offset_bottom = 949.0 fname = "MAA2000" rname = "A23" -[node name="dou5_A6" parent="." instance=ExtResource("2_xpo4b")] +[node name="dou5_A6" parent="." groups=["default_reset"] instance=ExtResource("2_xpo4b")] layout_mode = 2 offset_left = 8.0 offset_top = 812.0 @@ -135,7 +135,7 @@ patch_margin_bottom = 16 script = ExtResource("6_os4mt") fname = "Кассета П-1В" -[node name="ref_A19" parent="kasseta_P_1" instance=ExtResource("7_38u2b")] +[node name="ref_A19" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_38u2b")] offset_left = 9.0 offset_top = 33.0 offset_right = 59.0 @@ -143,7 +143,7 @@ offset_bottom = 183.0 fname = "ИП9-50" rname = "A19" -[node name="ref_A20" parent="kasseta_P_1" instance=ExtResource("7_38u2b")] +[node name="ref_A20" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_38u2b")] offset_left = 59.0 offset_top = 33.0 offset_right = 109.0 @@ -151,7 +151,7 @@ offset_bottom = 183.0 fname = "ИП9-50" rname = "A20" -[node name="ref_A21" parent="kasseta_P_1" instance=ExtResource("7_38u2b")] +[node name="ref_A21" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_38u2b")] offset_left = 109.0 offset_top = 33.0 offset_right = 159.0 @@ -329,6 +329,7 @@ fname = "УМ1535А" rname = "A18" [node name="Monitoring_panel" type="Panel" parent="."] +visible = false layout_mode = 0 theme_override_styles/panel = SubResource("StyleBoxTexture_vxfkm") @@ -408,5 +409,6 @@ offset_right = 649.0 offset_bottom = 1003.0 theme_override_colors/font_color = Color(0.862745, 0.0784314, 0.235294, 1) theme_override_font_sizes/font_size = 28 +text = "Прибор ПРД- неисправен" horizontal_alignment = 1 metadata/_edit_lock_ = true diff --git a/scenes/pribor-prd-v/pribor_prd_v.gd b/scenes/pribor-prd-v/pribor_prd_v.gd index acd1a63..fe6b8a8 100644 --- a/scenes/pribor-prd-v/pribor_prd_v.gd +++ b/scenes/pribor-prd-v/pribor_prd_v.gd @@ -6,8 +6,8 @@ const Constants = { "OUT_BLANK_PRD": 13, "CI_4_OT_FS": 11, "CI_5_OT_FS": 12, - "CI_4_B_UF": 1, - "CI_5_B_UF": 2, + "CI_4_B_UF": 4, + "CI_5_B_UF": 5, "POWER_UKP_1": 31, "POWER_UKP_2": 63, "DKM_BIT_3": 3, @@ -16,7 +16,7 @@ const Constants = { "ADDR_UG_LITERA_2": 0x108, "TEMP_THRESHOLD": 70, "POWER_THRESHOLD": 40, - "TIMER_DELAY": 2.0 + "TIMER_DELAY": 1.0 } enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } # Основные переменные @@ -80,8 +80,8 @@ func _exit_tree() -> void: func set_default_state() -> void: - for node in [$kasseta_P_1/ref_A19, $kasseta_P_1/ref_A20, $kasseta_P_1/ref_A21, $maa2000_A23, $maa2000_A22]: - node.state = STATE_VAL.NONE + for group in get_tree().get_nodes_in_group('default_reset'): + group.state = STATE_VAL.NONE for group in get_tree().get_nodes_in_group('power_amplifier'): group.state = STATE_VAL.NONE @@ -102,6 +102,7 @@ func on_data_received(unit_prd: Object) -> void: check_temperature_um(status) # Обработка данных ЭМС _process_ems_data(status) + if flag_timer_started: check_dkm(status, Constants.DKM_BIT_3) check_dkm(status, Constants.DKM_BIT_4) @@ -185,12 +186,12 @@ func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> void: const DKM: int = 28 var status_dkm = status_prd[DKM] >> bit_dkm & 1 if bit_dkm == Constants.DKM_BIT_3: - $dou4_A5.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR - $kasseta_FS_VD/ref_A6.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR - _control_results["dkm_1"] = status_dkm - elif bit_dkm == Constants.DKM_BIT_4: $dou5_A6.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR $kasseta_FS_VD/ref_A2.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + _control_results["dkm_1"] = status_dkm + elif bit_dkm == Constants.DKM_BIT_4: + $dou4_A5.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + $kasseta_FS_VD/ref_A6.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR _control_results["dkm_2"] = status_dkm diff --git a/scenes/контроль/кассета-п-2.tscn b/scenes/контроль/кассета-п-2.tscn index 077b080..d76a49e 100644 --- a/scenes/контроль/кассета-п-2.tscn +++ b/scenes/контроль/кассета-п-2.tscn @@ -14,7 +14,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 script = ExtResource("2_mdnod") -[node name="ref_A26" parent="." instance=ExtResource("3_4a27g")] +[node name="ref_A26" parent="." groups=["default_reset"] instance=ExtResource("3_4a27g")] offset_left = 10.0 offset_top = 30.0 offset_right = 60.0 @@ -22,7 +22,7 @@ offset_bottom = 180.0 fname = "ИП9-50" rname = "A22" -[node name="ref_A23" parent="." instance=ExtResource("3_4a27g")] +[node name="ref_A23" parent="." groups=["default_reset"] instance=ExtResource("3_4a27g")] offset_left = 60.0 offset_top = 30.0 offset_right = 110.0