diff --git a/project.godot b/project.godot index 0be2d552..e8ea6335 100644 --- a/project.godot +++ b/project.godot @@ -147,6 +147,7 @@ external_cu=false [global_group] default_reset="" +power_supply="Ноды источников питания прибора" [gui] diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index 4e6bb084..0024da27 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -33,6 +33,20 @@ const Constants: Dictionary = { 'attenutor_um_3': 0x0, 'POWER_UM': 75, } +# Конфигурация параметров для каждого прибора +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 := { + 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 } enum STATE_MASHINE { INIT, @@ -45,14 +59,13 @@ enum STATE_MASHINE { AWAIT } var block_config_k := { - # Ключ: [бит, нода, имя для _control_results (опционально)] - 'maa2000_1': [0, 'maa2000_A23'], - 'maa2000_2': [1, 'maa2000_A22'], - 'ip9_50_1': [2, 'kasseta_p_1/ref_A26'], - 'ip9_50_2': [3, 'kasseta_p_1/ref_A23'], - 'ip12_50_1': [4, 'kasseta_p_1/ref_A24'], - 'ip9_50_3': [5, 'kasseta_p_2/ref_A26'], - 'ip12_50_2': [6, 'kasseta_p_2/ref_A23'] + '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 fs_mapping_k = { 0: { 'node': 'kasseta_fs_kd/ref_A3', 'condition': pribor == '1к' }, @@ -79,9 +92,9 @@ 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 -var ug_work_2: int -var ug_work_3: int +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() @@ -93,14 +106,18 @@ var _control_results: Dictionary = { 'dkm_1': false, # Проверка ДКМ 1 'dkm_6': false, # Проверка ДКМ 6 'dkm_7': false, # Проверка ДКМ 7 - 'power_ukp': false, # Мощность от УКП + 'power_ip': false, # Мощность от УКП 'fs_1': false, # Проверка ФС 1 'fs_6': false, # Проверка ФС 6 'fs_7': false, # Проверка ФС 7 } +static var node_common_func = load('res://scripts/pribor-prd.gd') + func _ready() -> void: + if Engine.is_editor_hint(): + return initialize_connections() setup_timer() set_default_state() @@ -116,7 +133,7 @@ func on_state_mashine() -> void: state = STATE_MASHINE.AWAIT STATE_MASHINE.FS_TURN_ON: - _on_control_fs(true) + 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 @@ -140,7 +157,7 @@ func on_state_mashine() -> void: state = STATE_MASHINE.FS_WORK STATE_MASHINE.FS_TURN_OFF: - _on_control_fs(false) + node_common_func.manage_fs(false, pribor, PRIBOR_CONFIG, FS_PARAMS, current_fs, Constants.POWER_UM) power_control_result() state = STATE_MASHINE.STOP_CONTROL @@ -187,6 +204,8 @@ func set_default_state() -> void: func _enter_tree() -> void: + if Engine.is_editor_hint(): + return $control_result.text = '' signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) @@ -195,7 +214,7 @@ 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]]) + 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: @@ -207,11 +226,18 @@ func on_data_received(unit_prd: Object) -> void: if not is_inside_tree(): return - var status = unit_prd.status - check_block_ip(status, block_config_k) - check_temperature_um(status) + var status: PackedByteArray = unit_prd.status + # 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 meta_ip = power_supply.get_meta('ip') + if block_config_k.has(meta_ip): + power_supply.status = block_config_k[meta_ip][1] + + node_common_func.check_temperature_um(status, get_tree().get_nodes_in_group('power_amplifier')) # Обработка данных ЭМС - _process_ems_data(status) + #_process_ems_data(status) if current_fs == 1 and _control_results.fs_1: flag_check_dkm = check_dkm(status, Constants.DKM_BIT_1) @@ -220,79 +246,25 @@ func on_data_received(unit_prd: Object) -> void: elif current_fs == 7 and _control_results.fs_7: flag_check_dkm = check_dkm(status, Constants.DKM_BIT_7) - flag_check_dkm = check_dkm(status, Constants.DKM_BIT_7) - flag_check_dkm = check_dkm(status, Constants.DKM_BIT_6) - flag_check_dkm = check_dkm(status, Constants.DKM_BIT_1) - 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) - - # Обновление фреймов для входных сигналов - $Monitoring_panel/in_fs_1.frame = (in_blank >> Constants.CI_6_OT_FS) & 1 - $Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_7_OT_FS) & 1 - $Monitoring_panel/in_fs_3.frame = (in_blank >> Constants.CI_1_OT_FS) & 1 - - # Обновление фреймов для выходных сигналов ЭМС - $Monitoring_panel/out_ems_1.frame = (out_blank >> Constants.CI_6_B_UF) & 1 - $Monitoring_panel/out_ems_2.frame = (out_blank >> Constants.CI_7_B_UF) & 1 - $Monitoring_panel/out_ems_3.frame = (out_blank >> Constants.CI_1_B_UF) & 1 - - -## Проверка касет П1 и ИП МА2000 -func check_block_ip(status_prd: PackedByteArray, block_config: Dictionary) -> void : - # Конфигурация проверяемых блоков - const BYTE_DRY_CONTACT: int = 27 - - - var ug_online: bool = (status_prd[0] >> 1) & 1 - var all_good := true - - - for block in block_config: - var bit: int = block_config[block][0] - var node_name = block_config[block][1] - var node: Control = get_node(node_name) - - if ug_online: - var status = status_prd[BYTE_DRY_CONTACT] >> bit & 1 - node.state = STATE_VAL.ERROR if status else STATE_VAL.GOOD - all_good = all_good and (node.state == STATE_VAL.GOOD) - else: - node.state = STATE_VAL.NONE - - _control_results['block_ip'] = all_good - - -## Проверка температур УМ от УКП -func check_temperature_um(status_prd: PackedByteArray) -> void: - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - const TEMP: float = 115.0 / (Constants.MAXIMUM_CODE_ADC - Constants.MINIMUM_CODE_AD) - var ukp1_online: int = (status_prd[0] >> 2) & 1 - if ukp1_online: - var tmp_1: int - var temperature_ukp_1: int - for i_temp in 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 +## Обрабатывает данные ЭМС и обновляет UI панели +#func _process_ems_data(status: PackedByteArray) -> void: + ### Контроль ЭМС + #var in_blank: int = status.decode_u16(Constants.IN_BLANK_PRD) + #var out_blank: int = status.decode_u16(Constants.OUT_BLANK_PRD) +# + ## Обновление фреймов для входных сигналов + #$Monitoring_panel/in_fs_1.frame = (in_blank >> Constants.CI_6_OT_FS) & 1 + #$Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_7_OT_FS) & 1 + #$Monitoring_panel/in_fs_3.frame = (in_blank >> Constants.CI_1_OT_FS) & 1 +# + ## Обновление фреймов для выходных сигналов ЭМС + #$Monitoring_panel/out_ems_1.frame = (out_blank >> Constants.CI_6_B_UF) & 1 + #$Monitoring_panel/out_ems_2.frame = (out_blank >> Constants.CI_7_B_UF) & 1 + #$Monitoring_panel/out_ems_3.frame = (out_blank >> Constants.CI_1_B_UF) & 1 ## Проверка ДКМ @@ -388,42 +360,6 @@ func power_control_result() -> void: break -func _on_control_fs(mode: bool) -> void: - # Конфигурация параметров для каждого прибора - var 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]}, - } - # Получаем конфигурацию для текущего прибора - var config: Dictionary = pribor_config.get(pribor) - var angle: float = config.angle - var sectors: Array = config.sectors - - # Конфигурация частот и ширин для каждого ФС - var fs_params := { - 1: {'freq': 450.0, 'width': 80.0}, - 6: {'freq': 2450.0, 'width': 110.0}, - 7: {'freq': 4750.0, 'width': 110.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 - 1] if current_fs == 1 else sectors[current_fs - 5] - ]) - signaller.emit_signal('interfer_init', interfer_name, fs_arr, Constants.POWER_UM) - - func on_stop_control() -> void: state = STATE_MASHINE.FS_TURN_OFF @@ -458,13 +394,6 @@ 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] - if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_3): - ug_work_3 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_3] - var result_1 = ((Constants.attenutor_um_1 & 0x07) << 3) | (Constants.dou_ray_nuber & 0x07) var result_2 = ((Constants.attenutor_um_2 & 0x07) << 3) | (Constants.dou_ray_nuber & 0x07) var prd_module = prd.prd_dict[unit_prd.name] @@ -481,6 +410,14 @@ func on_mode_changed(in_tree: bool) -> void: func on_control_result() -> void: + #Обновляем _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 + all_blocks_ok = false + break + _control_results['block_ip'] = all_blocks_ok + # Словарь соответствия ключей ошибок и нод var error_nodes := { 'fs_1': $kasseta_fs_kd/ref_A3, diff --git a/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index b2d8941c..7a12d7f2 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.tscn +++ b/scenes/pribor-prd-k/pribor-prd-k.tscn @@ -54,7 +54,7 @@ offset_bottom = 432.0 script = ExtResource("3_wip3a") fname = "Кассета У5" -[node name="maa2000_A22" parent="." groups=["default_reset"] instance=ExtResource("1_8dmgr")] +[node name="maa2000_A22" parent="." groups=["default_reset", "power_supply"] instance=ExtResource("1_8dmgr")] layout_mode = 0 offset_left = 485.0 offset_top = 907.0 @@ -62,6 +62,7 @@ offset_right = 652.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A28" +metadata/ip = "maa2000_1" [node name="dou6_A7" parent="." groups=["default_reset"] instance=ExtResource("1_8dmgr")] layout_mode = 0 @@ -72,7 +73,7 @@ offset_bottom = 907.0 fname = "ДОУ-6" rname = "A7" -[node name="maa2000_A23" parent="." groups=["default_reset"] instance=ExtResource("1_8dmgr")] +[node name="maa2000_A23" parent="." groups=["default_reset", "power_supply"] instance=ExtResource("1_8dmgr")] layout_mode = 0 offset_left = 8.0 offset_top = 907.0 @@ -80,6 +81,7 @@ offset_right = 175.0 offset_bottom = 949.0 fname = "MAA2000" rname = "A27" +metadata/ip = "maa2000_2" [node name="dou7_A8" parent="." groups=["default_reset"] instance=ExtResource("1_8dmgr")] layout_mode = 0 @@ -305,29 +307,32 @@ patch_margin_bottom = 16 script = ExtResource("7_xpa2n") fname = "Кассета П-1" -[node name="ref_A26" parent="kasseta_p_1" groups=["default_reset"] instance=ExtResource("8_la5yt")] +[node name="ref_A26" parent="kasseta_p_1" groups=["default_reset", "power_supply"] instance=ExtResource("8_la5yt")] offset_left = 9.0 offset_top = 33.0 offset_right = 59.0 offset_bottom = 183.0 fname = "ИП9-50" rname = "A23" +metadata/ip = "ip9_50_1" -[node name="ref_A23" parent="kasseta_p_1" groups=["default_reset"] instance=ExtResource("8_la5yt")] +[node name="ref_A23" parent="kasseta_p_1" groups=["default_reset", "power_supply"] instance=ExtResource("8_la5yt")] offset_left = 59.0 offset_top = 33.0 offset_right = 109.0 offset_bottom = 183.0 fname = "ИП9-50" rname = "A24" +metadata/ip = "ip9_50_2" -[node name="ref_A24" parent="kasseta_p_1" groups=["default_reset"] instance=ExtResource("8_la5yt")] +[node name="ref_A24" parent="kasseta_p_1" groups=["default_reset", "power_supply"] instance=ExtResource("8_la5yt")] offset_left = 109.0 offset_top = 33.0 offset_right = 159.0 offset_bottom = 183.0 fname = "ИП12-50" rname = "A26" +metadata/ip = "ip12_50_1" [node name="lbl_fname" type="Label" parent="kasseta_p_1"] self_modulate = Color(1, 1, 1, 0.62) @@ -356,6 +361,7 @@ offset_right = 649.0 offset_bottom = 1003.0 theme_override_colors/font_color = Color(0.862745, 0.0784314, 0.235294, 1) theme_override_font_sizes/font_size = 28 +text = "Прибор ПРД- неисправен" horizontal_alignment = 1 metadata/_edit_lock_ = true diff --git a/scenes/контроль/кассета-п-2.tscn b/scenes/контроль/кассета-п-2.tscn index d76a49e2..a265d9d7 100644 --- a/scenes/контроль/кассета-п-2.tscn +++ b/scenes/контроль/кассета-п-2.tscn @@ -14,21 +14,23 @@ patch_margin_right = 16 patch_margin_bottom = 16 script = ExtResource("2_mdnod") -[node name="ref_A26" parent="." groups=["default_reset"] instance=ExtResource("3_4a27g")] +[node name="ref_A26" parent="." groups=["default_reset", "power_supply"] instance=ExtResource("3_4a27g")] offset_left = 10.0 offset_top = 30.0 offset_right = 60.0 offset_bottom = 180.0 fname = "ИП9-50" rname = "A22" +metadata/ip = "ip9_50_3" -[node name="ref_A23" parent="." groups=["default_reset"] instance=ExtResource("3_4a27g")] +[node name="ref_A23" parent="." groups=["default_reset", "power_supply"] instance=ExtResource("3_4a27g")] offset_left = 60.0 offset_top = 30.0 offset_right = 110.0 offset_bottom = 180.0 fname = "ИП12-50" rname = "A25" +metadata/ip = "ip12_50_2" [node name="lbl_fname" type="Label" parent="."] self_modulate = Color(1, 1, 1, 0.62) diff --git a/scenes/контроль/прибор.gd b/scenes/контроль/прибор.gd index 0f5b74a1..a664c4d2 100644 --- a/scenes/контроль/прибор.gd +++ b/scenes/контроль/прибор.gd @@ -1,3 +1,4 @@ +@tool extends Control """ diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd new file mode 100644 index 00000000..139dfcd1 --- /dev/null +++ b/scripts/pribor-prd.gd @@ -0,0 +1,69 @@ +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: + # Конфигурация проверяемых блоков + const BYTE_DRY_CONTACT: 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 + + 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, + } + 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 diff --git a/scripts/pribor-prd.gd.uid b/scripts/pribor-prd.gd.uid new file mode 100644 index 00000000..be3ece9e --- /dev/null +++ b/scripts/pribor-prd.gd.uid @@ -0,0 +1 @@ +uid://bhorwnn8gprn