From 08bd7ca39fec825b6d346742a4c5ca1596de4735 Mon Sep 17 00:00:00 2001 From: Maxim Date: Mon, 11 Aug 2025 16:13:51 +0300 Subject: [PATCH 1/9] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 1 + scenes/pribor-prd-k/kasseta-fs-kd.tscn | 9 ++++-- scenes/pribor-prd-k/pribor-prd-k.gd | 41 ++++++++++++++------------ scenes/pribor-prd-n/pribor-prd-n.tscn | 2 -- scripts/pribor-prd.gd | 7 ++--- 5 files changed, 32 insertions(+), 28 deletions(-) diff --git a/project.godot b/project.godot index e8ea6335..83e97938 100644 --- a/project.godot +++ b/project.godot @@ -148,6 +148,7 @@ external_cu=false default_reset="" power_supply="Ноды источников питания прибора" +fs_group="Группа модулей ФС" [gui] diff --git a/scenes/pribor-prd-k/kasseta-fs-kd.tscn b/scenes/pribor-prd-k/kasseta-fs-kd.tscn index d2192131..ac2d952b 100644 --- a/scenes/pribor-prd-k/kasseta-fs-kd.tscn +++ b/scenes/pribor-prd-k/kasseta-fs-kd.tscn @@ -34,13 +34,14 @@ offset_bottom = 183.0 fname = "Блок ФС-1" rname = "A4" -[node name="ref_A3" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")] +[node name="ref_A3" parent="." groups=["default_reset", "fs_group"] instance=ExtResource("3_kqnvt")] offset_left = 55.0 offset_top = 33.0 offset_right = 105.0 offset_bottom = 183.0 fname = "Модуль ФС" rname = "A1" +metadata/fs = "fs_1" [node name="ref_A4" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")] offset_left = 105.0 @@ -50,21 +51,23 @@ offset_bottom = 183.0 fname = "Блок ФС-2" rname = "A2" -[node name="ref_A6" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")] +[node name="ref_A6" parent="." groups=["default_reset", "fs_group"] instance=ExtResource("3_kqnvt")] offset_left = 155.0 offset_top = 33.0 offset_right = 205.0 offset_bottom = 183.0 fname = "Модуль ФС" rname = "A5" +metadata/fs = "fs_6" -[node name="ref_A5" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")] +[node name="ref_A5" parent="." groups=["default_reset", "fs_group"] instance=ExtResource("3_kqnvt")] offset_left = 205.0 offset_top = 33.0 offset_right = 255.0 offset_bottom = 183.0 fname = "Модуль ФС" rname = "A3" +metadata/fs = "fs_7" [node name="ref_A7" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")] offset_left = 255.0 diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index 0024da27..45f323a1 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -27,7 +27,7 @@ const Constants: Dictionary = { 'TEMP_THRESHOLD': 40, 'POWER_THRESHOLD': 40, 'TIMER_DELAY': 5.0, - 'dou_ray_nuber': 0x6, + 'dou_ray_nuber': 0x3, 'attenutor_um_1': 0x7, 'attenutor_um_2': 0x7, 'attenutor_um_3': 0x0, @@ -67,20 +67,7 @@ var block_config_k := { 'ip9_50_3': [5, false], 'ip12_50_2': [6, false], } -var fs_mapping_k = { - 0: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '1к' }, - 1: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '4к' }, - 2: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '3к' }, - 3: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '2к' }, - 20: { 'node': 'kasseta_fs_kd/ref_A6', 'condition': pribor == '1к' }, - 21: { 'node': 'kasseta_fs_kd/ref_A6', 'condition': pribor == '4к' }, - 22: { 'node': 'kasseta_fs_kd/ref_A6', 'condition': pribor == '3к' }, - 23: { 'node': 'kasseta_fs_kd/ref_A6', 'condition': pribor == '2к' }, - 24: { 'node': 'kasseta_fs_kd/ref_A5', 'condition': pribor == '1к' }, - 25: { 'node': 'kasseta_fs_kd/ref_A5', 'condition': pribor == '4к' }, - 26: { 'node': 'kasseta_fs_kd/ref_A5', 'condition': pribor == '3к' }, - 27: { 'node': 'kasseta_fs_kd/ref_A5', 'condition': pribor == '2к' }, - } +var fs_mapping_k: Dictionary = {} # Основные переменные var current_fs: int = 1 var state: int = STATE_MASHINE.INIT @@ -172,14 +159,28 @@ func on_state_mashine() -> void: func initialize_connections() -> void: - signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state')) var unit_name = get_meta('unit_name')[0] var unit_prd = network.get_unit_instance(unit_name) var current_unit = unit_prd.name var parts = current_unit.split('-') pribor = parts[-1] + fs_mapping_k = { + 0: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '1к' }, + 1: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '4к' }, + 2: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '3к' }, + 3: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '2к' }, + 20: { 'node': 'kasseta_fs_kd/ref_A6', 'condition': pribor == '1к' }, + 21: { 'node': 'kasseta_fs_kd/ref_A6', 'condition': pribor == '4к' }, + 22: { 'node': 'kasseta_fs_kd/ref_A6', 'condition': pribor == '3к' }, + 23: { 'node': 'kasseta_fs_kd/ref_A6', 'condition': pribor == '2к' }, + 24: { 'node': 'kasseta_fs_kd/ref_A5', 'condition': pribor == '1к' }, + 25: { 'node': 'kasseta_fs_kd/ref_A5', 'condition': pribor == '4к' }, + 26: { 'node': 'kasseta_fs_kd/ref_A5', 'condition': pribor == '3к' }, + 27: { 'node': 'kasseta_fs_kd/ref_A5', 'condition': pribor == '2к' }, + } unit_prd.connect('data_received', Callable(self, 'on_data_received')) unit_prd.connect('line_changed', Callable(self, 'on_line_changed')) + signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state').bind(fs_mapping_k)) func setup_timer() -> void: @@ -230,10 +231,11 @@ func on_data_received(unit_prd: Object) -> void: # 1. Обновляем статусы блоков block_config_k = node_common_func.check_block_ip(status, block_config_k) # 2. Обновляем ноды power_supply - for power_supply in get_tree().get_nodes_in_group('power_supply'): + var node_power_arr = get_tree().get_nodes_in_group('power_supply') + for power_supply in node_power_arr: var meta_ip = power_supply.get_meta('ip') if block_config_k.has(meta_ip): - power_supply.status = block_config_k[meta_ip][1] + power_supply.state = STATE_VAL.GOOD if block_config_k[meta_ip][1] else STATE_VAL.ERROR node_common_func.check_temperature_um(status, get_tree().get_nodes_in_group('power_amplifier')) # Обработка данных ЭМС @@ -245,7 +247,7 @@ func on_data_received(unit_prd: Object) -> void: flag_check_dkm = check_dkm(status, Constants.DKM_BIT_6) elif current_fs == 7 and _control_results.fs_7: flag_check_dkm = check_dkm(status, Constants.DKM_BIT_7) - + if flag_check_dkm: _process_ukp_power(status) @@ -366,6 +368,7 @@ func on_stop_control() -> void: func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary) -> void: # Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора + var fs_mapper: Array = get_tree().get_nodes_in_group('fs') for fs in packet_type_7: if fs in fs_mapping and fs_mapping[fs]['condition']: diff --git a/scenes/pribor-prd-n/pribor-prd-n.tscn b/scenes/pribor-prd-n/pribor-prd-n.tscn index eaa22e57..0d639ec6 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.tscn +++ b/scenes/pribor-prd-n/pribor-prd-n.tscn @@ -153,7 +153,6 @@ offset_right = 155.0 offset_bottom = 182.0 fname = "Модуль ФС" rname = "A1" -state = 2 [node name="ref_A2" parent="kasseta_FS_ND" groups=["default_reset"] instance=ExtResource("7_eoqf2")] offset_left = 155.0 @@ -162,7 +161,6 @@ offset_right = 205.0 offset_bottom = 182.0 fname = "Модуль ФС" rname = "A2" -state = 2 [node name="ref_A4" parent="kasseta_FS_ND" groups=["default_reset"] instance=ExtResource("7_eoqf2")] offset_left = 205.0 diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index 139dfcd1..4b3be6ff 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -27,14 +27,13 @@ static func manage_fs(mode: bool, pribor: String, pribor_config: Dictionary, fs_ ## Проверка касет П1 и ИП МА2000 static func check_block_ip(status_prd: PackedByteArray, block_config: Dictionary) -> Dictionary: # Конфигурация проверяемых блоков - const BYTE_DRY_CONTACT: int = 27 + var byte_dry: int = 27 var ug_online: bool = (status_prd[0] >> 1) & 1 for block in block_config: var bit: int = block_config[block][0] if ug_online: - var status = status_prd[BYTE_DRY_CONTACT] >> bit & 1 - block_config[block][1] = status - + var status = status_prd[byte_dry] >> bit & 1 + block_config[block][1] = false if status else true return block_config From bf6c0463cc809b83a227e10fe24def5b3c80b120 Mon Sep 17 00:00:00 2001 From: Maxim Date: Tue, 12 Aug 2025 23:11:51 +0300 Subject: [PATCH 2/9] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0,=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=89=D0=B5=D0=B3=D0=BE=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=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 | 377 ++++++++----------------- scenes/pribor-prd-n/pribor-prd-n.gd | 2 +- scenes/pribor-prd-v/pribor-prd-v.gd | 1 + scenes/настройки/настройки.gd | 2 +- scripts/pribor-prd.gd | 415 +++++++++++++++++++++++----- 5 files changed, 463 insertions(+), 334 deletions(-) diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index 45f323a1..67d37549 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -34,14 +34,14 @@ const Constants: Dictionary = { 'POWER_UM': 75, } # Конфигурация параметров для каждого прибора -const PRIBOR_CONFIG := { +const 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]}, } # Конфигурация частот и ширин для каждого ФС -const FS_PARAMS := { +const FS_PARAMS := { 1: {'freq': 450.0, 'width': 80.0}, 6: {'freq': 2450.0, 'width': 110.0}, 7: {'freq': 4750.0, 'width': 110.0} @@ -58,7 +58,7 @@ enum STATE_MASHINE { STOP_CONTROL, AWAIT } -var block_config_k := { +var block_ip_config_k := { 'maa2000_1': [0, false], 'maa2000_2': [1, false], 'ip9_50_1': [2, false], @@ -86,101 +86,81 @@ var ug_work_3: int = 0 var control_timer: Timer = Timer.new() var mashine_timer: Timer = Timer.new() var pribor: String +var prd_module: Object +var unit_prd: Object # Результаты контроля -var _control_results: Dictionary = { +var control_results: Dictionary = { 'block_ip': false, # Проверка касет П1 и ИП МА2000 'temperature': true, # Проверка температур УМ 'dkm_1': false, # Проверка ДКМ 1 'dkm_6': false, # Проверка ДКМ 6 'dkm_7': false, # Проверка ДКМ 7 - 'power_ip': false, # Мощность от УКП + 'power_um': false, # Мощность от УКП 'fs_1': false, # Проверка ФС 1 'fs_6': false, # Проверка ФС 6 'fs_7': false, # Проверка ФС 7 } static var node_common_func = load('res://scripts/pribor-prd.gd') +var test = preload('res://scripts/pribor-prd.gd') +var control_prd func _ready() -> void: if Engine.is_editor_hint(): return + initialize_connections() setup_timer() set_default_state() func on_state_mashine() -> void: - match state: - STATE_MASHINE.INIT: - if current_fs == 1 or current_fs == 6 or current_fs == 7: - state = STATE_MASHINE.FS_TURN_ON - else: - on_control_result() - state = STATE_MASHINE.AWAIT - - STATE_MASHINE.FS_TURN_ON: - node_common_func.manage_fs(true, pribor, PRIBOR_CONFIG, FS_PARAMS, current_fs, Constants.POWER_UM) - control_timer.wait_time = Constants.TIMER_DELAY - control_timer.start() - state = STATE_MASHINE.FS_WORK - - STATE_MASHINE.FS_WORK: - if (current_fs == 6 and flag_check_dkm and not flag_timer_started) or \ - (current_fs == 7 and flag_check_dkm and not flag_timer_started) or \ - (current_fs == 1 and not flag_timer_started): - state = STATE_MASHINE.UM_RUN - - STATE_MASHINE.UM_RUN: - var unit_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - var prd_module = prd.prd_dict[unit_prd.name] - prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.BASE_ADDR_EMS_G, 6666]]) - flag_timer_started = true - state = STATE_MASHINE.UG_SET - - STATE_MASHINE.UG_SET: - on_ug_setting() - state = STATE_MASHINE.FS_WORK - - STATE_MASHINE.FS_TURN_OFF: - node_common_func.manage_fs(false, pribor, PRIBOR_CONFIG, FS_PARAMS, current_fs, Constants.POWER_UM) - power_control_result() - state = STATE_MASHINE.STOP_CONTROL - - STATE_MASHINE.STOP_CONTROL: - flag_timer_started = false - flag_check_dkm = false - match current_fs: - 1: current_fs = 6 - 6: current_fs = 7 - 7: current_fs = 0 - state = STATE_MASHINE.INIT + control_prd.state_control_machine() + + block_ip_config_k = control_prd.block_config + var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') + for power_supply in node_ip_power_arr: + var meta_ip = power_supply.get_meta('ip') + if block_ip_config_k.has(meta_ip): + power_supply.state = STATE_VAL.GOOD if block_ip_config_k[meta_ip][1] else STATE_VAL.ERROR + + control_results = control_prd.control_results + if control_prd.current_fs == 1: + $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if control_results.dkm_1 else STATE_VAL.ERROR + elif control_prd.current_fs == 6: + $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if control_results.dkm_6 else STATE_VAL.ERROR + elif control_prd.current_fs == 7: + $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if control_results.dkm_7 else STATE_VAL.ERROR + + print(control_prd.power_result) + if not control_prd.power_result['ray_25_1'] or not control_prd.power_result['ray_25_6'] or not control_prd.power_result['ray_25_7']: + return + + var node_arr_power: Array = get_tree().get_nodes_in_group('power_amplifier') + for i_pow in node_arr_power.size(): + if i_pow < 1: + var pw = node_arr_power[i_pow] + pw.value1 = str(control_prd.power_result['ray_25_1'][i_pow]) + elif i_pow < 7: + var pw = node_arr_power[i_pow] + pw.value1 = str(control_prd.power_result['ray_25_6'][i_pow-1]) + elif i_pow < 13: + var pw = node_arr_power[i_pow] + pw.value1 = str(control_prd.power_result['ray_25_7'][i_pow-7]) func initialize_connections() -> void: var unit_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - var current_unit = unit_prd.name - var parts = current_unit.split('-') - pribor = parts[-1] - fs_mapping_k = { - 0: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '1к' }, - 1: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '4к' }, - 2: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '3к' }, - 3: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '2к' }, - 20: { 'node': 'kasseta_fs_kd/ref_A6', 'condition': pribor == '1к' }, - 21: { 'node': 'kasseta_fs_kd/ref_A6', 'condition': pribor == '4к' }, - 22: { 'node': 'kasseta_fs_kd/ref_A6', 'condition': pribor == '3к' }, - 23: { 'node': 'kasseta_fs_kd/ref_A6', 'condition': pribor == '2к' }, - 24: { 'node': 'kasseta_fs_kd/ref_A5', 'condition': pribor == '1к' }, - 25: { 'node': 'kasseta_fs_kd/ref_A5', 'condition': pribor == '4к' }, - 26: { 'node': 'kasseta_fs_kd/ref_A5', 'condition': pribor == '3к' }, - 27: { 'node': 'kasseta_fs_kd/ref_A5', 'condition': pribor == '2к' }, - } - unit_prd.connect('data_received', Callable(self, 'on_data_received')) + prd_module = prd.prd_dict[unit_name] + unit_prd = prd_module.unit_yau07 + + #signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state').bind(fs_mapping_k)) unit_prd.connect('line_changed', Callable(self, 'on_line_changed')) - signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state').bind(fs_mapping_k)) + var array_power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + var fs_node_array: Array = get_tree().get_nodes_in_group('fs_group') + control_prd = test.TestPRD.new($control_result, unit_prd, prd_module, Constants, PRIBOR_CONFIG, FS_PARAMS, block_ip_config_k, array_power_amplifier, control_results, fs_node_array) + add_child(control_prd) func setup_timer() -> void: @@ -189,12 +169,6 @@ func setup_timer() -> void: mashine_timer.wait_time = 0.5 mashine_timer.start() - 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'): @@ -207,204 +181,75 @@ func set_default_state() -> void: func _enter_tree() -> void: if Engine.is_editor_hint(): return - $control_result.text = '' + $control_result.text = 'Выполняется ...' + $control_result.add_theme_color_override('font_color', Color.ALICE_BLUE) signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) func _exit_tree() -> void: - var unit_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - 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, Constants.ADDR_UG_LITERA_3, ug_work_3]]) -func on_line_changed(unit_prd: Object) -> void: - if not unit_prd.online: +func on_line_changed(unit_pribor: Object) -> void: + if not unit_pribor.online: set_default_state() -func on_data_received(unit_prd: Object) -> void: - if not is_inside_tree(): - return - - var status: PackedByteArray = unit_prd.status - # 1. Обновляем статусы блоков - block_config_k = node_common_func.check_block_ip(status, block_config_k) - # 2. Обновляем ноды power_supply - var node_power_arr = get_tree().get_nodes_in_group('power_supply') - for power_supply in node_power_arr: - var meta_ip = power_supply.get_meta('ip') - if block_config_k.has(meta_ip): - power_supply.state = STATE_VAL.GOOD if block_config_k[meta_ip][1] else STATE_VAL.ERROR - - node_common_func.check_temperature_um(status, get_tree().get_nodes_in_group('power_amplifier')) - # Обработка данных ЭМС - #_process_ems_data(status) - - if current_fs == 1 and _control_results.fs_1: - flag_check_dkm = check_dkm(status, Constants.DKM_BIT_1) - elif current_fs == 6 and _control_results.fs_6: - flag_check_dkm = check_dkm(status, Constants.DKM_BIT_6) - elif current_fs == 7 and _control_results.fs_7: - flag_check_dkm = check_dkm(status, Constants.DKM_BIT_7) - - if flag_check_dkm: - _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) +#func on_data_received(unit_pribor: Object) -> void: + #if not is_inside_tree(): + #return # - ## Обновление фреймов для входных сигналов - #$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 + #var status: PackedByteArray = unit_pribor.status + ## 1. Обновляем статусы блоков + #block_config_k = node_common_func.check_block_ip(status, block_config_k) + ## 2. Обновляем ноды power_supply + #var node_power_arr = get_tree().get_nodes_in_group('power_supply') + #for power_supply in node_power_arr: + #var meta_ip = power_supply.get_meta('ip') + #if block_config_k.has(meta_ip): + #power_supply.state = STATE_VAL.GOOD if block_config_k[meta_ip][1] else STATE_VAL.ERROR # - ## Обновление фреймов для выходных сигналов ЭМС - #$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 + #node_common_func.check_temperature_um(status, get_tree().get_nodes_in_group('power_amplifier')) +# + #if current_fs == 1 and control_results.fs_1: + #control_results = node_common_func.check_dkm(status, Constants.DKM_BIT_1, control_results) + #flag_check_dkm = control_results.dkm_1 + #elif current_fs == 6 and control_results.fs_6: + #control_results = node_common_func.check_dkm(status, Constants.DKM_BIT_6, control_results) + #flag_check_dkm = control_results.fs_6 + #elif current_fs == 7 and control_results.fs_7: + #control_results = node_common_func.check_dkm(status, Constants.DKM_BIT_7, control_results) + #flag_check_dkm = control_results.dkm_7 +# + #var power_result: Dictionary = {'ray_25' : []} +# + #if flag_check_dkm: + #power_result = node_common_func.power_um_ukp(status, current_fs, power_result) -## Проверка ДКМ -func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> bool: - const DKM: int = 28 - - var status_dkm = status_prd[DKM] >> bit_dkm & 1 - print(status_prd[DKM]) - if bit_dkm == 5: - $dou6_A7.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_6'] = status_dkm - elif bit_dkm == 6: - $dou7_A8.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR - $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR - _control_results['dkm_7'] = status_dkm - elif bit_dkm == 0: - $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR - _control_results['dkm_1'] = status_dkm - return status_dkm +#func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary) -> void: + #var fs_result: Dictionary + #if current_fs == 1: + #fs_result = {'fs_1': STATE_VAL.NONE} + #elif current_fs == 6: + #fs_result = {'fs_6': STATE_VAL.NONE} + #elif current_fs == 7: + #fs_result = {'fs_7': STATE_VAL.NONE} + #fs_result = node_common_func.on_fs_state(packet_type_7, fs_mapping, fs_result) +# + #var fs_array: Array = get_tree().get_nodes_in_group('fs') + #for fs in fs_array: + #var fs_meta: String = fs.get_meta('fs') + #fs.state = fs_result[fs_meta] -func _process_ukp_power(status: PackedByteArray) -> void: - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - if current_fs == 1: - ## Мощность от УМ (УКП) литеры 1 - var arr_power_ukp_1: Array = [] - var power_ukp_1: int - 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] - - power_amplifier[6].value1 = '%d' % power_array_1[0] - power_amplifier[6].state = STATE_VAL.GOOD if power_array_1[0] > Constants.TEMP_THRESHOLD else STATE_VAL.ERROR - - count_packet_1 += 1 - - elif current_fs == 6: - ## Мощность УМ от УКП 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) - - if count_packet_6 == 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] - - 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] > Constants.TEMP_THRESHOLD else STATE_VAL.ERROR - count_packet_6 += 1 - - elif current_fs == 7: - ## Мощность УМ от УКП 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_7 == 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] > Constants.TEMP_THRESHOLD else STATE_VAL.ERROR - - count_packet_7 += 1 - - -func power_control_result() -> void: - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - _control_results['power_ukp'] = true - for amp in power_amplifier: - if amp.state != STATE_VAL.GOOD: - _control_results['power_ukp'] = false - break - - -func on_stop_control() -> void: - state = STATE_MASHINE.FS_TURN_OFF - - -func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary) -> void: - # Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора - var fs_mapper: Array = get_tree().get_nodes_in_group('fs') - - for fs in packet_type_7: - if fs in fs_mapping and fs_mapping[fs]['condition']: - var data = packet_type_7[fs] - if fs < 4 and current_fs == 1: - _control_results['fs_1'] = (data.isg == 1) - var state_fs = STATE_VAL.GOOD if data.isg == 1 else STATE_VAL.ERROR if data.isg == 0 else STATE_VAL.NONE - var node_name = fs_mapping[fs]['node'] - var node = get_node(node_name) - node.state = state_fs - elif fs < 24 and current_fs == 6: - _control_results['fs_6'] = (data.isg == 1) - var state_fs = STATE_VAL.GOOD if data.isg == 1 else STATE_VAL.ERROR if data.isg == 0 else STATE_VAL.NONE - var node_name = fs_mapping[fs]['node'] - var node = get_node(node_name) - node.state = state_fs - elif fs > 23 and current_fs == 7: - _control_results['fs_7'] = (data.isg == 1) - var state_fs = STATE_VAL.GOOD if data.isg == 1 else STATE_VAL.ERROR if data.isg == 0 else STATE_VAL.NONE - var node_name = fs_mapping[fs]['node'] - var node = get_node(node_name) - node.state = state_fs - - -func on_ug_setting() -> void: - var unit_name = get_meta('unit_name')[0] - var unit_prd = network.units[unit_name] - - 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]]) - - 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 power_um_control_result() -> void: + #var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + #control_results['power_um'] = true + #for amp in power_amplifier: + #if amp.state != STATE_VAL.GOOD: + #control_results['power_um'] = false + #break func on_mode_changed(in_tree: bool) -> void: @@ -413,13 +258,13 @@ func on_mode_changed(in_tree: bool) -> void: func on_control_result() -> void: - #Обновляем _control_results['block_ip'] на основе block_config_k + #Обновляем control_results['block_ip'] на основе block_config_k var all_blocks_ok = true - for block in block_config_k: - if not block_config_k[block][1]: # Если хоть один блок false + for block in block_ip_config_k: + if not block_ip_config_k[block][1]: # Если хоть один блок false all_blocks_ok = false break - _control_results['block_ip'] = all_blocks_ok + control_results['block_ip'] = all_blocks_ok # Словарь соответствия ключей ошибок и нод var error_nodes := { @@ -429,18 +274,18 @@ func on_control_result() -> void: } # Проверка результатов и установка состояний var result: bool = true - for key in _control_results: - if not _control_results[key]: + for key in control_results: + if not control_results[key]: result = false if error_nodes.has(key): error_nodes[key].state = STATE_VAL.ERROR # Установка текста и цвета результата var status_text := 'неисправен' - var status_color := Color.CRIMSON + var status_color := Color.RED if result: status_text = 'исправен' - status_color = Color.AQUAMARINE + status_color = Color.GREEN $control_result.text = 'Прибор ПРД-%s %s' % [pribor, status_text] $control_result.add_theme_color_override('font_color', status_color) diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd index 0aca3e9b..74695773 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.gd +++ b/scenes/pribor-prd-n/pribor-prd-n.gd @@ -72,7 +72,7 @@ func _ready() -> void: func on_state_mashine() -> void: match state: STATE_MASHINE.INIT: - print('Текущий запуск current_fs: ', current_fs) + print_debug('Текущий запуск current_fs: ', current_fs) if current_fs == 2 or current_fs == 3: state = STATE_MASHINE.FS_TURN_ON else: diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index 8c159cb2..954c6ca5 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -1,3 +1,4 @@ +@tool extends 'res://scenes/контроль/прибор.gd' const Constants = { diff --git a/scenes/настройки/настройки.gd b/scenes/настройки/настройки.gd index 4e07d7e8..29564b25 100644 --- a/scenes/настройки/настройки.gd +++ b/scenes/настройки/настройки.gd @@ -165,7 +165,7 @@ func setting_tab(): var tootip_text = tbl_row[3] name_to_line_index[param_name] = i $scroll_set/table.add_row([node_label, node_value]) - var label_instance = $scroll_set/table.get_node2(0, i) + var label_instance = $scroll_set/table.get_node2(0, i) label_instance.text = param_name label_instance.tooltip_text = tootip_text $scroll_set/table.set_node_editable(0, i, false) diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index 4b3be6ff..cf96eb7d 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -1,68 +1,351 @@ -extends Node - - -static func manage_fs(mode: bool, pribor: String, pribor_config: Dictionary, fs_params: Dictionary, current_fs: int, power_um: int) -> void: - # Получаем конфигурацию для текущего прибора - var config: Dictionary = pribor_config[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 current_fs in fs_params: - var params = fs_params[current_fs] - fs_arr.append([ - angle, - params.freq, - params.width, - sectors[current_fs - 1] if current_fs == 1 else sectors[current_fs - 5] - ]) - - signaller.emit_signal('interfer_init', interfer_name, fs_arr, power_um) - print_debug(['interfer_init: ', interfer_name, fs_arr]) - - -## Проверка касет П1 и ИП МА2000 -static func check_block_ip(status_prd: PackedByteArray, block_config: Dictionary) -> Dictionary: - # Конфигурация проверяемых блоков - var byte_dry: int = 27 - var ug_online: bool = (status_prd[0] >> 1) & 1 - for block in block_config: - var bit: int = block_config[block][0] - if ug_online: - var status = status_prd[byte_dry] >> bit & 1 - block_config[block][1] = false if status else true - return block_config - - -## Проверка температур УМ от УКП -static func check_temperature_um(status_prd: PackedByteArray, power_amplifier: Array) -> void: - const Constants: Dictionary = { - 'CONST_MIN_TEMP': -25, - 'MAXIMUM_CODE_ADC': 3796, - 'MINIMUM_CODE_AD': 2660, - 'TEMPERATURE_UKP_1': 47, - 'TEMPERATURE_UKP_2': 79, +class TestPRD extends Node: + enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } + # Конфигурация параметров для каждого прибора + enum STATE_MASHINE { + INIT, + FS_TURN_ON, + FS_WORK, + UG_SET, + UM_RUN, + FS_TURN_OFF, + STOP_CONTROL, + AWAIT } - 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 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 cur_ray: String = 'ray_25_1' + var power_result: Dictionary = { + 'ray_25_1': [], + 'ray_25_6': [], + 'ray_25_7' : [], + } + var constants: Dictionary + var pribor_config: Dictionary + var fs_parameters: Dictionary + var block_config: Dictionary + var control_results: Dictionary + var self_name: String + var state: int = STATE_MASHINE.INIT + var control_label: Label + var current_fs: int = 1 + var flag_check_dkm: bool + var flag_timer_started: bool + var unit_prd: Object + var module_prd: Object + var power_amplify: Array + var fs_array_node: Array - var ukp2_online = (status_prd[0] >> 3) & 1 - 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) - power_amplifier[i_temp+7].value0 = tmp_2 + var control_timer: Timer = Timer.new() + + func _init(ctrlabel, u_prd, m_prd, constant, prd_config, fs_params, block_prd_config, power_amp, ctrl_results, fs_arr_node) -> void: + self.control_label = ctrlabel + self.unit_prd = u_prd + self.module_prd = m_prd + self.pribor_config = prd_config + self.fs_parameters = fs_params + self.constants = constant + self.block_config = block_prd_config + self.power_amplify = power_amp + self.control_results = ctrl_results + self.fs_array_node = fs_arr_node + + func _ready() -> void: + initialize_connections() + setup_timer() + + func _process(_delta: float) -> void: + pass + + func on_data_received(unit_pribor: Object) -> void: + if not is_inside_tree(): + return + + var status: PackedByteArray = unit_pribor.status + + block_config = check_block_ip(status, block_config) + + check_temperature_um(status, power_amplify) + + if current_fs == 1 and control_results.fs_1: + control_results = check_dkm(status, constants.DKM_BIT_1, control_results) + flag_check_dkm = control_results.dkm_1 + elif current_fs == 6 and control_results.fs_6: + control_results = check_dkm(status, constants.DKM_BIT_6, control_results) + flag_check_dkm = control_results.fs_6 + elif current_fs == 7 and control_results.fs_7: + control_results = check_dkm(status, constants.DKM_BIT_7, control_results) + flag_check_dkm = control_results.dkm_7 + + if control_results.dkm_1 and current_fs == 1: + power_result['ray_25_1'] = power_um_ukp(status, current_fs, power_result['ray_25_1']) + if control_results.dkm_6 and current_fs == 6: + power_result['ray_25_6'] = power_um_ukp(status, current_fs, power_result['ray_25_6']) + if control_results.dkm_7 and current_fs == 7: + power_result['ray_25_7'] = power_um_ukp(status, current_fs, power_result['ray_25_7']) + + + func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary, fs_array: Array) -> void: + var fs_result: Dictionary + if current_fs == 1: + fs_result = {'fs_1': STATE_VAL.NONE} + elif current_fs == 6: + fs_result = {'fs_6': STATE_VAL.NONE} + elif current_fs == 7: + fs_result = {'fs_7': STATE_VAL.NONE} + fs_result = on_fs_state(packet_type_7, fs_mapping, fs_result) + for fs in fs_array: + var fs_meta: String = fs.get_meta('fs') + if fs_result.has(fs_meta): + fs.state = fs_result[fs_meta] + control_results[fs_meta] = fs_result[fs_meta] + + + func state_control_machine() -> void: + match state: + STATE_MASHINE.INIT: + control_label.text = 'Выполняется инициализация ФС-%s' % current_fs + if current_fs == 1 or current_fs == 6 or current_fs == 7: + state = STATE_MASHINE.FS_TURN_ON + else: + on_control_result() + state = STATE_MASHINE.AWAIT + + STATE_MASHINE.FS_TURN_ON: + control_label.text = 'Выполняется включение ФС-%s' % current_fs + manage_fs(true, self_name, pribor_config, fs_parameters, current_fs, constants.POWER_UM) + control_timer.wait_time = constants.TIMER_DELAY + control_timer.start() + state = STATE_MASHINE.FS_WORK + + STATE_MASHINE.FS_WORK: + control_label.text = 'Выполняется проверка ФС-%s' % current_fs + if (current_fs == 6 and flag_check_dkm and not flag_timer_started) or \ + (current_fs == 7 and flag_check_dkm and not flag_timer_started) or \ + (current_fs == 1 and not flag_timer_started): + state = STATE_MASHINE.UG_SET + + STATE_MASHINE.UG_SET: + control_label.text = 'Выполняется настройка угла (%s) и атт (%s, %s, %s)' % [constants.dou_ray_nuber, constants.attenutor_um_1, constants.attenutor_um_2, constants.attenutor_um_3] + on_ug_setting() + state = STATE_MASHINE.UM_RUN + + STATE_MASHINE.UM_RUN: + control_label.text = 'Выполняется настройка ЭМС' + module_prd.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]]) + flag_timer_started = true + state = STATE_MASHINE.FS_WORK + + STATE_MASHINE.FS_TURN_OFF: + control_label.text = 'Выполняется отключение ФС-%s' % current_fs + manage_fs(false, self_name, pribor_config, fs_parameters, current_fs, constants.POWER_UM) + state = STATE_MASHINE.STOP_CONTROL + + STATE_MASHINE.STOP_CONTROL: + control_label.text = 'Выполняется завершение проверки ФС-%s' % current_fs + power_um_control_result() + flag_timer_started = false + flag_check_dkm = false + match current_fs: + 1: current_fs = 6 + 6: current_fs = 7 + 7: current_fs = 0 + state = STATE_MASHINE.INIT + + + func initialize_connections() -> void: + var current_unit = unit_prd.name + var parts = current_unit.split('-') + self_name = parts[-1] + var fs_mapping = { + 0: { 'condition': self_name == '1к' }, + 1: { 'condition': self_name == '4к' }, + 2: { 'condition': self_name == '3к' }, + 3: { 'condition': self_name == '2к' }, + 20: { 'condition':self_name == '1к' }, + 21: { 'condition': self_name == '4к' }, + 22: { 'condition': self_name == '3к' }, + 23: { 'condition': self_name == '2к' }, + 24: { 'condition': self_name == '1к' }, + 25: { 'condition': self_name == '4к' }, + 26: { 'condition': self_name == '3к' }, + 27: { 'condition': self_name == '2к' }, + } + signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state').bind(fs_mapping, fs_array_node)) + unit_prd.connect('data_received', Callable(self, 'on_data_received')) + + + func setup_timer() -> void: + add_child(control_timer) + control_timer.timeout.connect(on_stop_control) + control_timer.one_shot = true + control_timer.wait_time = 10.0 + control_timer.start() + + + func on_control_result() -> void: + print('on_control_result') + + + func on_stop_control() -> void: + state = STATE_MASHINE.FS_TURN_OFF + + + func on_ug_setting() -> void: + 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) + + module_prd.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]]) + + module_prd.cmd_array.append([unit_prd.CmdCode.READ_ISA, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3]]) + + + func power_um_control_result() -> void: + control_results['power_um'] = true + for amp in power_result[cur_ray]: + if amp > constants.TEMP_THRESHOLD: + control_results['power_um'] = false + break + + + static func manage_fs(mode: bool, pribor: String, p_conf: Dictionary, fs_params: Dictionary, cur_fs: 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 cur_fs in fs_params: + var params = fs_params[cur_fs] + fs_arr.append([ + angle, + params.freq, + params.width, + sectors[cur_fs - 1] if cur_fs == 1 else sectors[cur_fs - 5] + ]) + + signaller.emit_signal('interfer_init', interfer_name, fs_arr, power_um) + + ## Проверка касет П1 и ИП МА2000 + static func check_block_ip(status_prd: PackedByteArray, block_ip_config: Dictionary) -> Dictionary: + # Конфигурация проверяемых блоков + var byte_dry: int = 27 + var ug_online: bool = (status_prd[0] >> 1) & 1 + for block in block_ip_config: + var bit: int = block_ip_config[block][0] + if ug_online: + var status = status_prd[byte_dry] >> bit & 1 + block_ip_config[block][1] = false if status else true + return block_ip_config + + ## Проверка температур УМ от УКП + static func check_temperature_um(status_prd: PackedByteArray, power_amplifier: Array) -> void: + 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 + 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].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 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 + + + ## Проверка ДКМ + static func check_dkm(status_prd: PackedByteArray, bit_dkm: int, dkm_result: Dictionary) -> Dictionary: + var dkm: int = 28 + var status_dkm = status_prd[dkm] >> bit_dkm & 1 + if bit_dkm == 0: + dkm_result['dkm_1'] = status_dkm + elif bit_dkm == 5: + dkm_result['dkm_6'] = status_dkm + elif bit_dkm == 6: + dkm_result['dkm_7'] = status_dkm + return dkm_result + + + static func on_fs_state(packet_type_7: Dictionary, fs_mapping: Dictionary, fs_results: Dictionary) -> Dictionary: + for fs in packet_type_7: + if fs in fs_mapping and fs_mapping[fs]['condition']: + var data = packet_type_7[fs] + if fs < 4 and fs_results.has('fs_1'): + fs_results['fs_1'] = data.isg + elif fs < 24 and fs_results.has('fs_6'): + fs_results['fs_6'] = data.isg + elif fs > 23 and fs_results.has('fs_7'): + fs_results['fs_7'] = data.isg + return fs_results + + + static func power_um_ukp(status: PackedByteArray, crnt_fs: int, pwr_result: Array) -> Array: + const Constants: Dictionary = {'POWER_UKP_1' : 31, 'POWER_UKP_2': 63, 'TEMP_THRESHOLD': 40} + var power_values: Array = [] + var base_offset = 0 + var is_data_valid = false + var iteration: int = 6 + + match crnt_fs: + 1: + # Обработка для current_fs = 1 (одно значение) + var value = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7) + power_values = [value] + is_data_valid = true + + 6: + # Обработка для current_fs = 6 (6 значений из УКП1) + base_offset = Constants.POWER_UKP_1 + is_data_valid = (status[0] >> 2) & 1 + if is_data_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 + is_data_valid = (status[0] >> 2) & 1 + if is_data_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 + + 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() From 82a97d6b9e3bbddad36a0927434ba6c0aa37a30d Mon Sep 17 00:00:00 2001 From: Maxim Date: Tue, 12 Aug 2025 23:21:00 +0300 Subject: [PATCH 3/9] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.gd | 65 ++--------------------------- scripts/pribor-prd.gd | 48 ++++++++++----------- 2 files changed, 28 insertions(+), 85 deletions(-) diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index 67d37549..f78171f9 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -117,14 +117,14 @@ func _ready() -> void: func on_state_mashine() -> void: control_prd.state_control_machine() - + block_ip_config_k = control_prd.block_config var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') for power_supply in node_ip_power_arr: var meta_ip = power_supply.get_meta('ip') if block_ip_config_k.has(meta_ip): power_supply.state = STATE_VAL.GOOD if block_ip_config_k[meta_ip][1] else STATE_VAL.ERROR - + control_results = control_prd.control_results if control_prd.current_fs == 1: $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if control_results.dkm_1 else STATE_VAL.ERROR @@ -132,11 +132,11 @@ func on_state_mashine() -> void: $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if control_results.dkm_6 else STATE_VAL.ERROR elif control_prd.current_fs == 7: $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if control_results.dkm_7 else STATE_VAL.ERROR - + print(control_prd.power_result) if not control_prd.power_result['ray_25_1'] or not control_prd.power_result['ray_25_6'] or not control_prd.power_result['ray_25_7']: return - + var node_arr_power: Array = get_tree().get_nodes_in_group('power_amplifier') for i_pow in node_arr_power.size(): if i_pow < 1: @@ -195,63 +195,6 @@ func on_line_changed(unit_pribor: Object) -> void: set_default_state() -#func on_data_received(unit_pribor: Object) -> void: - #if not is_inside_tree(): - #return -# - #var status: PackedByteArray = unit_pribor.status - ## 1. Обновляем статусы блоков - #block_config_k = node_common_func.check_block_ip(status, block_config_k) - ## 2. Обновляем ноды power_supply - #var node_power_arr = get_tree().get_nodes_in_group('power_supply') - #for power_supply in node_power_arr: - #var meta_ip = power_supply.get_meta('ip') - #if block_config_k.has(meta_ip): - #power_supply.state = STATE_VAL.GOOD if block_config_k[meta_ip][1] else STATE_VAL.ERROR -# - #node_common_func.check_temperature_um(status, get_tree().get_nodes_in_group('power_amplifier')) -# - #if current_fs == 1 and control_results.fs_1: - #control_results = node_common_func.check_dkm(status, Constants.DKM_BIT_1, control_results) - #flag_check_dkm = control_results.dkm_1 - #elif current_fs == 6 and control_results.fs_6: - #control_results = node_common_func.check_dkm(status, Constants.DKM_BIT_6, control_results) - #flag_check_dkm = control_results.fs_6 - #elif current_fs == 7 and control_results.fs_7: - #control_results = node_common_func.check_dkm(status, Constants.DKM_BIT_7, control_results) - #flag_check_dkm = control_results.dkm_7 -# - #var power_result: Dictionary = {'ray_25' : []} -# - #if flag_check_dkm: - #power_result = node_common_func.power_um_ukp(status, current_fs, power_result) - - -#func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary) -> void: - #var fs_result: Dictionary - #if current_fs == 1: - #fs_result = {'fs_1': STATE_VAL.NONE} - #elif current_fs == 6: - #fs_result = {'fs_6': STATE_VAL.NONE} - #elif current_fs == 7: - #fs_result = {'fs_7': STATE_VAL.NONE} - #fs_result = node_common_func.on_fs_state(packet_type_7, fs_mapping, fs_result) -# - #var fs_array: Array = get_tree().get_nodes_in_group('fs') - #for fs in fs_array: - #var fs_meta: String = fs.get_meta('fs') - #fs.state = fs_result[fs_meta] - - -#func power_um_control_result() -> void: - #var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - #control_results['power_um'] = true - #for amp in power_amplifier: - #if amp.state != STATE_VAL.GOOD: - #control_results['power_um'] = false - #break - - func on_mode_changed(in_tree: bool) -> void: if not in_tree: queue_free() diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index cf96eb7d..e2029a54 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -53,17 +53,17 @@ class TestPRD extends Node: func _process(_delta: float) -> void: pass - + func on_data_received(unit_pribor: Object) -> void: if not is_inside_tree(): return - + var status: PackedByteArray = unit_pribor.status block_config = check_block_ip(status, block_config) check_temperature_um(status, power_amplify) - + if current_fs == 1 and control_results.fs_1: control_results = check_dkm(status, constants.DKM_BIT_1, control_results) flag_check_dkm = control_results.dkm_1 @@ -73,15 +73,15 @@ class TestPRD extends Node: elif current_fs == 7 and control_results.fs_7: control_results = check_dkm(status, constants.DKM_BIT_7, control_results) flag_check_dkm = control_results.dkm_7 - + if control_results.dkm_1 and current_fs == 1: power_result['ray_25_1'] = power_um_ukp(status, current_fs, power_result['ray_25_1']) if control_results.dkm_6 and current_fs == 6: power_result['ray_25_6'] = power_um_ukp(status, current_fs, power_result['ray_25_6']) if control_results.dkm_7 and current_fs == 7: power_result['ray_25_7'] = power_um_ukp(status, current_fs, power_result['ray_25_7']) - - + + func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary, fs_array: Array) -> void: var fs_result: Dictionary if current_fs == 1: @@ -96,7 +96,7 @@ class TestPRD extends Node: if fs_result.has(fs_meta): fs.state = fs_result[fs_meta] control_results[fs_meta] = fs_result[fs_meta] - + func state_control_machine() -> void: match state: @@ -107,21 +107,21 @@ class TestPRD extends Node: else: on_control_result() state = STATE_MASHINE.AWAIT - + STATE_MASHINE.FS_TURN_ON: control_label.text = 'Выполняется включение ФС-%s' % current_fs manage_fs(true, self_name, pribor_config, fs_parameters, current_fs, constants.POWER_UM) control_timer.wait_time = constants.TIMER_DELAY control_timer.start() state = STATE_MASHINE.FS_WORK - + STATE_MASHINE.FS_WORK: control_label.text = 'Выполняется проверка ФС-%s' % current_fs if (current_fs == 6 and flag_check_dkm and not flag_timer_started) or \ (current_fs == 7 and flag_check_dkm and not flag_timer_started) or \ (current_fs == 1 and not flag_timer_started): state = STATE_MASHINE.UG_SET - + STATE_MASHINE.UG_SET: control_label.text = 'Выполняется настройка угла (%s) и атт (%s, %s, %s)' % [constants.dou_ray_nuber, constants.attenutor_um_1, constants.attenutor_um_2, constants.attenutor_um_3] on_ug_setting() @@ -132,12 +132,12 @@ class TestPRD extends Node: module_prd.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]]) flag_timer_started = true state = STATE_MASHINE.FS_WORK - + STATE_MASHINE.FS_TURN_OFF: control_label.text = 'Выполняется отключение ФС-%s' % current_fs manage_fs(false, self_name, pribor_config, fs_parameters, current_fs, constants.POWER_UM) state = STATE_MASHINE.STOP_CONTROL - + STATE_MASHINE.STOP_CONTROL: control_label.text = 'Выполняется завершение проверки ФС-%s' % current_fs power_um_control_result() @@ -148,8 +148,8 @@ class TestPRD extends Node: 6: current_fs = 7 7: current_fs = 0 state = STATE_MASHINE.INIT - - + + func initialize_connections() -> void: var current_unit = unit_prd.name var parts = current_unit.split('-') @@ -182,12 +182,12 @@ class TestPRD extends Node: func on_control_result() -> void: print('on_control_result') - + func on_stop_control() -> void: state = STATE_MASHINE.FS_TURN_OFF - - + + func on_ug_setting() -> void: 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) @@ -198,15 +198,15 @@ class TestPRD extends Node: module_prd.cmd_array.append([unit_prd.CmdCode.READ_ISA, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3]]) - + func power_um_control_result() -> void: control_results['power_um'] = true for amp in power_result[cur_ray]: if amp > constants.TEMP_THRESHOLD: control_results['power_um'] = false break - - + + static func manage_fs(mode: bool, pribor: String, p_conf: Dictionary, fs_params: Dictionary, cur_fs: int, power_um: int) -> void: # Получаем конфигурацию для текущего прибора var config: Dictionary = p_conf[pribor] @@ -227,7 +227,7 @@ class TestPRD extends Node: ]) signaller.emit_signal('interfer_init', interfer_name, fs_arr, power_um) - + ## Проверка касет П1 и ИП МА2000 static func check_block_ip(status_prd: PackedByteArray, block_ip_config: Dictionary) -> Dictionary: # Конфигурация проверяемых блоков @@ -239,7 +239,7 @@ class TestPRD extends Node: var status = status_prd[byte_dry] >> bit & 1 block_ip_config[block][1] = false if status else true return block_ip_config - + ## Проверка температур УМ от УКП static func check_temperature_um(status_prd: PackedByteArray, power_amplifier: Array) -> void: const Constants: Dictionary = { @@ -269,8 +269,8 @@ class TestPRD extends Node: 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 - - + + ## Проверка ДКМ static func check_dkm(status_prd: PackedByteArray, bit_dkm: int, dkm_result: Dictionary) -> Dictionary: var dkm: int = 28 From aa8a7144212de51fbe0328ca1a318722f8595b98 Mon Sep 17 00:00:00 2001 From: Maxim Date: Thu, 14 Aug 2025 16:08:42 +0300 Subject: [PATCH 4/9] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.gd | 102 +++---- scripts/pribor-prd.gd | 415 ++++++++++++++++++---------- 2 files changed, 314 insertions(+), 203 deletions(-) diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index f78171f9..caeb9d70 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -1,7 +1,7 @@ @tool extends 'res://scenes/контроль/прибор.gd' -const Constants: Dictionary = { +const constants_k: Dictionary = { 'IN_BLANK_PRD': 1, 'OUT_BLANK_PRD': 13, 'CI_1_OT_FS': 8, @@ -27,10 +27,10 @@ const Constants: Dictionary = { 'TEMP_THRESHOLD': 40, 'POWER_THRESHOLD': 40, 'TIMER_DELAY': 5.0, - 'dou_ray_nuber': 0x3, - 'attenutor_um_1': 0x7, - 'attenutor_um_2': 0x7, - 'attenutor_um_3': 0x0, + 'RAY_DOU_NUM': 0x3, + 'ATT_UM_1': 0x0, + 'ATT_UM_6': 0x7, + 'ATT_UM_7': 0x7, 'POWER_UM': 75, } # Конфигурация параметров для каждого прибора @@ -46,18 +46,8 @@ const FS_PARAMS := { 6: {'freq': 2450.0, 'width': 110.0}, 7: {'freq': 4750.0, 'width': 110.0} } - enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } -enum STATE_MASHINE { - INIT, - FS_TURN_ON, - FS_WORK, - UG_SET, - UM_RUN, - FS_TURN_OFF, - STOP_CONTROL, - AWAIT - } + var block_ip_config_k := { 'maa2000_1': [0, false], 'maa2000_2': [1, false], @@ -67,29 +57,19 @@ var block_ip_config_k := { 'ip9_50_3': [5, false], 'ip12_50_2': [6, false], } -var fs_mapping_k: Dictionary = {} + # Основные переменные var current_fs: int = 1 -var state: int = STATE_MASHINE.INIT -var flag_check_dkm: bool = false -var flag_timer_started: bool = false - -var count_packet_1:int = 0 -var count_packet_6:int = 0 -var count_packet_7:int = 0 -var power_array_1: Array = [] -var power_array_2: Array = [] var ug_work_1: int = 0 var ug_work_2: int = 0 var ug_work_3: int = 0 # Флаги и таймеры var control_timer: Timer = Timer.new() var mashine_timer: Timer = Timer.new() -var pribor: String -var prd_module: Object -var unit_prd: Object +var prd_k_module: Object +var unit_prd_k: Object # Результаты контроля -var control_results: Dictionary = { +var control_results_k: Dictionary = { 'block_ip': false, # Проверка касет П1 и ИП МА2000 'temperature': true, # Проверка температур УМ 'dkm_1': false, # Проверка ДКМ 1 @@ -101,7 +81,7 @@ var control_results: Dictionary = { 'fs_7': false, # Проверка ФС 7 } -static var node_common_func = load('res://scripts/pribor-prd.gd') +#static var node_common_func = load('res://scripts/pribor-prd.gd') var test = preload('res://scripts/pribor-prd.gd') var control_prd @@ -122,18 +102,17 @@ func on_state_mashine() -> void: var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') for power_supply in node_ip_power_arr: var meta_ip = power_supply.get_meta('ip') - if block_ip_config_k.has(meta_ip): + if block_ip_config_k.has(meta_ip) and control_prd.ug_online: power_supply.state = STATE_VAL.GOOD if block_ip_config_k[meta_ip][1] else STATE_VAL.ERROR - control_results = control_prd.control_results - if control_prd.current_fs == 1: - $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if control_results.dkm_1 else STATE_VAL.ERROR - elif control_prd.current_fs == 6: - $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if control_results.dkm_6 else STATE_VAL.ERROR - elif control_prd.current_fs == 7: - $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if control_results.dkm_7 else STATE_VAL.ERROR + control_results_k = control_prd.control_results + if control_prd.current_fs == 1 and control_results_k.fs_1: + $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if control_results_k.dkm_1 else STATE_VAL.ERROR + elif control_prd.current_fs == 6 and control_results_k.fs_6: + $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if control_results_k.dkm_6 else STATE_VAL.ERROR + elif control_prd.current_fs == 7 and control_results_k.fs_7: + $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if control_results_k.dkm_7 else STATE_VAL.ERROR - print(control_prd.power_result) if not control_prd.power_result['ray_25_1'] or not control_prd.power_result['ray_25_6'] or not control_prd.power_result['ray_25_7']: return @@ -152,14 +131,25 @@ func on_state_mashine() -> void: func initialize_connections() -> void: var unit_name = get_meta('unit_name')[0] - prd_module = prd.prd_dict[unit_name] - unit_prd = prd_module.unit_yau07 + prd_k_module = prd.prd_dict[unit_name] + unit_prd_k = prd_k_module.unit_yau07 - #signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state').bind(fs_mapping_k)) - unit_prd.connect('line_changed', Callable(self, 'on_line_changed')) - var array_power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - var fs_node_array: Array = get_tree().get_nodes_in_group('fs_group') - control_prd = test.TestPRD.new($control_result, unit_prd, prd_module, Constants, PRIBOR_CONFIG, FS_PARAMS, block_ip_config_k, array_power_amplifier, control_results, fs_node_array) + unit_prd_k.connect('line_changed', Callable(self, 'on_line_changed')) + var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier') + var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') + var init_data: Dictionary = { + 'control_label': $control_result, + 'power_amplifiers': power_amplifiers, + 'fs_nodes': fs_nodes, + 'unit_prd': unit_prd_k, + 'module_prd' : prd_k_module, + 'constants': constants_k, + 'prd_config': PRIBOR_CONFIG, + 'fs_params': FS_PARAMS, + 'block_ip_prd_config': block_ip_config_k, + 'control_results': control_results_k, + } + control_prd = test.TestPRD.new(init_data) add_child(control_prd) @@ -187,7 +177,7 @@ func _enter_tree() -> void: func _exit_tree() -> void: - 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, Constants.ADDR_UG_LITERA_3, ug_work_3]]) + 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]]) func on_line_changed(unit_pribor: Object) -> void: @@ -207,7 +197,7 @@ func on_control_result() -> void: if not block_ip_config_k[block][1]: # Если хоть один блок false all_blocks_ok = false break - control_results['block_ip'] = all_blocks_ok + control_results_k['block_ip'] = all_blocks_ok # Словарь соответствия ключей ошибок и нод var error_nodes := { @@ -217,18 +207,18 @@ func on_control_result() -> void: } # Проверка результатов и установка состояний var result: bool = true - for key in control_results: - if not control_results[key]: + for key in control_results_k: + if not control_results_k[key]: result = false if error_nodes.has(key): error_nodes[key].state = STATE_VAL.ERROR # Установка текста и цвета результата - var status_text := 'неисправен' + #var status_text := 'неисправен' var status_color := Color.RED - if result: - status_text = 'исправен' - status_color = Color.GREEN + #if result: + #status_text = 'исправен' + #status_color = Color.GREEN - $control_result.text = 'Прибор ПРД-%s %s' % [pribor, status_text] + #$control_result.text = 'Прибор ПРД-%s %s' % [pribor, status_text] $control_result.add_theme_color_override('font_color', status_color) diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index e2029a54..54cc92ff 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -1,6 +1,8 @@ class TestPRD extends Node: + const RAY_25_1:= 'ray_25_1' + const RAY_25_6:= 'ray_25_6' + const RAY_25_7:= 'ray_25_7' enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } - # Конфигурация параметров для каждого прибора enum STATE_MASHINE { INIT, FS_TURN_ON, @@ -11,12 +13,28 @@ class TestPRD extends Node: STOP_CONTROL, AWAIT } - var cur_ray: String = 'ray_25_1' - var power_result: Dictionary = { - 'ray_25_1': [], - 'ray_25_6': [], - 'ray_25_7' : [], + 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_result: Dictionary = { + RAY_25_1: [], + RAY_25_6: [], + RAY_25_7: [], + } var constants: Dictionary var pribor_config: Dictionary var fs_parameters: Dictionary @@ -24,28 +42,29 @@ class TestPRD extends Node: var control_results: Dictionary var self_name: String var state: int = STATE_MASHINE.INIT - var control_label: Label var current_fs: int = 1 var flag_check_dkm: bool var flag_timer_started: bool + var ug_online: bool var unit_prd: Object var module_prd: Object var power_amplify: Array var fs_array_node: Array + var control_label: Label var control_timer: Timer = Timer.new() - func _init(ctrlabel, u_prd, m_prd, constant, prd_config, fs_params, block_prd_config, power_amp, ctrl_results, fs_arr_node) -> void: - self.control_label = ctrlabel - self.unit_prd = u_prd - self.module_prd = m_prd - self.pribor_config = prd_config - self.fs_parameters = fs_params - self.constants = constant - self.block_config = block_prd_config - self.power_amplify = power_amp - self.control_results = ctrl_results - self.fs_array_node = fs_arr_node + func _init(init_data: Dictionary) -> void: + control_label = init_data['control_label'] + power_amplify = init_data['power_amplifiers'] + fs_array_node = init_data['fs_nodes'] + unit_prd = init_data['unit_prd'] + module_prd = init_data['module_prd'] + constants = init_data['constants'] + pribor_config = init_data['prd_config'] + fs_parameters = init_data['fs_params'] + block_config = init_data['block_ip_prd_config'] + control_results = init_data['control_results'] func _ready() -> void: initialize_connections() @@ -59,117 +78,126 @@ class TestPRD extends Node: return var status: PackedByteArray = unit_pribor.status + ug_online = (status[0] >> 1) & 1 block_config = check_block_ip(status, block_config) - check_temperature_um(status, power_amplify) - - if current_fs == 1 and control_results.fs_1: - control_results = check_dkm(status, constants.DKM_BIT_1, control_results) - flag_check_dkm = control_results.dkm_1 - elif current_fs == 6 and control_results.fs_6: - control_results = check_dkm(status, constants.DKM_BIT_6, control_results) - flag_check_dkm = control_results.fs_6 - elif current_fs == 7 and control_results.fs_7: - control_results = check_dkm(status, constants.DKM_BIT_7, control_results) - flag_check_dkm = control_results.dkm_7 - - if control_results.dkm_1 and current_fs == 1: - power_result['ray_25_1'] = power_um_ukp(status, current_fs, power_result['ray_25_1']) - if control_results.dkm_6 and current_fs == 6: - power_result['ray_25_6'] = power_um_ukp(status, current_fs, power_result['ray_25_6']) - if control_results.dkm_7 and current_fs == 7: - power_result['ray_25_7'] = power_um_ukp(status, current_fs, power_result['ray_25_7']) + _process_dkm_status(status) func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary, fs_array: Array) -> void: - var fs_result: Dictionary - if current_fs == 1: - fs_result = {'fs_1': STATE_VAL.NONE} - elif current_fs == 6: - fs_result = {'fs_6': STATE_VAL.NONE} - elif current_fs == 7: - fs_result = {'fs_7': STATE_VAL.NONE} + var fs_key: String = FS_KEYS.get(current_fs, '') + if fs_key.is_empty(): + return + + var fs_result := {fs_key: STATE_VAL.NONE} fs_result = on_fs_state(packet_type_7, fs_mapping, fs_result) - for fs in fs_array: - var fs_meta: String = fs.get_meta('fs') - if fs_result.has(fs_meta): - fs.state = fs_result[fs_meta] - control_results[fs_meta] = fs_result[fs_meta] + _update_fs_states(fs_result, fs_array) func state_control_machine() -> void: match state: STATE_MASHINE.INIT: - control_label.text = 'Выполняется инициализация ФС-%s' % current_fs - if current_fs == 1 or current_fs == 6 or current_fs == 7: - state = STATE_MASHINE.FS_TURN_ON - else: - on_control_result() - state = STATE_MASHINE.AWAIT - + _handle_init_state() STATE_MASHINE.FS_TURN_ON: - control_label.text = 'Выполняется включение ФС-%s' % current_fs - manage_fs(true, self_name, pribor_config, fs_parameters, current_fs, constants.POWER_UM) - control_timer.wait_time = constants.TIMER_DELAY - control_timer.start() - state = STATE_MASHINE.FS_WORK - + _handle_fs_turn_on_state() STATE_MASHINE.FS_WORK: - control_label.text = 'Выполняется проверка ФС-%s' % current_fs - if (current_fs == 6 and flag_check_dkm and not flag_timer_started) or \ - (current_fs == 7 and flag_check_dkm and not flag_timer_started) or \ - (current_fs == 1 and not flag_timer_started): - state = STATE_MASHINE.UG_SET - + _handle_fs_work_state() STATE_MASHINE.UG_SET: - control_label.text = 'Выполняется настройка угла (%s) и атт (%s, %s, %s)' % [constants.dou_ray_nuber, constants.attenutor_um_1, constants.attenutor_um_2, constants.attenutor_um_3] - on_ug_setting() - state = STATE_MASHINE.UM_RUN - + _handle_ug_set_state() STATE_MASHINE.UM_RUN: - control_label.text = 'Выполняется настройка ЭМС' - module_prd.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]]) - flag_timer_started = true - state = STATE_MASHINE.FS_WORK - + flag_timer_started = _handle_um_run_state() STATE_MASHINE.FS_TURN_OFF: - control_label.text = 'Выполняется отключение ФС-%s' % current_fs - manage_fs(false, self_name, pribor_config, fs_parameters, current_fs, constants.POWER_UM) - state = STATE_MASHINE.STOP_CONTROL - + _handle_fs_turn_off_state() STATE_MASHINE.STOP_CONTROL: - control_label.text = 'Выполняется завершение проверки ФС-%s' % current_fs - power_um_control_result() - flag_timer_started = false - flag_check_dkm = false - match current_fs: - 1: current_fs = 6 - 6: current_fs = 7 - 7: current_fs = 0 - state = STATE_MASHINE.INIT + _handle_stop_control_state() + func _handle_init_state() -> void: + control_label.text = 'Выполняется инициализация ФС-%s' % current_fs + if current_fs in [1, 2, 3, 4, 5, 6, 7]: + state = STATE_MASHINE.FS_TURN_ON + else: + on_control_result() + state = STATE_MASHINE.AWAIT + + + func _handle_fs_turn_on_state() -> void: + control_label.text = 'Выполняется включение ФС-%s' % current_fs + manage_fs(true, self_name, pribor_config, fs_parameters, current_fs, constants.POWER_UM) + control_timer.wait_time = constants.TIMER_DELAY + control_timer.start() + state = STATE_MASHINE.FS_WORK + + + func _handle_fs_work_state() -> void: + control_label.text = 'Выполняется проверка ФС-%s' % current_fs + if (current_fs == 2 and flag_check_dkm and not flag_timer_started) or \ + (current_fs == 3 and flag_check_dkm and not flag_timer_started) or \ + (current_fs == 4 and flag_check_dkm and not flag_timer_started) or \ + (current_fs == 5 and flag_check_dkm and not flag_timer_started) or \ + (current_fs == 6 and flag_check_dkm and not flag_timer_started) or \ + (current_fs == 7 and flag_check_dkm and not flag_timer_started) or \ + (current_fs == 1 and not flag_timer_started): + state = STATE_MASHINE.UG_SET + + + func _handle_ug_set_state() -> void: + control_label.text = 'Выполняется настройка угла (%s) и атт (%s, %s, %s)' % [ + constants.RAY_DOU_NUM, + constants.ATT_UM_1, + constants.ATT_UM_6, + constants.ATT_UM_7, + ] + on_ug_setting(module_prd, unit_prd, constants) + state = STATE_MASHINE.UM_RUN + + + func _handle_um_run_state() -> bool: + control_label.text = 'Выполняется настройка ЭМС' + module_prd.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]]) + state = STATE_MASHINE.FS_WORK + return true + + + func _handle_fs_turn_off_state() -> void: + control_label.text = 'Выполняется отключение ФС-%s' % current_fs + manage_fs(false, self_name, pribor_config, fs_parameters, current_fs, constants.POWER_UM) + state = STATE_MASHINE.STOP_CONTROL + + + func _handle_stop_control_state() -> void: + control_label.text = 'Выполняется завершение проверки ФС-%s' % current_fs + control_results = power_um_control_result(control_results, constants, power_result) + flag_timer_started = false + flag_check_dkm = false + _advance_to_next_fs() + state = STATE_MASHINE.INIT + + + func _advance_to_next_fs() -> void: + match current_fs: + 1: current_fs = 6 + 2: current_fs = 3 + 3: current_fs = 0 + 4: current_fs = 5 + 5: current_fs = 0 + 6: current_fs = 7 + 7: current_fs = 0 + + + ###################################### func initialize_connections() -> void: + _determine_self_name() + var fs_mapping = _create_fs_mapping(self_name) + signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state').bind(fs_mapping, fs_array_node)) + unit_prd.connect('data_received', Callable(self, 'on_data_received')) + + + func _determine_self_name() -> void: var current_unit = unit_prd.name var parts = current_unit.split('-') self_name = parts[-1] - var fs_mapping = { - 0: { 'condition': self_name == '1к' }, - 1: { 'condition': self_name == '4к' }, - 2: { 'condition': self_name == '3к' }, - 3: { 'condition': self_name == '2к' }, - 20: { 'condition':self_name == '1к' }, - 21: { 'condition': self_name == '4к' }, - 22: { 'condition': self_name == '3к' }, - 23: { 'condition': self_name == '2к' }, - 24: { 'condition': self_name == '1к' }, - 25: { 'condition': self_name == '4к' }, - 26: { 'condition': self_name == '3к' }, - 27: { 'condition': self_name == '2к' }, - } - signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state').bind(fs_mapping, fs_array_node)) - unit_prd.connect('data_received', Callable(self, 'on_data_received')) func setup_timer() -> void: @@ -180,33 +208,92 @@ class TestPRD extends Node: control_timer.start() - func on_control_result() -> void: - print('on_control_result') + 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() + control_results = check_dkm(status, dkm_bit, control_results) + + flag_check_dkm = control_results[_get_dkm_key_for_current_fs()] + if flag_check_dkm: + power_result[_get_ray_key_for_current_fs()] = power_um_ukp(status, current_fs, power_result[_get_ray_key_for_current_fs()]) + + + func _get_current_fs_key() -> String: + return FS_KEYS.get(current_fs, '') + + + func _get_dkm_bit_for_current_fs() -> int: + match current_fs: + 1: return constants.DKM_BIT_1 + 2: return constants.DKM_BIT_2 + 3: return constants.DKM_BIT_3 + 4: return constants.DKM_BIT_4 + 5: return constants.DKM_BIT_5 + 6: return constants.DKM_BIT_6 + 7: return constants.DKM_BIT_7 + _: return -1 + + + func _get_dkm_key_for_current_fs() -> String: + match current_fs: + 1: return 'dkm_1' + 2: return 'dkm_2' + 3: return 'dkm_3' + 4: return 'dkm_4' + 5: return 'dkm_5' + 6: return 'dkm_6' + 7: return 'dkm_7' + _: return '' + + + func _get_ray_key_for_current_fs() -> String: + match current_fs: + 1: return RAY_25_1 + 6: return RAY_25_6 + 7: return RAY_25_7 + _: return '' + + + func _update_fs_states(fs_result: Dictionary, fs_array: Array) -> void: + for fs in fs_array: + var fs_meta: String = fs.get_meta('fs') + if fs_result.has(fs_meta): + var new_state = fs_result[fs_meta] + fs.state = new_state + control_results[fs_meta] = new_state func on_stop_control() -> void: state = STATE_MASHINE.FS_TURN_OFF - func on_ug_setting() -> void: - 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) - - module_prd.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]]) - - module_prd.cmd_array.append([unit_prd.CmdCode.READ_ISA, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3]]) + static func on_control_result() -> void: + print('on_control_result') - func power_um_control_result() -> void: - control_results['power_um'] = true - for amp in power_result[cur_ray]: - if amp > constants.TEMP_THRESHOLD: - control_results['power_um'] = false - break + static func on_ug_setting(prd_module: Object, prd_unit: Object, settings_ug: Dictionary) -> void: + var result_1 = ((settings_ug.ATT_UM_6 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07) + var result_2 = ((settings_ug.ATT_UM_7 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07) + + prd_module.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_1]]) + + prd_module.cmd_array.append([prd_unit.CmdCode.READ_ISA, [settings_ug.ADDR_UG_LITERA_1, settings_ug.ADDR_UG_LITERA_2, settings_ug.ADDR_UG_LITERA_3]]) + static func power_um_control_result(ctrl_results: Dictionary, constan: Dictionary, pwr_result: Dictionary) -> Dictionary: + ctrl_results['power_um'] = true + for amp_array in pwr_result.values(): + for value in amp_array: + if value < constan.TEMP_THRESHOLD: + ctrl_results['power_um'] = false + break + return ctrl_results + + + ## Управаление модулем фс (включить/отключить излучение) static func manage_fs(mode: bool, pribor: String, p_conf: Dictionary, fs_params: Dictionary, cur_fs: int, power_um: int) -> void: # Получаем конфигурацию для текущего прибора var config: Dictionary = p_conf[pribor] @@ -232,15 +319,15 @@ class TestPRD extends Node: static func check_block_ip(status_prd: PackedByteArray, block_ip_config: Dictionary) -> Dictionary: # Конфигурация проверяемых блоков var byte_dry: int = 27 - var ug_online: bool = (status_prd[0] >> 1) & 1 + var ug_valid: bool = (status_prd[0] >> 1) & 1 for block in block_ip_config: var bit: int = block_ip_config[block][0] - if ug_online: + if ug_valid: var status = status_prd[byte_dry] >> bit & 1 block_ip_config[block][1] = false if status else true return block_ip_config - ## Проверка температур УМ от УКП + ## Проверка температур УМ от УКП static func check_temperature_um(status_prd: PackedByteArray, power_amplifier: Array) -> void: const Constants: Dictionary = { 'CONST_MIN_TEMP': -25, @@ -270,7 +357,6 @@ class TestPRD extends Node: 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 - ## Проверка ДКМ static func check_dkm(status_prd: PackedByteArray, bit_dkm: int, dkm_result: Dictionary) -> Dictionary: var dkm: int = 28 @@ -284,51 +370,86 @@ class TestPRD extends Node: return dkm_result + ## + static func _create_fs_mapping(s_name: String) -> Dictionary: + var suffixes: Dictionary = { + 0: 'к', 1: 'к', 2: 'к', 3: 'к', + 4: 'н', 5: 'н', 6: 'н', 7: 'н', + 8: 'н', 9: 'н', 10: 'н', 11: 'н', + 12: 'в', 13: 'в', 14: 'в', 15: 'в', + 16: 'в', 17: 'в', 18: 'в', 19: 'в', + 20: 'к', 21: 'к', 22: 'к', 23: 'к', + 24: 'к', 25: 'к', 26: 'к', 27: 'к', + } + + var mapping: Dictionary = {} + for fs_num in suffixes: + var num_part = str((fs_num % 4) + 1) + mapping[fs_num] = {'condition': s_name == num_part + suffixes[fs_num]} + return mapping + + + ## static func on_fs_state(packet_type_7: Dictionary, fs_mapping: Dictionary, fs_results: Dictionary) -> Dictionary: - for fs in packet_type_7: - if fs in fs_mapping and fs_mapping[fs]['condition']: - var data = packet_type_7[fs] - if fs < 4 and fs_results.has('fs_1'): - fs_results['fs_1'] = data.isg - elif fs < 24 and fs_results.has('fs_6'): - fs_results['fs_6'] = data.isg - elif fs > 23 and fs_results.has('fs_7'): - fs_results['fs_7'] = data.isg - return fs_results + 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] + + # Проверяем все правила для текущего FS + for rule_key in FS_RULES: + var rule = 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.range[0] and fs_num < rule.range[1]) and results.has(rule.key) + ## static func power_um_ukp(status: PackedByteArray, crnt_fs: int, pwr_result: Array) -> Array: - const Constants: Dictionary = {'POWER_UKP_1' : 31, 'POWER_UKP_2': 63, 'TEMP_THRESHOLD': 40} + const Constants: Dictionary = {'POWER_UKP_1' : 31, 'POWER_UKP_2': 63} var power_values: Array = [] var base_offset = 0 - var is_data_valid = false var iteration: int = 6 + var ug_valid: bool = (status[0] >> 2) & 1 match crnt_fs: 1: # Обработка для current_fs = 1 (одно значение) var value = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7) - power_values = [value] - is_data_valid = true - + if ug_valid: + power_values = [value] 6: # Обработка для current_fs = 6 (6 значений из УКП1) base_offset = Constants.POWER_UKP_1 - is_data_valid = (status[0] >> 2) & 1 - if is_data_valid: + 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 - is_data_valid = (status[0] >> 2) & 1 - if is_data_valid: + 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 From ebe661e745480c25c6993ef723a023bb2f0303d3 Mon Sep 17 00:00:00 2001 From: Maxim Date: Fri, 15 Aug 2025 01:07:59 +0300 Subject: [PATCH 5/9] =?UTF-8?q?=D0=9E=D1=82=D0=BB=D0=B6=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=20=D0=B8=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BD=D0=B0=203=20=D0=BF=D1=80=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=D1=85=20=D0=B2=20=D0=9A=D0=AD=D0=9D=20(=D0=9F?= =?UTF-8?q?=D0=A0=D0=94-=D0=9D,=20=D0=9F=D0=A0=D0=94-=D0=92,=20=D0=9F?= =?UTF-8?q?=D0=A0=D0=94-=D0=9A)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.gd | 145 ++++--- scenes/pribor-prd-n/kasseta-fs-nd.tscn | 6 +- scenes/pribor-prd-n/pribor-prd-n.gd | 538 +++++++------------------ scenes/pribor-prd-n/pribor-prd-n.tscn | 7 + scenes/pribor-prd-v/pribor-prd-v.gd | 475 +++++++--------------- scenes/pribor-prd-v/pribor-prd-v.tscn | 15 +- scripts/pribor-prd.gd | 219 +++++++--- 7 files changed, 541 insertions(+), 864 deletions(-) diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index caeb9d70..31a6c081 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -2,19 +2,6 @@ extends 'res://scenes/контроль/прибор.gd' const constants_k: Dictionary = { - '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, @@ -35,36 +22,45 @@ const constants_k: Dictionary = { } # Конфигурация параметров для каждого прибора const 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]}, + '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]}, } # Конфигурация частот и ширин для каждого ФС const FS_PARAMS := { - 1: {'freq': 450.0, 'width': 80.0}, - 6: {'freq': 2450.0, 'width': 110.0}, - 7: {'freq': 4750.0, 'width': 110.0} + 1: {'freq': 450.0, 'width': 80.0}, + 6: {'freq': 2450.0, 'width': 110.0}, + 7: {'freq': 4750.0, 'width': 110.0} } enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } 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], - } - + '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], +} +# Проверка ДКМ +var block_dkm_config_k: = { + 'dkm_1': false, + 'dkm_6': false, + 'dkm_7': false, +} +# Проверка ФС +var block_fs_prd_config_k: = { + 'fs_1': false, + 'fs_6': false, + 'fs_7': false, +} # Основные переменные var current_fs: int = 1 var ug_work_1: int = 0 var ug_work_2: int = 0 var ug_work_3: int = 0 -# Флаги и таймеры -var control_timer: Timer = Timer.new() var mashine_timer: Timer = Timer.new() var prd_k_module: Object var unit_prd_k: Object @@ -72,18 +68,13 @@ var unit_prd_k: Object var control_results_k: Dictionary = { 'block_ip': false, # Проверка касет П1 и ИП МА2000 'temperature': true, # Проверка температур УМ - 'dkm_1': false, # Проверка ДКМ 1 - 'dkm_6': false, # Проверка ДКМ 6 - 'dkm_7': false, # Проверка ДКМ 7 + 'dkm': false, 'power_um': false, # Мощность от УКП - 'fs_1': false, # Проверка ФС 1 - 'fs_6': false, # Проверка ФС 6 - 'fs_7': false, # Проверка ФС 7 + 'fs': false, } -#static var node_common_func = load('res://scripts/pribor-prd.gd') var test = preload('res://scripts/pribor-prd.gd') -var control_prd +var control_prd: Object func _ready() -> void: @@ -98,20 +89,21 @@ func _ready() -> void: func on_state_mashine() -> void: control_prd.state_control_machine() - block_ip_config_k = control_prd.block_config + block_ip_config_k = control_prd.block_ip_config var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') for power_supply in node_ip_power_arr: var meta_ip = power_supply.get_meta('ip') if block_ip_config_k.has(meta_ip) and control_prd.ug_online: power_supply.state = STATE_VAL.GOOD if block_ip_config_k[meta_ip][1] else STATE_VAL.ERROR - control_results_k = control_prd.control_results - if control_prd.current_fs == 1 and control_results_k.fs_1: - $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if control_results_k.dkm_1 else STATE_VAL.ERROR - elif control_prd.current_fs == 6 and control_results_k.fs_6: - $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if control_results_k.dkm_6 else STATE_VAL.ERROR - elif control_prd.current_fs == 7 and control_results_k.fs_7: - $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if control_results_k.dkm_7 else STATE_VAL.ERROR + var dkm: Dictionary = control_prd.block_dkm_config + var fs: Dictionary = control_prd.block_fs_config + if control_prd.current_fs == 1 and fs.fs_1: + $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if dkm.dkm_1 else STATE_VAL.ERROR + elif control_prd.current_fs == 6 and fs.fs_6: + $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if dkm.dkm_6 else STATE_VAL.ERROR + elif control_prd.current_fs == 7 and fs.fs_7: + $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if dkm.dkm_7 else STATE_VAL.ERROR if not control_prd.power_result['ray_25_1'] or not control_prd.power_result['ray_25_6'] or not control_prd.power_result['ray_25_7']: return @@ -147,7 +139,10 @@ func initialize_connections() -> void: 'prd_config': PRIBOR_CONFIG, 'fs_params': FS_PARAMS, 'block_ip_prd_config': block_ip_config_k, + 'block_dkm_prd_config': block_dkm_config_k, + 'block_fs_prd_config': block_fs_prd_config_k, 'control_results': control_results_k, + 'current_fs': current_fs, } control_prd = test.TestPRD.new(init_data) add_child(control_prd) @@ -189,36 +184,36 @@ func on_mode_changed(in_tree: bool) -> void: if not in_tree: queue_free() - -func on_control_result() -> void: - #Обновляем control_results['block_ip'] на основе block_config_k - var all_blocks_ok = true - for block in block_ip_config_k: - if not block_ip_config_k[block][1]: # Если хоть один блок false - all_blocks_ok = false - break - control_results_k['block_ip'] = all_blocks_ok - - # Словарь соответствия ключей ошибок и нод - var error_nodes := { - 'fs_1': $kasseta_fs_kd/ref_A3, - 'fs_6': $kasseta_fs_kd/ref_A6, - 'fs_7': $kasseta_fs_kd/ref_A5 - } - # Проверка результатов и установка состояний - var result: bool = true - for key in control_results_k: - if not control_results_k[key]: - result = false - if error_nodes.has(key): - error_nodes[key].state = STATE_VAL.ERROR - - # Установка текста и цвета результата +# +#func on_control_result() -> void: + #var pribor = 'her' + #var all_blocks_ok = true + #for block in block_ip_config_k: + #if not block_ip_config_k[block][1]: + #all_blocks_ok = false + #break + #control_results_k['block_ip'] = all_blocks_ok +# + ## Словарь соответствия ключей ошибок и нод + #var error_nodes := { + #'fs_1': $kasseta_fs_kd/ref_A3, + #'fs_6': $kasseta_fs_kd/ref_A6, + #'fs_7': $kasseta_fs_kd/ref_A5 + #} + ## Проверка результатов и установка состояний + #var result: bool = true + #for key in control_results_k: + #if not control_results_k[key]: + #result = false + #if error_nodes.has(key): + #error_nodes[key].state = STATE_VAL.ERROR +# + ## Установка текста и цвета результата #var status_text := 'неисправен' - var status_color := Color.RED + #var status_color := Color.RED #if result: #status_text = 'исправен' #status_color = Color.GREEN - +# #$control_result.text = 'Прибор ПРД-%s %s' % [pribor, status_text] - $control_result.add_theme_color_override('font_color', status_color) + #$control_result.add_theme_color_override('font_color', status_color) diff --git a/scenes/pribor-prd-n/kasseta-fs-nd.tscn b/scenes/pribor-prd-n/kasseta-fs-nd.tscn index 9ad7bd9f..4eee49c0 100644 --- a/scenes/pribor-prd-n/kasseta-fs-nd.tscn +++ b/scenes/pribor-prd-n/kasseta-fs-nd.tscn @@ -34,21 +34,23 @@ offset_bottom = 182.0 fname = "Блок ФС-3" rname = "A3" -[node name="ref_A3" parent="." instance=ExtResource("2_mkgdh")] +[node name="ref_A3" parent="." groups=["fs_group"] instance=ExtResource("2_mkgdh")] offset_left = 105.0 offset_top = 32.0 offset_right = 155.0 offset_bottom = 182.0 fname = "Модуль ФС" rname = "A1" +metadata/fs = "fs_4" -[node name="ref_A4" parent="." instance=ExtResource("2_mkgdh")] +[node name="ref_A4" parent="." groups=["fs_group"] instance=ExtResource("2_mkgdh")] offset_left = 155.0 offset_top = 32.0 offset_right = 205.0 offset_bottom = 182.0 fname = "Модуль ФС" rname = "A2" +metadata/fs = "fs_5" [node name="ref_A6" parent="." instance=ExtResource("2_mkgdh")] offset_left = 205.0 diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd index 74695773..cc039b1c 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.gd +++ b/scenes/pribor-prd-n/pribor-prd-n.gd @@ -1,13 +1,7 @@ @tool extends 'res://scenes/контроль/прибор.gd' -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, +const constants_n = { 'POWER_UKP_1': 31, 'POWER_UKP_2': 63, 'DKM_BIT_2': 1, @@ -15,122 +9,134 @@ const Constants = { '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': 3, + 'TIMER_DELAY': 5.0, + 'RAY_DOU_NUM': 0x3, 'ATT_UM_2': 0x7, 'ATT_UM_3': 0x7, - 'TIMER_DELAY': 5.0, 'POWER_UM': 70, } +# Конфигурация параметров для каждого прибора +const PRIBOR_CONFIG_N := { + '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]}, +} +# Конфигурация частот и ширин для каждого ФС +const FS_PARAMS_N := { + 2: {'freq': 900.0, 'width': 100.0}, + 3: {'freq': 1157.0, 'width': 100.0} +} enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } -enum STATE_MASHINE { - INIT, - FS_TURN_ON, - FS_WORK, - UG_SET, - UM_RUN, - FS_TURN_OFF, - STOP_CONTROL, - AWAIT - } -# Основные переменные -var current_fs: int = 2 -var state: int = STATE_MASHINE.INIT -var flag_check_dkm: bool = false -var flag_timer_started: bool = false - -var count_packet_2:int = 0 -var count_packet_3:int = 0 -var power_array_2: Array = [] -var power_array_3: Array = [] -var pribor: String -var ug_work_2: int -var ug_work_3: int -# Флаги и таймеры -var control_timer: Timer = Timer.new() -var mashine_timer: Timer = Timer.new() - -# Результаты контроля -var _control_results: Dictionary = { - 'block_ip': false, # Проверка касет П1 и ИП МА2000 - 'temperature': true, # Проверка температур УМ - 'dkm_2': false, # Проверка ДКМ - 'dkm_3': false, # Проверка ДКМ - 'power_ukp': false, # Мощность от УКП - 'fs_2': false, # Проверка ФС +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], +} +# Проверка ДКМ +var block_dkm_config_n: = { + 'dkm_2': false, + 'dkm_3': false, +} +# Проверка ФС +var block_fs_prd_config_n: = { + 'fs_2': false, 'fs_3': false, } +# Основные переменные +var current_fs: int = 2 +var ug_work_1: int = 0 +var ug_work_2: int = 0 +# Флаги и таймеры +var mashine_timer: Timer = Timer.new() +var prd_n_module: Object +var unit_prd_n: Object +var control_prd_n: Object +# Результаты контроля +var control_results_n: Dictionary = { + 'block_ip': false, # Проверка касет П1 и ИП МА2000 + 'temperature': true, # Проверка температур УМ + 'dkm': false, + 'power_um': false, # Мощность от УКП + 'fs': false, +} +var test = preload('res://scripts/pribor-prd.gd') + + +############# + + +func on_state_mashine() -> void: + control_prd_n.state_control_machine() + + block_ip_config_n = control_prd_n.block_ip_config + var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') + for power_supply in node_ip_power_arr: + var meta_ip = power_supply.get_meta('ip') + if block_ip_config_n.has(meta_ip) and control_prd_n.ug_online: + power_supply.state = STATE_VAL.GOOD if block_ip_config_n[meta_ip][1] else STATE_VAL.ERROR + + control_results_n = control_prd_n.control_results + var dkm: Dictionary = control_prd_n.block_dkm_config + var fs: Dictionary = control_prd_n.block_fs_config + if control_prd_n.current_fs == 2 and fs.fs_2: + $kasseta_FS_ND/ref_A4.state = STATE_VAL.GOOD if dkm.dkm_2 else STATE_VAL.ERROR + elif control_prd_n.current_fs == 3 and fs.fs_3: + $kasseta_FS_ND/ref_A3.state = STATE_VAL.GOOD if dkm.dkm_3 else STATE_VAL.ERROR + + if not control_prd_n.power_result['ray_25_2'] or not control_prd_n.power_result['ray_25_3']: + return + + var node_arr_power: Array = get_tree().get_nodes_in_group('power_amplifier') + for i_pow in node_arr_power.size(): + if i_pow < 6: + var pw = node_arr_power[i_pow] + pw.value1 = str(control_prd_n.power_result['ray_25_2'][i_pow]) + elif i_pow < 12: + var pw = node_arr_power[i_pow] + pw.value1 = str(control_prd_n.power_result['ray_25_3'][i_pow-6]) + func _ready() -> void: + if Engine.is_editor_hint(): + return + initialize_connections() setup_timer() set_default_state() -func on_state_mashine() -> void: - match state: - STATE_MASHINE.INIT: - print_debug('Текущий запуск current_fs: ', current_fs) - if current_fs == 2 or current_fs == 3: - state = STATE_MASHINE.FS_TURN_ON - else: - on_control_result() - state = STATE_MASHINE.AWAIT - - STATE_MASHINE.FS_TURN_ON: - print('FS_TURN_ON') - _on_control_fs(true) - control_timer.wait_time = Constants.TIMER_DELAY - control_timer.start() - state = STATE_MASHINE.FS_WORK - - STATE_MASHINE.FS_WORK: - print('FS_WORK') - if (current_fs == 2 and flag_check_dkm and not flag_timer_started) or \ - (current_fs == 3 and flag_check_dkm and not flag_timer_started): - state = STATE_MASHINE.UM_RUN - - STATE_MASHINE.UM_RUN: - print('UM_RUN') - 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.BASE_ADDR_EMS_G, 6666]]) - flag_timer_started = true - state = STATE_MASHINE.UG_SET - - STATE_MASHINE.UG_SET: - print('UG_SET') - on_ug_setting() - state = STATE_MASHINE.FS_WORK - - STATE_MASHINE.FS_TURN_OFF: - print('FS_TURN_OFF') - _on_control_fs(false) - power_control_result() - state = STATE_MASHINE.STOP_CONTROL - - STATE_MASHINE.STOP_CONTROL: - print('STOP_CONTROL') - flag_timer_started = false - flag_check_dkm = false - match current_fs: - 2: current_fs = 3 - 3: current_fs = 0 - state = STATE_MASHINE.INIT - - func initialize_connections() -> void: - signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state')) var unit_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - var current_unit = unit_prd.name - var parts = current_unit.split('-') - pribor = parts[-1] - unit_prd.connect('data_received', Callable(self, 'on_data_received')) - unit_prd.connect('line_changed', Callable(self, 'on_line_changed')) + prd_n_module = prd.prd_dict[unit_name] + unit_prd_n = prd_n_module.unit_yau07 + + unit_prd_n.connect('line_changed', Callable(self, 'on_line_changed')) + var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier') + var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') + var init_data: Dictionary = { + 'control_label': $control_result, + 'power_amplifiers': power_amplifiers, + 'fs_nodes': fs_nodes, + 'unit_prd': unit_prd_n, + 'module_prd' : prd_n_module, + 'constants': constants_n, + 'prd_config': PRIBOR_CONFIG_N, + 'fs_params': FS_PARAMS_N, + 'block_ip_prd_config': block_ip_config_n, + 'block_dkm_prd_config': block_dkm_config_n, + 'block_fs_prd_config': block_fs_prd_config_n, + 'control_results': control_results_n, + 'current_fs': current_fs, + } + control_prd_n = test.TestPRD.new(init_data) + add_child(control_prd_n) func setup_timer() -> void: @@ -139,12 +145,6 @@ func setup_timer() -> void: mashine_timer.wait_time = 0.5 mashine_timer.start() - 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'): @@ -155,304 +155,46 @@ func set_default_state() -> void: func _enter_tree() -> void: - $control_result.text = '' + if Engine.is_editor_hint(): + return + $control_result.text = 'Выполняется ...' + $control_result.add_theme_color_override('font_color', Color.ALICE_BLUE) signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) func _exit_tree() -> void: - var unit_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - 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_2, Constants.ADDR_UG_LITERA_2, ug_work_3]]) + 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]]) -func on_line_changed(unit_prd: Object) -> void: - if not unit_prd.online: +func on_line_changed(unit_pribor: Object) -> void: + if not unit_pribor.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 current_fs == 2 and _control_results.fs_2: - flag_check_dkm = check_dkm(status, Constants.DKM_BIT_2) - elif current_fs == 3 and _control_results.fs_3: - flag_check_dkm = check_dkm(status, Constants.DKM_BIT_3) - - if _control_results.fs_2 or _control_results.fs_3: - # Обработка мощности от УКП - _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_2_OT_FS) & 1 - $Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_3_OT_FS) & 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 -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 - - 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 - - $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_A20.state = STATE_VAL.ERROR if ip9_50_1 else STATE_VAL.GOOD - $kasseta_P_1/ref_A21.state = STATE_VAL.ERROR if ip9_50_2 else STATE_VAL.GOOD - $kasseta_P_1/ref_A19.state = STATE_VAL.ERROR if ip12_50_1 else STATE_VAL.GOOD - else: - $maa2000_A23.state = STATE_VAL.NONE - $maa2000_A22.state = STATE_VAL.NONE - $kasseta_P_1/ref_A19.state = STATE_VAL.NONE - $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: - const CONST_MIN_TEMP: int = -25 - const MAXIMUM_CODE_ADC: int = 3796 - const MINIMUM_CODE_AD: int = 2660 - const TEMP: float = 115.0 / (MAXIMUM_CODE_ADC - MINIMUM_CODE_AD) - const TEMPERATURE_UKP_1: int = 47 - const TEMPERATURE_UKP_2: int = 79 - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - - var ukp1_online: int = (status_prd[0] >> 2) & 1 - if ukp1_online: - for i_temp in range(6): - var temperature_ukp_1: int = status_prd.decode_u16(TEMPERATURE_UKP_1 + 2 * i_temp) - var tmp_1: int = round(CONST_MIN_TEMP + (MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) - power_amplifier[i_temp].value0 = tmp_1 - if tmp_1 > Constants.TEMP_THRESHOLD: - _control_results['temperature'] = false - 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(TEMPERATURE_UKP_2 + 2 * i_temp) - var tmp_2: int = round(CONST_MIN_TEMP + (MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3) - power_amplifier[i_temp+6].value0 = tmp_2 - if tmp_2 > Constants.TEMP_THRESHOLD: - _control_results['temperature'] = false - - - -## Проверка ДКМ -func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> bool: - const DKM: int = 28 - - var status_dkm = status_prd[DKM] >> bit_dkm & 1 - #print('^: ', status_prd[DKM]) - if bit_dkm == 1: - $dou3_A5.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 - elif bit_dkm == 2: - $dou2_A6.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_3'] = status_dkm - return status_dkm - - -func _process_ukp_power(status: PackedByteArray) -> void: - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - if current_fs == 2: - ## Мощность УМ от УКП 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) - - if count_packet_2 == 0: - power_array_2 = arr_power_ukp_1 - else: - for i in arr_power_ukp_1.size(): - if arr_power_ukp_1[i] > power_array_2[i]: - power_array_2[i] = arr_power_ukp_1[i] - - for i in 6: - power_amplifier[i].value1 = '%d' % power_array_2[i] - power_amplifier[i].state = STATE_VAL.GOOD if power_array_2[i] > Constants.TEMP_THRESHOLD else STATE_VAL.ERROR - count_packet_2 += 1 - - elif current_fs == 3: - ## Мощность УМ от УКП 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_3 == 0: - power_array_3 = arr_power_ukp_2 - else: - for i in arr_power_ukp_2.size(): - if arr_power_ukp_2[i] > power_array_3[i]: - power_array_3[i] = arr_power_ukp_2[i] - - for i in 6: - power_amplifier[i+6].value1 = '%d' % power_array_3[i] - power_amplifier[i+6].state = STATE_VAL.GOOD if power_array_3[i] > Constants.TEMP_THRESHOLD else STATE_VAL.ERROR - - count_packet_3 += 1 - - -func _on_control_fs(mode: bool) -> void: - # Конфигурация параметров для каждого прибора - var 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]}, - } - # Получаем конфигурацию для текущего прибора - var config: Dictionary = pribor_config.get(pribor) - var angle: float = config.angle - var sectors: Array = config.sectors - - # Конфигурация частот и ширин для каждого ФС - var fs_params := { - 2: {'freq': 900.0, 'width': 100.0}, - 3: {'freq': 1157.0, 'width': 100.0} - } - - # Формируем выходные данные - var interfer_name: String = 'k1' if mode else 'off' - var fs_arr: Array = [] - - if (state == STATE_MASHINE.FS_TURN_ON or state == STATE_MASHINE.FS_TURN_OFF): - if current_fs in fs_params: - var params = fs_params[current_fs] - fs_arr.append([ - angle, - params.freq, - params.width, - sectors[current_fs - 2] - ]) - signaller.emit_signal('interfer_init', interfer_name, fs_arr, Constants.POWER_UM) - - -func power_control_result() -> void: - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - _control_results['power_ukp'] = true - for amp in power_amplifier: - if amp.state != STATE_VAL.GOOD: - _control_results['power_ukp'] = false - break - - -func on_stop_control() -> void: - state = STATE_MASHINE.FS_TURN_OFF - - -func on_fs_update_state(packet_type_7: Dictionary) -> void: - # Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора - var fs_mapping = { - 4: { 'node': $kasseta_FS_ND/ref_A1, 'condition': pribor == '1н' }, - 5: { 'node': $kasseta_FS_ND/ref_A1, 'condition': pribor == '4н' }, - 6: { 'node': $kasseta_FS_ND/ref_A1, 'condition': pribor == '3н' }, - 7: { 'node': $kasseta_FS_ND/ref_A1, 'condition': pribor == '2н' }, - 8: { 'node': $kasseta_FS_ND/ref_A2, 'condition': pribor == '1н' }, - 9: { 'node': $kasseta_FS_ND/ref_A2, 'condition': pribor == '4н' }, - 10: { 'node': $kasseta_FS_ND/ref_A2, 'condition': pribor == '3н' }, - 11: { 'node': $kasseta_FS_ND/ref_A2, 'condition': pribor == '2н' } - } - for fs in packet_type_7: - if fs in fs_mapping and fs_mapping[fs]['condition']: - var data = packet_type_7[fs] - if fs < 8 and current_fs == 2: - _control_results['fs_2'] = (data.isg == 1) - var state_fs = 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_fs - elif fs > 7 and current_fs == 3: - _control_results['fs_3'] = (data.isg == 1) - var state_fs = 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_fs - - -func on_ug_setting() -> void: - var unit_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - - - if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_1): - ug_work_2 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_1] - if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_2): - ug_work_3 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_2] - - var result_1 = ((Constants.ATT_UM_2 & 0x07) << 3) | (Constants.RAY_DOU & 0x07) - var result_2 = ((Constants.ATT_UM_3 & 0x07) << 3) | (Constants.RAY_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_1, - Constants.ADDR_UG_LITERA_2, result_2]]) - - prd_module.cmd_array.append([unit_prd.CmdCode.READ_ISA, [Constants.ADDR_UG_LITERA_1, Constants.ADDR_UG_LITERA_2]]) - - func on_mode_changed(in_tree: bool) -> void: if not in_tree: queue_free() - -func on_control_result() -> void: - # Словарь соответствия ключей ошибок и нод - var error_nodes := { - 'fs_2': $kasseta_FS_ND/ref_A2, - 'fs_3': $kasseta_FS_ND/ref_A1, - } - # Проверка результатов и установка состояний - var result: bool = true - for key in _control_results: - if not _control_results[key]: - result = false - if error_nodes.has(key): - error_nodes[key].state = STATE_VAL.ERROR - - # Установка текста и цвета результата - var status_text := 'неисправен' - var status_color := Color.CRIMSON - if result: - status_text = 'исправен' - status_color = Color.AQUAMARINE - - $control_result.text = 'Прибор ПРД-%s %s' % [pribor, status_text] - $control_result.add_theme_color_override('font_color', status_color) +# +#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_VD/ref_A3.state = STATE_VAL.ERROR + #if key == 'fs_2': + #$kasseta_FS_VD/ref_A4.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/pribor-prd-n.tscn b/scenes/pribor-prd-n/pribor-prd-n.tscn index 0d639ec6..35104813 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.tscn +++ b/scenes/pribor-prd-n/pribor-prd-n.tscn @@ -51,6 +51,7 @@ offset_right = 175.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A23" +metadata/ip = "maa2000_2" [node name="maa2000_A22" parent="." groups=["default_reset"] instance=ExtResource("2_is25t")] layout_mode = 2 @@ -60,6 +61,7 @@ offset_right = 652.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A22" +metadata/ip = "maa2000_1" [node name="dou3_A5" parent="." groups=["default_reset"] instance=ExtResource("2_is25t")] layout_mode = 2 @@ -153,6 +155,7 @@ offset_right = 155.0 offset_bottom = 182.0 fname = "Модуль ФС" rname = "A1" +metadata/fs = "fs_3" [node name="ref_A2" parent="kasseta_FS_ND" groups=["default_reset"] instance=ExtResource("7_eoqf2")] offset_left = 155.0 @@ -161,6 +164,7 @@ offset_right = 205.0 offset_bottom = 182.0 fname = "Модуль ФС" rname = "A2" +metadata/fs = "fs_2" [node name="ref_A4" parent="kasseta_FS_ND" groups=["default_reset"] instance=ExtResource("7_eoqf2")] offset_left = 205.0 @@ -191,6 +195,7 @@ offset_right = 59.0 offset_bottom = 183.0 fname = "ИП12-50" rname = "A21" +metadata/ip = "ip12_50_1" [node name="ref_A20" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_eoqf2")] offset_left = 59.0 @@ -199,6 +204,7 @@ offset_right = 109.0 offset_bottom = 183.0 fname = "ИП9-50" rname = "A20" +metadata/ip = "ip9_50_1" [node name="ref_A19" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_eoqf2")] offset_left = 109.0 @@ -207,6 +213,7 @@ offset_right = 159.0 offset_bottom = 183.0 fname = "ИП9-50" rname = "A19" +metadata/ip = "ip9_50_2" [node name="lbl_fname" type="Label" parent="kasseta_P_1"] self_modulate = Color(1, 1, 1, 0.62) diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index 954c6ca5..d4bbc532 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -1,84 +1,146 @@ @tool extends 'res://scenes/контроль/прибор.gd' -const Constants = { - 'IN_BLANK_PRD': 1, - 'OUT_BLANK_PRD': 13, - 'CI_4_OT_FS': 11, - 'CI_5_OT_FS': 12, - 'CI_4_B_UF': 4, - 'CI_5_B_UF': 5, +const constants_v = { 'POWER_UKP_1': 31, 'POWER_UKP_2': 63, - 'DKM_BIT_3': 3, - 'DKM_BIT_4': 4, + '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, - 'TIMER_DELAY': 1.4, + 'TIMER_DELAY': 5.0, + 'RAY_DOU_NUM': 0x3, + 'ATT_UM_4': 0x7, + 'ATT_UM_5': 0x7, 'POWER_UM': 70, } +# Конфигурация параметров для каждого прибора +const PRIBOR_CONFIG_V := { + '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]}, +} +# Конфигурация частот и ширин для каждого ФС +const FS_PARAMS_V := { + 4: {'freq': 1227.0, 'width': 110.0}, + 5: {'freq': 1575.0, 'width': 110.0}, +} enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } +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], +} +# Проверка ДКМ +var block_dkm_config_v: = { + 'dkm_4': false, + 'dkm_5': false, +} +# Проверка ФС +var block_fs_prd_config_v: = { + 'fs_4': false, + 'fs_5': false, +} + # Основные переменные -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 current_fs: int = 4 +var ug_work_1: int = 0 +var ug_work_2: int = 0 # Флаги и таймеры -var control_timer: Timer = Timer.new() -var flag_timer_started: bool = false +var mashine_timer: Timer = Timer.new() +var prd_v_module: Object +var unit_prd_v: Object +var control_prd_v: Object # Результаты контроля -var _control_results: Dictionary = { +var control_results_v: Dictionary = { 'block_ip': false, # Проверка касет П1 и ИП МА2000 'temperature': true, # Проверка температур УМ - 'dkm_1': false, # Проверка ДКМ - 'dkm_2': false, # Проверка ДКМ - 'power_ukp': false, # Мощность от УКП - 'fs_1': false, # Проверка ФС - 'fs_2': false, + 'dkm': false, + 'power_um': false, # Мощность от УКП + 'fs': false, } +var test = preload('res://scripts/pribor-prd.gd') + + +func on_state_mashine() -> void: + control_prd_v.state_control_machine() + + block_ip_config_v = control_prd_v.block_ip_config + var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') + for power_supply in node_ip_power_arr: + var meta_ip = power_supply.get_meta('ip') + if block_ip_config_v.has(meta_ip) and control_prd_v.ug_online: + power_supply.state = STATE_VAL.GOOD if block_ip_config_v[meta_ip][1] else STATE_VAL.ERROR + + control_results_v = control_prd_v.control_results + var dkm: Dictionary = control_prd_v.block_dkm_config + var fs: Dictionary = control_prd_v.block_fs_config + if control_prd_v.current_fs == 4 and fs.fs_4: + $kasseta_FS_VD/ref_A2.state = STATE_VAL.GOOD if dkm.dkm_4 else STATE_VAL.ERROR + elif control_prd_v.current_fs == 5 and fs.fs_5: + $kasseta_FS_VD/ref_A6.state = STATE_VAL.GOOD if dkm.dkm_5 else STATE_VAL.ERROR + + if not control_prd_v.power_result['ray_25_4'] or not control_prd_v.power_result['ray_25_5']: + return + + var node_arr_power: Array = get_tree().get_nodes_in_group('power_amplifier') + for i_pow in node_arr_power.size(): + if i_pow < 6: + var pw = node_arr_power[i_pow] + pw.value1 = str(control_prd_v.power_result['ray_25_4'][i_pow]) + elif i_pow < 12: + var pw = node_arr_power[i_pow] + pw.value1 = str(control_prd_v.power_result['ray_25_5'][i_pow-6]) func _ready() -> void: + if Engine.is_editor_hint(): + return + 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_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - 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')) + prd_v_module = prd.prd_dict[unit_name] + unit_prd_v = prd_v_module.unit_yau07 + + unit_prd_v.connect('line_changed', Callable(self, 'on_line_changed')) + var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier') + var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') + var init_data: Dictionary = { + 'control_label': $control_result, + 'power_amplifiers': power_amplifiers, + 'fs_nodes': fs_nodes, + 'unit_prd': unit_prd_v, + 'module_prd' : prd_v_module, + 'constants': constants_v, + 'prd_config': PRIBOR_CONFIG_V, + 'fs_params': FS_PARAMS_V, + 'block_ip_prd_config': block_ip_config_v, + 'block_dkm_prd_config': block_dkm_config_v, + 'block_fs_prd_config': block_fs_prd_config_v, + 'control_results': control_results_v, + 'current_fs': current_fs, + } + control_prd_v = test.TestPRD.new(init_data) + add_child(control_prd_v) 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 _enter_tree() -> void: - $control_result.text = '' - signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) - signaller.emit_signal('interfer_off_all') - await get_tree().create_timer(2.0).timeout - _on_control_fs(true) - - -func _exit_tree() -> void: - var unit_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - 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]]) + add_child(mashine_timer) + mashine_timer.connect('timeout', Callable(self, 'on_state_mashine')) + mashine_timer.wait_time = 0.5 + mashine_timer.start() func set_default_state() -> void: @@ -89,286 +151,47 @@ func set_default_state() -> void: group.state = STATE_VAL.NONE -func on_line_changed(unit_prd: Object) -> void: - if not unit_prd.online: +func _enter_tree() -> void: + if Engine.is_editor_hint(): + return + $control_result.text = 'Выполняется ...' + $control_result.add_theme_color_override('font_color', Color.ALICE_BLUE) + signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) + + +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]]) + + +func on_line_changed(unit_pribor: Object) -> void: + if not unit_pribor.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_3) - check_dkm(status, Constants.DKM_BIT_4) - # Обработка мощности от УКП - _process_ukp_power(status) - - -## Проверка касет П1 и ИП МА2000 -func check_block_ip(status_prd: PackedByteArray) -> void: - var ug_online: bool = (status_prd[0] >> 1) & 1 - if not ug_online: - for node in [$maa2000_A23, $maa2000_A22, $kasseta_P_1/ref_A19, $kasseta_P_1/ref_A20, $kasseta_P_1/ref_A21]: - node.state = STATE_VAL.NONE - return - - 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 - - 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 - - $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_A19.state = STATE_VAL.ERROR if ip9_50_1 else STATE_VAL.GOOD - $kasseta_P_1/ref_A20.state = STATE_VAL.ERROR if ip9_50_2 else STATE_VAL.GOOD - $kasseta_P_1/ref_A21.state = STATE_VAL.ERROR if ip12_50_1 else STATE_VAL.GOOD - - _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: - const TEMP_CONSTANTS = { - 'min_temp': -25, - 'max_code': 3796, - 'min_code': 2660, - 'temp_factor': 115.0 / (3796 - 2660), - 'offset': 3 # Корректировка температуры - } - const TEMPERATURE_UKP_1: int = 47 - const TEMPERATURE_UKP_2: int = 79 - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - - # Сбрас флагов перед проверкой - _control_results['temperature'] = true - - var ukp1_online: int = (status_prd[0] >> 2) & 1 - if ukp1_online: - for i_temp in range(6): - var temperature_ukp_1: int = status_prd.decode_u16(TEMPERATURE_UKP_1 + 2 * i_temp) - var tmp_1: int = round(TEMP_CONSTANTS['min_temp'] + (TEMP_CONSTANTS['max_code'] - temperature_ukp_1) * TEMP_CONSTANTS['temp_factor'] + TEMP_CONSTANTS['offset']) - power_amplifier[i_temp].value0 = tmp_1 - if tmp_1 > Constants.TEMP_THRESHOLD: - _control_results['temperature'] = false - - 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(TEMPERATURE_UKP_2 + 2 * i_temp) - var tmp_2: int = round(TEMP_CONSTANTS['min_temp'] + (TEMP_CONSTANTS['max_code'] - temperature_ukp_2) * TEMP_CONSTANTS['temp_factor'] + TEMP_CONSTANTS['offset']) - power_amplifier[i_temp+6].value0 = tmp_2 - if tmp_2 > Constants.TEMP_THRESHOLD: - _control_results['temperature'] = false - - -## Проверка ДКМ -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: - $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 - - -# Обрабатывает данные ЭМС и обновляет 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_4_OT_FS) & 1 - $Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_5_OT_FS) & 1 - - # Обновление фреймов для выходных сигналов ЭМС - $Monitoring_panel/out_ems_1.frame = (out_blank >> Constants.CI_4_B_UF) & 1 - $Monitoring_panel/out_ems_2.frame = (out_blank >> Constants.CI_5_B_UF) & 1 - - -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] > Constants.POWER_THRESHOLD 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] > Constants.POWER_THRESHOLD 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 parts = currecnt_unit.split('-') - var last_part = parts[-1] - var angle: float = 0.0 # -> ПРД-В1; 90.0 -> ПРД-В2; 180.0 -> ПРД-В3; 270.0 -> ПРД-В4 - var sector_1: float = 12 # -> ПРД-В1; 15 -> ПРД-В2; 14 -> ПРД-В3; 13 -> ПРД-В4; - var sector_2: float = 16 # -> ПРД-В1; 19 -> ПРД-В2; 18 -> ПРД-В3; 17 -> ПРД-В4; - if last_part == '2в': - angle = 90.0 - sector_1 = 15 - sector_2 = 19 - elif last_part == '3в': - angle = 180.0 - sector_1 = 14 - sector_2 = 18 - elif last_part == '4в': - angle = 270.0 - sector_1 = 13 - sector_2 = 17 - - var interfer_name: String = 'k1' if mode else 'off' - var freq_1: float = 1227.0 # ФС_1 - var freq_2: float = 1575.0 # ФС_2 - var width_1: float = 110.0 # ФС_1 - var width_2: float = 110.0 # ФС_2 - - var fs_arr: Array = [[angle, freq_1, width_1, sector_1], [angle, freq_2, width_2, sector_2]] - signaller.emit_signal('interfer_init', interfer_name, fs_arr, Constants.POWER_UM) - - -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 = { - 12: { 'node': $kasseta_FS_VD/ref_A3, 'condition': last_part == '1в' }, - 13: { 'node': $kasseta_FS_VD/ref_A3, 'condition': last_part == '4в' }, - 14: { 'node': $kasseta_FS_VD/ref_A3, 'condition': last_part == '3в' }, - 15: { 'node': $kasseta_FS_VD/ref_A3, 'condition': last_part == '2в' }, - 16: { 'node': $kasseta_FS_VD/ref_A4, 'condition': last_part == '1в' }, - 17: { 'node': $kasseta_FS_VD/ref_A4, 'condition': last_part == '4в' }, - 18: { 'node': $kasseta_FS_VD/ref_A4, 'condition': last_part == '3в' }, - 19: { 'node': $kasseta_FS_VD/ref_A4, '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 < 16: - _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_name = get_meta('unit_name')[0] - var unit_prd = network.units[unit_name] - - 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_VD/ref_A3.state = STATE_VAL.ERROR - if key == 'fs_2': - $kasseta_FS_VD/ref_A4.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 +# +#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_VD/ref_A3.state = STATE_VAL.ERROR + #if key == 'fs_2': + #$kasseta_FS_VD/ref_A4.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/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index 02fd1156..1e567977 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="." groups=["default_reset"] instance=ExtResource("2_xpo4b")] +[node name="maa2000_A22" parent="." groups=["default_reset", "power_supply"] instance=ExtResource("2_xpo4b")] layout_mode = 2 offset_left = 485.0 offset_top = 877.0 @@ -52,6 +52,7 @@ offset_right = 652.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A22" +metadata/ip = "maa2000_1" [node name="dou4_A5" parent="." groups=["default_reset"] instance=ExtResource("2_xpo4b")] layout_mode = 2 @@ -62,7 +63,7 @@ offset_bottom = 877.0 fname = "ДОУ-4" rname = "A5" -[node name="maa2000_A23" parent="." groups=["default_reset"] instance=ExtResource("2_xpo4b")] +[node name="maa2000_A23" parent="." groups=["default_reset", "power_supply"] instance=ExtResource("2_xpo4b")] layout_mode = 2 offset_left = 8.0 offset_top = 877.0 @@ -70,6 +71,7 @@ offset_right = 175.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A23" +metadata/ip = "maa2000_2" [node name="dou5_A6" parent="." groups=["default_reset"] instance=ExtResource("2_xpo4b")] layout_mode = 2 @@ -135,29 +137,32 @@ patch_margin_bottom = 16 script = ExtResource("6_os4mt") fname = "Кассета П-1В" -[node name="ref_A19" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_38u2b")] +[node name="ref_A19" parent="kasseta_P_1" groups=["default_reset", "power_supply"] instance=ExtResource("7_38u2b")] offset_left = 9.0 offset_top = 33.0 offset_right = 59.0 offset_bottom = 183.0 fname = "ИП9-50" rname = "A19" +metadata/ip = "ip9_50_1" -[node name="ref_A20" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_38u2b")] +[node name="ref_A20" parent="kasseta_P_1" groups=["default_reset", "power_supply"] instance=ExtResource("7_38u2b")] offset_left = 59.0 offset_top = 33.0 offset_right = 109.0 offset_bottom = 183.0 fname = "ИП9-50" rname = "A20" +metadata/ip = "ip9_50_2" -[node name="ref_A21" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_38u2b")] +[node name="ref_A21" parent="kasseta_P_1" groups=["default_reset", "power_supply"] instance=ExtResource("7_38u2b")] offset_left = 109.0 offset_top = 33.0 offset_right = 159.0 offset_bottom = 183.0 fname = "ИП12-50" rname = "A21" +metadata/ip = "ip12_50_1" [node name="lbl_fname" type="Label" parent="kasseta_P_1"] self_modulate = Color(1, 1, 1, 0.62) diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index 54cc92ff..ac515ae9 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -1,5 +1,9 @@ class TestPRD extends Node: const RAY_25_1:= 'ray_25_1' + const RAY_25_2:= 'ray_25_2' + const RAY_25_3:= 'ray_25_3' + const RAY_25_4:= 'ray_25_4' + const RAY_25_5:= 'ray_25_5' const RAY_25_6:= 'ray_25_6' const RAY_25_7:= 'ray_25_7' enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } @@ -32,17 +36,23 @@ class TestPRD extends Node: var power_result: Dictionary = { RAY_25_1: [], + RAY_25_2: [], + RAY_25_3: [], + RAY_25_4: [], + RAY_25_5: [], RAY_25_6: [], RAY_25_7: [], } var constants: Dictionary var pribor_config: Dictionary var fs_parameters: Dictionary - var block_config: Dictionary + var block_ip_config: Dictionary + var block_dkm_config: Dictionary + var block_fs_config: Dictionary var control_results: Dictionary var self_name: String var state: int = STATE_MASHINE.INIT - var current_fs: int = 1 + var current_fs: int var flag_check_dkm: bool var flag_timer_started: bool var ug_online: bool @@ -51,9 +61,10 @@ class TestPRD extends Node: var power_amplify: Array var fs_array_node: Array var control_label: Label - var control_timer: Timer = Timer.new() + + ## Инициализация аргуметнов func _init(init_data: Dictionary) -> void: control_label = init_data['control_label'] power_amplify = init_data['power_amplifiers'] @@ -63,16 +74,23 @@ class TestPRD extends Node: constants = init_data['constants'] pribor_config = init_data['prd_config'] fs_parameters = init_data['fs_params'] - block_config = init_data['block_ip_prd_config'] + block_ip_config = init_data['block_ip_prd_config'] + block_dkm_config = init_data['block_dkm_prd_config'] + block_fs_config = init_data['block_fs_prd_config'] control_results = init_data['control_results'] + current_fs = init_data['current_fs'] + func _ready() -> void: initialize_connections() setup_timer() + func _process(_delta: float) -> void: pass + + ## Пакеты от ЯУ-07 func on_data_received(unit_pribor: Object) -> void: if not is_inside_tree(): return @@ -80,11 +98,12 @@ class TestPRD extends Node: var status: PackedByteArray = unit_pribor.status ug_online = (status[0] >> 1) & 1 - block_config = check_block_ip(status, block_config) + block_ip_config = check_block_ip(status, block_ip_config) check_temperature_um(status, power_amplify) _process_dkm_status(status) + ## Пакеты от MP550Service func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary, fs_array: Array) -> void: var fs_key: String = FS_KEYS.get(current_fs, '') if fs_key.is_empty(): @@ -94,7 +113,7 @@ class TestPRD extends Node: fs_result = on_fs_state(packet_type_7, fs_mapping, fs_result) _update_fs_states(fs_result, fs_array) - + ## func state_control_machine() -> void: match state: STATE_MASHINE.INIT: @@ -118,7 +137,7 @@ class TestPRD extends Node: if current_fs in [1, 2, 3, 4, 5, 6, 7]: state = STATE_MASHINE.FS_TURN_ON else: - on_control_result() + control_results = on_control_result(block_ip_config, block_dkm_config, block_fs_config, control_results) state = STATE_MASHINE.AWAIT @@ -132,6 +151,8 @@ class TestPRD extends Node: func _handle_fs_work_state() -> void: control_label.text = 'Выполняется проверка ФС-%s' % current_fs + if not module_prd.unit_yau07.online: + return if (current_fs == 2 and flag_check_dkm and not flag_timer_started) or \ (current_fs == 3 and flag_check_dkm and not flag_timer_started) or \ (current_fs == 4 and flag_check_dkm and not flag_timer_started) or \ @@ -143,13 +164,30 @@ class TestPRD extends Node: func _handle_ug_set_state() -> void: + var dic_att := { + 'RAY_DOU_NUM': constants.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, + } + 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 control_label.text = 'Выполняется настройка угла (%s) и атт (%s, %s, %s)' % [ - constants.RAY_DOU_NUM, - constants.ATT_UM_1, - constants.ATT_UM_6, - constants.ATT_UM_7, + dic_att.RAY_DOU_NUM, + dic_att.ATT_UM_1, + dic_att.ATT_UM_2, + dic_att.ATT_UM_3, ] - on_ug_setting(module_prd, unit_prd, constants) + on_ug_setting(module_prd, unit_prd, dic_att) state = STATE_MASHINE.UM_RUN @@ -209,12 +247,12 @@ class TestPRD extends Node: func _process_dkm_status(status: PackedByteArray) -> void: - if not control_results.has(_get_current_fs_key()): + if not block_fs_config.has(_get_current_fs_key()): return var dkm_bit = _get_dkm_bit_for_current_fs() - control_results = check_dkm(status, dkm_bit, control_results) + block_dkm_config = check_dkm(status, dkm_bit, block_dkm_config) - flag_check_dkm = control_results[_get_dkm_key_for_current_fs()] + flag_check_dkm = block_dkm_config[_get_dkm_key_for_current_fs()] if flag_check_dkm: power_result[_get_ray_key_for_current_fs()] = power_um_ukp(status, current_fs, power_result[_get_ray_key_for_current_fs()]) @@ -250,6 +288,10 @@ class TestPRD extends Node: func _get_ray_key_for_current_fs() -> String: match current_fs: 1: return RAY_25_1 + 2: return RAY_25_2 + 3: return RAY_25_3 + 4: return RAY_25_4 + 5: return RAY_25_5 6: return RAY_25_6 7: return RAY_25_7 _: return '' @@ -261,30 +303,56 @@ class TestPRD extends Node: if fs_result.has(fs_meta): var new_state = fs_result[fs_meta] fs.state = new_state - control_results[fs_meta] = new_state + block_fs_config[fs_meta] = new_state func on_stop_control() -> void: state = STATE_MASHINE.FS_TURN_OFF - static func on_control_result() -> void: - print('on_control_result') + static func on_control_result(ip_config: Dictionary, dkm_config: Dictionary, fs_config: Dictionary, ctrl_results: Dictionary) -> Dictionary: + var all_blocks_ip_ok = true + var all_blocks_dkm_ok = true + var all_blocks_fs_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 + + for block in dkm_config: + if not dkm_config[block]: + all_blocks_dkm_ok = false + ctrl_results['dkm'] = all_blocks_dkm_ok + + for block in fs_config: + if not fs_config[block]: + all_blocks_fs_ok = false + ctrl_results['fs'] = all_blocks_fs_ok + + return ctrl_results + ## Установка угла и аттенюации для УМ static func on_ug_setting(prd_module: Object, prd_unit: Object, settings_ug: Dictionary) -> void: - var result_1 = ((settings_ug.ATT_UM_6 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07) - var result_2 = ((settings_ug.ATT_UM_7 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07) + 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_module.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_1]]) + settings_ug.ADDR_UG_LITERA_2, result_2, + settings_ug.ADDR_UG_LITERA_3, settings_ug.ATT_UM_3]]) prd_module.cmd_array.append([prd_unit.CmdCode.READ_ISA, [settings_ug.ADDR_UG_LITERA_1, settings_ug.ADDR_UG_LITERA_2, settings_ug.ADDR_UG_LITERA_3]]) static func power_um_control_result(ctrl_results: Dictionary, constan: Dictionary, pwr_result: Dictionary) -> Dictionary: ctrl_results['power_um'] = true + + for amp_array in pwr_result.values(): + if amp_array.size() == 0: + ctrl_results['power_um'] = false + return ctrl_results + for amp_array in pwr_result.values(): for value in amp_array: if value < constan.TEMP_THRESHOLD: @@ -310,22 +378,23 @@ class TestPRD extends Node: angle, params.freq, params.width, - sectors[cur_fs - 1] if cur_fs == 1 else sectors[cur_fs - 5] + sectors[cur_fs - 1] if cur_fs == 1 else sectors[cur_fs - 5] if cur_fs > 5 else sectors[cur_fs - 4] if cur_fs > 3 else sectors[cur_fs - 2] ]) - signaller.emit_signal('interfer_init', interfer_name, fs_arr, power_um) + ## Проверка касет П1 и ИП МА2000 - static func check_block_ip(status_prd: PackedByteArray, block_ip_config: Dictionary) -> Dictionary: + 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 block_ip_config: - var bit: int = block_ip_config[block][0] + for block in ip_config: + var bit: int = ip_config[block][0] if ug_valid: var status = status_prd[byte_dry] >> bit & 1 - block_ip_config[block][1] = false if status else true - return block_ip_config + ip_config[block][1] = false if status else true + return ip_config + ## Проверка температур УМ от УКП static func check_temperature_um(status_prd: PackedByteArray, power_amplifier: Array) -> void: @@ -338,6 +407,8 @@ class TestPRD extends Node: } 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 + if ukp1_online: var tmp_1: int var temperature_ukp_1: int @@ -345,17 +416,21 @@ class TestPRD extends Node: 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 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].value0 = tmp_1 + 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) - power_amplifier[i_temp+7].value0 = tmp_2 + if power_amplifier.size() > 12: + power_amplifier[i_temp+7].value0 = tmp_2 + else: + power_amplifier[i_temp+6].value0 = tmp_2 + ## Проверка ДКМ static func check_dkm(status_prd: PackedByteArray, bit_dkm: int, dkm_result: Dictionary) -> Dictionary: @@ -363,6 +438,14 @@ class TestPRD extends Node: var status_dkm = status_prd[dkm] >> bit_dkm & 1 if bit_dkm == 0: dkm_result['dkm_1'] = status_dkm + elif bit_dkm == 1: + dkm_result['dkm_2'] = status_dkm + elif bit_dkm == 2: + dkm_result['dkm_3'] = status_dkm + elif bit_dkm == 3: + dkm_result['dkm_4'] = status_dkm + elif bit_dkm == 4: + dkm_result['dkm_5'] = status_dkm elif bit_dkm == 5: dkm_result['dkm_6'] = status_dkm elif bit_dkm == 6: @@ -373,53 +456,49 @@ class TestPRD extends Node: ## static func _create_fs_mapping(s_name: String) -> Dictionary: var suffixes: Dictionary = { - 0: 'к', 1: 'к', 2: 'к', 3: 'к', - 4: 'н', 5: 'н', 6: 'н', 7: 'н', - 8: 'н', 9: 'н', 10: 'н', 11: 'н', - 12: 'в', 13: 'в', 14: 'в', 15: 'в', - 16: 'в', 17: 'в', 18: 'в', 19: 'в', - 20: 'к', 21: 'к', 22: 'к', 23: 'к', - 24: 'к', 25: 'к', 26: 'к', 27: 'к', + 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: - var num_part = str((fs_num % 4) + 1) - mapping[fs_num] = {'condition': s_name == num_part + suffixes[fs_num]} + 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} + {'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] - - # Проверяем все правила для текущего FS - for rule_key in FS_RULES: - var rule = FS_RULES[rule_key] + 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.range[0] and fs_num < rule.range[1]) and results.has(rule.key) + return bool(fs_num >= rule.min and fs_num < rule.max) and results.has(rule.key) ## @@ -436,6 +515,30 @@ class TestPRD extends Node: 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 From 11bd15b88b391084e8373130f6784042ed45a4a8 Mon Sep 17 00:00:00 2001 From: Maxim Date: Fri, 15 Aug 2025 05:04:46 +0300 Subject: [PATCH 6/9] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 1 + scenes/pribor-prd-k/pribor-prd-k.gd | 181 ++++---- scenes/pribor-prd-k/pribor-prd-k.tscn | 5 +- scenes/pribor-prd-n/kasseta-fs-nd.tscn | 6 +- scenes/pribor-prd-n/pribor-prd-n.gd | 554 +++++++------------------ scenes/pribor-prd-n/pribor-prd-n.tscn | 26 +- scenes/pribor-prd-v/pribor-prd-v.gd | 493 ++++++++-------------- scenes/pribor-prd-v/pribor-prd-v.tscn | 15 +- scenes/контроль/кассета-у-5-к.tscn | 18 +- scenes/контроль/кассета-у-5-нв.tscn | 18 +- scripts/pribor-prd.gd | 286 +++++++++---- 11 files changed, 686 insertions(+), 917 deletions(-) diff --git a/project.godot b/project.godot index 83e97938..5eec3ea6 100644 --- a/project.godot +++ b/project.godot @@ -149,6 +149,7 @@ external_cu=false default_reset="" power_supply="Ноды источников питания прибора" fs_group="Группа модулей ФС" +y-5="" [gui] diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index caeb9d70..e31aa8c1 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -2,19 +2,6 @@ extends 'res://scenes/контроль/прибор.gd' const constants_k: Dictionary = { - '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, @@ -35,36 +22,53 @@ const constants_k: Dictionary = { } # Конфигурация параметров для каждого прибора const 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]}, + '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]}, } # Конфигурация частот и ширин для каждого ФС const FS_PARAMS := { - 1: {'freq': 450.0, 'width': 80.0}, - 6: {'freq': 2450.0, 'width': 110.0}, - 7: {'freq': 4750.0, 'width': 110.0} + 1: {'freq': 450.0, 'width': 80.0}, + 6: {'freq': 2450.0, 'width': 110.0}, + 7: {'freq': 4750.0, 'width': 110.0} } enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } 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], - } - + '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], +} +# Проверка ДКМ +var block_dkm_config_k: = { + 'dkm_1': false, + 'dkm_6': false, + 'dkm_7': false, +} +# Проверка ФС +var block_fs_prd_config_k: = { + 'fs_1': false, + 'fs_6': false, + 'fs_7': false, +} +var block_kasseta_y5_prd_config_k: = { + 'yau07': false, + 'ems': false, + 'ug': false, + 'ukp1': false, + 'ukp2': false, +} # Основные переменные var current_fs: int = 1 var ug_work_1: int = 0 var ug_work_2: int = 0 var ug_work_3: int = 0 -# Флаги и таймеры -var control_timer: Timer = Timer.new() var mashine_timer: Timer = Timer.new() var prd_k_module: Object var unit_prd_k: Object @@ -72,18 +76,13 @@ var unit_prd_k: Object var control_results_k: Dictionary = { 'block_ip': false, # Проверка касет П1 и ИП МА2000 'temperature': true, # Проверка температур УМ - 'dkm_1': false, # Проверка ДКМ 1 - 'dkm_6': false, # Проверка ДКМ 6 - 'dkm_7': false, # Проверка ДКМ 7 + 'dkm': false, 'power_um': false, # Мощность от УКП - 'fs_1': false, # Проверка ФС 1 - 'fs_6': false, # Проверка ФС 6 - 'fs_7': false, # Проверка ФС 7 + 'fs': false, } -#static var node_common_func = load('res://scripts/pribor-prd.gd') var test = preload('res://scripts/pribor-prd.gd') -var control_prd +var control_prd_k: Object func _ready() -> void: @@ -96,37 +95,45 @@ func _ready() -> void: func on_state_mashine() -> void: - control_prd.state_control_machine() - - block_ip_config_k = control_prd.block_config + control_prd_k.state_control_machine() + + block_kasseta_y5_prd_config_k = control_prd_k.block_kasseta_y5_config + var nodes_y5: Array = get_tree().get_nodes_in_group('y-5') + for node_y5 in nodes_y5: + var meta_y5 = node_y5.get_meta('y5') + if block_kasseta_y5_prd_config_k.has(meta_y5): + node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_k[meta_y5] else STATE_VAL.ERROR + + block_ip_config_k = control_prd_k.block_ip_config var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') for power_supply in node_ip_power_arr: var meta_ip = power_supply.get_meta('ip') - if block_ip_config_k.has(meta_ip) and control_prd.ug_online: + 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 - control_results_k = control_prd.control_results - if control_prd.current_fs == 1 and control_results_k.fs_1: - $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if control_results_k.dkm_1 else STATE_VAL.ERROR - elif control_prd.current_fs == 6 and control_results_k.fs_6: - $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if control_results_k.dkm_6 else STATE_VAL.ERROR - elif control_prd.current_fs == 7 and control_results_k.fs_7: - $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if control_results_k.dkm_7 else STATE_VAL.ERROR + var dkm: Dictionary = control_prd_k.block_dkm_config + var fs: Dictionary = control_prd_k.block_fs_config + if control_prd_k.current_fs == 1 and fs.fs_1: + $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if dkm.dkm_1 else STATE_VAL.ERROR + elif control_prd_k.current_fs == 6 and fs.fs_6: + $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if dkm.dkm_6 else STATE_VAL.ERROR + elif control_prd_k.current_fs == 7 and fs.fs_7: + $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if dkm.dkm_7 else STATE_VAL.ERROR - if not control_prd.power_result['ray_25_1'] or not control_prd.power_result['ray_25_6'] or not control_prd.power_result['ray_25_7']: + if not control_prd_k.power_result['ray_25_1'] or not control_prd_k.power_result['ray_25_6'] or not control_prd_k.power_result['ray_25_7']: return var node_arr_power: Array = get_tree().get_nodes_in_group('power_amplifier') for i_pow in node_arr_power.size(): if i_pow < 1: var pw = node_arr_power[i_pow] - pw.value1 = str(control_prd.power_result['ray_25_1'][i_pow]) + pw.value1 = str(control_prd_k.power_result['ray_25_1'][i_pow]) elif i_pow < 7: var pw = node_arr_power[i_pow] - pw.value1 = str(control_prd.power_result['ray_25_6'][i_pow-1]) + pw.value1 = str(control_prd_k.power_result['ray_25_6'][i_pow-1]) elif i_pow < 13: var pw = node_arr_power[i_pow] - pw.value1 = str(control_prd.power_result['ray_25_7'][i_pow-7]) + pw.value1 = str(control_prd_k.power_result['ray_25_7'][i_pow-7]) func initialize_connections() -> void: @@ -147,10 +154,14 @@ func initialize_connections() -> void: 'prd_config': PRIBOR_CONFIG, 'fs_params': FS_PARAMS, 'block_ip_prd_config': block_ip_config_k, + 'block_dkm_prd_config': block_dkm_config_k, + 'block_fs_prd_config': block_fs_prd_config_k, + 'block_kasseta_y5_prd_config': block_kasseta_y5_prd_config_k, 'control_results': control_results_k, + 'current_fs': current_fs, } - control_prd = test.TestPRD.new(init_data) - add_child(control_prd) + control_prd_k = test.TestPRD.new(init_data) + add_child(control_prd_k) func setup_timer() -> void: @@ -177,6 +188,8 @@ func _enter_tree() -> void: func _exit_tree() -> void: + if Engine.is_editor_hint(): + return 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]]) @@ -189,36 +202,36 @@ func on_mode_changed(in_tree: bool) -> void: if not in_tree: queue_free() - -func on_control_result() -> void: - #Обновляем control_results['block_ip'] на основе block_config_k - var all_blocks_ok = true - for block in block_ip_config_k: - if not block_ip_config_k[block][1]: # Если хоть один блок false - all_blocks_ok = false - break - control_results_k['block_ip'] = all_blocks_ok - - # Словарь соответствия ключей ошибок и нод - var error_nodes := { - 'fs_1': $kasseta_fs_kd/ref_A3, - 'fs_6': $kasseta_fs_kd/ref_A6, - 'fs_7': $kasseta_fs_kd/ref_A5 - } - # Проверка результатов и установка состояний - var result: bool = true - for key in control_results_k: - if not control_results_k[key]: - result = false - if error_nodes.has(key): - error_nodes[key].state = STATE_VAL.ERROR - - # Установка текста и цвета результата +# +#func on_control_result() -> void: + #var pribor = 'her' + #var all_blocks_ok = true + #for block in block_ip_config_k: + #if not block_ip_config_k[block][1]: + #all_blocks_ok = false + #break + #control_results_k['block_ip'] = all_blocks_ok +# + ## Словарь соответствия ключей ошибок и нод + #var error_nodes := { + #'fs_1': $kasseta_fs_kd/ref_A3, + #'fs_6': $kasseta_fs_kd/ref_A6, + #'fs_7': $kasseta_fs_kd/ref_A5 + #} + ## Проверка результатов и установка состояний + #var result: bool = true + #for key in control_results_k: + #if not control_results_k[key]: + #result = false + #if error_nodes.has(key): + #error_nodes[key].state = STATE_VAL.ERROR +# + ## Установка текста и цвета результата #var status_text := 'неисправен' - var status_color := Color.RED + #var status_color := Color.RED #if result: #status_text = 'исправен' #status_color = Color.GREEN - +# #$control_result.text = 'Прибор ПРД-%s %s' % [pribor, status_text] - $control_result.add_theme_color_override('font_color', status_color) + #$control_result.add_theme_color_override('font_color', status_color) diff --git a/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index 7a12d7f2..acb6db29 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.tscn +++ b/scenes/pribor-prd-k/pribor-prd-k.tscn @@ -1,10 +1,9 @@ -[gd_scene load_steps=16 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"] [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="Script" uid="uid://dow4nqi6hbak8" path="res://scenes/контроль/кассета-у-5.gd" id="3_wip3a"] [ext_resource type="PackedScene" uid="uid://bkxblfoj7ejv0" path="res://scenes/контроль/блок-а.tscn" id="6_fmhtx"] [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"] @@ -51,8 +50,6 @@ offset_left = 175.0 offset_top = 242.0 offset_right = 485.0 offset_bottom = 432.0 -script = ExtResource("3_wip3a") -fname = "Кассета У5" [node name="maa2000_A22" parent="." groups=["default_reset", "power_supply"] instance=ExtResource("1_8dmgr")] layout_mode = 0 diff --git a/scenes/pribor-prd-n/kasseta-fs-nd.tscn b/scenes/pribor-prd-n/kasseta-fs-nd.tscn index 9ad7bd9f..4eee49c0 100644 --- a/scenes/pribor-prd-n/kasseta-fs-nd.tscn +++ b/scenes/pribor-prd-n/kasseta-fs-nd.tscn @@ -34,21 +34,23 @@ offset_bottom = 182.0 fname = "Блок ФС-3" rname = "A3" -[node name="ref_A3" parent="." instance=ExtResource("2_mkgdh")] +[node name="ref_A3" parent="." groups=["fs_group"] instance=ExtResource("2_mkgdh")] offset_left = 105.0 offset_top = 32.0 offset_right = 155.0 offset_bottom = 182.0 fname = "Модуль ФС" rname = "A1" +metadata/fs = "fs_4" -[node name="ref_A4" parent="." instance=ExtResource("2_mkgdh")] +[node name="ref_A4" parent="." groups=["fs_group"] instance=ExtResource("2_mkgdh")] offset_left = 155.0 offset_top = 32.0 offset_right = 205.0 offset_bottom = 182.0 fname = "Модуль ФС" rname = "A2" +metadata/fs = "fs_5" [node name="ref_A6" parent="." instance=ExtResource("2_mkgdh")] offset_left = 205.0 diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd index 74695773..0770a21a 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.gd +++ b/scenes/pribor-prd-n/pribor-prd-n.gd @@ -1,13 +1,7 @@ @tool extends 'res://scenes/контроль/прибор.gd' -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, +const constants_n = { 'POWER_UKP_1': 31, 'POWER_UKP_2': 63, 'DKM_BIT_2': 1, @@ -15,122 +9,148 @@ const Constants = { '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': 3, + 'TIMER_DELAY': 5.0, + 'RAY_DOU_NUM': 0x3, 'ATT_UM_2': 0x7, 'ATT_UM_3': 0x7, - 'TIMER_DELAY': 5.0, 'POWER_UM': 70, } +# Конфигурация параметров для каждого прибора +const PRIBOR_CONFIG_N := { + '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]}, +} +# Конфигурация частот и ширин для каждого ФС +const FS_PARAMS_N := { + 2: {'freq': 900.0, 'width': 100.0}, + 3: {'freq': 1157.0, 'width': 100.0} +} enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } -enum STATE_MASHINE { - INIT, - FS_TURN_ON, - FS_WORK, - UG_SET, - UM_RUN, - FS_TURN_OFF, - STOP_CONTROL, - AWAIT - } -# Основные переменные -var current_fs: int = 2 -var state: int = STATE_MASHINE.INIT -var flag_check_dkm: bool = false -var flag_timer_started: bool = false - -var count_packet_2:int = 0 -var count_packet_3:int = 0 -var power_array_2: Array = [] -var power_array_3: Array = [] -var pribor: String -var ug_work_2: int -var ug_work_3: int -# Флаги и таймеры -var control_timer: Timer = Timer.new() -var mashine_timer: Timer = Timer.new() - -# Результаты контроля -var _control_results: Dictionary = { - 'block_ip': false, # Проверка касет П1 и ИП МА2000 - 'temperature': true, # Проверка температур УМ - 'dkm_2': false, # Проверка ДКМ - 'dkm_3': false, # Проверка ДКМ - 'power_ukp': false, # Мощность от УКП - 'fs_2': false, # Проверка ФС +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], +} +# Проверка ДКМ +var block_dkm_config_n: = { + 'dkm_2': false, + 'dkm_3': false, +} +# Проверка ФС +var block_fs_prd_config_n: = { + 'fs_2': false, 'fs_3': false, } +var block_kasseta_y5_prd_config_n: = { + 'yau07': false, + 'ems': false, + 'ug': false, + 'ukp1': false, + 'ukp2': false, +} + +# Основные переменные +var current_fs: int = 2 +var ug_work_1: int = 0 +var ug_work_2: int = 0 +# Флаги и таймеры +var mashine_timer: Timer = Timer.new() +var prd_n_module: Object +var unit_prd_n: Object +var control_prd_n: Object +# Результаты контроля +var control_results_n: Dictionary = { + 'block_ip': false, # Проверка касет П1 и ИП МА2000 + 'temperature': true, # Проверка температур УМ + 'dkm': false, + 'power_um': false, # Мощность от УКП + 'fs': false, +} +var test = preload('res://scripts/pribor-prd.gd') + + +################################ +func on_state_mashine() -> void: + control_prd_n.state_control_machine() + + block_kasseta_y5_prd_config_n = control_prd_n.block_kasseta_y5_config + var nodes_y5: Array = get_tree().get_nodes_in_group('y-5') + for node_y5 in nodes_y5: + var meta_y5 = node_y5.get_meta('y5') + if block_kasseta_y5_prd_config_n.has(meta_y5): + node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_n[meta_y5] else STATE_VAL.ERROR + + block_ip_config_n = control_prd_n.block_ip_config + var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') + for power_supply in node_ip_power_arr: + var meta_ip = power_supply.get_meta('ip') + 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 + + var dkm: Dictionary = control_prd_n.block_dkm_config + var fs: Dictionary = control_prd_n.block_fs_config + if control_prd_n.current_fs == 2 and fs.fs_2: + $kasseta_FS_ND/ref_A4.state = STATE_VAL.GOOD if dkm.dkm_2 else STATE_VAL.ERROR + elif control_prd_n.current_fs == 3 and fs.fs_3: + $kasseta_FS_ND/ref_A3.state = STATE_VAL.GOOD if dkm.dkm_3 else STATE_VAL.ERROR + + if not control_prd_n.power_result['ray_25_2'] or not control_prd_n.power_result['ray_25_3']: + return + + var node_arr_power: Array = get_tree().get_nodes_in_group('power_amplifier') + for i_pow in node_arr_power.size(): + if i_pow < 6: + var pw = node_arr_power[i_pow] + pw.value1 = str(control_prd_n.power_result['ray_25_2'][i_pow]) + elif i_pow < 12: + var pw = node_arr_power[i_pow] + pw.value1 = str(control_prd_n.power_result['ray_25_3'][i_pow-6]) + func _ready() -> void: + if Engine.is_editor_hint(): + return + initialize_connections() setup_timer() set_default_state() -func on_state_mashine() -> void: - match state: - STATE_MASHINE.INIT: - print_debug('Текущий запуск current_fs: ', current_fs) - if current_fs == 2 or current_fs == 3: - state = STATE_MASHINE.FS_TURN_ON - else: - on_control_result() - state = STATE_MASHINE.AWAIT - - STATE_MASHINE.FS_TURN_ON: - print('FS_TURN_ON') - _on_control_fs(true) - control_timer.wait_time = Constants.TIMER_DELAY - control_timer.start() - state = STATE_MASHINE.FS_WORK - - STATE_MASHINE.FS_WORK: - print('FS_WORK') - if (current_fs == 2 and flag_check_dkm and not flag_timer_started) or \ - (current_fs == 3 and flag_check_dkm and not flag_timer_started): - state = STATE_MASHINE.UM_RUN - - STATE_MASHINE.UM_RUN: - print('UM_RUN') - 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.BASE_ADDR_EMS_G, 6666]]) - flag_timer_started = true - state = STATE_MASHINE.UG_SET - - STATE_MASHINE.UG_SET: - print('UG_SET') - on_ug_setting() - state = STATE_MASHINE.FS_WORK - - STATE_MASHINE.FS_TURN_OFF: - print('FS_TURN_OFF') - _on_control_fs(false) - power_control_result() - state = STATE_MASHINE.STOP_CONTROL - - STATE_MASHINE.STOP_CONTROL: - print('STOP_CONTROL') - flag_timer_started = false - flag_check_dkm = false - match current_fs: - 2: current_fs = 3 - 3: current_fs = 0 - state = STATE_MASHINE.INIT - - func initialize_connections() -> void: - signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state')) var unit_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - var current_unit = unit_prd.name - var parts = current_unit.split('-') - pribor = parts[-1] - unit_prd.connect('data_received', Callable(self, 'on_data_received')) - unit_prd.connect('line_changed', Callable(self, 'on_line_changed')) + prd_n_module = prd.prd_dict[unit_name] + unit_prd_n = prd_n_module.unit_yau07 + + unit_prd_n.connect('line_changed', Callable(self, 'on_line_changed')) + var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier') + var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') + var init_data: Dictionary = { + 'control_label': $control_result, + 'power_amplifiers': power_amplifiers, + 'fs_nodes': fs_nodes, + 'unit_prd': unit_prd_n, + 'module_prd' : prd_n_module, + 'constants': constants_n, + 'prd_config': PRIBOR_CONFIG_N, + 'fs_params': FS_PARAMS_N, + 'block_ip_prd_config': block_ip_config_n, + 'block_dkm_prd_config': block_dkm_config_n, + 'block_fs_prd_config': block_fs_prd_config_n, + 'block_kasseta_y5_prd_config': block_kasseta_y5_prd_config_n, + 'control_results': control_results_n, + 'current_fs': current_fs, + } + control_prd_n = test.TestPRD.new(init_data) + add_child(control_prd_n) func setup_timer() -> void: @@ -139,12 +159,6 @@ func setup_timer() -> void: mashine_timer.wait_time = 0.5 mashine_timer.start() - 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'): @@ -155,304 +169,48 @@ func set_default_state() -> void: func _enter_tree() -> void: - $control_result.text = '' + if Engine.is_editor_hint(): + return + $control_result.text = 'Выполняется ...' + $control_result.add_theme_color_override('font_color', Color.ALICE_BLUE) signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) func _exit_tree() -> void: - var unit_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - 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_2, Constants.ADDR_UG_LITERA_2, ug_work_3]]) - - -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(): + if Engine.is_editor_hint(): return - - var status = unit_prd.status - check_block_ip(status) - check_temperature_um(status) - # Обработка данных ЭМС - _process_ems_data(status) - - if current_fs == 2 and _control_results.fs_2: - flag_check_dkm = check_dkm(status, Constants.DKM_BIT_2) - elif current_fs == 3 and _control_results.fs_3: - flag_check_dkm = check_dkm(status, Constants.DKM_BIT_3) - - if _control_results.fs_2 or _control_results.fs_3: - # Обработка мощности от УКП - _process_ukp_power(status) + 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]]) -# Обрабатывает данные ЭМС и обновляет 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_2_OT_FS) & 1 - $Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_3_OT_FS) & 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 -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 - - 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 - - $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_A20.state = STATE_VAL.ERROR if ip9_50_1 else STATE_VAL.GOOD - $kasseta_P_1/ref_A21.state = STATE_VAL.ERROR if ip9_50_2 else STATE_VAL.GOOD - $kasseta_P_1/ref_A19.state = STATE_VAL.ERROR if ip12_50_1 else STATE_VAL.GOOD - else: - $maa2000_A23.state = STATE_VAL.NONE - $maa2000_A22.state = STATE_VAL.NONE - $kasseta_P_1/ref_A19.state = STATE_VAL.NONE - $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: - const CONST_MIN_TEMP: int = -25 - const MAXIMUM_CODE_ADC: int = 3796 - const MINIMUM_CODE_AD: int = 2660 - const TEMP: float = 115.0 / (MAXIMUM_CODE_ADC - MINIMUM_CODE_AD) - const TEMPERATURE_UKP_1: int = 47 - const TEMPERATURE_UKP_2: int = 79 - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - - var ukp1_online: int = (status_prd[0] >> 2) & 1 - if ukp1_online: - for i_temp in range(6): - var temperature_ukp_1: int = status_prd.decode_u16(TEMPERATURE_UKP_1 + 2 * i_temp) - var tmp_1: int = round(CONST_MIN_TEMP + (MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) - power_amplifier[i_temp].value0 = tmp_1 - if tmp_1 > Constants.TEMP_THRESHOLD: - _control_results['temperature'] = false - 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(TEMPERATURE_UKP_2 + 2 * i_temp) - var tmp_2: int = round(CONST_MIN_TEMP + (MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3) - power_amplifier[i_temp+6].value0 = tmp_2 - if tmp_2 > Constants.TEMP_THRESHOLD: - _control_results['temperature'] = false - - - -## Проверка ДКМ -func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> bool: - const DKM: int = 28 - - var status_dkm = status_prd[DKM] >> bit_dkm & 1 - #print('^: ', status_prd[DKM]) - if bit_dkm == 1: - $dou3_A5.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 - elif bit_dkm == 2: - $dou2_A6.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_3'] = status_dkm - return status_dkm - - -func _process_ukp_power(status: PackedByteArray) -> void: - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - if current_fs == 2: - ## Мощность УМ от УКП 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) - - if count_packet_2 == 0: - power_array_2 = arr_power_ukp_1 - else: - for i in arr_power_ukp_1.size(): - if arr_power_ukp_1[i] > power_array_2[i]: - power_array_2[i] = arr_power_ukp_1[i] - - for i in 6: - power_amplifier[i].value1 = '%d' % power_array_2[i] - power_amplifier[i].state = STATE_VAL.GOOD if power_array_2[i] > Constants.TEMP_THRESHOLD else STATE_VAL.ERROR - count_packet_2 += 1 - - elif current_fs == 3: - ## Мощность УМ от УКП 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_3 == 0: - power_array_3 = arr_power_ukp_2 - else: - for i in arr_power_ukp_2.size(): - if arr_power_ukp_2[i] > power_array_3[i]: - power_array_3[i] = arr_power_ukp_2[i] - - for i in 6: - power_amplifier[i+6].value1 = '%d' % power_array_3[i] - power_amplifier[i+6].state = STATE_VAL.GOOD if power_array_3[i] > Constants.TEMP_THRESHOLD else STATE_VAL.ERROR - - count_packet_3 += 1 - - -func _on_control_fs(mode: bool) -> void: - # Конфигурация параметров для каждого прибора - var 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]}, - } - # Получаем конфигурацию для текущего прибора - var config: Dictionary = pribor_config.get(pribor) - var angle: float = config.angle - var sectors: Array = config.sectors - - # Конфигурация частот и ширин для каждого ФС - var fs_params := { - 2: {'freq': 900.0, 'width': 100.0}, - 3: {'freq': 1157.0, 'width': 100.0} - } - - # Формируем выходные данные - var interfer_name: String = 'k1' if mode else 'off' - var fs_arr: Array = [] - - if (state == STATE_MASHINE.FS_TURN_ON or state == STATE_MASHINE.FS_TURN_OFF): - if current_fs in fs_params: - var params = fs_params[current_fs] - fs_arr.append([ - angle, - params.freq, - params.width, - sectors[current_fs - 2] - ]) - signaller.emit_signal('interfer_init', interfer_name, fs_arr, Constants.POWER_UM) - - -func power_control_result() -> void: - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - _control_results['power_ukp'] = true - for amp in power_amplifier: - if amp.state != STATE_VAL.GOOD: - _control_results['power_ukp'] = false - break - - -func on_stop_control() -> void: - state = STATE_MASHINE.FS_TURN_OFF - - -func on_fs_update_state(packet_type_7: Dictionary) -> void: - # Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора - var fs_mapping = { - 4: { 'node': $kasseta_FS_ND/ref_A1, 'condition': pribor == '1н' }, - 5: { 'node': $kasseta_FS_ND/ref_A1, 'condition': pribor == '4н' }, - 6: { 'node': $kasseta_FS_ND/ref_A1, 'condition': pribor == '3н' }, - 7: { 'node': $kasseta_FS_ND/ref_A1, 'condition': pribor == '2н' }, - 8: { 'node': $kasseta_FS_ND/ref_A2, 'condition': pribor == '1н' }, - 9: { 'node': $kasseta_FS_ND/ref_A2, 'condition': pribor == '4н' }, - 10: { 'node': $kasseta_FS_ND/ref_A2, 'condition': pribor == '3н' }, - 11: { 'node': $kasseta_FS_ND/ref_A2, 'condition': pribor == '2н' } - } - for fs in packet_type_7: - if fs in fs_mapping and fs_mapping[fs]['condition']: - var data = packet_type_7[fs] - if fs < 8 and current_fs == 2: - _control_results['fs_2'] = (data.isg == 1) - var state_fs = 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_fs - elif fs > 7 and current_fs == 3: - _control_results['fs_3'] = (data.isg == 1) - var state_fs = 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_fs - - -func on_ug_setting() -> void: - var unit_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - - - if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_1): - ug_work_2 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_1] - if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_2): - ug_work_3 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_2] - - var result_1 = ((Constants.ATT_UM_2 & 0x07) << 3) | (Constants.RAY_DOU & 0x07) - var result_2 = ((Constants.ATT_UM_3 & 0x07) << 3) | (Constants.RAY_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_1, - Constants.ADDR_UG_LITERA_2, result_2]]) - - prd_module.cmd_array.append([unit_prd.CmdCode.READ_ISA, [Constants.ADDR_UG_LITERA_1, Constants.ADDR_UG_LITERA_2]]) +func on_line_changed(unit_pribor: Object) -> void: + if not unit_pribor.online: + set_default_state() func on_mode_changed(in_tree: bool) -> void: if not in_tree: queue_free() - -func on_control_result() -> void: - # Словарь соответствия ключей ошибок и нод - var error_nodes := { - 'fs_2': $kasseta_FS_ND/ref_A2, - 'fs_3': $kasseta_FS_ND/ref_A1, - } - # Проверка результатов и установка состояний - var result: bool = true - for key in _control_results: - if not _control_results[key]: - result = false - if error_nodes.has(key): - error_nodes[key].state = STATE_VAL.ERROR - - # Установка текста и цвета результата - var status_text := 'неисправен' - var status_color := Color.CRIMSON - if result: - status_text = 'исправен' - status_color = Color.AQUAMARINE - - $control_result.text = 'Прибор ПРД-%s %s' % [pribor, status_text] - $control_result.add_theme_color_override('font_color', status_color) +# +#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_VD/ref_A3.state = STATE_VAL.ERROR + #if key == 'fs_2': + #$kasseta_FS_VD/ref_A4.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/pribor-prd-n.tscn b/scenes/pribor-prd-n/pribor-prd-n.tscn index 0d639ec6..8905fe66 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.tscn +++ b/scenes/pribor-prd-n/pribor-prd-n.tscn @@ -1,10 +1,9 @@ -[gd_scene load_steps=14 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"] [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://dow4nqi6hbak8" path="res://scenes/контроль/кассета-у-5.gd" id="5_1wf07"] [ext_resource type="Script" uid="uid://crpedygm3gohi" path="res://scenes/контроль/кассета.gd" id="6_b5wvk"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="7_eoqf2"] [ext_resource type="PackedScene" uid="uid://bkxblfoj7ejv0" path="res://scenes/контроль/блок-а.tscn" id="8_sia5h"] @@ -43,7 +42,7 @@ offset_right = 15.0 offset_bottom = 30.0 script = ExtResource("1_bnnv3") -[node name="maa2000_A23" parent="." groups=["default_reset"] instance=ExtResource("2_is25t")] +[node name="maa2000_A23" parent="." groups=["default_reset", "power_supply"] instance=ExtResource("2_is25t")] layout_mode = 2 offset_left = 8.0 offset_top = 877.0 @@ -51,8 +50,9 @@ offset_right = 175.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A23" +metadata/ip = "maa2000_2" -[node name="maa2000_A22" parent="." groups=["default_reset"] instance=ExtResource("2_is25t")] +[node name="maa2000_A22" parent="." groups=["default_reset", "power_supply"] instance=ExtResource("2_is25t")] layout_mode = 2 offset_left = 485.0 offset_top = 877.0 @@ -60,6 +60,7 @@ offset_right = 652.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A22" +metadata/ip = "maa2000_1" [node name="dou3_A5" parent="." groups=["default_reset"] instance=ExtResource("2_is25t")] layout_mode = 2 @@ -109,8 +110,6 @@ offset_left = 175.0 offset_top = 242.0 offset_right = 485.0 offset_bottom = 432.0 -script = ExtResource("5_1wf07") -fname = "Кассета У5" [node name="kasseta_FS_ND" type="NinePatchRect" parent="."] layout_mode = 0 @@ -146,21 +145,23 @@ offset_bottom = 182.0 fname = "Блок ФС-2" rname = "A3" -[node name="ref_A1" parent="kasseta_FS_ND" groups=["default_reset"] instance=ExtResource("7_eoqf2")] +[node name="ref_A1" parent="kasseta_FS_ND" groups=["default_reset", "fs_group"] instance=ExtResource("7_eoqf2")] offset_left = 105.0 offset_top = 32.0 offset_right = 155.0 offset_bottom = 182.0 fname = "Модуль ФС" rname = "A1" +metadata/fs = "fs_3" -[node name="ref_A2" parent="kasseta_FS_ND" groups=["default_reset"] instance=ExtResource("7_eoqf2")] +[node name="ref_A2" parent="kasseta_FS_ND" groups=["default_reset", "fs_group"] instance=ExtResource("7_eoqf2")] offset_left = 155.0 offset_top = 32.0 offset_right = 205.0 offset_bottom = 182.0 fname = "Модуль ФС" rname = "A2" +metadata/fs = "fs_2" [node name="ref_A4" parent="kasseta_FS_ND" groups=["default_reset"] instance=ExtResource("7_eoqf2")] offset_left = 205.0 @@ -184,29 +185,32 @@ patch_margin_bottom = 16 script = ExtResource("6_b5wvk") fname = "Кассета П-1" -[node name="ref_A21" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_eoqf2")] +[node name="ref_A21" parent="kasseta_P_1" groups=["default_reset", "power_supply"] instance=ExtResource("7_eoqf2")] offset_left = 9.0 offset_top = 33.0 offset_right = 59.0 offset_bottom = 183.0 fname = "ИП12-50" rname = "A21" +metadata/ip = "ip12_50_1" -[node name="ref_A20" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_eoqf2")] +[node name="ref_A20" parent="kasseta_P_1" groups=["default_reset", "power_supply"] instance=ExtResource("7_eoqf2")] offset_left = 59.0 offset_top = 33.0 offset_right = 109.0 offset_bottom = 183.0 fname = "ИП9-50" rname = "A20" +metadata/ip = "ip9_50_1" -[node name="ref_A19" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_eoqf2")] +[node name="ref_A19" parent="kasseta_P_1" groups=["default_reset", "power_supply"] instance=ExtResource("7_eoqf2")] offset_left = 109.0 offset_top = 33.0 offset_right = 159.0 offset_bottom = 183.0 fname = "ИП9-50" rname = "A19" +metadata/ip = "ip9_50_2" [node name="lbl_fname" type="Label" parent="kasseta_P_1"] self_modulate = Color(1, 1, 1, 0.62) diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index 954c6ca5..1497d40c 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -1,84 +1,162 @@ @tool extends 'res://scenes/контроль/прибор.gd' -const Constants = { - 'IN_BLANK_PRD': 1, - 'OUT_BLANK_PRD': 13, - 'CI_4_OT_FS': 11, - 'CI_5_OT_FS': 12, - 'CI_4_B_UF': 4, - 'CI_5_B_UF': 5, +const constants_v = { 'POWER_UKP_1': 31, 'POWER_UKP_2': 63, - 'DKM_BIT_3': 3, - 'DKM_BIT_4': 4, + '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, - 'TIMER_DELAY': 1.4, + 'TIMER_DELAY': 5.0, + 'RAY_DOU_NUM': 0x3, + 'ATT_UM_4': 0x7, + 'ATT_UM_5': 0x7, 'POWER_UM': 70, } +# Конфигурация параметров для каждого прибора +const PRIBOR_CONFIG_V := { + '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]}, +} +# Конфигурация частот и ширин для каждого ФС +const FS_PARAMS_V := { + 4: {'freq': 1227.0, 'width': 110.0}, + 5: {'freq': 1575.0, 'width': 110.0}, +} enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } +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_dkm_config_v: = { + 'dkm_4': false, + 'dkm_5': false, +} +# Проверка ФС +var block_fs_prd_config_v: = { + 'fs_4': false, + 'fs_5': false, +} +var block_kasseta_y5_prd_config_v: = { + 'yau07': false, + 'ems': false, + 'ug': false, + 'ukp1': false, + 'ukp2': false, +} + # Основные переменные -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 current_fs: int = 4 +var ug_work_1: int = 0 +var ug_work_2: int = 0 # Флаги и таймеры -var control_timer: Timer = Timer.new() -var flag_timer_started: bool = false +var mashine_timer: Timer = Timer.new() +var prd_v_module: Object +var unit_prd_v: Object +var control_prd_v: Object # Результаты контроля -var _control_results: Dictionary = { +var control_results_v: Dictionary = { 'block_ip': false, # Проверка касет П1 и ИП МА2000 'temperature': true, # Проверка температур УМ - 'dkm_1': false, # Проверка ДКМ - 'dkm_2': false, # Проверка ДКМ - 'power_ukp': false, # Мощность от УКП - 'fs_1': false, # Проверка ФС - 'fs_2': false, + 'dkm': false, + 'power_um': false, # Мощность от УКП + 'fs': false, } +var test = preload('res://scripts/pribor-prd.gd') + + +func on_state_mashine() -> void: + control_prd_v.state_control_machine() + + block_kasseta_y5_prd_config_v = control_prd_v.block_kasseta_y5_config + var nodes_y5: Array = get_tree().get_nodes_in_group('y-5') + for node_y5 in nodes_y5: + var meta_y5 = node_y5.get_meta('y5') + if block_kasseta_y5_prd_config_v.has(meta_y5): + node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_v[meta_y5] else STATE_VAL.ERROR + + block_ip_config_v = control_prd_v.block_ip_config + var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') + for power_supply in node_ip_power_arr: + var meta_ip = power_supply.get_meta('ip') + 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 + + control_results_v = control_prd_v.control_results + var dkm: Dictionary = control_prd_v.block_dkm_config + var fs: Dictionary = control_prd_v.block_fs_config + if control_prd_v.current_fs == 4 and fs.fs_4: + $kasseta_FS_VD/ref_A2.state = STATE_VAL.GOOD if dkm.dkm_4 else STATE_VAL.ERROR + elif control_prd_v.current_fs == 5 and fs.fs_5: + $kasseta_FS_VD/ref_A6.state = STATE_VAL.GOOD if dkm.dkm_5 else STATE_VAL.ERROR + + if not control_prd_v.power_result['ray_25_4'] or not control_prd_v.power_result['ray_25_5']: + return + + var node_arr_power: Array = get_tree().get_nodes_in_group('power_amplifier') + for i_pow in node_arr_power.size(): + if i_pow < 6: + var pw = node_arr_power[i_pow] + pw.value1 = str(control_prd_v.power_result['ray_25_4'][i_pow]) + elif i_pow < 12: + var pw = node_arr_power[i_pow] + pw.value1 = str(control_prd_v.power_result['ray_25_5'][i_pow-6]) func _ready() -> void: + if Engine.is_editor_hint(): + return + 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_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - 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')) + prd_v_module = prd.prd_dict[unit_name] + unit_prd_v = prd_v_module.unit_yau07 + + unit_prd_v.connect('line_changed', Callable(self, 'on_line_changed')) + var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier') + var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') + var init_data: Dictionary = { + 'control_label': $control_result, + 'power_amplifiers': power_amplifiers, + 'fs_nodes': fs_nodes, + 'unit_prd': unit_prd_v, + 'module_prd' : prd_v_module, + 'constants': constants_v, + 'prd_config': PRIBOR_CONFIG_V, + 'fs_params': FS_PARAMS_V, + 'block_ip_prd_config': block_ip_config_v, + 'block_dkm_prd_config': block_dkm_config_v, + 'block_fs_prd_config': block_fs_prd_config_v, + 'block_kasseta_y5_prd_config': block_kasseta_y5_prd_config_v, + 'control_results': control_results_v, + 'current_fs': current_fs, + } + control_prd_v = test.TestPRD.new(init_data) + add_child(control_prd_v) 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 _enter_tree() -> void: - $control_result.text = '' - signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) - signaller.emit_signal('interfer_off_all') - await get_tree().create_timer(2.0).timeout - _on_control_fs(true) - - -func _exit_tree() -> void: - var unit_name = get_meta('unit_name')[0] - var unit_prd = network.get_unit_instance(unit_name) - 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]]) + add_child(mashine_timer) + mashine_timer.connect('timeout', Callable(self, 'on_state_mashine')) + mashine_timer.wait_time = 0.5 + mashine_timer.start() func set_default_state() -> void: @@ -89,286 +167,49 @@ func set_default_state() -> void: group.state = STATE_VAL.NONE -func on_line_changed(unit_prd: Object) -> void: - if not unit_prd.online: +func _enter_tree() -> void: + if Engine.is_editor_hint(): + return + $control_result.text = 'Выполняется ...' + $control_result.add_theme_color_override('font_color', Color.ALICE_BLUE) + signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) + + +func _exit_tree() -> void: + if Engine.is_editor_hint(): + return + 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]]) + + +func on_line_changed(unit_pribor: Object) -> void: + if not unit_pribor.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_3) - check_dkm(status, Constants.DKM_BIT_4) - # Обработка мощности от УКП - _process_ukp_power(status) - - -## Проверка касет П1 и ИП МА2000 -func check_block_ip(status_prd: PackedByteArray) -> void: - var ug_online: bool = (status_prd[0] >> 1) & 1 - if not ug_online: - for node in [$maa2000_A23, $maa2000_A22, $kasseta_P_1/ref_A19, $kasseta_P_1/ref_A20, $kasseta_P_1/ref_A21]: - node.state = STATE_VAL.NONE - return - - 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 - - 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 - - $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_A19.state = STATE_VAL.ERROR if ip9_50_1 else STATE_VAL.GOOD - $kasseta_P_1/ref_A20.state = STATE_VAL.ERROR if ip9_50_2 else STATE_VAL.GOOD - $kasseta_P_1/ref_A21.state = STATE_VAL.ERROR if ip12_50_1 else STATE_VAL.GOOD - - _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: - const TEMP_CONSTANTS = { - 'min_temp': -25, - 'max_code': 3796, - 'min_code': 2660, - 'temp_factor': 115.0 / (3796 - 2660), - 'offset': 3 # Корректировка температуры - } - const TEMPERATURE_UKP_1: int = 47 - const TEMPERATURE_UKP_2: int = 79 - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - - # Сбрас флагов перед проверкой - _control_results['temperature'] = true - - var ukp1_online: int = (status_prd[0] >> 2) & 1 - if ukp1_online: - for i_temp in range(6): - var temperature_ukp_1: int = status_prd.decode_u16(TEMPERATURE_UKP_1 + 2 * i_temp) - var tmp_1: int = round(TEMP_CONSTANTS['min_temp'] + (TEMP_CONSTANTS['max_code'] - temperature_ukp_1) * TEMP_CONSTANTS['temp_factor'] + TEMP_CONSTANTS['offset']) - power_amplifier[i_temp].value0 = tmp_1 - if tmp_1 > Constants.TEMP_THRESHOLD: - _control_results['temperature'] = false - - 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(TEMPERATURE_UKP_2 + 2 * i_temp) - var tmp_2: int = round(TEMP_CONSTANTS['min_temp'] + (TEMP_CONSTANTS['max_code'] - temperature_ukp_2) * TEMP_CONSTANTS['temp_factor'] + TEMP_CONSTANTS['offset']) - power_amplifier[i_temp+6].value0 = tmp_2 - if tmp_2 > Constants.TEMP_THRESHOLD: - _control_results['temperature'] = false - - -## Проверка ДКМ -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: - $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 - - -# Обрабатывает данные ЭМС и обновляет 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_4_OT_FS) & 1 - $Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_5_OT_FS) & 1 - - # Обновление фреймов для выходных сигналов ЭМС - $Monitoring_panel/out_ems_1.frame = (out_blank >> Constants.CI_4_B_UF) & 1 - $Monitoring_panel/out_ems_2.frame = (out_blank >> Constants.CI_5_B_UF) & 1 - - -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] > Constants.POWER_THRESHOLD 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] > Constants.POWER_THRESHOLD 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 parts = currecnt_unit.split('-') - var last_part = parts[-1] - var angle: float = 0.0 # -> ПРД-В1; 90.0 -> ПРД-В2; 180.0 -> ПРД-В3; 270.0 -> ПРД-В4 - var sector_1: float = 12 # -> ПРД-В1; 15 -> ПРД-В2; 14 -> ПРД-В3; 13 -> ПРД-В4; - var sector_2: float = 16 # -> ПРД-В1; 19 -> ПРД-В2; 18 -> ПРД-В3; 17 -> ПРД-В4; - if last_part == '2в': - angle = 90.0 - sector_1 = 15 - sector_2 = 19 - elif last_part == '3в': - angle = 180.0 - sector_1 = 14 - sector_2 = 18 - elif last_part == '4в': - angle = 270.0 - sector_1 = 13 - sector_2 = 17 - - var interfer_name: String = 'k1' if mode else 'off' - var freq_1: float = 1227.0 # ФС_1 - var freq_2: float = 1575.0 # ФС_2 - var width_1: float = 110.0 # ФС_1 - var width_2: float = 110.0 # ФС_2 - - var fs_arr: Array = [[angle, freq_1, width_1, sector_1], [angle, freq_2, width_2, sector_2]] - signaller.emit_signal('interfer_init', interfer_name, fs_arr, Constants.POWER_UM) - - -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 = { - 12: { 'node': $kasseta_FS_VD/ref_A3, 'condition': last_part == '1в' }, - 13: { 'node': $kasseta_FS_VD/ref_A3, 'condition': last_part == '4в' }, - 14: { 'node': $kasseta_FS_VD/ref_A3, 'condition': last_part == '3в' }, - 15: { 'node': $kasseta_FS_VD/ref_A3, 'condition': last_part == '2в' }, - 16: { 'node': $kasseta_FS_VD/ref_A4, 'condition': last_part == '1в' }, - 17: { 'node': $kasseta_FS_VD/ref_A4, 'condition': last_part == '4в' }, - 18: { 'node': $kasseta_FS_VD/ref_A4, 'condition': last_part == '3в' }, - 19: { 'node': $kasseta_FS_VD/ref_A4, '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 < 16: - _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_name = get_meta('unit_name')[0] - var unit_prd = network.units[unit_name] - - 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_VD/ref_A3.state = STATE_VAL.ERROR - if key == 'fs_2': - $kasseta_FS_VD/ref_A4.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 +# +#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_VD/ref_A3.state = STATE_VAL.ERROR + #if key == 'fs_2': + #$kasseta_FS_VD/ref_A4.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/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index 02fd1156..1e567977 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="." groups=["default_reset"] instance=ExtResource("2_xpo4b")] +[node name="maa2000_A22" parent="." groups=["default_reset", "power_supply"] instance=ExtResource("2_xpo4b")] layout_mode = 2 offset_left = 485.0 offset_top = 877.0 @@ -52,6 +52,7 @@ offset_right = 652.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A22" +metadata/ip = "maa2000_1" [node name="dou4_A5" parent="." groups=["default_reset"] instance=ExtResource("2_xpo4b")] layout_mode = 2 @@ -62,7 +63,7 @@ offset_bottom = 877.0 fname = "ДОУ-4" rname = "A5" -[node name="maa2000_A23" parent="." groups=["default_reset"] instance=ExtResource("2_xpo4b")] +[node name="maa2000_A23" parent="." groups=["default_reset", "power_supply"] instance=ExtResource("2_xpo4b")] layout_mode = 2 offset_left = 8.0 offset_top = 877.0 @@ -70,6 +71,7 @@ offset_right = 175.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A23" +metadata/ip = "maa2000_2" [node name="dou5_A6" parent="." groups=["default_reset"] instance=ExtResource("2_xpo4b")] layout_mode = 2 @@ -135,29 +137,32 @@ patch_margin_bottom = 16 script = ExtResource("6_os4mt") fname = "Кассета П-1В" -[node name="ref_A19" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_38u2b")] +[node name="ref_A19" parent="kasseta_P_1" groups=["default_reset", "power_supply"] instance=ExtResource("7_38u2b")] offset_left = 9.0 offset_top = 33.0 offset_right = 59.0 offset_bottom = 183.0 fname = "ИП9-50" rname = "A19" +metadata/ip = "ip9_50_1" -[node name="ref_A20" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_38u2b")] +[node name="ref_A20" parent="kasseta_P_1" groups=["default_reset", "power_supply"] instance=ExtResource("7_38u2b")] offset_left = 59.0 offset_top = 33.0 offset_right = 109.0 offset_bottom = 183.0 fname = "ИП9-50" rname = "A20" +metadata/ip = "ip9_50_2" -[node name="ref_A21" parent="kasseta_P_1" groups=["default_reset"] instance=ExtResource("7_38u2b")] +[node name="ref_A21" parent="kasseta_P_1" groups=["default_reset", "power_supply"] instance=ExtResource("7_38u2b")] offset_left = 109.0 offset_top = 33.0 offset_right = 159.0 offset_bottom = 183.0 fname = "ИП12-50" rname = "A21" +metadata/ip = "ip12_50_1" [node name="lbl_fname" type="Label" parent="kasseta_P_1"] self_modulate = Color(1, 1, 1, 0.62) diff --git a/scenes/контроль/кассета-у-5-к.tscn b/scenes/контроль/кассета-у-5-к.tscn index 19d0607d..1a0654ad 100644 --- a/scenes/контроль/кассета-у-5-к.tscn +++ b/scenes/контроль/кассета-у-5-к.tscn @@ -25,50 +25,56 @@ text = "Кассета У5" horizontal_alignment = 1 vertical_alignment = 1 -[node name="ref_A24" parent="." instance=ExtResource("3_wtlpi")] +[node name="ref_A24" parent="." groups=["power_supply"] instance=ExtResource("3_wtlpi")] offset_left = 5.0 offset_top = 32.0 offset_right = 55.0 offset_bottom = 182.0 fname = "ИП5-25" rname = "A31" +metadata/ip = "ip5_25" -[node name="ref_A30" parent="." instance=ExtResource("3_wtlpi")] +[node name="ref_A30" parent="." groups=["y-5"] instance=ExtResource("3_wtlpi")] offset_left = 55.0 offset_top = 32.0 offset_right = 105.0 offset_bottom = 182.0 fname = "ЯУ-07Б" rname = "A37" +metadata/y5 = "yau07" -[node name="ref_A26" parent="." instance=ExtResource("3_wtlpi")] +[node name="ref_A26" parent="." groups=["y-5"] instance=ExtResource("3_wtlpi")] offset_left = 105.0 offset_top = 32.0 offset_right = 155.0 offset_bottom = 182.0 fname = "ЭМС-Г" rname = "A33" +metadata/y5 = "ems" -[node name="ref_A27" parent="." instance=ExtResource("3_wtlpi")] +[node name="ref_A27" parent="." groups=["y-5"] instance=ExtResource("3_wtlpi")] offset_left = 155.0 offset_top = 32.0 offset_right = 205.0 offset_bottom = 182.0 fname = "УГ" rname = "A34" +metadata/y5 = "ug" -[node name="ref_A28" parent="." instance=ExtResource("3_wtlpi")] +[node name="ref_A28" parent="." groups=["y-5"] instance=ExtResource("3_wtlpi")] offset_left = 205.0 offset_top = 32.0 offset_right = 255.0 offset_bottom = 182.0 fname = "УКП" rname = "A35" +metadata/y5 = "ukp1" -[node name="ref_A29" parent="." instance=ExtResource("3_wtlpi")] +[node name="ref_A29" parent="." groups=["y-5"] instance=ExtResource("3_wtlpi")] offset_left = 254.0 offset_top = 32.0 offset_right = 304.0 offset_bottom = 182.0 fname = "УКП" rname = "A36" +metadata/y5 = "ukp2" diff --git a/scenes/контроль/кассета-у-5-нв.tscn b/scenes/контроль/кассета-у-5-нв.tscn index 21c75f48..dad7c794 100644 --- a/scenes/контроль/кассета-у-5-нв.tscn +++ b/scenes/контроль/кассета-у-5-нв.tscn @@ -25,50 +25,56 @@ text = "Кассета У5" horizontal_alignment = 1 vertical_alignment = 1 -[node name="ref_A24" parent="." instance=ExtResource("3_picsk")] +[node name="ref_A24" parent="." groups=["power_supply"] instance=ExtResource("3_picsk")] 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="." instance=ExtResource("3_picsk")] +[node name="ref_A30" parent="." groups=["y-5"] instance=ExtResource("3_picsk")] 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="." instance=ExtResource("3_picsk")] +[node name="ref_A26" parent="." groups=["y-5"] instance=ExtResource("3_picsk")] 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="." instance=ExtResource("3_picsk")] +[node name="ref_A27" parent="." groups=["y-5"] instance=ExtResource("3_picsk")] 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="." instance=ExtResource("3_picsk")] +[node name="ref_A28" parent="." groups=["y-5"] instance=ExtResource("3_picsk")] 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="." instance=ExtResource("3_picsk")] +[node name="ref_A29" parent="." groups=["y-5"] instance=ExtResource("3_picsk")] offset_left = 254.0 offset_top = 32.0 offset_right = 304.0 offset_bottom = 182.0 fname = "УКП" rname = "A29" +metadata/y5 = "ukp2" diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index 54cc92ff..46a7d244 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -1,5 +1,9 @@ class TestPRD extends Node: const RAY_25_1:= 'ray_25_1' + const RAY_25_2:= 'ray_25_2' + const RAY_25_3:= 'ray_25_3' + const RAY_25_4:= 'ray_25_4' + const RAY_25_5:= 'ray_25_5' const RAY_25_6:= 'ray_25_6' const RAY_25_7:= 'ray_25_7' enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } @@ -7,7 +11,14 @@ class TestPRD extends Node: INIT, FS_TURN_ON, FS_WORK, - UG_SET, + CHEK_KASSETA_Y5, + UG_SET_RAY_0, + UG_SET_RAY_1, + UG_SET_RAY_2, + UG_SET_RAY_3, + UG_SET_RAY_4, + UG_SET_RAY_5, + UG_SET_RAY_6, UM_RUN, FS_TURN_OFF, STOP_CONTROL, @@ -32,28 +43,36 @@ class TestPRD extends Node: var power_result: Dictionary = { RAY_25_1: [], + RAY_25_2: [], + RAY_25_3: [], + RAY_25_4: [], + RAY_25_5: [], RAY_25_6: [], RAY_25_7: [], } var constants: Dictionary var pribor_config: Dictionary var fs_parameters: Dictionary - var block_config: Dictionary + var block_ip_config: Dictionary + var block_dkm_config: Dictionary + var block_fs_config: Dictionary + var block_kasseta_y5_config: Dictionary var control_results: Dictionary var self_name: String var state: int = STATE_MASHINE.INIT - var current_fs: int = 1 + var current_fs: int var flag_check_dkm: bool var flag_timer_started: bool - var ug_online: bool + #var ug_online: bool var unit_prd: Object var module_prd: Object var power_amplify: Array var fs_array_node: Array var control_label: Label - var control_timer: Timer = Timer.new() + + ## Инициализация аргуметнов func _init(init_data: Dictionary) -> void: control_label = init_data['control_label'] power_amplify = init_data['power_amplifiers'] @@ -63,28 +82,36 @@ class TestPRD extends Node: constants = init_data['constants'] pribor_config = init_data['prd_config'] fs_parameters = init_data['fs_params'] - block_config = init_data['block_ip_prd_config'] + block_ip_config = init_data['block_ip_prd_config'] + block_dkm_config = init_data['block_dkm_prd_config'] + block_fs_config = init_data['block_fs_prd_config'] control_results = init_data['control_results'] + current_fs = init_data['current_fs'] + block_kasseta_y5_config = init_data['block_kasseta_y5_prd_config'] + func _ready() -> void: initialize_connections() setup_timer() + func _process(_delta: float) -> void: pass + + ## Пакеты от ЯУ-07 func on_data_received(unit_pribor: Object) -> void: if not is_inside_tree(): return var status: PackedByteArray = unit_pribor.status - ug_online = (status[0] >> 1) & 1 - - block_config = check_block_ip(status, block_config) + block_kasseta_y5_config = check_block_kasseta_y5(status, block_kasseta_y5_config) + block_ip_config = check_block_ip(status, block_ip_config) check_temperature_um(status, power_amplify) _process_dkm_status(status) + ## Пакеты от MP550Service func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary, fs_array: Array) -> void: var fs_key: String = FS_KEYS.get(current_fs, '') if fs_key.is_empty(): @@ -94,17 +121,32 @@ class TestPRD extends Node: fs_result = on_fs_state(packet_type_7, fs_mapping, fs_result) _update_fs_states(fs_result, fs_array) - + ## func state_control_machine() -> void: match state: STATE_MASHINE.INIT: _handle_init_state() STATE_MASHINE.FS_TURN_ON: _handle_fs_turn_on_state() + STATE_MASHINE.CHEK_KASSETA_Y5: + pass + STATE_MASHINE.FS_WORK: _handle_fs_work_state() - STATE_MASHINE.UG_SET: - _handle_ug_set_state() + STATE_MASHINE.UG_SET_RAY_0: + _handle_ug_set_state(0x0) + STATE_MASHINE.UG_SET_RAY_1: + _handle_ug_set_state(0x1) + STATE_MASHINE.UG_SET_RAY_2: + _handle_ug_set_state(0x2) + STATE_MASHINE.UG_SET_RAY_3: + _handle_ug_set_state(0x3) + STATE_MASHINE.UG_SET_RAY_4: + _handle_ug_set_state(0x4) + STATE_MASHINE.UG_SET_RAY_5: + _handle_ug_set_state(0x5) + STATE_MASHINE.UG_SET_RAY_6: + _handle_ug_set_state(0x6) STATE_MASHINE.UM_RUN: flag_timer_started = _handle_um_run_state() STATE_MASHINE.FS_TURN_OFF: @@ -118,38 +160,57 @@ class TestPRD extends Node: if current_fs in [1, 2, 3, 4, 5, 6, 7]: state = STATE_MASHINE.FS_TURN_ON else: - on_control_result() + control_results = on_control_result(block_ip_config, block_dkm_config, block_fs_config, control_results) state = STATE_MASHINE.AWAIT func _handle_fs_turn_on_state() -> void: control_label.text = 'Выполняется включение ФС-%s' % current_fs manage_fs(true, self_name, pribor_config, fs_parameters, current_fs, constants.POWER_UM) - control_timer.wait_time = constants.TIMER_DELAY - control_timer.start() + #control_timer.wait_time = constants.TIMER_DELAY + #control_timer.start() state = STATE_MASHINE.FS_WORK func _handle_fs_work_state() -> void: control_label.text = 'Выполняется проверка ФС-%s' % current_fs - if (current_fs == 2 and flag_check_dkm and not flag_timer_started) or \ - (current_fs == 3 and flag_check_dkm and not flag_timer_started) or \ - (current_fs == 4 and flag_check_dkm and not flag_timer_started) or \ - (current_fs == 5 and flag_check_dkm and not flag_timer_started) or \ - (current_fs == 6 and flag_check_dkm and not flag_timer_started) or \ - (current_fs == 7 and flag_check_dkm and not flag_timer_started) or \ - (current_fs == 1 and not flag_timer_started): - state = STATE_MASHINE.UG_SET + if not module_prd.unit_yau07.online: + return + if (current_fs == 2 and block_fs_config.fs_2 and not flag_timer_started) or \ + (current_fs == 3 and block_fs_config.fs_3 and not flag_timer_started) or \ + (current_fs == 4 and block_fs_config.fs_4 and not flag_timer_started) or \ + (current_fs == 5 and block_fs_config.fs_5 and not flag_timer_started) or \ + (current_fs == 6 and block_fs_config.fs_6 and not flag_timer_started) or \ + (current_fs == 7 and block_fs_config.fs_7 and not flag_timer_started) or \ + (current_fs == 1 and block_fs_config.fs_1 and not flag_timer_started): + state = STATE_MASHINE.UG_SET_RAY_6 - func _handle_ug_set_state() -> void: + 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, + } + 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 control_label.text = 'Выполняется настройка угла (%s) и атт (%s, %s, %s)' % [ - constants.RAY_DOU_NUM, - constants.ATT_UM_1, - constants.ATT_UM_6, - constants.ATT_UM_7, + dic_att.RAY_DOU_NUM, + dic_att.ATT_UM_1, + dic_att.ATT_UM_2, + dic_att.ATT_UM_3, ] - on_ug_setting(module_prd, unit_prd, constants) + on_ug_setting(module_prd, unit_prd, dic_att) state = STATE_MASHINE.UM_RUN @@ -209,12 +270,12 @@ class TestPRD extends Node: func _process_dkm_status(status: PackedByteArray) -> void: - if not control_results.has(_get_current_fs_key()): + if not block_fs_config.has(_get_current_fs_key()): return var dkm_bit = _get_dkm_bit_for_current_fs() - control_results = check_dkm(status, dkm_bit, control_results) + block_dkm_config = check_dkm(status, dkm_bit, block_dkm_config) - flag_check_dkm = control_results[_get_dkm_key_for_current_fs()] + flag_check_dkm = block_dkm_config[_get_dkm_key_for_current_fs()] if flag_check_dkm: power_result[_get_ray_key_for_current_fs()] = power_um_ukp(status, current_fs, power_result[_get_ray_key_for_current_fs()]) @@ -250,6 +311,10 @@ class TestPRD extends Node: func _get_ray_key_for_current_fs() -> String: match current_fs: 1: return RAY_25_1 + 2: return RAY_25_2 + 3: return RAY_25_3 + 4: return RAY_25_4 + 5: return RAY_25_5 6: return RAY_25_6 7: return RAY_25_7 _: return '' @@ -261,30 +326,56 @@ class TestPRD extends Node: if fs_result.has(fs_meta): var new_state = fs_result[fs_meta] fs.state = new_state - control_results[fs_meta] = new_state + block_fs_config[fs_meta] = new_state func on_stop_control() -> void: state = STATE_MASHINE.FS_TURN_OFF - static func on_control_result() -> void: - print('on_control_result') + static func on_control_result(ip_config: Dictionary, dkm_config: Dictionary, fs_config: Dictionary, ctrl_results: Dictionary) -> Dictionary: + var all_blocks_ip_ok = true + var all_blocks_dkm_ok = true + var all_blocks_fs_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 + + for block in dkm_config: + if not dkm_config[block]: + all_blocks_dkm_ok = false + ctrl_results['dkm'] = all_blocks_dkm_ok + + for block in fs_config: + if not fs_config[block]: + all_blocks_fs_ok = false + ctrl_results['fs'] = all_blocks_fs_ok + + return ctrl_results + ## Установка угла и аттенюации для УМ static func on_ug_setting(prd_module: Object, prd_unit: Object, settings_ug: Dictionary) -> void: - var result_1 = ((settings_ug.ATT_UM_6 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07) - var result_2 = ((settings_ug.ATT_UM_7 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07) + 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_module.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_1]]) + settings_ug.ADDR_UG_LITERA_2, result_2, + settings_ug.ADDR_UG_LITERA_3, settings_ug.ATT_UM_3]]) prd_module.cmd_array.append([prd_unit.CmdCode.READ_ISA, [settings_ug.ADDR_UG_LITERA_1, settings_ug.ADDR_UG_LITERA_2, settings_ug.ADDR_UG_LITERA_3]]) static func power_um_control_result(ctrl_results: Dictionary, constan: Dictionary, pwr_result: Dictionary) -> Dictionary: ctrl_results['power_um'] = true + + for amp_array in pwr_result.values(): + if amp_array.size() == 0: + ctrl_results['power_um'] = false + return ctrl_results + for amp_array in pwr_result.values(): for value in amp_array: if value < constan.TEMP_THRESHOLD: @@ -310,22 +401,33 @@ class TestPRD extends Node: angle, params.freq, params.width, - sectors[cur_fs - 1] if cur_fs == 1 else sectors[cur_fs - 5] + sectors[cur_fs - 1] if cur_fs == 1 else sectors[cur_fs - 5] if cur_fs > 5 else sectors[cur_fs - 4] if cur_fs > 3 else sectors[cur_fs - 2] ]) - signaller.emit_signal('interfer_init', interfer_name, fs_arr, power_um) + ## Проверка касет П1 и ИП МА2000 - static func check_block_ip(status_prd: PackedByteArray, block_ip_config: Dictionary) -> Dictionary: + 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 block_ip_config: - var bit: int = block_ip_config[block][0] + for block in ip_config: + var bit: int = ip_config[block][0] if ug_valid: var status = status_prd[byte_dry] >> bit & 1 - block_ip_config[block][1] = false if status else true - return block_ip_config + ip_config[block][1] = false if status else true + return ip_config + + + ## Проверка кассеты у-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_temperature_um(status_prd: PackedByteArray, power_amplifier: Array) -> void: @@ -338,6 +440,8 @@ class TestPRD extends Node: } 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 + if ukp1_online: var tmp_1: int var temperature_ukp_1: int @@ -345,17 +449,21 @@ class TestPRD extends Node: 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 + + 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].value0 = tmp_1 - var ukp2_online = (status_prd[0] >> 3) & 1 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) - power_amplifier[i_temp+7].value0 = tmp_2 + if power_amplifier.size() > 12: + power_amplifier[i_temp+7].value0 = tmp_2 + else: + power_amplifier[i_temp+6].value0 = tmp_2 + ## Проверка ДКМ static func check_dkm(status_prd: PackedByteArray, bit_dkm: int, dkm_result: Dictionary) -> Dictionary: @@ -363,6 +471,14 @@ class TestPRD extends Node: var status_dkm = status_prd[dkm] >> bit_dkm & 1 if bit_dkm == 0: dkm_result['dkm_1'] = status_dkm + elif bit_dkm == 1: + dkm_result['dkm_2'] = status_dkm + elif bit_dkm == 2: + dkm_result['dkm_3'] = status_dkm + elif bit_dkm == 3: + dkm_result['dkm_4'] = status_dkm + elif bit_dkm == 4: + dkm_result['dkm_5'] = status_dkm elif bit_dkm == 5: dkm_result['dkm_6'] = status_dkm elif bit_dkm == 6: @@ -373,53 +489,49 @@ class TestPRD extends Node: ## static func _create_fs_mapping(s_name: String) -> Dictionary: var suffixes: Dictionary = { - 0: 'к', 1: 'к', 2: 'к', 3: 'к', - 4: 'н', 5: 'н', 6: 'н', 7: 'н', - 8: 'н', 9: 'н', 10: 'н', 11: 'н', - 12: 'в', 13: 'в', 14: 'в', 15: 'в', - 16: 'в', 17: 'в', 18: 'в', 19: 'в', - 20: 'к', 21: 'к', 22: 'к', 23: 'к', - 24: 'к', 25: 'к', 26: 'к', 27: 'к', + 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: - var num_part = str((fs_num % 4) + 1) - mapping[fs_num] = {'condition': s_name == num_part + suffixes[fs_num]} + 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} + {'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] - - # Проверяем все правила для текущего FS - for rule_key in FS_RULES: - var rule = FS_RULES[rule_key] + 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.range[0] and fs_num < rule.range[1]) and results.has(rule.key) + return bool(fs_num >= rule.min and fs_num < rule.max) and results.has(rule.key) ## @@ -436,6 +548,30 @@ class TestPRD extends Node: 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 From aa837b52f2aaf75f2752f69556c1f806b1bc92ec Mon Sep 17 00:00:00 2001 From: Maxim Date: Fri, 15 Aug 2025 05:05:46 +0300 Subject: [PATCH 7/9] =?UTF-8?q?=D0=9F=D0=BE=D1=81=D0=BB=D0=B5=20=D1=81?= =?UTF-8?q?=D0=BB=D0=B8=D1=8F=D0=BD=D0=B8=D1=8F=20=D1=81=20master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index e31aa8c1..e39517f8 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -211,7 +211,7 @@ func on_mode_changed(in_tree: bool) -> void: #all_blocks_ok = false #break #control_results_k['block_ip'] = all_blocks_ok -# + ## Словарь соответствия ключей ошибок и нод #var error_nodes := { #'fs_1': $kasseta_fs_kd/ref_A3, From d67a2a6cd7ec67b76b85853d6af7d25394daa13c Mon Sep 17 00:00:00 2001 From: Maxim Date: Fri, 15 Aug 2025 09:48:50 +0300 Subject: [PATCH 8/9] =?UTF-8?q?=D1=81=D0=BD=D1=8F=D1=82=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BC=D0=BE=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D1=81=D0=BE?= =?UTF-8?q?=20=D0=B2=D1=81=D0=B5=D1=85=20=D0=BB=D1=83=D1=87=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D1=80=D0=B8=D0=B1=D0=BE=D1=80=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B4-=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.gd | 7 +- scenes/pribor-prd-n/pribor-prd-n.gd | 27 ++-- scenes/pribor-prd-v/pribor-prd-v.gd | 5 +- scenes/pribor-prd-v/pribor-prd-v.tscn | 5 +- scripts/pribor-prd.gd | 180 +++++++++++++++----------- 5 files changed, 130 insertions(+), 94 deletions(-) diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index e39517f8..0e6a5b69 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -96,14 +96,17 @@ func _ready() -> void: func on_state_mashine() -> void: control_prd_k.state_control_machine() - + block_kasseta_y5_prd_config_k = control_prd_k.block_kasseta_y5_config var nodes_y5: Array = get_tree().get_nodes_in_group('y-5') 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: + node_y5.state = STATE_VAL.ERROR if meta_y5 == 'yau07' else STATE_VAL.NONE + return node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_k[meta_y5] else STATE_VAL.ERROR - + block_ip_config_k = control_prd_k.block_ip_config var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') for power_supply in node_ip_power_arr: diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd index 0770a21a..74c5283e 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.gd +++ b/scenes/pribor-prd-n/pribor-prd-n.gd @@ -81,14 +81,17 @@ var test = preload('res://scripts/pribor-prd.gd') ################################ func on_state_mashine() -> void: control_prd_n.state_control_machine() - + block_kasseta_y5_prd_config_n = control_prd_n.block_kasseta_y5_config var nodes_y5: Array = get_tree().get_nodes_in_group('y-5') 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: + node_y5.state = STATE_VAL.ERROR if meta_y5 == 'yau07' else STATE_VAL.NONE + return node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_n[meta_y5] else STATE_VAL.ERROR - + block_ip_config_n = control_prd_n.block_ip_config var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') for power_supply in node_ip_power_arr: @@ -96,14 +99,23 @@ func on_state_mashine() -> 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 + var fs_results: Dictionary = control_prd_n.block_fs_config + var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') + for f in fs_nodes: + var fs_meta: String = f.get_meta('fs') + if fs_results.has(fs_meta): + var new_state = fs_results[fs_meta] + f.state = new_state + fs_results[fs_meta] = new_state + var dkm: Dictionary = control_prd_n.block_dkm_config - var fs: Dictionary = control_prd_n.block_fs_config - if control_prd_n.current_fs == 2 and fs.fs_2: + if control_prd_n.current_fs == 2 and fs_results.fs_2: $kasseta_FS_ND/ref_A4.state = STATE_VAL.GOOD if dkm.dkm_2 else STATE_VAL.ERROR - elif control_prd_n.current_fs == 3 and fs.fs_3: + elif control_prd_n.current_fs == 3 and fs_results.fs_3: $kasseta_FS_ND/ref_A3.state = STATE_VAL.GOOD if dkm.dkm_3 else STATE_VAL.ERROR - if not control_prd_n.power_result['ray_25_2'] or not control_prd_n.power_result['ray_25_3']: + #if not control_prd_n.power_result['ray_25_2'] or not control_prd_n.power_result['ray_25_3']: + if 1 == 1: return var node_arr_power: Array = get_tree().get_nodes_in_group('power_amplifier') @@ -132,11 +144,10 @@ func initialize_connections() -> void: unit_prd_n.connect('line_changed', Callable(self, 'on_line_changed')) var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier') - var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') var init_data: Dictionary = { 'control_label': $control_result, 'power_amplifiers': power_amplifiers, - 'fs_nodes': fs_nodes, + #'fs_nodes': fs_nodes, 'unit_prd': unit_prd_n, 'module_prd' : prd_n_module, 'constants': constants_n, diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index 1497d40c..0e7a8d64 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -79,12 +79,15 @@ var test = preload('res://scripts/pribor-prd.gd') func on_state_mashine() -> void: control_prd_v.state_control_machine() - + block_kasseta_y5_prd_config_v = control_prd_v.block_kasseta_y5_config var nodes_y5: Array = get_tree().get_nodes_in_group('y-5') for node_y5 in nodes_y5: var meta_y5 = node_y5.get_meta('y5') if block_kasseta_y5_prd_config_v.has(meta_y5): + if block_kasseta_y5_prd_config_v['yau07'] == false: + node_y5.state = STATE_VAL.ERROR if meta_y5 == 'yau07' else STATE_VAL.NONE + return node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_v[meta_y5] else STATE_VAL.ERROR block_ip_config_v = control_prd_v.block_ip_config diff --git a/scenes/pribor-prd-v/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index 1e567977..38702ac3 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.tscn +++ b/scenes/pribor-prd-v/pribor-prd-v.tscn @@ -1,10 +1,9 @@ -[gd_scene load_steps=15 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"] [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="Script" uid="uid://dow4nqi6hbak8" path="res://scenes/контроль/кассета-у-5.gd" id="5_6p5qb"] [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"] @@ -112,8 +111,6 @@ offset_left = 175.0 offset_top = 242.0 offset_right = 485.0 offset_bottom = 432.0 -script = ExtResource("5_6p5qb") -fname = "Кассета У5" [node name="kasseta_FS_VD" parent="." instance=ExtResource("5_nhd2k")] layout_mode = 0 diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index 46a7d244..b2b6d400 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -1,24 +1,25 @@ class TestPRD extends Node: - const RAY_25_1:= 'ray_25_1' - const RAY_25_2:= 'ray_25_2' - const RAY_25_3:= 'ray_25_3' - const RAY_25_4:= 'ray_25_4' - const RAY_25_5:= 'ray_25_5' - const RAY_25_6:= 'ray_25_6' - const RAY_25_7:= 'ray_25_7' + 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 STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } enum STATE_MASHINE { 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, - UG_SET_RAY_6, UM_RUN, FS_TURN_OFF, STOP_CONTROL, @@ -42,13 +43,13 @@ class TestPRD extends Node: } var power_result: Dictionary = { - RAY_25_1: [], - RAY_25_2: [], - RAY_25_3: [], - RAY_25_4: [], - RAY_25_5: [], - RAY_25_6: [], - RAY_25_7: [], + 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 @@ -61,13 +62,11 @@ class TestPRD extends Node: var self_name: String var state: int = STATE_MASHINE.INIT var current_fs: int - var flag_check_dkm: bool - var flag_timer_started: bool + var flag_timer_started: bool = false #var ug_online: bool var unit_prd: Object var module_prd: Object var power_amplify: Array - var fs_array_node: Array var control_label: Label var control_timer: Timer = Timer.new() @@ -76,7 +75,6 @@ class TestPRD extends Node: func _init(init_data: Dictionary) -> void: control_label = init_data['control_label'] power_amplify = init_data['power_amplifiers'] - fs_array_node = init_data['fs_nodes'] unit_prd = init_data['unit_prd'] module_prd = init_data['module_prd'] constants = init_data['constants'] @@ -109,17 +107,26 @@ class TestPRD extends Node: block_ip_config = check_block_ip(status, block_ip_config) check_temperature_um(status, power_amplify) _process_dkm_status(status) + if current_fs != 0: + var tek_litera: Dictionary = power_result[current_fs] + var interes = _get_ray_key(state) + print('interes: ', interes) + if interes != '': + var arr_pow = tek_litera[interes] + tek_litera[_get_ray_key(state)] = power_um_ukp(status, current_fs, tek_litera[_get_ray_key(state)]) + power_result[current_fs] = tek_litera ## Пакеты от MP550Service - func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary, fs_array: Array) -> void: + func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary) -> void: var fs_key: String = FS_KEYS.get(current_fs, '') if fs_key.is_empty(): return var fs_result := {fs_key: STATE_VAL.NONE} fs_result = on_fs_state(packet_type_7, fs_mapping, fs_result) - _update_fs_states(fs_result, fs_array) + block_fs_config[fs_key] = fs_result[fs_key] + ## func state_control_machine() -> void: @@ -128,11 +135,41 @@ class TestPRD extends Node: _handle_init_state() STATE_MASHINE.FS_TURN_ON: _handle_fs_turn_on_state() - STATE_MASHINE.CHEK_KASSETA_Y5: - pass - + state = STATE_MASHINE.FS_WORK STATE_MASHINE.FS_WORK: - _handle_fs_work_state() + if not flag_timer_started: + _handle_fs_work_state() + STATE_MASHINE.CHEK_KASSETA_Y5: + if block_kasseta_y5_config['yau07']: + state = STATE_MASHINE.WRITE_ISA + else: + print_debug('Яу-07Б: нет связи ', block_kasseta_y5_config) + STATE_MASHINE.WRITE_ISA: + _handle_ug_set_state(0x6) + STATE_MASHINE.READ_ISA: + _handle_read_isa(module_prd, unit_prd, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3]) + state = STATE_MASHINE.UG_SET_RAY + STATE_MASHINE.UG_SET_RAY: + var addr: int = constants.ADDR_UG_LITERA_1 + if current_fs == 3 or current_fs == 5 or current_fs == 7: + addr = constants.ADDR_UG_LITERA_2 + if unit_prd.isa_ports.has(addr) and (unit_prd.cmd_state == unit_prd.CmdState.DONE): + control_timer.stop() + if unit_prd.isa_ports[addr] & 0x07 == 0: + state = STATE_MASHINE.UG_SET_RAY_1 + elif unit_prd.isa_ports[addr] & 0x07 == 1: + state = STATE_MASHINE.UG_SET_RAY_2 + elif unit_prd.isa_ports[addr] & 0x07 == 2: + state = STATE_MASHINE.UG_SET_RAY_3 + elif unit_prd.isa_ports[addr] & 0x07 == 3: + state = STATE_MASHINE.UG_SET_RAY_4 + elif unit_prd.isa_ports[addr] & 0x07 == 4: + state = STATE_MASHINE.UG_SET_RAY_5 + elif unit_prd.isa_ports[addr] & 0x07 == 5: + state = STATE_MASHINE.FS_TURN_OFF + elif unit_prd.isa_ports[addr] & 0x07 == 6: + state = STATE_MASHINE.UG_SET_RAY_0 + STATE_MASHINE.UG_SET_RAY_0: _handle_ug_set_state(0x0) STATE_MASHINE.UG_SET_RAY_1: @@ -145,8 +182,6 @@ class TestPRD extends Node: _handle_ug_set_state(0x4) STATE_MASHINE.UG_SET_RAY_5: _handle_ug_set_state(0x5) - STATE_MASHINE.UG_SET_RAY_6: - _handle_ug_set_state(0x6) STATE_MASHINE.UM_RUN: flag_timer_started = _handle_um_run_state() STATE_MASHINE.FS_TURN_OFF: @@ -162,28 +197,28 @@ class TestPRD extends Node: else: control_results = on_control_result(block_ip_config, block_dkm_config, block_fs_config, control_results) state = STATE_MASHINE.AWAIT + print_debug(power_result) func _handle_fs_turn_on_state() -> void: control_label.text = 'Выполняется включение ФС-%s' % current_fs manage_fs(true, self_name, pribor_config, fs_parameters, current_fs, constants.POWER_UM) - #control_timer.wait_time = constants.TIMER_DELAY - #control_timer.start() - state = STATE_MASHINE.FS_WORK + control_timer.wait_time = constants.TIMER_DELAY + control_timer.start() func _handle_fs_work_state() -> void: control_label.text = 'Выполняется проверка ФС-%s' % current_fs if not module_prd.unit_yau07.online: return - if (current_fs == 2 and block_fs_config.fs_2 and not flag_timer_started) or \ - (current_fs == 3 and block_fs_config.fs_3 and not flag_timer_started) or \ - (current_fs == 4 and block_fs_config.fs_4 and not flag_timer_started) or \ - (current_fs == 5 and block_fs_config.fs_5 and not flag_timer_started) or \ - (current_fs == 6 and block_fs_config.fs_6 and not flag_timer_started) or \ - (current_fs == 7 and block_fs_config.fs_7 and not flag_timer_started) or \ - (current_fs == 1 and block_fs_config.fs_1 and not flag_timer_started): - state = STATE_MASHINE.UG_SET_RAY_6 + if (current_fs == 2 and block_fs_config.fs_2) or \ + (current_fs == 3 and block_fs_config.fs_3) or \ + (current_fs == 4 and block_fs_config.fs_4) or \ + (current_fs == 5 and block_fs_config.fs_5) or \ + (current_fs == 6 and block_fs_config.fs_6) or \ + (current_fs == 7 and block_fs_config.fs_7) or \ + (current_fs == 1 and block_fs_config.fs_1): + state = STATE_MASHINE.CHEK_KASSETA_Y5 func _handle_ug_set_state(RAY_DOU_NUM: int) -> void: @@ -217,7 +252,7 @@ class TestPRD extends Node: func _handle_um_run_state() -> bool: control_label.text = 'Выполняется настройка ЭМС' module_prd.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]]) - state = STATE_MASHINE.FS_WORK + state = STATE_MASHINE.READ_ISA return true @@ -231,7 +266,6 @@ class TestPRD extends Node: control_label.text = 'Выполняется завершение проверки ФС-%s' % current_fs control_results = power_um_control_result(control_results, constants, power_result) flag_timer_started = false - flag_check_dkm = false _advance_to_next_fs() state = STATE_MASHINE.INIT @@ -251,7 +285,7 @@ class TestPRD extends Node: func initialize_connections() -> void: _determine_self_name() var fs_mapping = _create_fs_mapping(self_name) - signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state').bind(fs_mapping, fs_array_node)) + signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state').bind(fs_mapping)) unit_prd.connect('data_received', Callable(self, 'on_data_received')) @@ -275,10 +309,6 @@ class TestPRD extends Node: var dkm_bit = _get_dkm_bit_for_current_fs() block_dkm_config = check_dkm(status, dkm_bit, block_dkm_config) - flag_check_dkm = block_dkm_config[_get_dkm_key_for_current_fs()] - if flag_check_dkm: - power_result[_get_ray_key_for_current_fs()] = power_um_ukp(status, current_fs, power_result[_get_ray_key_for_current_fs()]) - func _get_current_fs_key() -> String: return FS_KEYS.get(current_fs, '') @@ -308,27 +338,17 @@ class TestPRD extends Node: _: return '' - func _get_ray_key_for_current_fs() -> String: - match current_fs: - 1: return RAY_25_1 - 2: return RAY_25_2 - 3: return RAY_25_3 - 4: return RAY_25_4 - 5: return RAY_25_5 - 6: return RAY_25_6 - 7: return RAY_25_7 + static func _get_ray_key(machine_state: int) -> String: + match machine_state: + STATE_MASHINE.UG_SET_RAY_0: return RAY_m5 + STATE_MASHINE.UG_SET_RAY_1: return RAY_5 + STATE_MASHINE.UG_SET_RAY_2: return RAY_15 + STATE_MASHINE.UG_SET_RAY_3: return RAY_25 + STATE_MASHINE.UG_SET_RAY_4: return RAY_35 + STATE_MASHINE.UG_SET_RAY_5: return RAY_45 _: return '' - func _update_fs_states(fs_result: Dictionary, fs_array: Array) -> void: - for fs in fs_array: - var fs_meta: String = fs.get_meta('fs') - if fs_result.has(fs_meta): - var new_state = fs_result[fs_meta] - fs.state = new_state - block_fs_config[fs_meta] = new_state - - func on_stop_control() -> void: state = STATE_MASHINE.FS_TURN_OFF @@ -337,22 +357,22 @@ class TestPRD extends Node: var all_blocks_ip_ok = true var all_blocks_dkm_ok = true var all_blocks_fs_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 - + for block in dkm_config: if not dkm_config[block]: all_blocks_dkm_ok = false ctrl_results['dkm'] = all_blocks_dkm_ok - + for block in fs_config: if not fs_config[block]: all_blocks_fs_ok = false ctrl_results['fs'] = all_blocks_fs_ok - + return ctrl_results @@ -365,22 +385,24 @@ class TestPRD extends Node: settings_ug.ADDR_UG_LITERA_2, result_2, settings_ug.ADDR_UG_LITERA_3, settings_ug.ATT_UM_3]]) - prd_module.cmd_array.append([prd_unit.CmdCode.READ_ISA, [settings_ug.ADDR_UG_LITERA_1, settings_ug.ADDR_UG_LITERA_2, settings_ug.ADDR_UG_LITERA_3]]) + + static func _handle_read_isa(prd_module: Object, prd_unit: Object, read_isa_ports: Array) -> void: + prd_module.cmd_array.append([prd_unit.CmdCode.READ_ISA, read_isa_ports]) static func power_um_control_result(ctrl_results: Dictionary, constan: Dictionary, pwr_result: Dictionary) -> Dictionary: ctrl_results['power_um'] = true - + for amp_array in pwr_result.values(): if amp_array.size() == 0: ctrl_results['power_um'] = false return ctrl_results - - for amp_array in pwr_result.values(): - for value in amp_array: - if value < constan.TEMP_THRESHOLD: - ctrl_results['power_um'] = false - break + + #for amp_array in pwr_result.values(): + #for value in amp_array: + #if value < constan.TEMP_THRESHOLD: + #ctrl_results['power_um'] = false + #break return ctrl_results @@ -417,8 +439,8 @@ class TestPRD extends Node: var status = status_prd[byte_dry] >> bit & 1 ip_config[block][1] = false if status else true return ip_config - - + + ## Проверка кассеты у-5 (ЯУ-07Б, ЭМС-Г, УГ, УКП-1, УКП-2) static func check_block_kasseta_y5(status_prd: PackedByteArray, y5_config: Dictionary) -> Dictionary: y5_config.yau07 = true @@ -441,7 +463,7 @@ class TestPRD extends Node: 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 - + if ukp1_online: var tmp_1: int var temperature_ukp_1: int @@ -449,7 +471,7 @@ class TestPRD extends Node: 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 - + 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) From 295f81f694526f88000bac73d5cf4cefa85e73b2 Mon Sep 17 00:00:00 2001 From: Maxim Date: Fri, 15 Aug 2025 14:13:36 +0300 Subject: [PATCH 9/9] =?UTF-8?q?=D1=81=D0=BD=D1=8F=D1=82=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BC=D0=BE=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D1=81=D0=BE?= =?UTF-8?q?=20=D0=B2=D1=81=D0=B5=D1=85=20=D0=BB=D1=83=D1=87=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D1=80=D0=B8=D0=B1=D0=BE=D1=80=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B4-=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-k/pribor-prd-k.gd | 25 ++++--- scenes/pribor-prd-n/pribor-prd-n.gd | 2 +- scenes/pribor-prd-v/pribor-prd-v.gd | 24 ++++--- scripts/pribor-prd.gd | 103 ++++++++++++++++++---------- 4 files changed, 99 insertions(+), 55 deletions(-) diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index 0e6a5b69..8051033d 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -77,6 +77,7 @@ var control_results_k: Dictionary = { 'block_ip': false, # Проверка касет П1 и ИП МА2000 'temperature': true, # Проверка температур УМ 'dkm': false, + 'dou': false, 'power_um': false, # Мощность от УКП 'fs': false, } @@ -114,18 +115,28 @@ func on_state_mashine() -> 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 + var fs_results: Dictionary = control_prd_k.block_fs_config + var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') + for f in fs_nodes: + var fs_meta: String = f.get_meta('fs') + if fs_results.has(fs_meta): + var new_state = fs_results[fs_meta] + f.state = new_state + fs_results[fs_meta] = new_state + var dkm: Dictionary = control_prd_k.block_dkm_config - var fs: Dictionary = control_prd_k.block_fs_config - if control_prd_k.current_fs == 1 and fs.fs_1: + if control_prd_k.current_fs == 1 and fs_results.fs_1: $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if dkm.dkm_1 else STATE_VAL.ERROR - elif control_prd_k.current_fs == 6 and fs.fs_6: + elif control_prd_k.current_fs == 6 and fs_results.fs_6: $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if dkm.dkm_6 else STATE_VAL.ERROR - elif control_prd_k.current_fs == 7 and fs.fs_7: + elif control_prd_k.current_fs == 7 and fs_results.fs_7: $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if dkm.dkm_7 else STATE_VAL.ERROR - if not control_prd_k.power_result['ray_25_1'] or not control_prd_k.power_result['ray_25_6'] or not control_prd_k.power_result['ray_25_7']: + #if not control_prd_k.power_result['ray_25_1'] or not control_prd_k.power_result['ray_25_6'] or not control_prd_k.power_result['ray_25_7']: + #return + if 1 == 1: return - + var node_arr_power: Array = get_tree().get_nodes_in_group('power_amplifier') for i_pow in node_arr_power.size(): if i_pow < 1: @@ -146,11 +157,9 @@ func initialize_connections() -> void: unit_prd_k.connect('line_changed', Callable(self, 'on_line_changed')) var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier') - var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') var init_data: Dictionary = { 'control_label': $control_result, 'power_amplifiers': power_amplifiers, - 'fs_nodes': fs_nodes, 'unit_prd': unit_prd_k, 'module_prd' : prd_k_module, 'constants': constants_k, diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd index 74c5283e..13813b23 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.gd +++ b/scenes/pribor-prd-n/pribor-prd-n.gd @@ -72,6 +72,7 @@ var control_results_n: Dictionary = { 'block_ip': false, # Проверка касет П1 и ИП МА2000 'temperature': true, # Проверка температур УМ 'dkm': false, + 'dou': false, 'power_um': false, # Мощность от УКП 'fs': false, } @@ -147,7 +148,6 @@ func initialize_connections() -> void: var init_data: Dictionary = { 'control_label': $control_result, 'power_amplifiers': power_amplifiers, - #'fs_nodes': fs_nodes, 'unit_prd': unit_prd_n, 'module_prd' : prd_n_module, 'constants': constants_n, diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index 0e7a8d64..101b6828 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -71,6 +71,7 @@ var control_results_v: Dictionary = { 'block_ip': false, # Проверка касет П1 и ИП МА2000 'temperature': true, # Проверка температур УМ 'dkm': false, + 'dou': false, 'power_um': false, # Мощность от УКП 'fs': false, } @@ -97,17 +98,26 @@ func on_state_mashine() -> 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 - control_results_v = control_prd_v.control_results + var fs_results: Dictionary = control_prd_v.block_fs_config + var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') + for f in fs_nodes: + var fs_meta: String = f.get_meta('fs') + if fs_results.has(fs_meta): + var new_state = fs_results[fs_meta] + f.state = new_state + fs_results[fs_meta] = new_state + var dkm: Dictionary = control_prd_v.block_dkm_config - var fs: Dictionary = control_prd_v.block_fs_config - if control_prd_v.current_fs == 4 and fs.fs_4: + if control_prd_v.current_fs == 4 and fs_results.fs_4: $kasseta_FS_VD/ref_A2.state = STATE_VAL.GOOD if dkm.dkm_4 else STATE_VAL.ERROR - elif control_prd_v.current_fs == 5 and fs.fs_5: + elif control_prd_v.current_fs == 5 and fs_results.fs_5: $kasseta_FS_VD/ref_A6.state = STATE_VAL.GOOD if dkm.dkm_5 else STATE_VAL.ERROR - if not control_prd_v.power_result['ray_25_4'] or not control_prd_v.power_result['ray_25_5']: + #if not control_prd_v.power_result['ray_25_4'] or not control_prd_v.power_result['ray_25_5']: + #return + if 1 == 1: return - + var node_arr_power: Array = get_tree().get_nodes_in_group('power_amplifier') for i_pow in node_arr_power.size(): if i_pow < 6: @@ -134,11 +144,9 @@ func initialize_connections() -> void: unit_prd_v.connect('line_changed', Callable(self, 'on_line_changed')) var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier') - var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') var init_data: Dictionary = { 'control_label': $control_result, 'power_amplifiers': power_amplifiers, - 'fs_nodes': fs_nodes, 'unit_prd': unit_prd_v, 'module_prd' : prd_v_module, 'constants': constants_v, diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index b2b6d400..26c1b9ca 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -20,7 +20,8 @@ class TestPRD extends Node: UG_SET_RAY_3, UG_SET_RAY_4, UG_SET_RAY_5, - UM_RUN, + IN_EMS_RUN, + IN_EMS_STOP, FS_TURN_OFF, STOP_CONTROL, AWAIT @@ -69,6 +70,7 @@ class TestPRD extends Node: var power_amplify: Array var control_label: Label var control_timer: Timer = Timer.new() + var ems_6666_timer: Timer = Timer.new() ## Инициализация аргуметнов @@ -110,9 +112,7 @@ class TestPRD extends Node: if current_fs != 0: var tek_litera: Dictionary = power_result[current_fs] var interes = _get_ray_key(state) - print('interes: ', interes) if interes != '': - var arr_pow = tek_litera[interes] tek_litera[_get_ray_key(state)] = power_um_ukp(status, current_fs, tek_litera[_get_ray_key(state)]) power_result[current_fs] = tek_litera @@ -146,9 +146,14 @@ class TestPRD extends Node: print_debug('Яу-07Б: нет связи ', block_kasseta_y5_config) STATE_MASHINE.WRITE_ISA: _handle_ug_set_state(0x6) + state = STATE_MASHINE.READ_ISA + #STATE_MASHINE.IN_EMS_RUN: + #ems_6666_timer.start() + #state = STATE_MASHINE.READ_ISA STATE_MASHINE.READ_ISA: - _handle_read_isa(module_prd, unit_prd, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3]) - state = STATE_MASHINE.UG_SET_RAY + if (unit_prd.cmd_state == unit_prd.CmdState.DONE) or (unit_prd.cmd_state == unit_prd.CmdState.FALSE): + _handle_read_isa(module_prd, unit_prd, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3]) + state = STATE_MASHINE.UG_SET_RAY STATE_MASHINE.UG_SET_RAY: var addr: int = constants.ADDR_UG_LITERA_1 if current_fs == 3 or current_fs == 5 or current_fs == 7: @@ -166,24 +171,32 @@ class TestPRD extends Node: elif unit_prd.isa_ports[addr] & 0x07 == 4: state = STATE_MASHINE.UG_SET_RAY_5 elif unit_prd.isa_ports[addr] & 0x07 == 5: - state = STATE_MASHINE.FS_TURN_OFF + state = STATE_MASHINE.IN_EMS_STOP elif unit_prd.isa_ports[addr] & 0x07 == 6: state = STATE_MASHINE.UG_SET_RAY_0 STATE_MASHINE.UG_SET_RAY_0: _handle_ug_set_state(0x0) + await get_tree().create_timer(1.0).timeout + state = STATE_MASHINE.READ_ISA STATE_MASHINE.UG_SET_RAY_1: _handle_ug_set_state(0x1) + state = STATE_MASHINE.READ_ISA STATE_MASHINE.UG_SET_RAY_2: _handle_ug_set_state(0x2) + state = STATE_MASHINE.READ_ISA STATE_MASHINE.UG_SET_RAY_3: _handle_ug_set_state(0x3) + state = STATE_MASHINE.READ_ISA STATE_MASHINE.UG_SET_RAY_4: _handle_ug_set_state(0x4) + state = STATE_MASHINE.READ_ISA STATE_MASHINE.UG_SET_RAY_5: _handle_ug_set_state(0x5) - STATE_MASHINE.UM_RUN: - flag_timer_started = _handle_um_run_state() + state = STATE_MASHINE.READ_ISA + STATE_MASHINE.IN_EMS_STOP: + ems_6666_timer.stop() + state = STATE_MASHINE.FS_TURN_OFF STATE_MASHINE.FS_TURN_OFF: _handle_fs_turn_off_state() STATE_MASHINE.STOP_CONTROL: @@ -194,10 +207,11 @@ class TestPRD extends Node: control_label.text = 'Выполняется инициализация ФС-%s' % current_fs if current_fs in [1, 2, 3, 4, 5, 6, 7]: state = STATE_MASHINE.FS_TURN_ON + #state = STATE_MASHINE.STOP_CONTROL else: - control_results = on_control_result(block_ip_config, block_dkm_config, block_fs_config, control_results) + control_results = on_control_result(block_ip_config, block_dkm_config, block_fs_config, control_results, power_result, self_name, constants) state = STATE_MASHINE.AWAIT - print_debug(power_result) + #print_debug(power_result) func _handle_fs_turn_on_state() -> void: @@ -228,6 +242,7 @@ class TestPRD extends Node: '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 @@ -246,14 +261,11 @@ class TestPRD extends Node: dic_att.ATT_UM_3, ] on_ug_setting(module_prd, unit_prd, dic_att) - state = STATE_MASHINE.UM_RUN - func _handle_um_run_state() -> bool: - control_label.text = 'Выполняется настройка ЭМС' + func _on_ems_6666_timer() -> void: + print_debug('Write 6666') module_prd.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]]) - state = STATE_MASHINE.READ_ISA - return true func _handle_fs_turn_off_state() -> void: @@ -264,7 +276,6 @@ class TestPRD extends Node: func _handle_stop_control_state() -> void: control_label.text = 'Выполняется завершение проверки ФС-%s' % current_fs - control_results = power_um_control_result(control_results, constants, power_result) flag_timer_started = false _advance_to_next_fs() state = STATE_MASHINE.INIT @@ -299,8 +310,12 @@ class TestPRD extends Node: add_child(control_timer) control_timer.timeout.connect(on_stop_control) control_timer.one_shot = true - control_timer.wait_time = 10.0 + control_timer.wait_time = 15.0 control_timer.start() + + add_child(ems_6666_timer) + ems_6666_timer.timeout.connect(_on_ems_6666_timer) + ems_6666_timer.wait_time = 1.5 func _process_dkm_status(status: PackedByteArray) -> void: @@ -353,10 +368,11 @@ class TestPRD extends Node: state = STATE_MASHINE.FS_TURN_OFF - static func on_control_result(ip_config: Dictionary, dkm_config: Dictionary, fs_config: Dictionary, ctrl_results: Dictionary) -> Dictionary: + static func on_control_result(ip_config: Dictionary, dkm_config: Dictionary, fs_config: Dictionary, ctrl_results: Dictionary, power_config: Dictionary, pribor: String, cnstnt: Dictionary) -> Dictionary: var all_blocks_ip_ok = true var all_blocks_dkm_ok = true var all_blocks_fs_ok = true + var all_dou_ok = true for block in ip_config: if not ip_config[block][1]: @@ -372,7 +388,31 @@ class TestPRD extends Node: if not fs_config[block]: all_blocks_fs_ok = false ctrl_results['fs'] = all_blocks_fs_ok - + + var arr_liters = [2, 3] + if pribor == '1к' or pribor == '2к' or pribor == '3к' or pribor == '4к': + arr_liters = [1, 6, 7] + elif pribor == '1в' or pribor == '2в' or pribor == '3в' or pribor == '4в': + arr_liters = [4, 5] + + for i_liter in arr_liters: + var amp_array = power_config[i_liter] + if amp_array[RAY_m5].size() == 0 or \ + amp_array[RAY_5].size() == 0 or \ + amp_array[RAY_15].size() == 0 or \ + amp_array[RAY_25].size() == 0 or \ + amp_array[RAY_35].size() == 0 or \ + amp_array[RAY_45].size() == 0: + all_dou_ok = false + + for i_powers in amp_array.values(): + for k_pow in i_powers.size(): + if i_powers[k_pow] < cnstnt.POWER_THRESHOLD: + print_debug(i_powers[k_pow]) + all_dou_ok = false + + print([i_liter, amp_array]) + ctrl_results['dou'] = all_dou_ok return ctrl_results @@ -381,31 +421,18 @@ class TestPRD extends Node: 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_module.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]]) + prd_module.cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [ settings_ug.BASE_EMS_G, 6666, + 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, + ] + ]) static func _handle_read_isa(prd_module: Object, prd_unit: Object, read_isa_ports: Array) -> void: prd_module.cmd_array.append([prd_unit.CmdCode.READ_ISA, read_isa_ports]) - static func power_um_control_result(ctrl_results: Dictionary, constan: Dictionary, pwr_result: Dictionary) -> Dictionary: - ctrl_results['power_um'] = true - - for amp_array in pwr_result.values(): - if amp_array.size() == 0: - ctrl_results['power_um'] = false - return ctrl_results - - #for amp_array in pwr_result.values(): - #for value in amp_array: - #if value < constan.TEMP_THRESHOLD: - #ctrl_results['power_um'] = false - #break - return ctrl_results - - ## Управаление модулем фс (включить/отключить излучение) static func manage_fs(mode: bool, pribor: String, p_conf: Dictionary, fs_params: Dictionary, cur_fs: int, power_um: int) -> void: # Получаем конфигурацию для текущего прибора