Исправление. Определение на связи/отключен

This commit is contained in:
sasha80
2025-03-14 11:30:17 +03:00
parent 19a9a844ed
commit 2d33484f95
4 changed files with 21 additions and 22 deletions

View File

@@ -43,13 +43,12 @@ class StackItem:
func on_data_received(_data: PackedByteArray): pass
## Обработчик таймера
func _on_timeout(unit_sch3) -> void:
func _on_timeout(unit_sch3, mbc: ModbusClientRtu) -> void:
push_warning(step_fsm)
if step_fsm == Sch3Fsm.WRITE:
if write_stack.size():
var ad = write_stack.pop_front()
if not unit_sch3.write(ad.addr, ad.data):
write_stack.push_back(ad)
mbc.write(ad.addr, ad.data)
step_fsm = Sch3Fsm.READ_INPUT
elif step_fsm == Sch3Fsm.READ_INPUT:
unit_sch3.read_input(base_input_address, regs_input_count)
@@ -58,8 +57,7 @@ func _on_timeout(unit_sch3) -> void:
unit_sch3.read_holding(base_holding_address, regs_holding_count)
step_fsm = Sch3Fsm.WRITE
elif step_fsm == Sch3Fsm.CONNECT:
var unit_key = settings.get_unit_key(unit_sch3.name)
var mbc = network.mbcs[unit_key]
mbc.queue_clear()
mbc.flush()
mbc.try_reconnect()
mbc.request_read(base_input_address, regs_input_count)
@@ -102,7 +100,8 @@ func _ready() -> void:
unit_sch3.connect('resp_input', on_resp_input)
unit_sch3.connect('resp_holding', on_resp_holding)
unit_sch3.connect('command_fail', on_command_fail)
timer.connect('timeout', _on_timeout.bind(unit_sch3))
var mbc = network.mbcs[unit_key]
timer.connect('timeout', _on_timeout.bind(unit_sch3, mbc))
add_child(timer)
timer.start(request_period)

View File

@@ -68,7 +68,7 @@ class Modbus extends ModbusClientRtu:
if rc != Error.OK:
push_error('%s:%s %s' % [unit_name, port, params])
return false
set_indication_timeout(params[5])
set_response_timeout(params[5])
thread_run()
return true

View File

@@ -47,8 +47,7 @@ class Sch3 extends unit.Unit:
## Производит разбор принятых данных. Вызывать при приёме данных на сокете.[br]
## [param data] - Данные принятые на сокете.[br]
## [param tick] - Текущщее время в мс.[br]
func parse(message: Dictionary, tick: int) -> bool:
rx_tick = tick
func parse(message: Dictionary) -> bool:
if not online and (message['code'] != 'exception'):
online = true
emit_signal('line_changed', self)
@@ -69,9 +68,6 @@ class Sch3 extends unit.Unit:
var msg = message['data']
emit_signal('info_received', msg)
'exception':
var msg = message['data']
cmd_state = CmdState.FAIL
emit_signal('except_received', msg)
rc = false
_:
var msg: String = 'код команды \"%s\" - не распознан' % message_code
@@ -86,6 +82,7 @@ class Sch3 extends unit.Unit:
emit_signal('command_fail', self)
return true
## Отправляет команду "записать в регистры".[br]
## [param addr] - Начальный адрес регистров.[br]
## [param count] - Данные для записи в регистры от начального адреса.[br]
@@ -120,14 +117,15 @@ class Sch3 extends unit.Unit:
## [param data] - Данные прочитанные из регистров.[br]
## [param tick] - Время приёма пакета.[br]
func on_read(return_code, base_addr, data):
var tick = Time.get_ticks_msec()
var msg: Dictionary
if return_code == Error.OK:
rx_tick = Time.get_ticks_msec()
msg['code'] = 'resp_holding'
msg['data'] = [base_addr] + data
else:
msg['code'] = 'exception'
parse(msg, tick)
msg['data'] = 'операция чтения входных регистров не выполнена (%d)' % base_addr
parse(msg)
## Принимает результат команды "читать регистры входов".[br]
@@ -136,14 +134,15 @@ class Sch3 extends unit.Unit:
## [param data] - Данные прочитанные из регистров.[br]
## [param tick] - Время приёма пакета.[br]
func on_read_input(return_code, base_addr, data):
var tick = Time.get_ticks_msec()
var msg: Dictionary
if return_code == Error.OK:
rx_tick = Time.get_ticks_msec()
msg['code'] = 'resp_input'
msg['data'] = [base_addr] + data
else:
msg['code'] = 'exception'
parse(msg, tick)
msg['data'] = 'операция чтения входных регистров не выполнена (%d)' % base_addr
parse(msg)
## Принимает результат команды "записать в регистры".[br]
@@ -151,12 +150,13 @@ class Sch3 extends unit.Unit:
## [param base_addr] - Начальный адрес регистров.[br]
## [param data] - Данные прочитанные из регистров.[br]
## [param tick] - Время приёма пакета.[br]
func on_write(return_code, _base_addr, _data):
var tick = Time.get_ticks_msec()
func on_write(return_code, base_addr, data):
var msg: Dictionary
if return_code == Error.OK:
rx_tick = Time.get_ticks_msec()
msg['data'] = []
msg['code'] = 'resp_write'
else:
msg['code'] = 'exception'
parse(msg, tick)
msg['data'] = 'операция записи в регистры не выполнена (%d, %s)' % [base_addr, data]
msg['code'] = 'except_received'
parse(msg)

View File

@@ -25,4 +25,4 @@ class Unit extends Object:
var online: bool = false ## Состояние подключения устройства
var name: String = '<без имени>' ## Уникальное имя устройства
func _init(nm) -> void: self.name = nm
func _to_string() -> String: return String('устройство: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]])
func _to_string() -> String: return String('<\"%s\", %s>' % [self.name, ['отключен', 'на связи'][int(online)]])