@tool extends 'res://scenes/контроль/прибор.gd' enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } # Основные переменные var unit_prd_v: Object var ctrl_pos = 70 func _ready() -> void: if Engine.is_editor_hint(): return var unit_name = get_meta('unit_name')[0] var prd_v_module = prd.prd_dict[unit_name] unit_prd_v = prd_v_module.unit_control var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') for temp in power_amplifier: temp.value1 = -70 unit_prd_v.connect('control_is_over', Callable(self, 'on_press_device')) on_press_device() func _process(_delta: float) -> void: if Engine.is_editor_hint(): return set_frame($input_0, unit_prd_v.ems_input_1) set_frame($input_1, unit_prd_v.ems_input_2) set_frame($output_0, unit_prd_v.ems_output_1) set_frame($output_1, unit_prd_v.ems_output_2) func set_frame(node_frame: Node, val: int): node_frame.set_frame(val) func start_control() -> void: set_default_state() find_labels(self) func set_default_state() -> void: for group in get_tree().get_nodes_in_group('default_reset'): group.state = STATE_VAL.NONE for group in get_tree().get_nodes_in_group('power_amplifier'): group.state = STATE_VAL.NONE func _enter_tree() -> void: if Engine.is_editor_hint(): return $control_result.text = 'Ожидается запуск контроля ...' # TODO: Необходимо сделать пулл сообщений $control_result.add_theme_color_override('font_color', Color.ALICE_BLUE) 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]]) static func temperature_fill(temperature_arr_node: Array, temperature_dic: Dictionary)->void: for i_node_temperature in temperature_arr_node: var temperature_meta: String = i_node_temperature.get_meta('um') if not temperature_dic.has(temperature_meta): return i_node_temperature.value1 = temperature_dic[temperature_meta] static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifier: Array, POWER_THRESHOLD: int) -> void: for i_powapm in power_amplifier: var powamp_meta: String = i_powapm.get_meta('um') var status = STATE_VAL.GOOD if pow_dic else STATE_VAL.NONE if not pow_dic.has(powamp_meta): return if pow_dic[powamp_meta].size() < 6: status = STATE_VAL.ERROR else: if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_4: return if powamp_meta in ['um_9', 'um_10', 'um_11', 'um_12', 'um_13', 'um_14'] and not fs_result.fs_5: return i_powapm.value0 = pow_dic[powamp_meta] for i_p in pow_dic[powamp_meta]: if i_p < POWER_THRESHOLD: status = STATE_VAL.ERROR i_powapm.state = status ## Проверка температур УМ от УКП static func check_temperature_um(status_prd: PackedByteArray, power_amplifier: Array) -> bool: if power_amplifier.size() < 1: return false const Constants: Dictionary = { 'CONST_MIN_TEMP': -25, 'MAXIMUM_CODE_ADC': 3796, 'MINIMUM_CODE_AD': 2660, 'TEMPERATURE_UKP_1': 47, 'TEMPERATURE_UKP_2': 79, } const TEMP: float = 115.0 / (Constants.MAXIMUM_CODE_ADC - Constants.MINIMUM_CODE_AD) var ukp1_online: int = (status_prd[0] >> 2) & 1 var ukp2_online = (status_prd[0] >> 3) & 1 var all_temp_is_ok: bool = true if ukp1_online: var tmp_1: int var temperature_ukp_1: int for i_temp in 6: temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * i_temp) tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) power_amplifier[i_temp].value1 = tmp_1 if tmp_1>70: all_temp_is_ok = false if power_amplifier.size() > 12: # Темпуратура от УМ литеры 1 temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * 7) tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) power_amplifier[6].value1 = tmp_1 if tmp_1>70: all_temp_is_ok = false if ukp2_online: for i_temp in 6: var temperature_ukp_2: int = status_prd.decode_u16(Constants.TEMPERATURE_UKP_2 + 2 * i_temp) var tmp_2: int = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3) if power_amplifier.size() > 12: power_amplifier[i_temp+7].value1 = tmp_2 if tmp_2>70: all_temp_is_ok = false else: power_amplifier[i_temp+6].value1 = tmp_2 if tmp_2>70: all_temp_is_ok = false return all_temp_is_ok func on_press_device() -> void: var nodes_y5: Array = get_tree().get_nodes_in_group('y-5') var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') var module_fs_4: Node = $kasseta_FS_VD/ref_A6 var dou_4: Node = $dou4_A5 var module_fs_5: Node = $kasseta_FS_VD/ref_A2 var dou_5: Node = $dou5_A6 var for_control_result: Dictionary = { 'result_dic': unit_prd_v.control_results, 'power_dic': unit_prd_v.power_result, 'block_kasseta_y5_config': unit_prd_v.block_kasseta_y5_config, 'block_ip_config': unit_prd_v.block_ip_config, 'temperature_um' : unit_prd_v.temperature_um, 'nodes_y5': nodes_y5, 'node_ip_power_arr': node_ip_power_arr, 'fs_nodes': fs_nodes, 'power_amplifier': power_amplifier, 'POWER_THRESHOLD': unit_prd_v.constants.POWER_THRESHOLD, 'name_prd': unit_prd_v.self_name, 'module_fs_4': module_fs_4, 'dou_4': dou_4, 'module_fs_5': module_fs_5, 'dou_5': dou_5, } on_control_result(for_control_result) static func on_control_result(for_result_dic: Dictionary) -> void: temperature_fill(for_result_dic.power_amplifier, for_result_dic.temperature_um) var block_kasseta_y5_prd_config_v: Dictionary = for_result_dic.block_kasseta_y5_config var nodes_y5: Array = for_result_dic.nodes_y5 for node_y5 in nodes_y5: 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 break node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_v[meta_y5] else STATE_VAL.ERROR var block_ip_config_v: Dictionary = for_result_dic.block_ip_config for power_supply in for_result_dic.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 ## If control is end var result_dic: Dictionary = for_result_dic.result_dic for f in for_result_dic.fs_nodes: var fs_meta: String = f.get_meta('fs') if result_dic.has(fs_meta): f.state = result_dic[fs_meta] if result_dic.fs_5 == 1 and block_kasseta_y5_prd_config_v['yau07']: for_result_dic.module_fs_5.state = STATE_VAL.GOOD if result_dic.dkm_5 else STATE_VAL.ERROR for_result_dic.dou_5.state = STATE_VAL.GOOD if result_dic.dou_5 else STATE_VAL.ERROR if result_dic.fs_4 == 1 and block_kasseta_y5_prd_config_v['yau07']: for_result_dic.module_fs_4.state = STATE_VAL.GOOD if result_dic.dkm_4 else STATE_VAL.ERROR for_result_dic.dou_4.state = STATE_VAL.GOOD if result_dic.dou_4 else STATE_VAL.ERROR if block_kasseta_y5_prd_config_v['yau07']: power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) var result: bool = true for device in result_dic.values(): if not device: result = false log.message(Logger.INFO, 'Прибор ПРД-%s %s' % [for_result_dic.name_prd, ['неисправен', 'исправен'][int(result)]]) func find_labels(node1: Node): if node1 is Label: if node1.name in ["lbl_rname", "rname"]: if not node1.has_meta("tooltip_set"): ctrl_pos += 1 var box_number = ceili(float(ctrl_pos) / 10.0) var position_number = ctrl_pos % 10 if position_number == 0: position_number = 10 node1.tooltip_text = "Ящик - %d, Позиция - %d" % [box_number, position_number] node1.mouse_filter = Control.MOUSE_FILTER_STOP node1.set_meta("tooltip_set", true) for child in node1.get_children(): find_labels(child)