Files
uarep-ctl/scenes/pribor-prd-k/pribor-prd-k.gd
2025-08-05 15:45:52 +03:00

391 lines
16 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@tool
extends 'res://scenes/контроль/прибор.gd'
const Constants = {
'IN_BLANK_PRD': 1,
'OUT_BLANK_PRD': 13,
'CI_1_OT_FS': 8,
'CI_6_OT_FS': 13,
'CI_7_OT_FS': 14,
'CI_1_B_UF': 3,
'CI_6_B_UF': 4,
'CI_7_B_UF': 5,
'CONST_MIN_TEMP': -25,
'MAXIMUM_CODE_ADC': 3796,
'MINIMUM_CODE_AD': 2660,
'TEMPERATURE_UKP_1': 47,
'TEMPERATURE_UKP_2': 79,
'POWER_UKP_1': 31,
'POWER_UKP_2': 63,
'DKM_BIT_1': 0,
'DKM_BIT_6': 5,
'DKM_BIT_7': 6,
'BASE_ADDR_EMS_G': 0x120,
'ADDR_UG_LITERA_1': 0x106,
'ADDR_UG_LITERA_2': 0x108,
'ADDR_UG_LITERA_3': 0x10A,
'TEMP_THRESHOLD': 70,
'POWER_THRESHOLD': 40,
'TIMER_DELAY': 1.5,
'dou_ray_nuber': 0x3,
'attenutor_um_1': 0x7,
'attenutor_um_2': 0x7,
'attenutor_um_3': 0x7,
}
enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 }
# Основные переменные
var count_packet_1:int = 0
var count_packet_2:int = 0
var power_array_1: Array = []
var power_array_2: Array = []
var currecnt_unit: String
var ug_work_1: int
var ug_work_2: int
var ug_work_3: int
# Флаги и таймеры
var control_timer: Timer = Timer.new()
var flag_timer_started: bool = false
# Результаты контроля
var _control_results: Dictionary = {
'block_ip': false, # Проверка касет П1 и ИП МА2000
'temperature': true, # Проверка температур УМ
'dkm_1': false, # Проверка ДКМ
'dkm_2': false, # Проверка ДКМ
'power_ukp': false, # Мощность от УКП
'fs_1': false, # Проверка ФС
'fs_2': false,
'fs_3': false,
}
func _ready() -> void:
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)
unit_prd.connect('data_received', Callable(self, 'on_data_received'))
unit_prd.connect('line_changed', Callable(self, 'on_line_changed'))
func setup_timer() -> void:
add_child(control_timer)
control_timer.connect('timeout', Callable(self, 'on_stop_control'))
control_timer.one_shot = true
control_timer.wait_time = 10.0
control_timer.start()
func set_default_state() -> void:
for group in get_tree().get_nodes_in_group('default_reset'):
group.state = STATE_VAL.NONE
for group in get_tree().get_nodes_in_group('power_amplifier'):
group.state = STATE_VAL.NONE
func _enter_tree() -> void:
$control_result.text = ''
signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false))
_on_control_fs(true)
func _exit_tree() -> void:
var unit_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]])
func on_line_changed(unit_prd: Object) -> void:
if not unit_prd.online:
set_default_state()
func on_data_received(unit_prd: Object) -> void:
if not is_inside_tree():
return
var status = unit_prd.status
check_block_ip(status)
check_temperature_um(status)
# Обработка данных ЭМС
_process_ems_data(status)
if flag_timer_started:
check_dkm(status, Constants.DKM_BIT_1)
check_dkm(status, Constants.DKM_BIT_6)
check_dkm(status, Constants.DKM_BIT_7)
# Обработка мощности от УКП
_process_ukp_power(status)
# Обрабатывает данные ЭМС и обновляет UI панели
func _process_ems_data(status: PackedByteArray) -> void:
## Контроль ЭМС
var in_blank: int = status.decode_u16(Constants.IN_BLANK_PRD)
var out_blank: int = status.decode_u16(Constants.OUT_BLANK_PRD)
# Обновление фреймов для входных сигналов
$Monitoring_panel/in_fs_1.frame = (in_blank >> Constants.CI_6_OT_FS) & 1
$Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_7_OT_FS) & 1
$Monitoring_panel/in_fs_3.frame = (in_blank >> Constants.CI_1_OT_FS) & 1
# Обновление фреймов для выходных сигналов ЭМС
$Monitoring_panel/out_ems_1.frame = (out_blank >> Constants.CI_6_B_UF) & 1
$Monitoring_panel/out_ems_2.frame = (out_blank >> Constants.CI_7_B_UF) & 1
$Monitoring_panel/out_ems_3.frame = (out_blank >> Constants.CI_1_B_UF) & 1
## Проверка касет П1 и ИП МА2000
func check_block_ip(status_prd: PackedByteArray) -> void :
var ug_online: bool = (status_prd[0] >> 1) & 1
if ug_online:
const BYTE_DRY_CONTACT: int = 27
const BIT_MAA2000_1: int = 0
const BIT_MAA2000_2: int = 1
const BIT_IP9_50_1: int = 2
const BIT_IP9_50_2: int = 3
const BIT_IP12_50_1: int = 4
const BIT_IP9_50_3: int = 5
const BIT_IP12_50_2: int = 6
var maa2000_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_MAA2000_1 & 1
var maa2000_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_MAA2000_2 & 1
var ip9_50_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_1 & 1
var ip9_50_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_2 & 1
var ip12_50_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP12_50_1 & 1
var ip9_50_3 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_3 & 1
var ip12_50_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP12_50_2 & 1
$maa2000_A23.state = STATE_VAL.ERROR if maa2000_1 else STATE_VAL.GOOD
$maa2000_A22.state = STATE_VAL.ERROR if maa2000_2 else STATE_VAL.GOOD
$kasseta_p_1/ref_A26.state = STATE_VAL.ERROR if ip9_50_1 else STATE_VAL.GOOD
$kasseta_p_1/ref_A23.state = STATE_VAL.ERROR if ip9_50_2 else STATE_VAL.GOOD
$kasseta_p_1/ref_A24.state = STATE_VAL.ERROR if ip12_50_1 else STATE_VAL.GOOD
$kasseta_p_2/ref_A26.state = STATE_VAL.ERROR if ip9_50_3 else STATE_VAL.GOOD
$kasseta_p_2/ref_A23.state = STATE_VAL.ERROR if ip12_50_2 else STATE_VAL.GOOD
else:
$maa2000_A23.state = STATE_VAL.NONE
$maa2000_A22.state = STATE_VAL.NONE
$kasseta_p_1/ref_A26.state = STATE_VAL.NONE
$kasseta_p_1/ref_A23.state = STATE_VAL.NONE
$kasseta_p_1/ref_A24.state = STATE_VAL.NONE
$kasseta_p_2/ref_A26.state = STATE_VAL.NONE
$kasseta_p_2/ref_A23.state = STATE_VAL.NONE
_control_results['block_ip'] = (
$maa2000_A23.state == STATE_VAL.GOOD and
$maa2000_A22.state == STATE_VAL.GOOD and
$kasseta_p_1/ref_A26.state == STATE_VAL.GOOD and
$kasseta_p_1/ref_A23.state == STATE_VAL.GOOD and
$kasseta_p_1/ref_A24.state == STATE_VAL.GOOD and
$kasseta_p_2/ref_A26.state == STATE_VAL.GOOD and
$kasseta_p_2/ref_A23.state == STATE_VAL.GOOD
)
## Проверка температур УМ от УКП
func check_temperature_um(status_prd: PackedByteArray) -> void:
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
const TEMP: float = 115.0 / (Constants.MAXIMUM_CODE_ADC - Constants.MINIMUM_CODE_AD)
var ukp1_online: int = (status_prd[0] >> 2) & 1
if ukp1_online:
var tmp_1: int
var temperature_ukp_1: int
for i_temp in range(6):
temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * i_temp)
tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3)
power_amplifier[i_temp].value0 = tmp_1
# Темпуратура от УМ литеры 1
temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * 7)
tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3)
power_amplifier[6].value0 = tmp_1
var ukp2_online = (status_prd[0] >> 3) & 1
if ukp2_online:
for i_temp in range(6):
var temperature_ukp_2: int = status_prd.decode_u16(Constants.TEMPERATURE_UKP_2 + 2 * i_temp)
var tmp_2: int = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3)
power_amplifier[i_temp+7].value0 = tmp_2
## Проверка ДКМ
func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> void:
const DKM: int = 28
var status_dkm = status_prd[DKM] >> bit_dkm & 1
if bit_dkm == 5:
$dou6_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
$kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results['dkm_1'] = status_dkm
elif bit_dkm == 6:
$dou7_A8.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
$kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results['dkm_2'] = status_dkm
elif bit_dkm == 0:
$kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results['dkm_3'] = status_dkm
func _process_ukp_power(status: PackedByteArray) -> void:
## Мощность УМ от УКП 1
var arr_power_ukp_1: Array = []
if (status[0] >> 2) & 1:
var power_ukp_1: int
for i_power in range(6):
power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * i_power)
arr_power_ukp_1.append(power_ukp_1)
# Мощность от УМ (УКП) литеры 3
power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7)
arr_power_ukp_1.append(power_ukp_1)
if count_packet_1 == 0:
power_array_1 = arr_power_ukp_1
else:
for i in arr_power_ukp_1.size():
if arr_power_ukp_1[i] > power_array_1[i]:
power_array_1[i] = arr_power_ukp_1[i]
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
for i in 7:
power_amplifier[i].value1 = '%d' % power_array_1[i]
power_amplifier[i].state = STATE_VAL.GOOD if power_array_1[i] > 40 else STATE_VAL.ERROR
count_packet_1 += 1
## Мощность УМ от УКП 2
var arr_power_ukp_2: Array = []
if (status[0] >> 2) & 1:
for i_power in range(6):
var power_ukp_2 = status.decode_u16(Constants.POWER_UKP_2 + 2 * i_power)
arr_power_ukp_2.append(power_ukp_2)
if count_packet_2 == 0:
power_array_2 = arr_power_ukp_2
else:
for i in arr_power_ukp_2.size():
if arr_power_ukp_2[i] > power_array_2[i]:
power_array_2[i] = arr_power_ukp_2[i]
for i in 6:
power_amplifier[i+7].value1 = '%d' % power_array_2[i]
power_amplifier[i+7].state = STATE_VAL.GOOD if power_array_2[i] > 40 else STATE_VAL.ERROR
count_packet_2 += 1
_control_results['power_ukp'] = true
for amp in power_amplifier:
if amp.state != STATE_VAL.GOOD:
_control_results['power_ukp'] = false
break
func _on_control_fs(mode: bool) -> void:
var interfer_name: String
var fs_arr: = [[90.0, 2450.0, 1500.0, 23]]
if mode:
interfer_name = 'k1'
else:
interfer_name = 'off'
signaller.emit_signal('interfer_init', interfer_name, fs_arr, 50.0)
func on_stop_control() -> void:
print_debug('Контроль ПРД остановлен')
_on_control_fs(false)
on_control_result()
func on_fs_update_state(packet_type_7: Dictionary) -> void:
var parts = currecnt_unit.split('-')
var last_part = parts[-1] # Прибор
# Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора
var fs_mapping = {
0: { 'node': $kasseta_fs_kd/ref_A3, 'condition': last_part == '1к' },
1: { 'node': $kasseta_fs_kd/ref_A3, 'condition': last_part == '4к' },
2: { 'node': $kasseta_fs_kd/ref_A3, 'condition': last_part == '3к' },
3: { 'node': $kasseta_fs_kd/ref_A3, 'condition': last_part == '2к' },
20: { 'node': $kasseta_fs_kd/ref_A6, 'condition': last_part == '1к' },
21: { 'node': $kasseta_fs_kd/ref_A6, 'condition': last_part == '4к' },
22: { 'node': $kasseta_fs_kd/ref_A6, 'condition': last_part == '3к' },
23: { 'node': $kasseta_fs_kd/ref_A6, 'condition': last_part == '2к' },
24: { 'node': $kasseta_fs_kd/ref_A5, 'condition': last_part == '1к' },
25: { 'node': $kasseta_fs_kd/ref_A5, 'condition': last_part == '4к' },
26: { 'node': $kasseta_fs_kd/ref_A5, 'condition': last_part == '3к' },
27: { 'node': $kasseta_fs_kd/ref_A5, 'condition': last_part == '2к' },
}
for fs in packet_type_7:
if fs in fs_mapping and fs_mapping[fs]['condition']:
var data = packet_type_7[fs]
var state = STATE_VAL.GOOD if data.isg == 1 else STATE_VAL.ERROR if data.isg == 0 else STATE_VAL.NONE
fs_mapping[fs]['node'].state = state
if fs < 4:
_control_results['fs_1'] = (data.isg == 1)
elif fs <24:
_control_results['fs_2'] = (data.isg == 1)
else:
_control_results['fs_3'] = (data.isg == 1)
if _control_results['fs_1'] and _control_results['fs_2'] and _control_results['fs_3'] and not flag_timer_started:
on_ug_setting()
control_timer.wait_time = Constants.TIMER_DELAY
control_timer.start()
flag_timer_started = true
func on_ug_setting() -> void:
var unit_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]
prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, result_1,
Constants.ADDR_UG_LITERA_2, result_2,
Constants.ADDR_UG_LITERA_3, Constants.attenutor_um_3,
Constants.BASE_ADDR_EMS_G, 6666]])
prd_module.cmd_array.append([unit_prd.CmdCode.READ_ISA, [Constants.ADDR_UG_LITERA_1, Constants.ADDR_UG_LITERA_2, Constants.ADDR_UG_LITERA_3]])
func on_mode_changed(in_tree: bool) -> void:
if not in_tree:
queue_free()
func on_control_result() -> void:
var result: bool = true
for key in _control_results:
if not _control_results[key]:
if key == 'fs_1':
$kasseta_fs_kd/ref_A3.state = STATE_VAL.ERROR
if key == 'fs_2':
$kasseta_fs_kd/ref_A6.state = STATE_VAL.ERROR
if key == 'fs_3':
$kasseta_fs_kd/ref_A5.state = STATE_VAL.ERROR
result = false
print_debug('%s false' % key)
var parts = currecnt_unit.split('-')
var last_part = parts[-1] # Прибор
if result:
$control_result.text = 'Прибор ПРД-%s исправен' % last_part
$control_result.add_theme_color_override('font_color', Color.AQUAMARINE)
else:
$control_result.text = 'Прибор ПРД-%s неисправен' % last_part
$control_result.add_theme_color_override('font_color', Color.CRIMSON)
await get_tree().create_timer(Constants.TIMER_DELAY).timeout
flag_timer_started = false