После отладки приборов прд-н/прд-в в камере КЭН

This commit is contained in:
Maxim
2025-07-11 00:43:04 +03:00
parent 6972557f8e
commit 012bd2f832
4 changed files with 268 additions and 94 deletions

View File

@@ -70,7 +70,7 @@ offset_bottom = 877.0
fname = "ДОУ-2"
rname = "A5"
[node name="dou2_A6" parent="." instance=ExtResource("2_is25t")]
[node name="dou3_A6" parent="." instance=ExtResource("2_is25t")]
layout_mode = 2
offset_left = 8.0
offset_top = 812.0
@@ -376,6 +376,7 @@ fname = "УМ1535А"
rname = "A18"
[node name="Monitoring_panel" type="Panel" parent="."]
visible = false
layout_mode = 0
theme_override_styles/panel = SubResource("StyleBoxTexture_bnnv3")
@@ -446,3 +447,13 @@ theme_override_font_sizes/font_size = 10
text = "Out
ems 2"
horizontal_alignment = 1
[node name="control_result" type="Label" parent="."]
offset_left = 9.0
offset_top = 960.0
offset_right = 649.0
offset_bottom = 1003.0
theme_override_colors/font_color = Color(0.862745, 0.0784314, 0.235294, 1)
theme_override_font_sizes/font_size = 28
horizontal_alignment = 1
metadata/_edit_lock_ = true

View File

@@ -1,41 +1,90 @@
@tool
extends "res://scenes/контроль/прибор.gd"
const IN_BLANK_PRD: int = 1
const OUT_BLANK_PRD: int = 13
const CI_2_OT_FS: int = 9
const CI_3_OT_FS: int = 10
const CI_2_B_UF: int = 1
const CI_3_B_UF: int = 2
const POWER_UKP_1: int = 31
const POWER_UKP_2: int = 63
var timer_03: Timer = Timer.new()
const Constants = {
"IN_BLANK_PRD": 1,
"OUT_BLANK_PRD": 13,
"CI_2_OT_FS": 9,
"CI_3_OT_FS": 10,
"CI_2_B_UF": 4,
"CI_3_B_UF": 5,
"POWER_UKP_1": 31,
"POWER_UKP_2": 63,
"DKM_BIT_2": 1,
"DKM_BIT_3": 2,
"ADDR_UG_LITERA_1": 0x106,
"ADDR_UG_LITERA_2": 0x108,
"TEMP_THRESHOLD": 70,
"POWER_THRESHOLD": 40,
"TIMER_DELAY": 1.0
}
enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 }
# Основные переменные
var count_packet_1:int = 0
var power_array_1: Array = []
var count_packet_2:int = 0
var power_array_1: Array = []
var power_array_2: Array = []
enum STATE_VAL {
NONE = 0,
GOOD = 1,
ERROR = 2 }
var currecnt_unit: String
var ug_work_1: int
var ug_work_2: 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,
}
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_key = settings.get_unit_key(get_meta('unit_name')[0])
var unit_prd = network.units[unit_key]
currecnt_unit = unit_prd.name
unit_prd.connect('data_received', Callable(self, 'on_data_received'))
unit_prd.connect('line_changed', Callable(self, 'on_line_changed'))
set_default_state()
self.add_child(timer_03)
timer_03.connect('timeout', Callable(self, 'on_timer_03'))
#on_timer_03(unit_key)
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 node in [$kasseta_P_1/ref_A19, $kasseta_P_1/ref_A20, $kasseta_P_1/ref_A21, $maa2000_A23, $maa2000_A22, $dou2_A5, $dou3_A6, $kasseta_FS_ND/ref_A3, $kasseta_FS_ND/ref_A4]:
node.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_key = settings.get_unit_key(get_meta('unit_name')[0])
var unit_prd = network.units[unit_key]
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:
@@ -47,70 +96,32 @@ func on_data_received(unit_prd: Object) -> void:
if not is_inside_tree():
return
check_block_ip(unit_prd.status)
check_temperature_um(unit_prd.status)
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_2)
check_dkm(status, Constants.DKM_BIT_3)
# Обработка мощности от УКП
_process_ukp_power(status)
# Обрабатывает данные ЭМС и обновляет UI панели
func _process_ems_data(status: PackedByteArray) -> void:
## Контроль ЭМС
#_process_ems_data(unit_prd)
var in_blank: int = status.decode_u16(Constants.IN_BLANK_PRD)
var out_blank: int = status.decode_u16(Constants.OUT_BLANK_PRD)
var in_blank: int = unit_prd.status.decode_u16(IN_BLANK_PRD)
var out_blank: int = unit_prd.status.decode_u16(OUT_BLANK_PRD)
# Обновление фреймов для входных сигналов
$Monitoring_panel/in_fs_1.frame = (in_blank >> Constants.CI_2_OT_FS) & 1
$Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_3_OT_FS) & 1
$Monitoring_panel/in_fs_1.frame = (in_blank >> CI_2_OT_FS) & 1
$Monitoring_panel/in_fs_2.frame = (in_blank >> CI_3_OT_FS) & 1
$Monitoring_panel/out_ems_1.frame = (out_blank >> CI_2_B_UF) & 1
$Monitoring_panel/out_ems_2.frame = (out_blank >> CI_3_B_UF) & 1
## Мощность УМ от УКП 1
if (in_blank >> CI_2_OT_FS) & 1:
const bit_dkm_1: int = 1
check_dkm(unit_prd.status, bit_dkm_1)
var arr_power_ukp_1: Array = []
if (unit_prd.status[0] >> 2) & 1:
for i_power in range(6):
var power_ukp_1 = unit_prd.status.decode_u16(POWER_UKP_1 + 2 * i_power)
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 6:
power_amplifier[i].value1 = '%d' % power_array_1[i]
count_packet_1 += 1
## Мощность УМ от УКП 2
if (in_blank >> CI_3_OT_FS) & 1:
const bit_dkm_2: int = 2
check_dkm(unit_prd.status, bit_dkm_2)
var arr_power_ukp_2: Array = []
if (unit_prd.status[0] >> 2) & 1:
for i_power in range(6):
var power_ukp_2 = unit_prd.status.decode_u16(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]
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
for i in 6:
power_amplifier[i+6].value1 = '%d' % power_array_2[i]
count_packet_2 += 1
# Обновление фреймов для выходных сигналов ЭМС
$Monitoring_panel/out_ems_1.frame = (out_blank >> Constants.CI_2_B_UF) & 1
$Monitoring_panel/out_ems_2.frame = (out_blank >> Constants.CI_3_B_UF) & 1
## Проверка касет П1 и ИП МА2000
@@ -141,6 +152,14 @@ func check_block_ip(status_prd: PackedByteArray) -> void :
$kasseta_P_1/ref_A19.state = STATE_VAL.NONE
$kasseta_P_1/ref_A20.state = STATE_VAL.NONE
$kasseta_P_1/ref_A21.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_A19.state == STATE_VAL.GOOD and
$kasseta_P_1/ref_A20.state == STATE_VAL.GOOD and
$kasseta_P_1/ref_A21.state == STATE_VAL.GOOD
)
## Проверка температур УМ от УКП
@@ -173,14 +192,155 @@ 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 == 1:
$dou2_A5.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
$kasseta_FS_ND/ref_A4.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results["dkm_1"] = status_dkm
elif bit_dkm == 2:
$dou2_A6.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
$dou3_A6.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
$kasseta_FS_ND/ref_A3.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results["dkm_2"] = status_dkm
func _process_ukp_power(status: PackedByteArray) -> void:
## Мощность УМ от УКП 1
var arr_power_ukp_1: Array = []
if (status[0] >> 2) & 1:
for i_power in range(6):
var power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * i_power)
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 6:
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+6].value1 = '%d' % power_array_2[i]
power_amplifier[i+6].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_timer_03(unit_name):
#print(unit_name)
func _on_control_fs(mode: bool) -> void:
var interfer_name: String
var fs_arr: Array
if mode:
interfer_name = 'k1'
fs_arr = [[90.0, 2450.0, 1500.0, 23]]
else:
interfer_name = 'off'
fs_arr = [[90.0, 2450.0, 1500.0, 23]]
signaller.emit_signal('interfer_init', interfer_name, fs_arr)
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 = {
4: { "node": $kasseta_FS_ND/ref_A1, "condition": last_part == '' },
5: { "node": $kasseta_FS_ND/ref_A1, "condition": last_part == '' },
6: { "node": $kasseta_FS_ND/ref_A1, "condition": last_part == '' },
7: { "node": $kasseta_FS_ND/ref_A1, "condition": last_part == '' },
8: { "node": $kasseta_FS_ND/ref_A2, "condition": last_part == '' },
9: { "node": $kasseta_FS_ND/ref_A2, "condition": last_part == '' },
10: { "node": $kasseta_FS_ND/ref_A2, "condition": last_part == '' },
11: { "node": $kasseta_FS_ND/ref_A2, "condition": last_part == '' }
}
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 < 8:
_control_results["fs_1"] = (data.isg == 1)
else:
_control_results["fs_2"] = (data.isg == 1)
if _control_results['fs_1'] and _control_results["fs_2"] 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_key = settings.get_unit_key(get_meta('unit_name')[0])
var unit_prd = network.units[unit_key]
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]
const dou = 0x3
const att = 0x7
var result = ((att & 0x07) << 3) | (dou & 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, Constants.ADDR_UG_LITERA_2, result, 0x120, 6666]])
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_ND/ref_A1.state = STATE_VAL.ERROR
if key == 'fs_2':
$kasseta_FS_ND/ref_A2.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

View File

@@ -329,6 +329,7 @@ fname = "УМ1535А"
rname = "A18"
[node name="Monitoring_panel" type="Panel" parent="."]
visible = false
layout_mode = 0
theme_override_styles/panel = SubResource("StyleBoxTexture_vxfkm")
@@ -408,5 +409,6 @@ offset_right = 649.0
offset_bottom = 1003.0
theme_override_colors/font_color = Color(0.862745, 0.0784314, 0.235294, 1)
theme_override_font_sizes/font_size = 28
text = "Прибор ПРД- неисправен"
horizontal_alignment = 1
metadata/_edit_lock_ = true

View File

@@ -6,8 +6,8 @@ const Constants = {
"OUT_BLANK_PRD": 13,
"CI_4_OT_FS": 11,
"CI_5_OT_FS": 12,
"CI_4_B_UF": 1,
"CI_5_B_UF": 2,
"CI_4_B_UF": 4,
"CI_5_B_UF": 5,
"POWER_UKP_1": 31,
"POWER_UKP_2": 63,
"DKM_BIT_3": 3,
@@ -16,7 +16,7 @@ const Constants = {
"ADDR_UG_LITERA_2": 0x108,
"TEMP_THRESHOLD": 70,
"POWER_THRESHOLD": 40,
"TIMER_DELAY": 2.0
"TIMER_DELAY": 1.0
}
enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 }
# Основные переменные
@@ -80,7 +80,7 @@ func _exit_tree() -> void:
func set_default_state() -> void:
for node in [$kasseta_P_1/ref_A19, $kasseta_P_1/ref_A20, $kasseta_P_1/ref_A21, $maa2000_A23, $maa2000_A22]:
for node in [$kasseta_P_1/ref_A19, $kasseta_P_1/ref_A20, $kasseta_P_1/ref_A21, $maa2000_A23, $maa2000_A22, $dou4_A5, $dou5_A6, $kasseta_FS_VD/ref_A2, $kasseta_FS_VD/ref_A6]:
node.state = STATE_VAL.NONE
for group in get_tree().get_nodes_in_group('power_amplifier'):
@@ -102,6 +102,7 @@ func on_data_received(unit_prd: Object) -> void:
check_temperature_um(status)
# Обработка данных ЭМС
_process_ems_data(status)
if flag_timer_started:
check_dkm(status, Constants.DKM_BIT_3)
check_dkm(status, Constants.DKM_BIT_4)
@@ -185,12 +186,12 @@ 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 == Constants.DKM_BIT_3:
$dou4_A5.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
$kasseta_FS_VD/ref_A6.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results["dkm_1"] = status_dkm
elif bit_dkm == Constants.DKM_BIT_4:
$dou5_A6.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
$kasseta_FS_VD/ref_A2.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results["dkm_1"] = status_dkm
elif bit_dkm == Constants.DKM_BIT_4:
$dou4_A5.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
$kasseta_FS_VD/ref_A6.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results["dkm_2"] = status_dkm
@@ -280,7 +281,7 @@ func on_stop_control() -> void:
func on_fs_update_state(packet_type_7: Dictionary) -> void:
var parts = currecnt_unit.split('-')
var last_part = parts[-1] # Прибор
# Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора
var fs_mapping = {
12: { "node": $kasseta_FS_VD/ref_A3, "condition": last_part == '' },