Доработка машины сосотояний и результатов контроля
This commit is contained in:
@@ -16,25 +16,26 @@ const PROGRESS_COMPLETE: float = 100.0
|
||||
## Константы для работы с лучами управления
|
||||
const RAY_MASK = 0x07
|
||||
const SPECIAL_LITERAS = [3, 5, 7]
|
||||
const RAY_m5: String = "RAY_m5"
|
||||
const RAY_5: String = "RAY_5"
|
||||
const RAY_15: String = "RAY_15"
|
||||
const RAY_25: String = "RAY_25"
|
||||
const RAY_35: String = "RAY_35"
|
||||
const RAY_45: String = "RAY_45"
|
||||
const RAY_m5: String = 'RAY_m5'
|
||||
const RAY_5: String = 'RAY_5'
|
||||
const RAY_15: String = 'RAY_15'
|
||||
const RAY_25: String = 'RAY_25'
|
||||
const RAY_35: String = 'RAY_35'
|
||||
const RAY_45: String = 'RAY_45'
|
||||
|
||||
## Конфигурация лучей: состояния, названия, задержки и требования
|
||||
const RAY_CONFIG = {
|
||||
0: { "state": "UG_SET_RAY_0", "name": "-5°", "delay": 0.5, "requires_si_fs": true },
|
||||
1: { "state": "UG_SET_RAY_1", "name": "5°", "delay": 0.0, "requires_si_fs": false },
|
||||
2: { "state": "UG_SET_RAY_2", "name": "15°", "delay": 0.0, "requires_si_fs": false },
|
||||
3: { "state": "UG_SET_RAY_3", "name": "25°", "delay": 0.0, "requires_si_fs": false },
|
||||
4: { "state": "UG_SET_RAY_4", "name": "35°", "delay": 0.0, "requires_si_fs": false },
|
||||
5: { "state": "UG_SET_RAY_5", "name": "45°", "delay": 0.0, "requires_si_fs": false },
|
||||
6: { "state": "UG_SET_RAY_0", "name": "сброс", "delay": 0.0, "requires_si_fs": false } # Особый случай
|
||||
0: { 'state': 'UG_SET_RAY_0', 'name': '-5°', 'requires_si_fs': true },
|
||||
1: { 'state': 'UG_SET_RAY_1', 'name': '5°', 'requires_si_fs': false },
|
||||
2: { 'state': 'UG_SET_RAY_2', 'name': '15°', 'requires_si_fs': false },
|
||||
3: { 'state': 'UG_SET_RAY_3', 'name': '25°', 'requires_si_fs': false },
|
||||
4: { 'state': 'UG_SET_RAY_4', 'name': '35°', 'requires_si_fs': false },
|
||||
5: { 'state': 'UG_SET_RAY_5', 'name': '45°', 'requires_si_fs': false },
|
||||
6: { 'state': 'UG_SET_RAY_0', 'name': 'Контроль', 'requires_si_fs': false } # ДКМ
|
||||
}
|
||||
|
||||
const RAY_TYPES := [RAY_m5, RAY_5, RAY_15, RAY_25, RAY_35, RAY_45]
|
||||
const DATA_EXIT_CONTOL_ISA: int = 0
|
||||
|
||||
## Перечисление состояний машины контроля ПРД
|
||||
enum STATE_MACHINE {
|
||||
@@ -44,6 +45,7 @@ enum STATE_MACHINE {
|
||||
WRITE_ISA,
|
||||
READ_ISA,
|
||||
CHEK_KASSETA_Y5,
|
||||
CHEK_BLOCK_IP,
|
||||
UG_SET_RAY,
|
||||
UG_SET_RAY_0,
|
||||
UG_SET_RAY_1,
|
||||
@@ -83,6 +85,7 @@ var _data_indices: Dictionary
|
||||
var _fs_keys: Dictionary
|
||||
var _temperature_constants: Dictionary
|
||||
var _ems_input_bits_config: Dictionary
|
||||
var _default_states: Dictionary = {} ## Сохраняет состояния по умолчанию для сброса
|
||||
var _fs_rules: Array
|
||||
|
||||
## Основные переменные класса
|
||||
@@ -111,6 +114,7 @@ var flag_in_control: bool = false
|
||||
var flag_control_is_over: bool = false
|
||||
var flag_no_trust_yau07: bool = false
|
||||
var flag_only_fs: bool = false
|
||||
var flag_temperature_ok: bool = true
|
||||
|
||||
## Таймеры контроля
|
||||
var control_timer: Timer = Timer.new()
|
||||
@@ -125,13 +129,13 @@ var cmd_array: Array
|
||||
var total_fs_to_check: int = 0
|
||||
var completed_fs_count: int = 0
|
||||
var current_fs_progress: float = 0.0
|
||||
var current_status: String = "Ожидание запуска контроля"
|
||||
var current_status: String = 'Ожидание запуска контроля'
|
||||
|
||||
## Сигналы класса
|
||||
signal control_is_over() # Когда контроль завершен
|
||||
signal control_is_over(device_name: String) # Когда контроль завершен
|
||||
signal status_updated(status_text: String) # Сигнал для обновления статуса
|
||||
signal update_progress(progress_value: float)
|
||||
signal update_max_value_progress(max_progress_value: int)
|
||||
signal update_progress(progress_value: float) # Обновление статуса выполнения контроля
|
||||
signal update_max_value_progress(max_progress_value: int) # Установка максимального значения для прогресс бара
|
||||
|
||||
## Свойство прогресса с автоматическим emit сигнала
|
||||
var progress_value: float:
|
||||
@@ -148,15 +152,63 @@ func _init(init_data: Dictionary, cmd_array_from_prd: Array) -> void:
|
||||
unit_prd = init_data['unit_prd']
|
||||
cmd_array = cmd_array_from_prd
|
||||
config_manager = PRDConfigManager.new()
|
||||
_initialize_config_from_manager()
|
||||
_initialize_ray_mapping()
|
||||
_initialize_power_structure()
|
||||
_initialize_config_from_manager() # Инициализация конфигурации из менеджера
|
||||
_initialize_ray_mapping() # Инициализация маппинга состояний лучей
|
||||
_initialize_power_structure() # Инициализация структуры данных для хранения мощностей
|
||||
|
||||
|
||||
## Инициализация состояний по умолчанию
|
||||
func _initialize_default_states() -> void:
|
||||
_default_states = {
|
||||
# Флаги состояния системы
|
||||
'flag_write_isa': flag_write_isa,
|
||||
'flag_fs_status_ok': flag_fs_status_ok,
|
||||
'flag_si_fs_input': flag_si_fs_input,
|
||||
'flag_si_fs_output': flag_si_fs_output,
|
||||
'flag_control_is_over': flag_control_is_over,
|
||||
'flag_no_trust_yau07': flag_no_trust_yau07,
|
||||
'flag_only_fs': flag_only_fs,
|
||||
|
||||
# Состояние машины и литеры
|
||||
'state': state,
|
||||
'current_litera': current_litera,
|
||||
|
||||
# Переменные прогресса
|
||||
'progress_value': progress_value,
|
||||
'current_status': current_status,
|
||||
'total_fs_to_check': total_fs_to_check,
|
||||
'completed_fs_count': completed_fs_count,
|
||||
'current_fs_progress': current_fs_progress,
|
||||
|
||||
# Счетчики
|
||||
'cc': cc,
|
||||
|
||||
# Сокеты ЭМС-Г
|
||||
'ems_g_sock_dic': ems_g_sock_dic.duplicate(true),
|
||||
|
||||
# Структуры данных (глубокое копирование)
|
||||
'power_for_litera': _deep_copy_power_structure(),
|
||||
'control_results': control_results.duplicate(true),
|
||||
'power_result': power_result.duplicate(true),
|
||||
'temperature_um': temperature_um.duplicate(true),
|
||||
'ecms': ecms.duplicate(true),
|
||||
|
||||
# Конфигурации блоков
|
||||
'block_ip_config': block_ip_config.duplicate(true),
|
||||
'block_kasseta_y5_config': block_kasseta_y5_config.duplicate(true),
|
||||
|
||||
# Конфигурация устройства
|
||||
'self_name': self_name,
|
||||
'constants': constants.duplicate(true),
|
||||
'pribor_config': pribor_config.duplicate(true),
|
||||
'fs_parameters': fs_parameters.duplicate(true)
|
||||
}
|
||||
|
||||
|
||||
## Инициализация конфигурации из менеджера
|
||||
func _initialize_config_from_manager() -> void:
|
||||
if not config_manager.is_loaded():
|
||||
push_error("ConfigManager не загружен!")
|
||||
push_error('ConfigManager не загружен!')
|
||||
return
|
||||
|
||||
_device_constants = config_manager.get_device_constants()
|
||||
@@ -180,21 +232,22 @@ func _initialize_power_structure() -> void:
|
||||
|
||||
## Инициализация при готовности узла
|
||||
func _ready() -> void:
|
||||
_determine_self_name()
|
||||
initialize_connections()
|
||||
setup_timer()
|
||||
_initialize_ray_state_enums()
|
||||
_determine_self_name() # Определение имени и конфигурации устройства
|
||||
_initialize_default_states() # Инициализация состояний по умолчанию
|
||||
initialize_connections() # Инициализация соединений и сигналов
|
||||
setup_timer() # Настройка таймеров контроля
|
||||
_initialize_ray_state_enums() # Инициализация перечислений значений для состояний лучей
|
||||
|
||||
|
||||
## Инициализация маппинга состояний лучей
|
||||
func _initialize_ray_mapping() -> void:
|
||||
_ray_state_mapping = {
|
||||
STATE_MACHINE.UG_SET_RAY_0: "RAY_m5",
|
||||
STATE_MACHINE.UG_SET_RAY_1: "RAY_5",
|
||||
STATE_MACHINE.UG_SET_RAY_2: "RAY_15",
|
||||
STATE_MACHINE.UG_SET_RAY_3: "RAY_25",
|
||||
STATE_MACHINE.UG_SET_RAY_4: "RAY_35",
|
||||
STATE_MACHINE.UG_SET_RAY_5: "RAY_45",
|
||||
STATE_MACHINE.UG_SET_RAY_0: 'RAY_m5',
|
||||
STATE_MACHINE.UG_SET_RAY_1: 'RAY_5',
|
||||
STATE_MACHINE.UG_SET_RAY_2: 'RAY_15',
|
||||
STATE_MACHINE.UG_SET_RAY_3: 'RAY_25',
|
||||
STATE_MACHINE.UG_SET_RAY_4: 'RAY_35',
|
||||
STATE_MACHINE.UG_SET_RAY_5: 'RAY_45',
|
||||
}
|
||||
|
||||
|
||||
@@ -211,6 +264,7 @@ func _initialize_ray_state_enums() -> void:
|
||||
func _process(_delta: float) -> void:
|
||||
pass
|
||||
|
||||
var count_packets_power: int = 0
|
||||
|
||||
## Обработка данных от ЯУ-07
|
||||
func on_data_received(unit_pribor: Object) -> void:
|
||||
@@ -226,7 +280,8 @@ func on_data_received(unit_pribor: Object) -> void:
|
||||
socket_status_ems_g(status)
|
||||
block_ip_config = check_block_ip(status, block_ip_config)
|
||||
temperature_um = check_temperature_um(status)
|
||||
|
||||
flag_temperature_ok = check_overheating(temperature_um)
|
||||
|
||||
if machine_timer.is_stopped():
|
||||
return
|
||||
|
||||
@@ -239,11 +294,12 @@ func on_data_received(unit_pribor: Object) -> void:
|
||||
if interes != '':
|
||||
tek_litera[_get_ray_key(state)] = power_um_ukp(status, current_litera, tek_litera[_get_ray_key(state)])
|
||||
power_for_litera[current_litera] = tek_litera
|
||||
count_packets_power += 1
|
||||
|
||||
|
||||
## Получение ключа луча по состоянию машины
|
||||
func _get_ray_key(machine_state: int) -> String:
|
||||
return _ray_state_mapping.get(machine_state, "")
|
||||
return _ray_state_mapping.get(machine_state, '')
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -293,10 +349,11 @@ func state_control_machine() -> void:
|
||||
STATE_MACHINE.INIT: _handle_init_state()
|
||||
STATE_MACHINE.FS_TURN_ON: _handle_fs_turn_on_state()
|
||||
STATE_MACHINE.FS_WORK: _handle_fs_work_state()
|
||||
STATE_MACHINE.CHEK_KASSETA_Y5: _handle_check_kasseta_state()
|
||||
STATE_MACHINE.CHEK_KASSETA_Y5: _handle_check_kasseta_state() # Проверка Кассеты У5
|
||||
STATE_MACHINE.CHEK_BLOCK_IP: _handle_check_block_ip_state() # Проверка ИП
|
||||
STATE_MACHINE.WRITE_ISA: _handle_write_isa_state()
|
||||
STATE_MACHINE.READ_ISA: _handle_read_isa_state()
|
||||
STATE_MACHINE.UG_SET_RAY: _handle_ray_operation() # Режим чтения
|
||||
STATE_MACHINE.UG_SET_RAY: _handle_ray_operation() # Режим чтения
|
||||
STATE_MACHINE.UG_SET_RAY_0: _handle_ray_operation(0)
|
||||
STATE_MACHINE.UG_SET_RAY_1: _handle_ray_operation(1)
|
||||
STATE_MACHINE.UG_SET_RAY_2: _handle_ray_operation(2)
|
||||
@@ -313,7 +370,7 @@ func state_control_machine() -> void:
|
||||
## Обработка состояния INIT - инициализация ФС
|
||||
func _handle_init_state() -> void:
|
||||
if current_litera in [1, 2, 3, 4, 5, 6, 7]:
|
||||
_set_status("Инициализация ФС-%s" % current_litera)
|
||||
_set_status('Инициализация ФС-%s' % current_litera)
|
||||
var flag_ecm: bool = false
|
||||
|
||||
# Проверка доступности ЭМС для текущей литеры
|
||||
@@ -338,13 +395,13 @@ func _handle_init_state() -> void:
|
||||
if not device:
|
||||
result = false
|
||||
|
||||
_set_status("Прибор ПРД-%s: %s" % [self_name, ['неисправен', 'исправен'][int(result)]])
|
||||
emit_signal('control_is_over')
|
||||
_set_status('Прибор ПРД-%s: %s' % [self_name, ['неисправен', 'исправен'][int(result)]])
|
||||
emit_signal('control_is_over', self_name)
|
||||
|
||||
|
||||
## Обработка состояния FS_TURN_ON - включение ФС
|
||||
func _handle_fs_turn_on_state() -> void:
|
||||
_set_status("Включение ФС-%s" % current_litera)
|
||||
_set_status('Включение ФС-%s' % current_litera)
|
||||
manage_fs(true, self_name, pribor_config, fs_parameters, current_litera, constants.POWER_UM)
|
||||
control_timer.wait_time = constants.TIMER_DELAY
|
||||
control_timer.start()
|
||||
@@ -354,20 +411,17 @@ func _handle_fs_turn_on_state() -> void:
|
||||
## Обработка состояния FS_WORK - проверка работы ФС
|
||||
func _handle_fs_work_state() -> void:
|
||||
var flag_ecm: bool = false
|
||||
|
||||
# Проверка соответствия ЭМС
|
||||
_set_status('Проверка связи сервиса КАПС РПБ')
|
||||
for key in ecms:
|
||||
var params = ecms[key].params.freq
|
||||
if fs_parameters[current_litera].freq == params:
|
||||
var kni = ecms[key].kni
|
||||
if pribor_config[self_name].angle == kni:
|
||||
flag_ecm = true
|
||||
|
||||
|
||||
# Если ЭМС доступна и ФС в порядке - запускаем таймер ЭМС
|
||||
if flag_ecm and flag_fs_status_ok:
|
||||
ems_6666_timer.start()
|
||||
_set_status("Проверка ФС-%s" % current_litera)
|
||||
|
||||
_set_status('Проверка ФС-%s' % current_litera)
|
||||
# Проверка завершения работы ФС
|
||||
if (current_litera == 2 and control_results.fs_2) or \
|
||||
(current_litera == 3 and control_results.fs_3) or \
|
||||
@@ -381,12 +435,34 @@ func _handle_fs_work_state() -> void:
|
||||
|
||||
## Обработка состояния CHECK_KASSETA - проверка кассеты Y5
|
||||
func _handle_check_kasseta_state() -> void:
|
||||
if block_kasseta_y5_config['yau07']:
|
||||
state = STATE_MACHINE.WRITE_ISA
|
||||
_set_status('Проверка кассеты У5')
|
||||
var block_kasseta_y5 = true
|
||||
for case in block_kasseta_y5_config:
|
||||
if not block_kasseta_y5_config[case]:
|
||||
block_kasseta_y5 = false
|
||||
if block_kasseta_y5:
|
||||
if flag_temperature_ok:
|
||||
ems_6666_timer.start()
|
||||
state = STATE_MACHINE.CHEK_BLOCK_IP
|
||||
else:
|
||||
_set_status('Перегрев УМ')
|
||||
state = STATE_MACHINE.IN_EMS_STOP
|
||||
elif flag_only_fs:
|
||||
state = STATE_MACHINE.IN_EMS_STOP
|
||||
|
||||
|
||||
## Обработка состояния CHECK_BLOCK_IP - проверка кассеты Y5
|
||||
func _handle_check_block_ip_state() -> void:
|
||||
_set_status('Проверка источников питания')
|
||||
var block_ip = true
|
||||
for ip in block_ip_config:
|
||||
if not block_ip_config[ip][1]:
|
||||
block_ip = false
|
||||
if block_ip:
|
||||
state = STATE_MACHINE.WRITE_ISA
|
||||
elif flag_only_fs:
|
||||
state = STATE_MACHINE.IN_EMS_STOP
|
||||
|
||||
## Обработка состояния WRITE_ISA - запись в УГ
|
||||
func _handle_write_isa_state() -> void:
|
||||
if not flag_write_isa:
|
||||
@@ -410,8 +486,7 @@ func _handle_ems_stop_state() -> void:
|
||||
|
||||
## Обработка состояния FS_TURN_OFF - выключение ФС
|
||||
func _handle_fs_turn_off_state() -> void:
|
||||
ems_6666_timer.stop()
|
||||
_set_status("Отключение ФС-%s" % current_litera)
|
||||
_set_status('Отключение ФС-%s' % current_litera)
|
||||
flag_fs_status_ok = false
|
||||
manage_fs(false, self_name, pribor_config, fs_parameters, current_litera, constants.POWER_UM)
|
||||
state = STATE_MACHINE.STOP_CONTROL
|
||||
@@ -419,7 +494,7 @@ func _handle_fs_turn_off_state() -> void:
|
||||
|
||||
## Обработка состояния STOP_CONTROL - завершение контроля
|
||||
func _handle_stop_control_state() -> void:
|
||||
_set_status("Завершение контроля ФС-%s" % current_litera)
|
||||
_set_status('Завершение контроля ФС-%s' % current_litera)
|
||||
completed_fs_count += 1
|
||||
_advance_to_next_fs()
|
||||
state = STATE_MACHINE.INIT
|
||||
@@ -470,17 +545,15 @@ func _handle_ray_read_mode() -> void:
|
||||
func _handle_ray_write_mode(ray_num: int) -> void:
|
||||
if not _can_write_ray(ray_num):
|
||||
return
|
||||
|
||||
var ray_config = RAY_CONFIG[ray_num]
|
||||
|
||||
|
||||
# Особые условия для луча 0
|
||||
if ray_num == 0:
|
||||
control_timer.stop()
|
||||
|
||||
# Задержка если требуется
|
||||
if ray_config.delay > 0:
|
||||
await get_tree().create_timer(ray_config.delay).timeout
|
||||
|
||||
|
||||
# Ожидание пяти пакетов от ЯУ-07
|
||||
if count_packets_power < 5:
|
||||
return
|
||||
|
||||
# Установка луча
|
||||
_handle_ug_set_state(ray_num)
|
||||
flag_write_isa = true
|
||||
@@ -531,7 +604,7 @@ func _get_ug_address() -> int:
|
||||
#region UG_OPERATIONS
|
||||
## Подготовка к настройке и записи в УГ
|
||||
func _handle_ug_set_state(RAY_DOU_NUM: int) -> void:
|
||||
_set_status("Настройка угла %s" % _get_ray_name(RAY_DOU_NUM))
|
||||
_set_status('Настройка угла %s' % _get_ray_name(RAY_DOU_NUM))
|
||||
var dic_att := {
|
||||
'RAY_DOU_NUM': RAY_DOU_NUM,
|
||||
'ADDR_UG_LITERA_1': constants.ADDR_UG_LITERA_1,
|
||||
@@ -554,11 +627,12 @@ func _handle_ug_set_state(RAY_DOU_NUM: int) -> void:
|
||||
dic_att['ATT_UM_2'] = constants.ATT_UM_3
|
||||
|
||||
flag_write_isa = on_ug_setting(unit_prd, dic_att, cmd_array)
|
||||
count_packets_power = 0
|
||||
|
||||
|
||||
## Получение имени луча по номеру
|
||||
func _get_ray_name(ray_num: int) -> String:
|
||||
return RAY_CONFIG.get(ray_num, {}).get("name", "неизвестный угол")
|
||||
return RAY_CONFIG.get(ray_num, {}).get('name', 'неизвестный угол')
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -635,7 +709,7 @@ func setup_timer() -> void:
|
||||
add_child(control_timer)
|
||||
control_timer.timeout.connect(on_stop_control)
|
||||
control_timer.one_shot = true
|
||||
control_timer.wait_time = constants.get("TIMER_DELAY", 10.0)
|
||||
control_timer.wait_time = constants.get('TIMER_DELAY', 10.0)
|
||||
|
||||
# Таймер ЭМС-Г
|
||||
add_child(ems_6666_timer)
|
||||
@@ -675,7 +749,7 @@ func _determine_self_name() -> void:
|
||||
flag_no_trust_yau07 = false
|
||||
flag_only_fs = false
|
||||
cc = 0
|
||||
state = STATE_MACHINE.get("INIT", 0)
|
||||
state = STATE_MACHINE.get('INIT', 0)
|
||||
var current_unit = unit_prd.name
|
||||
var parts = current_unit.split('-')
|
||||
self_name = parts[-1]
|
||||
@@ -688,20 +762,20 @@ func _determine_self_name() -> void:
|
||||
var device_config = _device_constants.get(device_type, {})
|
||||
var device_data_config = _device_configs.get(device_type, {})
|
||||
|
||||
constants = device_config.get("constants", {})
|
||||
pribor_config = device_config.get("pribor_config", {})
|
||||
constants = device_config.get('constants', {})
|
||||
pribor_config = device_config.get('pribor_config', {})
|
||||
|
||||
# Конвертация fs_params ключей в int
|
||||
var raw_fs_params = device_config.get("fs_params", {})
|
||||
var raw_fs_params = device_config.get('fs_params', {})
|
||||
fs_parameters = {}
|
||||
for key in raw_fs_params:
|
||||
fs_parameters[int(key)] = raw_fs_params[key]
|
||||
|
||||
# Загрузка конфигураций блоков
|
||||
block_ip_config = _load_block_config(device_data_config.get("block_ip", {}), "block_ip")
|
||||
block_kasseta_y5_config = _load_block_config(device_data_config.get("block_kasseta", {}), "block_kasseta")
|
||||
control_results = device_data_config.get("control_results", {})
|
||||
current_litera = device_config.get("start_litera", 0)
|
||||
block_ip_config = _load_block_config(device_data_config.get('block_ip', {}), 'block_ip')
|
||||
block_kasseta_y5_config = _load_block_config(device_data_config.get('block_kasseta', {}), 'block_kasseta')
|
||||
control_results = device_data_config.get('control_results', {})
|
||||
current_litera = device_config.get('start_litera', 0)
|
||||
|
||||
# Определение общего количества ФС для контроля
|
||||
match self_name:
|
||||
@@ -720,7 +794,7 @@ func _determine_self_name() -> void:
|
||||
|
||||
## Загрузка конфигурации блока
|
||||
func _load_block_config(config, config_type: String) -> Dictionary:
|
||||
if config is String and config == "base":
|
||||
if config is String and config == 'base':
|
||||
return _base_configs.get(config_type, {}).duplicate(true)
|
||||
elif config is Dictionary:
|
||||
return config.duplicate(true)
|
||||
@@ -774,8 +848,8 @@ func on_interfer_resized(ecms_dic: Dictionary) -> void:
|
||||
|
||||
## Обработка запуска контроля устройства
|
||||
func _on_start_contol_device()-> void:
|
||||
_set_status("Подготовка к контролю")
|
||||
_determine_self_name()
|
||||
_set_status('Подготовка к контролю')
|
||||
restore_default_states()
|
||||
machine_timer.wait_time = constants.STATE_MASHINE_TIMER
|
||||
machine_timer.start()
|
||||
|
||||
@@ -783,8 +857,12 @@ func _on_start_contol_device()-> void:
|
||||
## Обработка изменения режима работы
|
||||
func on_mode_changed(in_tree: bool) -> void:
|
||||
flag_in_control = in_tree
|
||||
if not in_tree:
|
||||
_set_status("Ожидание запуска контроля")
|
||||
if not in_tree: ## При нажатии выхода из режима контроль
|
||||
_set_status('Ожидание запуска контроля')
|
||||
cmd_array.append([unit_prd.CmdCode.WRITE_ISA,[
|
||||
constants.ADDR_UG_LITERA_1, DATA_EXIT_CONTOL_ISA,
|
||||
constants.ADDR_UG_LITERA_2, DATA_EXIT_CONTOL_ISA,
|
||||
constants.ADDR_UG_LITERA_3, DATA_EXIT_CONTOL_ISA]])
|
||||
flag_control_is_over = false
|
||||
flag_no_trust_yau07 = false
|
||||
flag_only_fs = false
|
||||
@@ -792,8 +870,9 @@ func on_mode_changed(in_tree: bool) -> void:
|
||||
machine_timer.stop()
|
||||
state = STATE_MACHINE.INIT
|
||||
_handle_fs_turn_off_state()
|
||||
else:
|
||||
_set_status("Ожидание запуска контроля")
|
||||
restore_default_states()
|
||||
else: ## При нажатии на режим контроль
|
||||
_set_status('Ожидание запуска контроля')
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -976,6 +1055,24 @@ static func check_temperature_um(status_prd: PackedByteArray) -> Dictionary:
|
||||
return return_dic_temp
|
||||
|
||||
|
||||
static func check_overheating(temperature_data: Dictionary) -> bool:
|
||||
const MAX_TEMP: int = 55
|
||||
const MIN_VALID_TEMP: int = -1500
|
||||
const MAX_VALID_TEMP: int = 150
|
||||
|
||||
for key in temperature_data:
|
||||
var temp = temperature_data[key]
|
||||
|
||||
# Пропускаем невалидные значения
|
||||
if temp < MIN_VALID_TEMP or temp > MAX_VALID_TEMP:
|
||||
continue
|
||||
|
||||
# Проверяем превышение температуры
|
||||
if temp > MAX_TEMP:
|
||||
return false
|
||||
return true
|
||||
|
||||
|
||||
## Проверка ДКМ
|
||||
static func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> bool:
|
||||
var dkm: int = 28
|
||||
@@ -1089,7 +1186,7 @@ static func update_max_power_values(power_data: Array, max_power_values: Array)
|
||||
|
||||
## Подготовка принятых данных по контролю для передачи в сцену
|
||||
static func prep_power(power_dic: Dictionary, prd_name: String)-> Dictionary:
|
||||
const RAY_KEYS := ["RAY_m5", "RAY_5", "RAY_15", "RAY_25", "RAY_35", "RAY_45"]
|
||||
const RAY_KEYS := ['RAY_m5', 'RAY_5', 'RAY_15', 'RAY_25', 'RAY_35', 'RAY_45']
|
||||
var prep_pow_dic: Dictionary = {}
|
||||
|
||||
var arr_litera: Array[int]
|
||||
@@ -1143,7 +1240,6 @@ static func prep_power(power_dic: Dictionary, prd_name: String)-> Dictionary:
|
||||
|
||||
## Проверка результатов ДОУ
|
||||
static func check_dou_result(control_dic: Dictionary, power_dic: Dictionary, pribor: String, litera: int, cnst: Dictionary) -> Dictionary:
|
||||
var all_dou_ok = true
|
||||
var dou: String = 'dou_2' if litera == 2 else 'dou_3'
|
||||
if pribor == '1к' or pribor == '2к' or pribor == '3к' or pribor == '4к':
|
||||
dou = 'dou_6' if litera == 6 else 'dou_7'
|
||||
@@ -1151,7 +1247,8 @@ static func check_dou_result(control_dic: Dictionary, power_dic: Dictionary, pri
|
||||
dou = 'dou_4' if litera == 4 else 'dou_5'
|
||||
|
||||
var ray_dic: Dictionary = power_dic[litera]
|
||||
if ray_dic[RAY_m5].size() == 0 or \
|
||||
# Проверка наличия данных
|
||||
if ray_dic[RAY_m5].size() == 0 or \
|
||||
ray_dic[RAY_5 ].size() == 0 or \
|
||||
ray_dic[RAY_15].size() == 0 or \
|
||||
ray_dic[RAY_25].size() == 0 or \
|
||||
@@ -1159,12 +1256,109 @@ static func check_dou_result(control_dic: Dictionary, power_dic: Dictionary, pri
|
||||
ray_dic[RAY_45].size() == 0:
|
||||
control_dic[dou] = false
|
||||
return control_dic
|
||||
|
||||
for i_pow_arr in ray_dic.values():
|
||||
for i_pow in i_pow_arr.size():
|
||||
if i_pow_arr[i_pow] < cnst.POWER_THRESHOLD:
|
||||
all_dou_ok = false
|
||||
|
||||
control_dic[dou] = all_dou_ok
|
||||
|
||||
# Подсчет значений ниже порога по позициям
|
||||
var low_power_by_position: Array = [0, 0, 0, 0, 0, 0] # Счетчики для 6 позиций
|
||||
for ray_key in [RAY_m5, RAY_5, RAY_15, RAY_25, RAY_35, RAY_45]:
|
||||
var power_array: Array = ray_dic[ray_key]
|
||||
for i in range(power_array.size()):
|
||||
if power_array[i] < cnst.POWER_THRESHOLD:
|
||||
low_power_by_position[i] += 1
|
||||
|
||||
# Проверяем, нет ли позиции где много низких значений
|
||||
var limit_power_um: int = 2
|
||||
var good_positions: int = 0
|
||||
for count in low_power_by_position:
|
||||
if count <= limit_power_um:
|
||||
good_positions += 1
|
||||
control_dic[dou] = good_positions >= 4
|
||||
return control_dic
|
||||
#endregion
|
||||
|
||||
#region DEFAULT_STATES
|
||||
## Глубокое копирование структуры мощностей
|
||||
func _deep_copy_power_structure() -> Dictionary:
|
||||
var copy = {}
|
||||
for litera in power_for_litera:
|
||||
copy[litera] = {}
|
||||
for ray_type in power_for_litera[litera]:
|
||||
copy[litera][ray_type] = power_for_litera[litera][ray_type].duplicate()
|
||||
return copy
|
||||
|
||||
## Восстановление состояний по умолчанию
|
||||
func restore_default_states() -> void:
|
||||
if _default_states.is_empty():
|
||||
_initialize_default_states()
|
||||
|
||||
# Восстановление простых переменных
|
||||
flag_write_isa = _default_states['flag_write_isa']
|
||||
flag_fs_status_ok = _default_states['flag_fs_status_ok']
|
||||
flag_si_fs_input = _default_states['flag_si_fs_input']
|
||||
flag_si_fs_output = _default_states['flag_si_fs_output']
|
||||
flag_control_is_over = _default_states['flag_control_is_over']
|
||||
flag_no_trust_yau07 = _default_states['flag_no_trust_yau07']
|
||||
flag_only_fs = _default_states['flag_only_fs']
|
||||
|
||||
state = _default_states['state']
|
||||
current_litera = _default_states['current_litera']
|
||||
|
||||
progress_value = _default_states['progress_value']
|
||||
current_status = _default_states['current_status']
|
||||
total_fs_to_check = _default_states['total_fs_to_check']
|
||||
completed_fs_count = _default_states['completed_fs_count']
|
||||
current_fs_progress = _default_states['current_fs_progress']
|
||||
|
||||
cc = _default_states['cc']
|
||||
|
||||
# Восстановление словарей (глубокое копирование)
|
||||
ems_g_sock_dic = _default_states['ems_g_sock_dic'].duplicate(true)
|
||||
power_for_litera = _default_states['power_for_litera'].duplicate(true)
|
||||
control_results = _default_states['control_results'].duplicate(true)
|
||||
power_result = _default_states['power_result'].duplicate(true)
|
||||
temperature_um = _default_states['temperature_um'].duplicate(true)
|
||||
ecms = _default_states['ecms'].duplicate(true)
|
||||
block_ip_config = _default_states['block_ip_config'].duplicate(true)
|
||||
block_kasseta_y5_config = _default_states['block_kasseta_y5_config'].duplicate(true)
|
||||
|
||||
# Остановка таймеров
|
||||
control_timer.stop()
|
||||
ems_6666_timer.stop()
|
||||
machine_timer.stop()
|
||||
|
||||
_set_status('Состояния сброшены к значениям по умолчанию')
|
||||
|
||||
## Получение текущих состояний для отладки
|
||||
func get_current_states() -> Dictionary:
|
||||
return {
|
||||
'flags': {
|
||||
'write_isa': flag_write_isa,
|
||||
'fs_status_ok': flag_fs_status_ok,
|
||||
'si_fs_input': flag_si_fs_input,
|
||||
'si_fs_output': flag_si_fs_output,
|
||||
'in_control': flag_in_control,
|
||||
'control_is_over': flag_control_is_over,
|
||||
'no_trust_yau07': flag_no_trust_yau07,
|
||||
'only_fs': flag_only_fs
|
||||
},
|
||||
'state_machine': {
|
||||
'state': state,
|
||||
'current_litera': current_litera
|
||||
},
|
||||
'progress': {
|
||||
'value': progress_value,
|
||||
'status': current_status,
|
||||
'total_fs': total_fs_to_check,
|
||||
'completed_fs': completed_fs_count,
|
||||
'current_fs_progress': current_fs_progress
|
||||
},
|
||||
'counters': {
|
||||
'cc': cc,
|
||||
'cmd_array_size': cmd_array.size()
|
||||
},
|
||||
'results': {
|
||||
'power_for_litera': power_for_litera,
|
||||
'power_results': power_result,
|
||||
'control_results': control_results,
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
Reference in New Issue
Block a user