Files
PRD_TU_MP550/scripts/control_panel.gd
2025-02-24 21:15:40 +03:00

484 lines
19 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.

extends Panel
signal signal_on_start_timer_03()
var timer: Timer = Timer.new()
var timer_03: Timer = Timer.new()
var node_cell_ind: Array
var count_cell: int
var past_pribor: int
var logger: Node
var array_pow: Array = []
var count_packet:int = 0
var flag_control_on: bool = false
var flag_fs_1_ready: bool = false
var flag_fs_2_ready: bool = false
class Logger extends Node:
var log_counter: int = 0
var log_level = "INFO"
var log_array
func _init(log_node):
log_array = log_node
log_array.clear()
func get_current_datetime_string() -> String:
var time = Time.get_datetime_dict_from_system()
return ' [%02d-%02d-%04d %02d:%02d] ' % [time['day'], time['month'], time['year'], time['hour'], time['minute']]
func info(message):
if log_level == "INFO" or log_level == "DEBUG":
var datetime_string = get_current_datetime_string()
log_array.insert_line_at(log_counter, "[INFO]" + datetime_string + message)
log_counter += 1
func warning(message):
if log_level == "WARNING" or log_level == "INFO" or log_level == "DEBUG":
var datetime_string = get_current_datetime_string()
log_array.insert_line_at(log_counter, "[WARNING]" + datetime_string + message)
log_counter += 1
func error(message):
var datetime_string = get_current_datetime_string()
log_array.insert_line_at(log_counter, "[ERROR]" + datetime_string + message)
log_counter += 1
func _ready() -> void:
Network.connect('port_fs_opened_1', _on_fs_status_1.bind(Constants.STATE_VAL.GOOD))
Network.connect('port_fs_closed_1', _on_fs_status_1.bind(Constants.STATE_VAL.ERROR))
Network.connect('data_from_fs_1', _on_data_fs.bind('ФС-1'))
Network.connect('port_fs_opened_2', _on_fs_status_2.bind(Constants.STATE_VAL.GOOD))
Network.connect('port_fs_closed_2', _on_fs_status_2.bind(Constants.STATE_VAL.ERROR))
Network.connect('data_from_fs_2', _on_data_fs.bind('ФС-2'))
self.add_child(timer)
timer.connect('timeout', Callable(self, '_on_timer'))
Network.connect('yau_receive', Callable(self, '_on_yau_received'))
self.get_parent().get_child(2).connect('signal_FS_is_ready', Callable(self, '_on_fs_status'))
# Добавляем таймер как дочерний узел
self.add_child(timer_03)
# Подключаем сигнал timeout к функции _on_timer_03
timer_03.connect('timeout', Callable(self, '_on_timer_03'))
self.connect('signal_on_start_timer_03', Callable(self, '_on_start_timer_03'))
node_cell_ind = [
$soc_y5/yau_07b,
$soc_y5/ems_g,
$soc_y5/ug,
$soc_y5/ukp_2,
$soc_y5/ukp_1,
$soc_P1/MAA_1,
$soc_P1/MAA_2,
$soc_P1/IP9_50_2,
$soc_P1/IP9_50_1,
$soc_P1/IP12_50,
$soc_P2/IP9_50,
$soc_P2/IP12_50,
$soc_y5/IP5_25,
$Kasseta_FS/ref_A3,
$Kasseta_FS/ref_A1,
$Kasseta_FS/ref_A2,
$Kasseta_FS/ref_A4,
$Kasseta_FS/Block_FS_PRD_K,
$Kasseta_FS/FS_PRD_K,
$soc_DKM/DKM_1,
$soc_DKM/DKM_2,
$soc_DKM/DKM_3,
]
count_cell = len(node_cell_ind)
_draw_control_panel_prd(Constants.CURRENT_MODE)
func _status_cell(status):
var status_board: int = status.decode_u8(Constants.DataIndices.STATUS_BOARD)
var dry_contact: int = status.decode_u8(Constants.DataIndices.DRY_CONTACT)
# status_board
for i in range(1, 5):
if ((status_board >> (i-1)) & 0x1) == 1:
node_cell_ind[i].state = Constants.STATE_VAL.GOOD
logger.info("%s : Есть связь ✅" % node_cell_ind[i].get('fname'))
else:
node_cell_ind[i].state = Constants.STATE_VAL.ERROR
logger.error("%s : Нет связи ❌" % node_cell_ind[i].get('fname'))
#dry_contact
if (node_cell_ind[2].state == Constants.STATE_VAL.GOOD):
for i_node in range(5, 13):
var skip = false
if i_node == 10 or i_node == 11:
skip = Constants.CURRENT_MODE != Constants.MODE.PRD_K
if not skip:
if ((dry_contact >> (i_node-5)) & 0x1) == 0:
node_cell_ind[i_node].state = Constants.STATE_VAL.GOOD
logger.info("%s : Есть связь ✅" % node_cell_ind[i_node].get('fname'))
else:
node_cell_ind[i_node].state = Constants.STATE_VAL.ERROR
logger.error("%s : Нет связи ❌" % node_cell_ind[i_node].get('fname'))
else:
for i_node_unknow in range(5, 13):
node_cell_ind[i_node_unknow].state = Constants.STATE_VAL.NONE
func _on_yau_received(status_yau):
if flag_control_on:
var arr_power_ukp_1: Array = []
for i in range(6): ## Мощность от УКП_1
var power_ukp_1 = status_yau.decode_u16(Constants.DataIndices.POWER_UKP_1 + 2 * i)
arr_power_ukp_1.append(power_ukp_1)
if count_packet == 0:
array_pow = arr_power_ukp_1
else:
for i in range(6):
if arr_power_ukp_1[i] > array_pow[i]:
array_pow[i] = arr_power_ukp_1[i]
count_packet +=1
#print(Network.unit.isa_ports)
func _status_prd():
var status: int = 0
for i in range(10):
status += 1 if (node_cell_ind[i].state == Constants.STATE_VAL.GOOD) else 0
for i in range(12, count_cell-2):
status += 1 if (node_cell_ind[i].state == Constants.STATE_VAL.GOOD) else 0
if (Constants.CURRENT_MODE == Constants.MODE.PRD_K):
status += 1 if (node_cell_ind[10].state == Constants.STATE_VAL.GOOD) else 0
status += 1 if (node_cell_ind[11].state == Constants.STATE_VAL.GOOD) else 0
status += 1 if (node_cell_ind[12].state == Constants.STATE_VAL.GOOD) else 0
status += 1 if (node_cell_ind[17].state == Constants.STATE_VAL.GOOD) else 0
status += 1 if (node_cell_ind[18].state == Constants.STATE_VAL.GOOD) else 0
if (status == count_cell-3):
$lbl_control.text = 'Прибор исправен'
$lbl_control.modulate = Color.AQUAMARINE
else:
$lbl_control.text = 'Прибор неисправен'
$lbl_control.modulate = Color.CRIMSON
func _draw_control_panel_prd(pribor):
if pribor == Constants.MODE.PRD_H:
# Кассета У5
$soc_y5/IP5_25.rname = 'А24'
$soc_y5/yau_07b.rname = 'А30'
$soc_y5/ems_g.rname = 'А26'
$soc_y5/ug.rname = 'А27'
$soc_y5/ukp_1.rname = 'А28'
$soc_y5/ukp_2.rname = 'А29'
# Кассета ФС
$Kasseta_FS/Kasseta.text = 'Кассета ФС-НД'
$Kasseta_FS/Block_FS_PRD_K.visible = false
$Kasseta_FS/FS_PRD_K.visible = false
$Kasseta_FS/ref_A1.rname = 'А1'
$Kasseta_FS/ref_A1.fname = 'Модуль ФС'
$Kasseta_FS/ref_A3.rname = 'А3'
$Kasseta_FS/ref_A3.fname = 'БЛОК ФС-2'
$Kasseta_FS/ref_A2.rname = 'А2'
$Kasseta_FS/ref_A2.fname = 'Модуль ФС'
$Kasseta_FS/ref_A4.rname = 'А4'
$Kasseta_FS/ref_A4.fname = 'БЛОК ФС-3'
# Кассета П-1
$soc_P1/IP12_50.rname = 'А21'
$soc_P1/IP9_50_1.rname = 'А20'
$soc_P1/IP9_50_2.rname = 'А19'
$soc_P1/MAA_1.rname = 'А22'
$soc_P1/MAA_2.rname = 'А23'
# Кассета П-2
$soc_P2.visible = false
# ДКМ
$soc_DKM/DKM_1.visible = false
$soc_DKM/DKM_2.fname = 'ДКМ-2'
$soc_DKM/DKM_3.fname = 'ДКМ-3'
elif pribor == Constants.MODE.PRD_B:
# Кассета У5
$soc_y5/IP5_25.rname = 'А24'
$soc_y5/yau_07b.rname = 'А30'
$soc_y5/ems_g.rname = 'А26'
$soc_y5/ug.rname = 'А27'
$soc_y5/ukp_1.rname = 'А28'
$soc_y5/ukp_2.rname = 'А29'
# Кассета ФС
$Kasseta_FS/Kasseta.text = 'Кассета ФС-ВД'
$Kasseta_FS/Block_FS_PRD_K.visible = false
$Kasseta_FS/FS_PRD_K.visible = false
$Kasseta_FS/ref_A1.rname = 'А1'
$Kasseta_FS/ref_A1.fname = 'Модуль ФС'
$Kasseta_FS/ref_A3.rname = 'А3'
$Kasseta_FS/ref_A3.fname = 'БЛОК ФС-4'
$Kasseta_FS/ref_A2.rname = 'А2'
$Kasseta_FS/ref_A2.fname = 'Модуль ФС'
$Kasseta_FS/ref_A4.rname = 'А4'
$Kasseta_FS/ref_A4.fname = 'БЛОК ФС-5'
# Кассета П-1
$soc_P1/IP12_50.rname = 'А21'
$soc_P1/IP9_50_1.rname = 'А20'
$soc_P1/IP9_50_2.rname = 'А19'
$soc_P1/MAA_1.rname = 'А22'
$soc_P1/MAA_2.rname = 'А23'
# Кассета П-2
$soc_P2.visible = false
# ДКМ
$soc_DKM/DKM_1.visible = false
$soc_DKM/DKM_2.fname = 'ДКМ-4'
$soc_DKM/DKM_3.fname = 'ДКМ-5'
elif pribor == Constants.MODE.PRD_K:
# Кассета У5
$soc_y5/IP5_25.rname = 'А31'
$soc_y5/yau_07b.rname = 'А37'
$soc_y5/ems_g.rname = 'А33'
$soc_y5/ug.rname = 'А34'
$soc_y5/ukp_1.rname = 'А35'
$soc_y5/ukp_2.rname = 'А36'
# Кассета ФС
$Kasseta_FS/Kasseta.text = 'Кассета ФС-КД'
$Kasseta_FS/Block_FS_PRD_K.visible = true
$Kasseta_FS/FS_PRD_K.visible = true
$Kasseta_FS/ref_A1.rname = 'А3'
$Kasseta_FS/ref_A1.fname = 'Модуль ФС'
$Kasseta_FS/ref_A3.rname = 'А6'
$Kasseta_FS/ref_A3.fname = 'БЛОК ФС-6'
$Kasseta_FS/ref_A2.rname = 'А2'
$Kasseta_FS/ref_A2.fname = 'Модуль ФС'
$Kasseta_FS/ref_A4.rname = 'А5'
$Kasseta_FS/ref_A4.fname = 'БЛОК ФС-7'
# Кассета П-1
$soc_P1/IP12_50.rname = 'А23'
$soc_P1/IP12_50.fname = 'ИП9-50'
$soc_P1/IP9_50_1.rname = 'А24'
$soc_P1/IP9_50_1.fname = 'ИП9-50'
$soc_P1/IP9_50_2.rname = 'А26'
$soc_P1/IP9_50_2.fname = 'ИП12-50'
$soc_P1/MAA_1.rname = 'А27'
$soc_P1/MAA_2.rname = 'А28'
# Кассета П-2
$soc_P2.visible = true
# ДКМ
$soc_DKM/DKM_1.visible = true
$soc_DKM/DKM_2.fname = 'ДКМ-6'
$soc_DKM/DKM_3.fname = 'ДКМ-7'
func _on_fs_status_1(_name_port, status_fs_1: int):
$Kasseta_FS/ref_A1.state = status_fs_1
#if logger:
#var message: String = "Модуль ФС-1: %s" % name_port
#logger.info(message)
func _on_fs_status_2(_name_port, status_fs_2):
$Kasseta_FS/ref_A2.state = status_fs_2
#if logger:
#var message: String = "Модуль ФС-2: %s" % name_port
#logger.info(message)
func fs_1_setup(freq):
await get_tree().create_timer(0.4).timeout
Network.set_fs_gen_status(true) ## отключен на false
await get_tree().create_timer(0.4).timeout
Network.get_gen_state_1()
Network.status_can_macro_1(false)
Network.set_fs_ferq_carrier(freq * 1_000_000)
Network.set_fs_attenuation(float(19))
Network.set_can_macro(freq)
Network.status_can_macro_1(true)
await get_tree().create_timer(0.4).timeout
Network.set_fs_gen_status(false)
await get_tree().create_timer(0.4).timeout
Network.get_gen_state_1()
func fs_2_setup(freq):
await get_tree().create_timer(1.8).timeout
Network.set_fs_gen_status_2(true)
await get_tree().create_timer(0.8).timeout
Network.get_gen_state_2()
Network.status_can_macro_2(false)
Network.set_fs_ferq_carrier_2(freq * 1_000_000)
Network.set_fs_attenuation_2(float(19))
Network.set_can_macro_2(freq)
Network.status_can_macro_2(true)
await get_tree().create_timer(0.8).timeout
Network.set_fs_gen_status_2(false) ## отключен = false
await get_tree().create_timer(0.8).timeout
Network.get_gen_state_2()
func yau_07b_setup():
Network.write_port_isa(Constants.BASE_PORTS.UG+6, 56)
Network.write_port_isa(Constants.BASE_PORTS.UG+8, 56)
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, Constants.META.MODUL_UM_2)
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, 2<<13)
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, Constants.META.MODUL_UM_3)
Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, 2<<13)
func _on_data_fs(fs_data:PackedByteArray, fs_name: String):
if logger:
var GRP = fs_data.decode_u8(0x0)
var CMD = fs_data.decode_u8(0x1)
match CMD:
Constants.CMD.READ_CARRIER:
if GRP == Constants.GROUP.BASE:
logger.info('В модуль %s установлена частота: %s МГц ✅' % [fs_name, (fs_data.decode_u64(0xC) / 1_000_000.0)])
Constants.CMD.READ_ATT:
if GRP == Constants.GROUP.RF:
logger.info('В модуль %s установлена аттенюация: %s dB ✅' % [fs_name, (fs_data.decode_float(0x18))])
Constants.CMD.READ_GEN_STATUS:
if GRP == Constants.GROUP.GENERATOR:
if fs_data.decode_u32(0xC) == 0:
logger.info('Состояние генератора %s: Включен ✅' % fs_name)
else:
if fs_name == 'ФС-1':
flag_fs_1_ready = false
if fs_name == 'ФС-2':
flag_fs_2_ready = false
logger.info('Состояние генератора %s: Отключен ❌' % fs_name)
Constants.CMD.BASE_CAN_MACRO_READ:
if GRP == Constants.GROUP.BASE:
logger.info('В модуль %s установлена частота CAN: %s МГц ✅' % [fs_name, (fs_data.decode_u16(0x20))])
func _on_start_super_control():
logger = Logger.new(get_node('log_array'))
for i in count_cell:
node_cell_ind[i].state = Constants.STATE_VAL.NONE
#timer.start(5)
if (past_pribor != Constants.CURRENT_MODE):
_draw_control_panel_prd(Constants.CURRENT_MODE)
if (Network.unit.online):
$soc_y5/yau_07b.state = Constants.STATE_VAL.GOOD
logger.info("ЯУ-07Б: Есть связь ✅")
yau_07b_setup()
_status_cell(Network.unit.status)
else:
for i in range(1, count_cell):
node_cell_ind[i].state = Constants.STATE_VAL.NONE
$soc_y5/yau_07b.state = Constants.STATE_VAL.ERROR
logger.error("ЯУ-07Б: Нет связи ❌")
if Network.unit_fs.online:
var fs_freq: Array = [0, 0, 0]
if Constants.CURRENT_MODE == Constants.MODE.PRD_H:
fs_freq[0] = Constants.FS_FREQ.f2
fs_freq[1] = Constants.FS_FREQ.f3
elif Constants.CURRENT_MODE == Constants.MODE.PRD_B:
fs_freq[0] = Constants.FS_FREQ.f4
fs_freq[1] = Constants.FS_FREQ.f5
logger.info('Настройка модулей ФС %s Гц' % str(fs_freq))
fs_1_setup(fs_freq[0]) # Гц
fs_2_setup(fs_freq[1]) # Гц
else:
logger.info('Настройка модулей ФС ❌')
func _on_timer():
if (Network.unit.online):
logger = Logger.new(get_node('log_array'))
logger.info("ЯУ-07Б: Есть связь ✅ ")
$soc_y5/yau_07b.state = Constants.STATE_VAL.GOOD
_status_cell(Network.unit.status)
else:
for i in range(1, count_cell):
node_cell_ind[i].state = Constants.STATE_VAL.NONE
$soc_y5/yau_07b.state = Constants.STATE_VAL.ERROR
logger.error("ЯУ-07Б: Нет связи ❌")
if (Network.unit_fs.online):
logger.info('Настройка модулей ФС Гц')
fs_1_setup(Constants.FS_FREQ.f2) # Гц
fs_2_setup(Constants.FS_FREQ.f3) # Гц
else:
logger.error('Настройка модулей ФС ❌')
func _on_start_timer_03():
timer_03.wait_time = 0.3
timer_03.one_shot = true
array_pow = []
flag_control_on = true
count_packet = 0
logger.info('Включение Модуляции УМ на высокое')
#Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, Constants.META.MODUL_UM_2)
#Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, 1<<13)
timer_03.start()
func _on_timer_03():
#Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, Constants.META.MODUL_UM_2)
#Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, 0<<13)
logger.info('Отключение Модуляции УМ')
flag_control_on = false
logger.info('Количество принятых пакетов от ЯУ-07Б: %s пакета' % count_packet)
logger.info('Максимальные значения по мощности от УКП-1: %s ' % str(array_pow))
_status_prd()
func _on_fs_status(META:int):
if logger:
if META == Constants.META.CI_2_OT_FS or META == Constants.META.CI_4_OT_FS:
flag_fs_1_ready = true
elif META == Constants.META.CI_3_OT_FS or META == Constants.META.CI_5_OT_FS:
flag_fs_2_ready = true
if flag_fs_1_ready and flag_fs_2_ready:
#dkm
var dkm: int = Network.unit.status.decode_u8(Constants.DataIndices.DKM)
$DKM.text = str(dkm)
if Constants.CURRENT_MODE == Constants.MODE.PRD_H:
$soc_DKM/DKM_2.state = (dkm >> 1) & 0x1
$soc_DKM/DKM_3.state = (dkm >> 2) & 0x1
$Kasseta_FS/ref_A3.state = $soc_DKM/DKM_2.state
$Kasseta_FS/ref_A4.state = $soc_DKM/DKM_3.state
if (dkm >> 1) & 0x1 == 1:
logger.info('%s: %s' % [$Kasseta_FS/ref_A3.fname, 'Включено'])
else:
logger.info('%s: %s' % [$Kasseta_FS/ref_A3.fname, 'Нет связи'])
if (dkm >> 2) & 0x1 == 1:
logger.info('%s: %s' % [$Kasseta_FS/ref_A4.fname, 'Включено'])
else:
logger.info('%s: %s' % [$Kasseta_FS/ref_A4.fname, 'Нет связи'])
elif Constants.CURRENT_MODE == Constants.MODE.PRD_B:
$soc_DKM/DKM_2.state = (dkm >> 3) & 0x1
$soc_DKM/DKM_3.state = (dkm >> 4) & 0x1
$Kasseta_FS/ref_A3.state = $soc_DKM/DKM_2.state
$Kasseta_FS/ref_A4.state = $soc_DKM/DKM_3.state
if (dkm >> 3) & 0x1 == 1:
logger.info('%s: %s' % [$Kasseta_FS/ref_A3.fname, 'Включено'])
else:
logger.info('%s: %s' % [$Kasseta_FS/ref_A3.fname, 'Нет связи'])
if (dkm >> 4) & 0x1 == 1:
logger.info('%s: %s' % [$Kasseta_FS/ref_A4.fname, 'Включено'])
else:
logger.info('%s: %s' % [$Kasseta_FS/ref_A4.fname, 'Нет связи'])
elif Constants.CURRENT_MODE == Constants.MODE.PRD_K:
$soc_DKM/DKM_1.state = (dkm >> 0) & 0x1
$soc_DKM/DKM_2.state = (dkm >> 5) & 0x1
$soc_DKM/DKM_3.state = (dkm >> 6) & 0x1
$Kasseta_FS/Block_FS_PRD_K.state = $soc_DKM/DKM_1.state
$Kasseta_FS/ref_A3.state = $soc_DKM/DKM_2.state
$Kasseta_FS/ref_A4.state = $soc_DKM/DKM_3.state
emit_signal('signal_on_start_timer_03')