Доработка. Режим внешнего управления. Освобождение uart-портов
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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')]])
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user