diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 83fa64c..fb65dee 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -43,6 +43,17 @@ func on_line_changed_sch3(unit_sch3): $margin/vbox/grid/state.texture = textures[STATE_VAL.NONE] +func on_settings_changed(): + var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) + if not external_ctl: + return + var items = get_tree().get_nodes_in_group('bits_items_switch') + for item in items: + item.disabled = external_ctl + items = get_tree().get_nodes_in_group('bits_items_good') + for item in items: + item.texture = textures[STATE_VAL.NONE] + ## Вызывается при изменении состояния выключателя[br] ## [param val] - Состояние выключателя[br] ## [param meta] - Адреса регистров и индексы битов назначенных выключателю[br] @@ -62,11 +73,6 @@ func _enter_tree() -> void: if Engine.is_editor_hint(): return var unit_key = settings.get_unit_key(unit_name) var unit_sch3 = network.units[unit_key] - var items = get_tree().get_nodes_in_group('bits_items_switch') - for item in items: - var meta = item.get_meta('bits') - item.connect('toggled', on_toggled_switch.bind(meta, unit_sch3)) - item.disabled = true unit_sch3.base_holding_address = base_holding_address unit_sch3.regs_holding_count = regs_holding_count unit_sch3.base_input_address = base_input_address @@ -79,6 +85,16 @@ func _enter_tree() -> void: unit_sch3.connect('line_changed', on_line_changed_sch3) +func _ready() -> void: + var unit_key = settings.get_unit_key(unit_name) + var unit_sch3 = network.units[unit_key] + var items = get_tree().get_nodes_in_group('bits_items_switch') + for item in items: + var meta = item.get_meta('bits') + item.connect('toggled', on_toggled_switch.bind(meta, unit_sch3)) + item.disabled = true + + func _exit_tree() -> void: if Engine.is_editor_hint(): return var unit_key = settings.get_unit_key(unit_name) diff --git a/scenes/pribor-uyep/sch3.tscn b/scenes/pribor-uyep/sch3.tscn index ae16b53..f74e094 100644 --- a/scenes/pribor-uyep/sch3.tscn +++ b/scenes/pribor-uyep/sch3.tscn @@ -136,7 +136,7 @@ theme_override_font_sizes/font_size = 17 text = "УФ" vertical_alignment = 1 -[node name="switch0" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch"]] +[node name="switch0" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]] editor_description = "Питание УФ" material = SubResource("ShaderMaterial_c1mqk") layout_mode = 2 @@ -165,7 +165,7 @@ theme_override_font_sizes/font_size = 17 text = "РТР" vertical_alignment = 1 -[node name="switch1" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch"]] +[node name="switch1" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]] editor_description = "РТР" material = SubResource("ShaderMaterial_c1mqk") layout_mode = 2 @@ -193,7 +193,7 @@ theme_override_font_sizes/font_size = 17 text = "ПРД-Н.1" vertical_alignment = 1 -[node name="switch2" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch"]] +[node name="switch2" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]] editor_description = "ПРД-Н.1" material = SubResource("ShaderMaterial_c1mqk") layout_mode = 2 @@ -222,7 +222,7 @@ theme_override_font_sizes/font_size = 17 text = "ПРД-Н.2" vertical_alignment = 1 -[node name="switch3" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch"]] +[node name="switch3" type="CheckButton" parent="margin/vbox/table" groups=["bits_items_switch", "c111"]] editor_description = "Питание ПРД-Н.2" material = SubResource("ShaderMaterial_c1mqk") layout_mode = 2 diff --git a/scenes/pribor-uyep/spt25-view.gd b/scenes/pribor-uyep/spt25-view.gd index 797b1cb..f537b1c 100644 --- a/scenes/pribor-uyep/spt25-view.gd +++ b/scenes/pribor-uyep/spt25-view.gd @@ -3,20 +3,30 @@ extends "res://scenes/контроль/элемент-я.gd" -func on_line_changed(unit): - if not unit.online: - state = STATE_VAL.NONE - $block_output.state0 = STATE_VAL.NONE - $block_output.state1 = STATE_VAL.NONE - $block_output.state2 = STATE_VAL.NONE - $block_input1.state = STATE_VAL.NONE - $block_input1.state0 = STATE_VAL.NONE - $block_input1.state1 = STATE_VAL.NONE - $block_input1.state2 = STATE_VAL.NONE - $block_input2.state = STATE_VAL.NONE - $block_input2.state0 = STATE_VAL.NONE - $block_input2.state1 = STATE_VAL.NONE - $block_input2.state2 = STATE_VAL.NONE +func on_line_changed(unit0): + if not unit0.online: + disable_all() + + +func on_settings_changed(): + var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) + if external_ctl: + disable_all() + + +func disable_all(): + state = STATE_VAL.NONE + $block_output.state0 = STATE_VAL.NONE + $block_output.state1 = STATE_VAL.NONE + $block_output.state2 = STATE_VAL.NONE + $block_input1.state = STATE_VAL.NONE + $block_input1.state0 = STATE_VAL.NONE + $block_input1.state1 = STATE_VAL.NONE + $block_input1.state2 = STATE_VAL.NONE + $block_input2.state = STATE_VAL.NONE + $block_input2.state0 = STATE_VAL.NONE + $block_input2.state1 = STATE_VAL.NONE + $block_input2.state2 = STATE_VAL.NONE func on_data_received(data: PackedByteArray): diff --git a/scripts/network.gd b/scripts/network.gd index 4814379..a69b6f7 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -188,9 +188,7 @@ func _ready() -> void: units_serial[unit_key] = unit_serial units[unit_key] = unit_serial serials[unit_key] = serial - bind_serials.append([serial, unit_serial, unit_name]) - ProjectSettings.connect('settings_changed', Callable(self, '_on_settings_changed_modbus').bind(bind_modbuses)) ProjectSettings.connect('settings_changed', Callable(self, '_on_settings_changed_serial').bind(bind_serials)) tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp[settings.get_unit_key('уарэп-5п28')]]) diff --git a/scripts/sch3.gd b/scripts/sch3.gd index 9b92a7c..abedfbf 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -9,7 +9,9 @@ class Sch3 extends unit.Unit: READ_INPUT, READ_HOLDING, WRITE, - CONNECT } + CONNECT, + IDLE, + DISCONNECT } var step_fsm: Sch3Fsm = Sch3Fsm.CONNECT var base_input_address: int = 0 @@ -24,21 +26,22 @@ class Sch3 extends unit.Unit: var mbc: = ModbusClientRtu.new() var tick_fsm_delta: = reconnect_period - - func try_connect() -> bool: - var port = settings.UnitProfiles[name][1] - var params = settings.UnitProfiles[name][2] + func try_disconnect(): mbc.thread_stop() mbc.queue_clear() mbc.flush() mbc.close() + + func try_connect() -> bool: + var port = settings.UnitProfiles[name][1] # TODO: убрать это отсюда (обращение к глобальным данным из экземпляра) + var params = settings.UnitProfiles[name][2] # TODO: убрать это отсюда (обращение к глобальным данным из экземпляра) var rc = mbc.open(port, params[0], params[1], params[2], params[3], params[4]) - if rc != Error.OK: + if rc != Error.OK: # TODO: убрать это отсюда (неуместный вывод сообщения) if not reconnect_failed: push_error('%s: невозможно открыть \"%s\" %s' % [name, port, params]) reconnect_failed = true return false - if reconnect_failed: + if reconnect_failed: # TODO: убрать это отсюда (неуместный вывод сообщения) push_warning('%s: открыто после сбоя \"%s\" %s' % [name, port, params]) reconnect_failed = false mbc.set_response_timeout(params[5]) @@ -74,10 +77,17 @@ class Sch3 extends unit.Unit: tx_tick = tick step_fsm = Sch3Fsm.WRITE elif step_fsm == Sch3Fsm.CONNECT: + try_disconnect() try_connect() mbc.request_read_input(base_input_address, regs_input_count) cmd_state = CmdState.WAIT tx_tick = tick + elif step_fsm == Sch3Fsm.DISCONNECT: + try_disconnect() + step_fsm = Sch3Fsm.IDLE + elif step_fsm == Sch3Fsm.IDLE: + pass + signal write (addr: int, data: Array) ## Вызывается при получении сообщения подтверждения записи signal read (addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров входов. @@ -90,7 +100,14 @@ class Sch3 extends unit.Unit: mbc.connect('read', on_read) mbc.connect('read_input', on_read_input) mbc.connect('write', on_write) + ProjectSettings.connect('settings_changed', _on_settings_changed) + func _on_settings_changed(): + var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) + if external_ctl and (step_fsm not in [Sch3Fsm.DISCONNECT, Sch3Fsm.IDLE]): + step_fsm = Sch3Fsm.DISCONNECT + elif (not external_ctl) and (step_fsm in [Sch3Fsm.DISCONNECT, Sch3Fsm.IDLE]): + step_fsm = Sch3Fsm.CONNECT func parse(return_code: Error, base_addr: int, data: Array, code: String): if return_code == Error.OK: @@ -124,8 +141,9 @@ class Sch3 extends unit.Unit: cmd_state = CmdState.FAIL emit_signal('command_fail', self) emit_signal('line_changed', self) - step_fsm = Sch3Fsm.CONNECT - tick_fsm_delta = reconnect_period + if step_fsm != Sch3Fsm.IDLE: + step_fsm = Sch3Fsm.CONNECT + tick_fsm_delta = reconnect_period if (tick - tick_fsm) > tick_fsm_delta: tick_fsm = tick _on_timeout(tick)