Доработка интегрального контроля (в процессе)

This commit is contained in:
TotMaxim
2025-11-25 20:36:47 +03:00
parent bfb9d3a4e8
commit 0c8f02bc77
7 changed files with 388 additions and 164 deletions

View File

@@ -151,17 +151,26 @@ class Fs:
class PRD:
enum STATE_DEVICE {
NONE,
GOOD,
ERROR
}
var prd_name: String ## Имя прибора
var unit_yau07 ## Юнит эмс
var unit_yau07: Object ## Юнит эмс
var unit_control: Object ## Класс проверки прибора ПРД
var fs_dic: Dictionary ## Массив блоков ФС
var yemsg_board: yemsboards.EmsBoard ## Плата ЭМС-Г
var state = PrdState.WORK
var cmd_array: Array ## Очередь команд
var ug_online: bool = false ## Состояние ячейки УГ
var serviceability: bool = false
var set_ug_state: bool = true ## Необходимо ли записать в УГ настройки
signal update_serviceability()
signal update_serviceability(state: int) ## Сообщает изменение текущего состояния юнита ПРД
var serviceability: int:
set(v):
if v != serviceability:
serviceability = v
emit_signal('update_serviceability', v)
func _init(u_name, u_yau07):
prd_name = u_name
@@ -201,11 +210,11 @@ class PRD:
func on_line_changed(unit_ems):
emit_signal('update_serviceability')
if not unit_ems.online:
yemsg_board.ems_load = yemsg_board.LoadState.NOT_DEFINED
yemsg_board.set_wait()
set_ug_state = true
serviceability = STATE_DEVICE.NONE
func on_data_received(_u):
set_prd_status()
@@ -222,33 +231,79 @@ class PRD:
execute_cmd()
return
execute_cmd()
func set_prd_status():
## Мониторинг состояния юнита прд
func set_prd_status() -> void:
# Обновление статуса платы ЯУ-07
yemsg_board.set_status(unit_yau07.status)
# Проверка онлайн-статусов основных модулей
ug_online = (unit_yau07.status[0] >> 1) & 1
if not ug_online:
set_ug_state = true
var ukp_1_online = (unit_yau07.status[0] >> 2) & 1
var ukp_2_online = (unit_yau07.status[0] >> 3) & 1
var ems_g_online = (unit_yau07.status[0] & 1) & 1
var ems_g_online = (unit_yau07.status[0] & 1) & 1
# Установка флага состояния УГ
if not ug_online:
set_ug_state = true
# Проверка источников питания
var ip_online: bool = _check_dry_contact(unit_yau07.status, prd_name)
var check_temperature_um: bool = unit_control.flags.temperature_ok
var check_dic: Dictionary = {
'ukp_1_online': ukp_1_online,
'ukp_2_online': ukp_2_online,
'ems_g_online': ems_g_online,
'ip_online': ip_online,
'ug_online': ug_online,
'temperature_um': check_temperature_um
}
# Определение состояния обслуживания
if unit_control:
if unit_control.flags.control_is_over:
serviceability = _set_serviceability_from_control_results(unit_control)
else:
serviceability = _set_serviceability_from_online_status(check_dic)
## Проверка онлайн-статуса сухих контактов
static func _check_dry_contact(unit_yau07_status: PackedByteArray, self_name: String) -> bool:
var bit_ip_config: Array = [0, 1, 2, 3, 4, 5, 6, 7]
var ip_online: bool = true
var is_k_type: bool = prd_name in ['уарэп-яу07-1к', 'уарэп-яу07-2к', 'уарэп-яу07-3к', 'уарэп-яу07-4к']
var is_k_type: bool = self_name in ['уарэп-яу07-1к', 'уарэп-яу07-2к', 'уарэп-яу07-3к', 'уарэп-яу07-4к']
for bit in bit_ip_config:
var status: bool = unit_yau07.status[27] >> bit & 1
# Игнорируем биты 5 и 6 для всех приборов, кроме типа "к"
if not is_k_type and (bit == 5 or bit == 6):
if not is_k_type and bit in [5, 6]: # Игнорируем биты 5 и 6 для всех приборов, кроме типа "к"
continue
var status: bool = unit_yau07_status[27] >> bit & 1
if status:
ip_online = false
return false
return true
## Установка состояния обслуживания на основе результатов контроля
static func _set_serviceability_from_control_results(unit_ctrl: Object) -> int:
var control_results = unit_ctrl.get_control_results()
var result_dic = control_results.result_dic
const CRITICAL_DEVICES: Array = [
'fs_1', 'fs_2', 'fs_3', 'fs_4', 'fs_5', 'fs_6', 'fs_7',
'dkm_1', 'dkm_2', 'dkm_3', 'dkm_4', 'dkm_5', 'dkm_6', 'dkm_7',
'block_ip', 'dou_2', 'dou_3', 'dou_4', 'dou_5', 'dou_6', 'dou_7'
]
var all_ok: bool = true
for device_key in CRITICAL_DEVICES:
if result_dic.has(device_key) and result_dic[device_key] is bool:
if not result_dic[device_key]:
all_ok = false
break
return STATE_DEVICE.GOOD if all_ok else STATE_DEVICE.ERROR
## Установка состояния обслуживания на основе онлайн-статусов
static func _set_serviceability_from_online_status(check_dic: Dictionary) -> int:
var all_online: bool = true
for status in check_dic:
if not check_dic[status]:
all_online = false
break
var check_serviceability = ug_online and ukp_1_online and ukp_2_online and ems_g_online and ip_online
if serviceability != check_serviceability:
serviceability = check_serviceability
emit_signal('update_serviceability')
return STATE_DEVICE.NONE if all_online else STATE_DEVICE.ERROR
func execute_cmd():
if not len(cmd_array): return
if unit_yau07.cmd_state != unit_yau07.CmdState.DONE: return
@@ -290,8 +345,6 @@ class PRD:
func set_um(data_arr):
cmd_array.append([unit_yau07.CmdCode.WRITE_ISA, data_arr])
func _on_control_completed(_unit_control_name: String)->void:
emit_signal('update_serviceability')
func _ready() -> void:
@@ -303,7 +356,6 @@ func _ready() -> void:
var unit_control = TestPRD.new({'unit_prd': unit_prd}, new_prd.cmd_array)
add_child(unit_control)
new_prd.unit_control = unit_control
unit_control.control_is_over.connect(new_prd._on_control_completed) # Прямая подписка на метод new_prd
for key in FS_PRD.keys():
var fs = Fs.new(key, FS_PRD[key][0])
fs_dict[key] = fs

View File

@@ -105,14 +105,14 @@ var _fs_rules: Array
## Основные переменные класса
var config_manager: PRDConfigManager
var unit_prd: Object
var control_results: Dictionary
var power_result: Dictionary
var constants: Dictionary
var pribor_config: Dictionary
var fs_parameters: Dictionary
var block_ip_config: Dictionary
var block_kasseta_y5_config: Dictionary
var temperature_um: Dictionary
var control_results: Dictionary
var power_result: Dictionary
var ecms: Dictionary
var power_for_litera: Dictionary
var self_name: String
@@ -152,9 +152,10 @@ var current_fs_progress: float = 0.0
var current_status: String = 'Ожидание запуска контроля'
## Сигналы класса
signal control_is_over(device_name: String) # Когда контроль завершен
signal status_updated(status_text: String) # Сигнал для обновления статуса
signal update_progress(progress_value: float) # Обновление статуса выполнения контроля
signal control_is_over(device_name: String) # Когда контроль завершен
signal status_updated(status_text: String) # Сигнал для обновления статуса
signal control_results_updated(control_results: Dictionary) # Обновление результатов контроля
signal update_progress(progress_value: float) # Обновление статуса выполнения контроля
signal update_max_value_progress(max_progress_value: int) # Установка максимального значения для прогресс бара
## Свойство прогресса с автоматическим emit сигнала
@@ -282,23 +283,19 @@ func _process(_delta: float) -> void:
## Обработка данных от ЯУ-07
func on_data_received(unit_pribor: Object) -> void:
if not flags.in_control:
return
var status: PackedByteArray = unit_pribor.status
block_kasseta_y5_config = check_block_kasseta_y5(status, block_kasseta_y5_config, flags.no_trust_yau07)
if flags.no_trust_yau07:
return
socket_status_ems_g(status)
block_ip_config = check_block_ip(status, block_ip_config)
temperature_um = check_temperature_um(status)
flags.temperature_ok = check_overheating(temperature_um)
if machine_timer.is_stopped():
return
block_ip_config = check_block_ip(status, block_ip_config)
block_kasseta_y5_config = check_block_kasseta_y5(status, block_kasseta_y5_config, flags.no_trust_yau07)
_set_control_result('block_kasseta', on_y5_control_result(block_kasseta_y5_config))
_set_control_result('temperature', flags.temperature_ok)
_set_control_result('block_ip', on_dry_control_result(block_ip_config))
if not flags.in_control: return
if machine_timer.is_stopped(): return
if flags.no_trust_yau07: return
socket_status_ems_g(status)
_process_dkm_status(status)
# Формирование мощностей в литерах
if current_litera != 0:
var tek_litera: Dictionary = power_for_litera[current_litera]
@@ -361,10 +358,10 @@ func socket_status_ems_g(packet_form_yau_07: PackedByteArray) -> void:
func state_control_machine() -> void:
match state:
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() # Проверка Кассеты У5
STATE_MACHINE.CHEK_BLOCK_IP: _handle_check_block_ip_state() # Проверка ИП
STATE_MACHINE.FS_TURN_ON: _handle_fs_turn_on_state()
STATE_MACHINE.FS_WORK: _handle_fs_work_state()
STATE_MACHINE.READ_ISA: _handle_read_isa_state()
STATE_MACHINE.UG_SET_RAY_CTRL: _handle_ray_operation(6)
STATE_MACHINE.UG_SET_RAY: _handle_ray_operation() # Режим чтения
@@ -386,20 +383,19 @@ func _handle_init_state() -> void:
if current_litera in [1, 2, 3, 4, 5, 6, 7]:
_set_status('Инициализация ФС-%s' % current_litera)
if _get_current_ecm(): return
state = STATE_MACHINE.FS_TURN_ON
state = STATE_MACHINE.CHEK_KASSETA_Y5
else:
if _get_current_ecm(): return
# Завершение контроля если литеры закончились
flags.control_is_over = true
control_results = on_control_result(block_ip_config, control_results)
power_result = prep_power(power_for_litera, self_name)
machine_timer.stop()
_set_control_result('is_over_control', flags.control_is_over)
var result: bool = true
for device in control_results.values():
if not device:
result = false
_set_status('Прибор ПРД-%s: %s' % [self_name, ['неисправен', 'исправен'][int(result)]])
emit_signal('control_is_over', self_name)
@@ -429,11 +425,9 @@ static func take_ecm_id(ecm_dic: Dictionary, device_name: String, current_lit: i
func _handle_fs_work_state() -> void:
_set_status('Проверка связи сервиса КАПС РПБ')
if not flags.ecm_is_comming: return
#print([self_name, current_ecm_key , ecms[current_ecm_key]])
# Если ЭМС доступна и ФС в порядке - запускаем таймер ЭМС
if current_ecm_key != 0 and flags.fs_status_ok:
_set_status('Проверка ФС-%s' % current_litera)
# Проверка завершения работы ФС
# Если ФС в порядке
if (current_litera == 2 and control_results.fs_2) or \
(current_litera == 3 and control_results.fs_3) or \
(current_litera == 4 and control_results.fs_4) or \
@@ -443,9 +437,12 @@ func _handle_fs_work_state() -> void:
(current_litera == 1 and control_results.fs_1):
if not block_kasseta_y5_config['yau07']:
_set_status('Ожидание данных от ЯУ-07...')
return # НЕ переходим дальше пока нет данных
return # НЕ переходим дальше пока нет данных от сервиса МП550
state = STATE_MACHINE.CHEK_KASSETA_Y5
if flags.only_fs:
state = STATE_MACHINE.IN_EMS_STOP
else:
state = STATE_MACHINE.UG_SET_RAY_5 if current_litera == 1 else STATE_MACHINE.UG_SET_RAY_CTRL
## Обработка состояния CHECK_KASSETA - проверка кассеты Y5
@@ -463,9 +460,9 @@ func _handle_check_kasseta_state() -> void:
_set_status('Перегрев УМ')
state = STATE_MACHINE.IN_EMS_STOP
else:
#flag_only_fs = true
_set_status('Касета У5: ERROR')
state = STATE_MACHINE.IN_EMS_STOP
flags.flag_only_fs = true
_set_status('Касета У5: ERROR, Проверка ФС.')
state = STATE_MACHINE.FS_TURN_ON
## Обработка состояния CHECK_BLOCK_IP - проверка кассеты Y5
@@ -475,13 +472,8 @@ func _handle_check_block_ip_state() -> void:
for ip in block_ip_config:
if not block_ip_config[ip][1]:
block_ip = false
if block_ip:
if current_litera == 1:
state = STATE_MACHINE.UG_SET_RAY_5
else:
state = STATE_MACHINE.UG_SET_RAY_CTRL
elif flags.only_fs:
state = STATE_MACHINE.IN_EMS_STOP
state = STATE_MACHINE.FS_TURN_ON if block_ip else STATE_MACHINE.IN_EMS_STOP
## Обработка состояния READ_ISA - чтение из УГ
@@ -982,13 +974,21 @@ func get_control_results() -> Dictionary:
#region STATIC_UTILITY_METHODS
## Итоговое заключение по результатам контроля всех ИП
static func on_control_result(ip_config: Dictionary, ctrl_results: Dictionary) -> Dictionary:
static func on_dry_control_result(ip_config: Dictionary) -> bool:
var all_blocks_ip_ok = true
for block in ip_config:
if not ip_config[block][1]:
all_blocks_ip_ok = false
ctrl_results['block_ip'] = all_blocks_ip_ok
return ctrl_results
return all_blocks_ip_ok
## Итоговое заключение по результатам контроля кассеты у5
static func on_y5_control_result(block_kasseta: Dictionary) -> bool:
var all_blocks_y5_ok = true
for block in block_kasseta:
if not block_kasseta[block]:
all_blocks_y5_ok = false
return all_blocks_y5_ok
## Установка угла и аттенюации для УМ
@@ -1072,13 +1072,18 @@ static func check_temperature_um(status_prd: PackedByteArray) -> Dictionary:
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)
return_dic_temp[arr_um[i_temp]] = tmp_1
else:
for i_temp in 8:
return_dic_temp[arr_um[i_temp]] = -999 # Заполняем нулями если УКП нет на связи
if ukp2_online:
for i_temp in 8:
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)
return_dic_temp[arr_um[i_temp+8]] = tmp_2
else:
for i_temp in 8:
return_dic_temp[arr_um[i_temp+8]] = -999 # Заполняем -999 если УКП нет на связи
return return_dic_temp
@@ -1372,3 +1377,16 @@ func get_current_states() -> Dictionary:
}
}
#endregion
#region setters
func _set_control_result(key: String, status: bool)-> void:
var old_value = control_results.get(key)
if key == 'is_over_control' or old_value != status:
control_results[key] = status
emit_signal('control_results_updated', control_results)
print_debug('control_results_updated: ',[key, status])
func _get_control_result(key: String) -> bool:
return control_results[key]
#endregion