221 lines
9.3 KiB
GDScript
221 lines
9.3 KiB
GDScript
@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)
|