Доработка. Отображение состояния Щ3 (Щ-3) в режиме Контроль

This commit is contained in:
sasha80
2024-11-02 11:57:39 +03:00
parent d4b98c4cb3
commit fa436b1850
8 changed files with 56 additions and 28 deletions

View File

@@ -117,7 +117,7 @@ offset_top = 275.0
offset_right = 225.0
offset_bottom = 367.0
[node name="sch3" parent="." groups=["bit_items"] instance=ExtResource("7_13r50")]
[node name="sch3" parent="." instance=ExtResource("7_13r50")]
offset_left = 175.0
offset_top = 714.0
offset_right = 680.0

View File

@@ -3,14 +3,35 @@
extends "res://scenes/контроль/элемент-я.gd"
func on_data_received(data): pass
func _enter_tree() -> void:
if Engine.is_editor_hint(): return
var unit_key = settings.get_unit_key(unit_name)
var unit = network.units[unit_key]
unit.connect('responce_received', Callable(self, 'on_responce_received'))
func _exit_tree() -> void:
if Engine.is_editor_hint(): return
var unit_key = settings.get_unit_key(unit_name)
var unit = network.units[unit_key]
unit.disconnect('responce_received', Callable(self, 'responce_received'))
func on_line_changed(_unit):
var items = get_tree().get_nodes_in_group('bit_items')
for item in items:
item.texture = textures[STATE_VAL.NONE]
func on_data_received(data: PackedByteArray):
var items = get_tree().get_nodes_in_group('bits_items')
for item in items:
item.texture = textures[STATE_VAL.ERROR]
func on_responce_received(addr: int, data: PackedByteArray):
print_debug([addr, data])
if (addr != 0) or (data.size() != 4):
return
var items = get_tree().get_nodes_in_group('bits_items')
var cnt_good: int = 0
for item in items:
var bits: Array = item.get_meta('bits')
var byte0: int = bits[0]
@@ -21,4 +42,6 @@ func on_data_received(data: PackedByteArray):
if (data[byte0] & (1 << bit0)) \
== (data[byte1] & (1 << bit1)) \
else STATE_VAL.ERROR
cnt_good += int(v == STATE_VAL.GOOD)
item.texture = textures[v]
state = STATE_VAL.GOOD if cnt_good == items.size() else STATE_VAL.ERROR

View File

@@ -19,10 +19,8 @@ func on_line_changed(unit):
$block_input2.state2 = STATE_VAL.NONE
func on_data_received(data: PackedByteArray, unit):
if data.size() <= 6:
push_error('ошибка: неверная длина данных %d байт %s' % [data.size(), unit])
return
func on_data_received(data: PackedByteArray):
# Сеть 1. Использование
$block_input1.state = STATE_VAL.GOOD if data[4] & (1 << 5) else STATE_VAL.ERROR
# Сеть 1. Вход

View File

@@ -55,7 +55,7 @@ func _enter_tree() -> void:
if Engine.is_editor_hint(): return
var unit_key = settings.get_unit_key(unit_name)
var unit = network.units[unit_key]
unit.connect('data_received', Callable(self, 'on_data_received').bind(unit))
unit.connect('data_received', Callable(self, 'on_data_received'))
unit.connect('line_changed', Callable(self, 'on_line_changed'))

View File

@@ -1,6 +1,7 @@
class_name sch_3 extends Node
const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды.
const ONLINE_TIMEOUT: int = 5000 ## Время ожидания данных
const REQUEST_PERIOD: int = 3000 ## Переиод запроса, мс
class Sch3 extends unit.Unit:
@@ -29,24 +30,26 @@ class Sch3 extends unit.Unit:
## Изменяет состояние. Вызывать периодически.[br]
## [param tick] - Текущщее время в мс.[br]
func process(tick: int):
if online and ((tick - tick_rx) > ONLINE_TIMEOUT):
if online and ((tick - rx_tick) > ONLINE_TIMEOUT):
online = false
emit_signal('line_changed', self)
if (cmd_state == CmdState.WAIT) or (cmd_state == CmdState.SEND):
if cmd_state == CmdState.WAIT:
cmd_state = CmdState.FAIL
emit_signal('command_fail', self)
var rc = Error.ERR_BUSY
if cmd_state == CmdState.SEND:
rc = Error.OK
tick_tx = tick
cmd_state = CmdState.WAIT
if (tick - tx_tick) > REQUEST_PERIOD:
if read_input(0, 4):
tx_tick = tick
cmd_state = CmdState.WAIT
rc = Error.OK
return rc
## Производит разбор принятых данных. Вызывать при приёме данных на сокете.[br]
## [param data] - Данные принятые на сокете.[br]
## [param tick] - Текущщее время в мс.[br]
func parse(data: PackedByteArray, tick: int) -> bool:
tick_rx = tick
rx_tick = tick
if not online:
online = true
emit_signal('line_changed', self)
@@ -63,15 +66,18 @@ class Sch3 extends unit.Unit:
var addr = message_data[0]
var regs = message_data.slice(1)
emit_signal('responce_received', addr, regs)
rc = true
'info':
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
cmd_state = CmdState.FAIL
emit_signal('parse_failed', msg)
rc = false
if (cmd_state == CmdState.WAIT) and rc:
@@ -98,7 +104,7 @@ class Sch3 extends unit.Unit:
## Отправляет команду "читать регистры хранения".[br]
## [param addr] - Начальный адрес регистров.[br]
## [param count] - Количество регистров от начального адреса.[br]
func read_holdind(addr: int, count: int = 1) -> bool:
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]}
tx_data = JSON.stringify(json_dict).to_utf8_buffer()

View File

@@ -5,9 +5,6 @@ const REQUEST_PERIOD: int = 3000 ## Переиод запроса, мс
class SPT25 extends unit.Unit:
var tx_tick: int = 0
var rx_tick: int = 0
var req_period = REQUEST_PERIOD
func _to_string() -> String: return String('СПТ-25 %s %s' % [self.name, ['отключен', 'на связи'][int(online)]])
func _init(nm) -> void:
@@ -28,12 +25,15 @@ class SPT25 extends unit.Unit:
if not online:
online = true
emit_signal('line_changed', self)
if rx_data.size() <= 6:
emit_signal('parse_failed', self)
return
emit_signal('data_received', rx_data)
func process(tick: int):
var rc: = Error.ERR_BUSY
if (tick - tx_tick) > req_period:
if (tick - tx_tick) > REQUEST_PERIOD:
tx_tick = tick
rc = Error.OK
if online:

View File

@@ -44,7 +44,6 @@ class TCP5P28 extends unit.Unit:
signal get_threats(unit: TCP5P28) ## Сигнал запрос целей.
signal get_interfers(unit: TCP5P28) ## Запрос состояния выполнения целеуказания.
var rx_tick: = 0 ## Тик время последнего приёма, мс.
var tx_stack: Array ## Массив пакетов для отправки.
func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]])

View File

@@ -8,8 +8,10 @@ class Unit:
signal parse_failed(unit) ## Вызывается при обнаружении ошибки во входных данных
signal data_received(data: PackedByteArray) ## Вызывается по приёму данных
var tx_data: = PackedByteArray() ## Буфер отправленный.
var tx_len = 0 ## Длина последнего отправленного пакета.
var tx_data: = PackedByteArray() ## Буфер отправленный.
var tx_len = 0 ## Длина последнего отправленного пакета.
var tx_tick: int = 0
var rx_tick: int = 0
var online: bool
var name: String
func _init(nm) -> void: self.name = nm