Merge branch 'master-prd' of http://169.254.27.70:3000/sasha80/uarep-ctl into master-prd

This commit is contained in:
Maxim Name
2025-07-07 17:13:29 +03:00
5 changed files with 80 additions and 41 deletions

View File

@@ -11,12 +11,16 @@ const POWER_UKP_1: int = 31
const POWER_UKP_2: int = 63
const bit_dkm_3: int = 3
const bit_dkm_4: int = 4
const ADDR_UG_LITERA_1: int = 0x106
const ADDR_UG_LITERA_2: int = 0x108
var count_packet_1:int = 0
var power_array_1: Array = []
var count_packet_2:int = 0
var power_array_2: Array = []
var currecnt_unit: String
var ug_work_1: int
var ug_work_2: int
enum STATE_VAL {
NONE = 0,
@@ -43,13 +47,25 @@ func _ready() -> void:
control_timer.start()
func _enter_tree() -> void:
signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false))
on_ug_setting()
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, [ADDR_UG_LITERA_1, ug_work_1, ADDR_UG_LITERA_2, ug_work_2]])
func set_default_state() -> 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
$maa2000_A23.state = STATE_VAL.NONE
$maa2000_A22.state = STATE_VAL.NONE
for group in get_tree().get_nodes_in_group('power_amplifier'):
group.state = STATE_VAL.NONE
@@ -231,10 +247,9 @@ func _on_control_fs(mode: bool) -> void:
func on_stop_control() -> void:
_on_control_fs(false)
print('stop timer')
func on_fs_update_state(packet_type_7: Dictionary):
func on_fs_update_state(packet_type_7: Dictionary) -> void:
var parts = currecnt_unit.split('-')
var last_part = parts[-1] # Прибор
for fs in packet_type_7:
@@ -246,7 +261,7 @@ func on_fs_update_state(packet_type_7: Dictionary):
$kasseta_FS_VD/ref_A3.state = STATE_VAL.GOOD if packet_type_7[fs].isg == 1 else STATE_VAL.ERROR if packet_type_7[fs].isg == 0 else STATE_VAL.NONE
if fs == 15 and last_part == '':
$kasseta_FS_VD/ref_A3.state = STATE_VAL.GOOD if packet_type_7[fs].isg == 1 else STATE_VAL.ERROR if packet_type_7[fs].isg == 0 else STATE_VAL.NONE
if fs == 16 and last_part == '':
$kasseta_FS_VD/ref_A4.state = STATE_VAL.GOOD if packet_type_7[fs].isg == 1 else STATE_VAL.ERROR if packet_type_7[fs].isg == 0 else STATE_VAL.NONE
if fs == 17 and last_part == '':
@@ -255,4 +270,25 @@ func on_fs_update_state(packet_type_7: Dictionary):
$kasseta_FS_VD/ref_A4.state = STATE_VAL.GOOD if packet_type_7[fs].isg == 1 else STATE_VAL.ERROR if packet_type_7[fs].isg == 0 else STATE_VAL.NONE
if fs == 19 and last_part == '':
$kasseta_FS_VD/ref_A4.state = STATE_VAL.GOOD if packet_type_7[fs].isg == 1 else STATE_VAL.ERROR if packet_type_7[fs].isg == 0 else STATE_VAL.NONE
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(ADDR_UG_LITERA_1):
ug_work_1 = unit_prd.isa_ports[ADDR_UG_LITERA_1]
if unit_prd.isa_ports.has(ADDR_UG_LITERA_2):
ug_work_2 = unit_prd.isa_ports[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, [ADDR_UG_LITERA_1, result, ADDR_UG_LITERA_2, result]])
func on_mode_changed(in_tree: bool) -> void:
if not in_tree:
queue_free()

View File

@@ -77,15 +77,13 @@ func _enter_tree() -> void:
unit_sch3.regs_input_count = regs_input_count
unit_sch3.request_period = request_period
unit_sch3.reconnect_period = reconnect_period
unit_sch3.connect('read', on_read.bind(unit_sch3))
unit_sch3.connect('read_input', on_input)
unit_sch3.connect('read_input', on_input.bind(unit_sch3))
unit_sch3.connect('error', on_error.bind(unit_sch3))
unit_sch3.connect('line_changed', on_line_changed_sch3)
func _ready() -> void:
var unit_key = settings.get_unit_key(unit_name)
var a = network.units
var unit_sch3 = network.units[unit_key]
var items = get_tree().get_nodes_in_group('bits_items_switch')
for item in items:
@@ -98,23 +96,34 @@ func _exit_tree() -> void:
if Engine.is_editor_hint(): return
var unit_key = settings.get_unit_key(unit_name)
var unit_sch3 = network.units[unit_key]
unit_sch3.disconnect('read', on_read.bind(unit_sch3))
unit_sch3.disconnect('read_input', on_input.bind(unit_sch3))
external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false)
unit_sch3.disconnect('error', on_error)
unit_sch3.disconnect('line_changed', on_line_changed_sch3)
## Вызывается по сигналу "приняты данные чтения регистров хранения"[br]
## Вызывается по сигналу "приняты данные чтения регистров входов".[br]
## [param base_addr] - Начальный адрес регистров.[br]
## [param data] - Массив значений прочитанных из регистров.
func on_read(base_addr: int, data: Array, unit_sch3):
if (base_addr != base_holding_address) or (data.size() < regs_holding_count):
## [param data] - Массив значений прочитанных из регистров.[br]
func on_input(base_addr: int, data: Array, unit_sch3):
if !is_inside_tree():
return
if (base_addr != base_input_address) or (data.size() < regs_input_count):
return
# "Для контроля состояния управляющего элемента подачи электроэнергии на приборы ..."
# "Для контроля подачи электроэнергии на приборы ..."
# Таблицы 3.13 и 3.14. Ecли значения соответствующих битов в этих
# регистрах равны, то "исправно".
var items = get_tree().get_nodes_in_group('bits_items_good')
for i in data.size():
regs_holding[base_addr + i] = data[i]
regs_input[base_addr + i] = data[i]
# Разрешить работу выключателей только когда прочитано их реальное состояние
if not switches_sync:
regs_holding[0] = regs_input[0]
regs_holding[1] = regs_input[1]
for i in 16:
regs_holding[2] = tools.set_bit(regs_holding[0], i, not ((regs_holding[0] >> i) & 1))
regs_holding[3] = tools.set_bit(regs_holding[1], i, not ((regs_holding[1] >> i) & 1))
if not external_ctl:
if regs_holding.has(0) and regs_holding.has(2):
regs_holding[0] = regs_holding[0] | 1
@@ -127,27 +136,10 @@ func on_read(base_addr: int, data: Array, unit_sch3):
var byte1: int = bits[2] # Адрес регистра
var bit1: int = bits[3] # Индекс бита
var val0: bool = regs_holding[byte0] & (1 << bit0) > 0
item.button_pressed = val0
item.set_pressed_no_signal(val0)
item.disabled = false
regs_holding[byte1] = tools.set_bit(regs_holding[byte1], bit1, not val0)
unit_sch3.push_write_holding(regs_holding)
## Вызывается по сигналу "приняты данные чтения регистров входов".[br]
## [param base_addr] - Начальный адрес регистров.[br]
## [param data] - Массив значений прочитанных из регистров.[br]
func on_input(base_addr: int, data: Array):
if !is_inside_tree():
return
if (base_addr != base_input_address) or (data.size() < regs_input_count):
return
# "Для контроля состояния управляющего элемента подачи электроэнергии на приборы ..."
# "Для контроля подачи электроэнергии на приборы ..."
# Таблицы 3.13 и 3.14. Ecли значения соответствующих битов в этих
# регистрах равны, то "исправно".
var items = get_tree().get_nodes_in_group('bits_items_good')
for i in data.size():
regs_input[base_addr + i] = data[i]
# Таблица 3.15, Регистр PowerState
$margin/vbox/grid1/lbl_freq.text = '%d' % (regs_input[4] & 0x1ff)
$margin/vbox/grid1/lbl_freq.self_modulate = Color.WHITE

View File

@@ -136,6 +136,17 @@ theme_override_font_sizes/font_size = 17
text = "УФ"
vertical_alignment = 1
[node name="switch0" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]]
editor_description = "Питание УФ"
material = SubResource("ShaderMaterial_c1mqk")
layout_mode = 2
size_flags_horizontal = 2
tooltip_text = "Выключатель питания УФ"
button_pressed = true
action_mode = 0
script = ExtResource("7_l6esm")
metadata/bits = [0, 0, 2, 0]
[node name="state1" type="TextureRect" parent="margin/vbox/table" groups=["bits_items_good"]]
custom_minimum_size = Vector2(24, 24)
layout_mode = 2

View File

@@ -194,7 +194,6 @@ class PRD:
fs.um_code_rx = u.isa_ports[port] & 0x7
func on_line_changed(unit_ems):
if not unit_ems.online:
yemsg_board.ems_load = yemsg_board.LoadState.NOT_DEFINED
@@ -203,8 +202,6 @@ class PRD:
func on_data_received(_u):
set_prd_status()
if state != PrdState.WORK:
return
if yemsg_board.state_board != yemsg_board.WAIT or yemsg_board.state_cmd != yemsg_board.WAIT:
return
if yemsg_board.online:
@@ -280,6 +277,8 @@ func _ready() -> void:
var unit_caps_key = settings.get_unit_key('уарэп-капсрпб')
var unit_caps = network.units[unit_caps_key]
unit_caps.connect('data_received', Callable(self, 'on_data_capsrpb_received'))
signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(PrdState.CONTROL))
signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(PrdState.WORK))
func get_fs_param(index: int) -> Array:
@@ -347,7 +346,7 @@ func on_data_capsrpb_received(unit0: capsrpb.CapsRpb):
if not unit0.json_dic.has('ts'): return
if unit0.json_dic['ts'] != 7: return
if not unit0.json_dic.has('msfs'): return
var msfs = unit0.json_dic['msfs']
for fs in msfs:
if fs is Dictionary:
@@ -369,3 +368,9 @@ func on_data_capsrpb_received(unit0: capsrpb.CapsRpb):
if fs.has('width'):
fs_module.width_caps_rx = int(fs['width'])
signaller.emit_signal('fs_update_state', fs_dict)
## Вызывается при переходе в режим работа/контроль
func on_mode_changed(changed_mode: int) -> void:
for pdr in prd.prd_dict.values():
pdr.state = changed_mode

View File

@@ -70,11 +70,6 @@ class Sch3 extends unit.Unit:
mbc.request_read_input(base_input_address, regs_input_count)
cmd_state = CmdState.WAIT
tx_tick = tick
step_fsm = Sch3Fsm.READ_HOLDING
elif step_fsm == Sch3Fsm.READ_HOLDING:
mbc.request_read(base_holding_address, regs_holding_count)
cmd_state = CmdState.WAIT
tx_tick = tick
step_fsm = Sch3Fsm.WRITE
elif step_fsm == Sch3Fsm.CONNECT:
try_disconnect()