diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 1bc4aae4..e9d1db7b 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -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) diff --git a/scripts/network.gd b/scripts/network.gd index 443af57e..c23ab480 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -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 diff --git a/scripts/sch3.gd b/scripts/sch3.gd index 6ee5b689..d3589856 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -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) diff --git a/scripts/unit.gd b/scripts/unit.gd index 5209cc9e..a3f093b7 100644 --- a/scripts/unit.gd +++ b/scripts/unit.gd @@ -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)]])