From 0e303abf197659e910f6205ec810c3138646f2ab Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 4 Jul 2025 13:46:17 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=A93=20=D0=A7=D1=82=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=B8=D0=BD=D0=BF=D1=83=D1=82=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uyep/sch3-view.gd | 43 ++++++++++++++------------------- scripts/sch3.gd | 5 ---- 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 9fe5654..1f5a4d9 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -77,8 +77,7 @@ 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) @@ -98,23 +97,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 @@ -131,23 +141,6 @@ func on_read(base_addr: int, data: Array, unit_sch3): 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 diff --git a/scripts/sch3.gd b/scripts/sch3.gd index abedfbf..acb767d 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -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() From 72dd8240a2d47a3efe49efed01c919714e0ecf5b Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 4 Jul 2025 14:35:55 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=A0=D0=B5=D0=B3=D1=80=D0=B5=D1=81=D1=81?= =?UTF-8?q?=D0=B8=D1=8F.=20=D0=92=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=82=20?= =?UTF-8?q?=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20=D1=83=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=B8=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=A3=D0=A4=20=D0=B2=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=B5=20=D0=A93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-v/pribor_prd_v.gd | 5 ++--- scenes/pribor-uyep/sch3-view.gd | 3 ++- scenes/pribor-uyep/sch3.tscn | 11 +++++++++++ scripts/prd.gd | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/scenes/pribor-prd-v/pribor_prd_v.gd b/scenes/pribor-prd-v/pribor_prd_v.gd index 01f9134..76a70d2 100644 --- a/scenes/pribor-prd-v/pribor_prd_v.gd +++ b/scenes/pribor-prd-v/pribor_prd_v.gd @@ -49,7 +49,7 @@ func set_default_state() -> void: $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 @@ -246,7 +246,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 == '2в': $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 == '1в': $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 == '4в': @@ -255,4 +255,3 @@ 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 == '2в': $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 - diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 1f5a4d9..665e6a6 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -64,6 +64,7 @@ func on_toggled_switch(val: bool, meta: Array, unit_sch3): regs_holding[on_addr] = tools.set_bit(regs_holding[on_addr], on_bit, val) regs_holding[off_addr] = tools.set_bit(regs_holding[off_addr], off_bit, not val) unit_sch3.push_write_holding(regs_holding) + print_debug(regs_holding) func _enter_tree() -> void: @@ -137,7 +138,7 @@ func on_input(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) diff --git a/scenes/pribor-uyep/sch3.tscn b/scenes/pribor-uyep/sch3.tscn index 2905b58..a175a03 100644 --- a/scenes/pribor-uyep/sch3.tscn +++ b/scenes/pribor-uyep/sch3.tscn @@ -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 diff --git a/scripts/prd.gd b/scripts/prd.gd index 2141471..8d4e326 100644 --- a/scripts/prd.gd +++ b/scripts/prd.gd @@ -347,7 +347,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: From 5bb1e24c7a6285c1210cc545ce2830bbaa5053e3 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 4 Jul 2025 14:41:43 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=20?= =?UTF-8?q?=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B9=20=D0=BF=D1=80=D0=B8=D0=BD?= =?UTF-8?q?=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uyep/sch3-view.gd | 1 - 1 file changed, 1 deletion(-) diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 665e6a6..59891f3 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -64,7 +64,6 @@ func on_toggled_switch(val: bool, meta: Array, unit_sch3): regs_holding[on_addr] = tools.set_bit(regs_holding[on_addr], on_bit, val) regs_holding[off_addr] = tools.set_bit(regs_holding[off_addr], off_bit, not val) unit_sch3.push_write_holding(regs_holding) - print_debug(regs_holding) func _enter_tree() -> void: From 916b82f69371b424230d2e7edadbfc87933ff229 Mon Sep 17 00:00:00 2001 From: Maxim Date: Mon, 7 Jul 2025 16:29:18 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=BC=20=D0=B0=D1=82=D1=82=D0=B5=D0=BD=D1=8E=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B0=D0=BC=D0=B8=20=D1=83=20=D1=83=D0=B3=D0=BB?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D0=B4=D0=BE=D1=83=20=D0=B2=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-prd-v/pribor_prd_v.gd | 41 +++++++++++++++++++++++++++-- scenes/pribor-uyep/sch3-view.gd | 1 - scripts/prd.gd | 11 +++++--- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/scenes/pribor-prd-v/pribor_prd_v.gd b/scenes/pribor-prd-v/pribor_prd_v.gd index 76a70d2..fbc39a5 100644 --- a/scenes/pribor-prd-v/pribor_prd_v.gd +++ b/scenes/pribor-prd-v/pribor_prd_v.gd @@ -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,6 +47,18 @@ 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 @@ -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: @@ -255,3 +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 == '2в': $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() diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 59891f3..f0ee87f 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -84,7 +84,6 @@ func _enter_tree() -> void: 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: diff --git a/scripts/prd.gd b/scripts/prd.gd index 8d4e326..afffcdf 100644 --- a/scripts/prd.gd +++ b/scripts/prd.gd @@ -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: @@ -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