diff --git a/scripts/network.gd b/scripts/network.gd index eb3e7907..ab5146ba 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -130,16 +130,16 @@ func _ready() -> void: unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) if proto in SERIAL_PROTO: - var unit = SERIAL_PROTO[proto].new(unit_name) + var unit_serial = SERIAL_PROTO[proto].new(unit_name) var unit_key = settings.get_unit_key(unit_name) if logger_page: - unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) - unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) + unit_serial.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) + unit_serial.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) var serial = create_serial(unit_name) - units_serial[unit_key] = unit - units[unit_key] = unit + units_serial[unit_key] = unit_serial + units[unit_key] = unit_serial serials[unit_key] = serial - var rc = serial.try_open(on_serial_data.bind(unit)) + var rc = serial.try_open(on_serial_data.bind(unit_serial)) if rc != Error.OK: log.message(log.ERROR, 'Невозможно открыть %s для \"%s\"' % [serial, unit_name]) else: @@ -220,16 +220,16 @@ func _process(_delta: float) -> void: Error.OK: sock_unicast.send_to([addr[0], dst_ports[addr]], unit.tx_data.slice(0, unit.tx_len)) Error.FAILED: emit_signal('socket_error', [unit, sock_unicast]) for key in units_serial: - var unit = units_serial[key] + var unit_serial = units_serial[key] var serial = serials[key] - match unit.process(tick): - Error.OK: serial.send_to(unit.tx_data) - Error.FAILED: emit_signal('socket_error', [unit, serial]) + match unit_serial.process(tick): + Error.OK: serial.send_to(unit_serial.tx_data) + Error.FAILED: emit_signal('socket_error', [unit_serial, serial]) for sock_unit in tcp_sockets: var sock = sock_unit[0] - var unit = sock_unit[1] - match unit.process(tick): - Error.OK: sock.send_to(unit.tx_data) - Error.FAILED: emit_signal('socket_error', [unit, sock]) + var unit_tcp = sock_unit[1] + match unit_tcp.process(tick): + Error.OK: sock.send_to(unit_tcp.tx_data) + Error.FAILED: emit_signal('socket_error', [unit_tcp, sock]) poll_receive_tcp(sock) poll_sockets.any(func(sock): poll_receive(sock)) diff --git a/scripts/sch3.gd b/scripts/sch3.gd index a4535fcd..a45901c4 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -1,11 +1,15 @@ class_name sch_3 extends Node -const ONLINE_TIMEOUT: int = 5000 ## Время ожидания данных -const REQUEST_PERIOD: int = 3000 ## Переиод запроса, мс +## Модуль Прибора Щ3 +const ONLINE_TIMEOUT: int = 5000 ## Время ожидания данных +const REQUEST_PERIOD: int = 1000 ## Переиод запроса, мс + + +## Представление прибора Щ3 class Sch3 extends unit.Unit: - var unit: = 1 ## Адрес устройства Modbus. + var mb_addr: = 0 ## Адрес устройства Modbus. var cmd_state: = CmdState.DONE ## Состояние выполнения текущей команды. var tick_rx: = 0 ## Время приёма крайнего сообщения. var tick_tx: = 0 ## Время отправки крайнего сообщения. @@ -17,13 +21,15 @@ class Sch3 extends unit.Unit: signal info_received(msg: String) ## Вызывается при получении информационного сообщения. signal except_received(msg: String) ## Вызывается при получении сообщения об исключительной ситуации. - func _init(nm: String, u: int = 1): - unit = u + func _init(nm: String, u: int = 0): + mb_addr = u name = nm ## Изменяет состояние. Вызывать периодически.[br] ## [param tick] - Текущщее время в мс.[br] - func process(tick: int): + ## Возвращает [b]Error.OK[/b] - если данные готовы для отправки.[br] + ## Возвращает [b]Error.ERR_BUSY[/b] - если данных для отправки нет.[br] + func process(tick: int) -> Error: if online and ((tick - rx_tick) > ONLINE_TIMEOUT): online = false emit_signal('line_changed', self) @@ -49,7 +55,7 @@ class Sch3 extends unit.Unit: emit_signal('line_changed', self) var utf8_data = data.get_string_from_utf8() if Error.OK == json_conv.parse(utf8_data): - emit_signal('data_received') + emit_signal('data_received', data) var message: Dictionary = json_conv.get_data() if message.has('code') and message.has('data'): var rc: = true @@ -57,8 +63,10 @@ class Sch3 extends unit.Unit: var message_data = message['data'] match message_code: 'resp_holding', 'resp_input': - var addr = message_data[0] + var addr = int(message_data[0]) var regs = message_data.slice(1) + for i in regs.size(): + regs[i] = int(regs[i]) emit_signal(message_code, addr, regs) 'resp_write': emit_signal(message_code) @@ -91,7 +99,7 @@ class Sch3 extends unit.Unit: ## [param count] - Данные для записи в регистры от начального адреса.[br] func write(addr: int, data: Array) -> bool: if cmd_state != CmdState.DONE: return false - var json_dict = {'code': 'write', 'data': [addr] + data} + var json_dict: = {'code': 'write', 'data': [addr] + data, 'unit': mb_addr} tx_data = JSON.stringify(json_dict).to_utf8_buffer() tx_len = len(tx_data) cmd_state = CmdState.SEND @@ -102,7 +110,7 @@ class Sch3 extends unit.Unit: ## [param count] - Количество регистров от начального адреса.[br] func read_holding(addr: int, count: int = 1) -> bool: if cmd_state != CmdState.DONE: return false - var json_dict = {'code': 'read_holding', 'data': [addr, count]} + var json_dict: = {'code': 'read_holding', 'data': [addr, count], 'unit': mb_addr} tx_data = JSON.stringify(json_dict).to_utf8_buffer() tx_len = len(tx_data) cmd_state = CmdState.SEND @@ -113,7 +121,7 @@ class Sch3 extends unit.Unit: ## [param count] - Количество регистров от начального адреса.[br] func read_input(addr: int, count: int = 1) -> bool: if cmd_state != CmdState.DONE: return false - var json_dict = {'code': 'read_input', 'data': [addr, count]} + var json_dict: = {'code': 'read_input', 'data': [addr, count], 'unit': mb_addr} tx_data = JSON.stringify(json_dict).to_utf8_buffer() tx_len = len(tx_data) cmd_state = CmdState.SEND diff --git a/scripts/settings.gd b/scripts/settings.gd index 6a5ec3b3..ec13ddcc 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -5,22 +5,22 @@ class_name rep_settings extends Node @export var UnitProfiles: = { \ # Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий - 'уарэп-яу07-частный': ['yau07rx', '10.1.1.2', [50002], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], + 'уарэп-яу07-частный': ['yau07rx', '127.0.0.2', [50002], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], 'уарэп-яу07-общий': ['yau07rx', '*', [50000], true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'], 'уарэп-капсрпб': ['json-capsrpb', '127.0.0.1', [42023, 42022], false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'], - 'уарэп-эмс': ['yau07tx', '10.1.1.52', [50052], false, false, 'IP-адрес ЯУ-07 прибора УФ'], - 'уарэп-яу07-2в': ['yau07tx', '10.1.1.34', [50034], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-2н': ['yau07tx', '10.1.1.33', [50033], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-2к': ['yau07tx', '10.1.1.35', [50035], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-4в': ['yau07tx', '10.1.1.66', [50066], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-4н': ['yau07tx', '10.1.1.65', [50065], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-4к': ['yau07tx', '10.1.1.67', [50067], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-1в': ['yau07tx', '10.1.1.18', [50018], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-1н': ['yau07tx', '10.1.1.17', [50017], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-1к': ['yau07tx', '10.1.1.19', [50019], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-3в': ['yau07tx', '10.1.1.50', [50050], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-3н': ['yau07tx', '10.1.1.49', [50049], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-3к': ['yau07tx', '10.1.1.51', [50051], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-эмс': ['yau07tx', '127.0.0.52', [50052], false, false, 'IP-адрес ЯУ-07 прибора УФ'], + 'уарэп-яу07-2в': ['yau07tx', '127.0.0.34', [50034], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-2н': ['yau07tx', '127.0.0.33', [50033], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-2к': ['yau07tx', '127.0.0.35', [50035], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-4в': ['yau07tx', '127.0.0.66', [50066], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-4н': ['yau07tx', '127.0.0.65', [50065], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-4к': ['yau07tx', '127.0.0.67', [50067], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-1в': ['yau07tx', '127.0.0.18', [50018], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-1н': ['yau07tx', '127.0.0.17', [50017], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-1к': ['yau07tx', '127.0.0.19', [50019], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-3в': ['yau07tx', '127.0.0.50', [50050], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-3н': ['yau07tx', '127.0.0.49', [50049], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-3к': ['yau07tx', '127.0.0.51', [50051], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], # Название: [ Протокол, Адрес, Порт получения, Комментарий ] 'уарэп-5п28': [ '5p28', '127.0.0.1', [50000], 'IP-адрес комплекса 5П-28'], diff --git a/scripts/signaller.gd b/scripts/signaller.gd index de926699..47620b7b 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -4,11 +4,11 @@ class_name Signaller extends Node ## два и более узла, из разных файлов. Должен быть помещён в автозагрузку. ## Подключает обработчик к событию по его определению -func conn(sgnl: Signal, clbl: Callable): connect(sgnl.get_name(), clbl) +func conn(sgnl: Signal, clbl: Callable): connect(sgnl.get_name(), clbl) ## Вызывает сигнал по его определению -func emmit(sgnl: Signal): emit_signal(sgnl.get_name()) +func emmit(sgnl: Signal): emit_signal(sgnl.get_name()) ## Вызывается при обнаружение ошибки последовательного порта diff --git a/scripts/unit.gd b/scripts/unit.gd index af319a46..5209cc9e 100644 --- a/scripts/unit.gd +++ b/scripts/unit.gd @@ -1,7 +1,7 @@ class_name base_unit extends Node ## Базовый класс для управления подключаемыми устройствами -class Unit: +class Unit extends Object: ## Состояние автомата выполнения команды. enum CmdState { @@ -18,11 +18,11 @@ class Unit: signal parse_failed(unit) ## Вызывается при обнаружении ошибки во входных данных signal data_received(data: PackedByteArray) ## Вызывается по приёму данных - var tx_data: = PackedByteArray() ## Буфер отправленный. + var tx_data: = PackedByteArray() ## Буфер для отправки. var tx_len: int = 0 ## Длина последнего отправленного пакета. - var tx_tick: int = 0 - var rx_tick: int = 0 - var online: bool = false - var name: String = '<устройство>' + var tx_tick: int = 0 ## Тик-время отправки буфера + var rx_tick: int = 0 ## Тик-время последнего приёма данных + 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)]])