Доработка. Обмен с 5П-28 вынесен в отдельный поток.

This commit is contained in:
MaD_CaT
2026-01-30 11:11:17 +03:00
parent 6950b09879
commit 8f4134a911
2 changed files with 159 additions and 104 deletions

View File

@@ -110,24 +110,6 @@ class SocketUDP extends PacketPeerUDP:
push_error('%s: %s', [error_string(rc), addr])
class SocketTCP extends TCPServer:
const RX_TIMEOUT: int = 1000 ## Время сброса счётчика принятия части пакета.
var peerstream: = PacketPeerStream.new()
var unit_name: StringName ## Уникальное имя устройства
var head_len: int = 8 ## Длина заголовка команды.
var len_place: int = 4 ## Номер начального байта с длинной блока данных.
var type_len: int = 4 ## Количество байт в размере длинны.
var rx_tick: int ## Время приёма последнего пакета.
var rx_all: bool = true ## Флаг, что пакет принят полностью.
var rx_len: int ## Количество принятых байт.
var rx_data: PackedByteArray ## Принятые данные.
var data_len: int ## Размер ожидаемых данных.
func send_to(data: PackedByteArray):
var peer = peerstream.get_stream_peer()
peer.put_data(data)
var poll_sockets: Array[SocketUDP] ## Сокеты для непрерывного опроса наличия новых данных
var tcp_sockets: Array[Array] ## Сокеты для TCP-соединений
var units: Dictionary[StringName, unit.Unit] ## Экземпляры всех сетевых устройств
@@ -187,21 +169,6 @@ func create_socket_caps(unit_name: StringName) -> SocketUDP:
return sock
## [param unit_name] - Уникальное имя устройства[br]
func create_socket_tcp(unit_name: StringName) -> SocketTCP:
var st = settings.UnitProfiles[unit_name][1]
var addr = st[0]
var port = st[1]
var sock: = SocketTCP.new()
sock.unit_name = unit_name
var rc: = sock.listen(port, addr)
if rc == Error.OK:
log.message(log.INFO, '\"%s\" слушает на %s:%d' % [unit_name, addr, port])
else:
log.message(log.ERROR, '\"%s\" %s:%d \"%s\"' % [unit_name, addr, port, error_string(rc)])
return sock
## [param unit_name] - Уникальное имя устройства[br]
func create_serial(unit_instance: unit.Unit) -> SocketSerial:
var st = settings.UnitProfiles[unit_instance.name][1]
@@ -279,9 +246,11 @@ func _ready() -> void:
dst_ports[unit_name] = unit_profile[3]
if proto in TCP_PROTO:
var addr = settings.UnitProfiles[unit_name][1]
var unit_tcp = TCP_PROTO[proto].new(unit_name)
units[unit_name] = unit_tcp
units_tcp[unit_name] = unit_tcp
unit_tcp.open(addr[0], addr[1])
if proto in MODBUS_PROTO:
var unit_modbus = MODBUS_PROTO[proto].new(unit_name)
@@ -305,7 +274,6 @@ func _ready() -> void:
units_nullp[unit_name] = unit_null
tcp_sockets.append([create_socket_tcp('уарэп-5п28'), units_tcp['уарэп-5п28']])
for key: StringName in dst_ports:
port_to_unit_name[dst_ports[key]] = key
if logger_page:
@@ -347,55 +315,6 @@ func poll_receive_udp(sock: SocketUDP) -> bool:
return false
func poll_receive_tcp(sock: SocketTCP) -> bool:
if sock.is_connection_available(): # Проверить, если кто то пытается подключиться
var client: = sock.take_connection() # Принять соединение
sock.peerstream.set_stream_peer(client) # Привязать поток к новому клиенту
log.info('подключен: %s:%d к порту: %d' % [ client.get_connected_host(), client.get_connected_port(), client.get_local_port() ])
var peer = sock.peerstream.get_stream_peer()
if peer:
while true:
var peer_len_data: = peer.get_available_bytes()
if peer_len_data <= 0:
break
get_client_data(sock, peer, peer_len_data)
if sock.unit_name in units_tcp and sock.rx_all:
units_tcp[sock.unit_name].parse(sock.rx_data, tick)
return false
func get_client_data(sock: SocketTCP, peer: StreamPeer, peer_len_data: int) -> void:
if tick - sock.rx_tick > sock.RX_TIMEOUT:
sock.rx_all = true
sock.rx_tick = tick
if sock.rx_all:
if peer_len_data >= sock.head_len:
sock.rx_all = false
sock.rx_len = sock.head_len
var head = peer.get_data(sock.head_len)
sock.data_len = head[1].decode_u32(sock.len_place)
var len_data_in_buf = peer.get_available_bytes()
if len_data_in_buf > 0:
sock.rx_data = head[1]
var len_rx = len_data_in_buf
if len_data_in_buf >= sock.data_len:
len_rx = sock.data_len
get_tcp_data(sock, peer, len_rx)
else:
var len_rx = (sock.head_len + sock.data_len) - sock.rx_len
if peer_len_data < len_rx:
len_rx = peer_len_data
get_tcp_data(sock, peer, len_rx)
func get_tcp_data(sock: SocketTCP, peer: StreamPeer, len_rx: int):
var temp_data = peer.get_data(len_rx)[1]
sock.rx_data.append_array(temp_data)
sock.rx_len += len_rx
if sock.rx_len == sock.head_len + sock.data_len:
sock.rx_all = true
func _process(_delta: float) -> void:
if Engine.is_editor_hint(): return
tick = Time.get_ticks_msec()
@@ -421,12 +340,6 @@ func _process(_delta: float) -> void:
for unit_name: StringName in units_modbus:
var unit_modbus: = units_modbus[unit_name]
unit_modbus.process(tick)
for sock_unit: Array in tcp_sockets:
var sock = sock_unit[0]
var unit_tcp = sock_unit[1]
if Error.OK == unit_tcp.process(tick):
sock.send_to(unit_tcp.tx_data)
poll_receive_tcp(sock)
poll_sockets.any(poll_receive_udp)