Доработка. Режим внешнего управления. Освобождение uart-портов

This commit is contained in:
sasha80
2025-05-28 16:41:24 +03:00
parent 08ee8c4b0b
commit 11ee535801
5 changed files with 76 additions and 34 deletions

View File

@@ -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')]])

View File

@@ -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)