Рефактор
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'],
|
||||
|
||||
@@ -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())
|
||||
|
||||
|
||||
## Вызывается при обнаружение ошибки последовательного порта
|
||||
|
||||
@@ -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)]])
|
||||
|
||||
Reference in New Issue
Block a user