Доработка УГ

This commit is contained in:
TotMaxim
2025-11-20 21:37:17 +03:00
parent 667f6d997e
commit 6624110192
4 changed files with 721 additions and 119 deletions

136
config/default_data.json Normal file
View File

@@ -0,0 +1,136 @@
{
"default_data": {
"ПРД-Н1": {
"temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
"power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111],
"sockets": [false, false, false, false, false],
"dkm": [false, false, false, false, false, false, false],
"dou2": [false, false, false, false, false, false, false],
"dou3": [false, false, false, false, false, false, false],
"att2": [false, false, false, false, false, false, false, false],
"att3": [false, false, false, false, false, false, false, false],
"ip": [false, false, false, false, false, false, false, false]
},
"ПРД-В1": {
"temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
"power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111],
"sockets": [false, false, false, false, false],
"dkm": [false, false, false, true, false, false, false],
"dou2": [false, false, false, false, false, false, false],
"dou3": [false, false, false, false, false, false, false],
"att2": [false, false, false, false, false, false, false, false],
"att3": [false, false, false, false, false, false, false, false],
"ip": [false, false, false, false, false, false, false, true]
},
"ПРД-К1": {
"temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32],
"power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112],
"sockets": [false, false, false, false, false],
"dkm": [false, false, false, false, false, false, false],
"dou2": [false, false, false, false, false, false, false],
"dou3": [false, false, false, false, false, false, false],
"att2": [false, false, false, false, false, false, false, false],
"att3": [false, false, false, false, false, false, false, false],
"ip": [false, false, false, false, false, false, false, false]
},
"ПРД-Н2": {
"temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
"power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111],
"sockets": [false, false, false, false, false],
"dkm": [false, false, false, false, false, false, false],
"dou2": [false, false, false, false, false, false, false],
"dou3": [false, false, false, false, false, false, false],
"att2": [false, false, false, false, false, false, false, false],
"att3": [false, false, false, false, false, false, false, false],
"ip": [false, false, false, false, false, false, false, false]
},
"ПРД-В2": {
"temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
"power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111],
"sockets": [false, false, false, false, false],
"dkm": [false, false, false, false, false, false, false],
"dou2": [false, false, false, false, false, false, false],
"dou3": [false, false, false, false, false, false, false],
"att2": [false, false, false, false, false, false, false, false],
"att3": [false, false, false, false, false, false, false, false],
"ip": [false, false, false, false, false, false, false, false]
},
"ПРД-К2": {
"temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32],
"power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112],
"sockets": [false, false, false, false, false],
"dkm": [false, false, false, false, false, false, false],
"dou2": [false, false, false, false, false, false, false],
"dou3": [false, false, false, false, false, false, false],
"att2": [false, false, false, false, false, false, false, false],
"att3": [false, false, false, false, false, false, false, false],
"ip": [false, false, false, false, false, false, false, false]
},
"ПРД-Н3": {
"temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
"power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111],
"sockets": [false, false, false, false, false],
"dkm": [false, false, false, false, false, false, false],
"dou2": [false, false, false, false, false, false, false],
"dou3": [false, false, false, false, false, false, false],
"att2": [false, false, false, false, false, false, false, false],
"att3": [false, false, false, false, false, false, false, false],
"ip": [false, false, false, false, false, false, false, false]
},
"ПРД-В3": {
"temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
"power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111],
"sockets": [false, false, false, false, false],
"dkm": [false, false, false, false, false, false, false],
"dou2": [false, false, false, false, false, false, false],
"dou3": [false, false, false, false, false, false, false],
"att2": [false, false, false, false, false, false, false, false],
"att3": [false, false, false, false, false, false, false, false],
"ip": [false, false, false, false, false, false, false, false]
},
"ПРД-К3": {
"temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32],
"power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112],
"sockets": [false, false, false, false, false],
"dkm": [false, false, false, false, false, false, false],
"dou2": [false, false, false, false, false, false, false],
"dou3": [false, false, false, false, false, false, false],
"att2": [false, false, false, false, false, false, false, false],
"att3": [false, false, false, false, false, false, false, false],
"ip": [false, false, false, false, false, false, false, false]
},
"ПРД-Н4": {
"temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
"power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111],
"sockets": [false, false, false, false, false],
"dkm": [false, false, false, false, false, false, false],
"dou2": [false, false, false, false, false, false, false],
"dou3": [false, false, false, false, false, false, false],
"att2": [false, false, false, false, false, false, false, false],
"att3": [false, false, false, false, false, false, false, false],
"ip": [false, false, false, false, false, false, false, false]
},
"ПРД-В4": {
"temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
"power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111],
"sockets": [false, false, false, false, false],
"dkm": [false, false, false, false, false, false, false],
"dou2": [false, false, false, false, false, false, false],
"dou3": [false, false, false, false, false, false, false],
"att2": [false, false, false, false, false, false, false, false],
"att3": [false, false, false, false, false, false, false, false],
"ip": [false, false, false, false, false, false, false, false]
},
"ПРД-К4": {
"temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32],
"power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112],
"sockets": [false, false, false, false, false],
"dkm": [false, false, false, false, false, false, false],
"dou2": [false, false, false, false, false, false, false],
"dou3": [false, false, false, false, false, false, false],
"att2": [false, false, false, false, false, false, false, false],
"att3": [false, false, false, false, false, false, false, false],
"ip": [false, false, false, false, false, false, false, false]
}
}
}

187
main.gd
View File

@@ -1,15 +1,101 @@
extends Control
const CONFIG_PATH = "res://config/default_data.json"
const BUFFER_SIZE = 32
var dictionary_yau07: Dictionary
var udp_broadcast: UDPBroadcast
var default_data: Dictionary = {}
var dictionary_yau07: Dictionary
var dictionary_sockets_bit: Dictionary ## Байт 8 для отправки о состоянии ячеек
func _load_default_data():
var file = FileAccess.open(CONFIG_PATH, FileAccess.READ)
if file:
var json = JSON.new()
var error = json.parse(file.get_as_text())
if error == OK:
default_data = json.data["default_data"]
else:
push_error("JSON Parse Error: ", json.get_error_message())
file.close()
else:
push_error("Failed to load config file: ", CONFIG_PATH)
func _apply_default_data():
var prd_nodes = get_tree().get_nodes_in_group('prd')
for prd in prd_nodes:
var device_name = prd.get_meta('yau07')
if default_data.has(device_name):
var device_data = default_data[device_name]
_fill_ukp_fields(prd, device_data)
# Заполняем поля температур
func _fill_ukp_fields(prd_node: Control, device_data: Dictionary):
var device_name = prd_node.get_meta('yau07')
# Заполняем поля температур
var temp_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "temperature_ukp")
if device_data.has("temperature_ukp"):
for i in range(min(temp_fields.size(), device_data["temperature_ukp"].size())):
temp_fields[i].text = str(device_data["temperature_ukp"][i])
# Заполняем поля мощности
var power_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "power_ukp")
if device_data.has("power_ukp"):
for i in range(min(power_fields.size(), device_data["power_ukp"].size())):
power_fields[i].text = str(device_data["power_ukp"][i])
# Устанавливаем состояния сокетов
if device_data.has("sockets"):
var socket_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "socket")
for i in range(min(socket_fields.size(), device_data["sockets"].size())):
socket_fields[i].set_pressed_no_signal(device_data["sockets"][i])
# Устанавливаем состояния ДКМ
if device_data.has("dkm"):
var dkm_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "dkm")
for i in range(min(dkm_fields.size(), device_data["dkm"].size())):
dkm_fields[i].set_pressed_no_signal(device_data["dkm"][i])
# Устанавливаем состояния ДОУ2
if device_data.has("dou2"):
var dou2_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "dou2")
for i in range(min(dou2_fields.size(), device_data["dou2"].size())):
dou2_fields[i].set_pressed_no_signal(device_data["dou2"][i])
# Устанавливаем состояния ДОУ3
if device_data.has("dou3"):
var dou3_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "dou3")
for i in range(min(dou3_fields.size(), device_data["dou3"].size())):
dou3_fields[i].set_pressed_no_signal(device_data["dou3"][i])
# Устанавливаем состояния аттенюаторов 2
if device_data.has("att2"):
var att2_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "att2")
for i in range(min(att2_fields.size(), device_data["att2"].size())):
att2_fields[i].set_pressed_no_signal(device_data["att2"][i])
# Устанавливаем состояния аттенюаторов 3
if device_data.has("att3"):
var att3_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "att3")
for i in range(min(att3_fields.size(), device_data["att3"].size())):
att3_fields[i].set_pressed_no_signal(device_data["att3"][i])
# Устанавливаем состояния источников питания (с инверсией)
if device_data.has("ip"):
var ip_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "ip")
for i in range(min(ip_fields.size(), device_data["ip"].size())):
# Для IP используется инверсия: true в JSON = нажато = бит 0
ip_fields[i].set_pressed_no_signal(device_data["ip"][i])
func _ready() -> void:
var device_yau07: Array = get_tree().get_nodes_in_group('device-addr')
for device in device_yau07:
device.connect('toggled', on_modify_device.bind(device.get_meta('device')))
var sockets: Array = get_tree().get_nodes_in_group('socket')
for soc in sockets:
soc.connect('toggled', _on_modify_sockets.bind(soc.get_meta('bit'), soc.get_meta('device'))) ## Мета bit от 0 до 3, мета ПРД
@@ -26,6 +112,21 @@ func _ready() -> void:
for dkm in dkm_arr_node:
dkm.connect('toggled', _on_modify_dkm.bind(dkm.get_meta('bit'), dkm.get_meta('device')))
var dou2_arr_node: Array = get_tree().get_nodes_in_group('dou2')
for dou2 in dou2_arr_node:
dou2.connect('toggled', _on_modify_dou2.bind(dou2.get_meta('bit'), dou2.get_meta('device')))
var dou3_arr_node: Array = get_tree().get_nodes_in_group('dou3')
for dou3 in dou3_arr_node:
dou3.connect('toggled', _on_modify_dou3.bind(dou3.get_meta('bit'), dou3.get_meta('device')))
var ip_arr_node: Array = get_tree().get_nodes_in_group('ip')
for ip in ip_arr_node:
ip.connect('toggled', _on_modify_ip.bind(ip.get_meta('bit'), ip.get_meta('device')))
_update_tab_container()
_load_default_data()
_apply_default_data()
func _exit_tree():
for device in dictionary_yau07:
@@ -45,6 +146,35 @@ func on_modify_device(toggled: bool, name_device: String) -> void:
dictionary_yau07[name_device].close_udp_unit()
dictionary_yau07.erase(name_device)
print("Устройство %s деактивировано" % name_device)
_update_tab_container()
func _update_tab_container():
var tab_container = $TabContainer
var device_nodes = get_tree().get_nodes_in_group('device-addr')
var has_visible_tabs = false
# Проходим по всем вкладкам и обновляем их состояние
for i in range(tab_container.get_tab_count()):
var tab_control = tab_container.get_tab_control(i)
var device_name = tab_control.get_meta('yau07', '')
# Ищем соответствующую кнопку устройства
var device_button = null
for device in device_nodes:
if device.get_meta('device') == device_name:
device_button = device
break
# Если нашли кнопку, устанавливаем состояние вкладки
if device_button:
var is_enabled = device_button.button_pressed
tab_container.set_tab_disabled(i, !is_enabled)
if is_enabled:
has_visible_tabs = true
# Если все вкладки заблокированы, скрываем TabContainer
tab_container.visible = has_visible_tabs
## Функция для установки статусов ячеек на связи (УГ, ЭМС-Г, УКП)
@@ -67,6 +197,61 @@ func _on_modify_dkm(toggled: bool, bit: int, device: String)->void:
print("Статус DKM устройства %s обновлен: 0x%04X" % [device, new_status])
## Функция для установки статусов ДОУ2 в ПРД
func _on_modify_dou2(toggled: bool, bit: int, device: String)->void:
if not toggled:
var dou2_arr_node = get_tree().get_nodes_in_group('dou2')
for dou2 in dou2_arr_node:
if dou2.has_meta('bit') and dou2.get_meta('bit') == bit:
dou2.set_pressed(true)
if toggled:
var dou2_arr_node = get_tree().get_nodes_in_group('dou2')
for dou2 in dou2_arr_node:
if dou2.has_meta('bit') and dou2.get_meta('bit') != bit and dou2.button_pressed:
dou2.set_pressed_no_signal(false)
# Всегда устанавливаем статус, если кнопка нажата
if toggled and dictionary_yau07.has(device):
var udp_unit = dictionary_yau07[device]
udp_unit.set_dou2_status(bit)
## Функция для установки статусов ДОУ3 в ПРД
func _on_modify_dou3(toggled: bool, bit: int, device: String)->void:
if not toggled:
var dou3_arr_node = get_tree().get_nodes_in_group('dou3')
for dou3 in dou3_arr_node:
if dou3.has_meta('bit') and dou3.get_meta('bit') == bit:
dou3.set_pressed(true)
if toggled:
var dou3_arr_node = get_tree().get_nodes_in_group('dou3')
for dou3 in dou3_arr_node:
if dou3.has_meta('bit') and dou3.get_meta('bit') != bit and dou3.button_pressed:
dou3.set_pressed_no_signal(false)
# Всегда устанавливаем статус, если кнопка нажата
if toggled and dictionary_yau07.has(device):
var udp_unit = dictionary_yau07[device]
udp_unit.set_dou3_status(bit)
func _on_modify_ip(toggled: bool, bit: int, device: String):
if dictionary_yau07.has(device):
var udp_unit = dictionary_yau07[device]
var current_status = udp_unit.get_ip_status()
# Инверсия: нажата = 0, отжата = 1
var bit_value = 0 if toggled else 1
var new_status
if bit_value == 0:
new_status = current_status & ~(1 << bit) # Устанавливаем бит в 0
else:
new_status = current_status | (1 << bit) # Устанавливаем бит в 1
udp_unit.set_ip_status(new_status)
print("Статус ИП устройства %s обновлен: 0x%04X" % [device, new_status])
## Функция для установки значений в ячейках УКП
func _on_ukp_submitted(_new_text: String, device: String) -> void:
if not dictionary_yau07.has(device):

470
main.tscn
View File

@@ -145,194 +145,436 @@ text = "Загрузка ЭМС"
metadata/bit = 4
metadata/device = "ПРД-Н1"
[node name="ukp_1" type="GridContainer" parent="TabContainer/ПРД-Н1"]
layout_mode = 2
offset_left = 205.0
offset_top = 7.0
offset_right = 939.0
offset_bottom = 95.0
columns = 7
[node name="Label" type="Label" parent="TabContainer/ПРД-Н1/ukp_1"]
custom_minimum_size = Vector2(0, 30)
layout_mode = 2
theme_override_styles/normal = SubResource("StyleBoxFlat_ig7tw")
text = "Температуры"
horizontal_alignment = 1
[node name="TextEdit" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit2" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit3" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit4" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit5" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit6" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="Label2" type="Label" parent="TabContainer/ПРД-Н1/ukp_1"]
custom_minimum_size = Vector2(0, 30)
layout_mode = 2
theme_override_styles/normal = SubResource("StyleBoxFlat_ig7tw")
text = "Мощность"
horizontal_alignment = 1
[node name="TextEdit7" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit8" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit9" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit10" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit11" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit12" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="ukp_2" type="GridContainer" parent="TabContainer/ПРД-Н1"]
[node name="TabBar" type="TabContainer" parent="TabContainer/ПРД-Н1"]
layout_mode = 0
offset_left = 205.0
offset_top = 103.0
offset_right = 939.0
offset_bottom = 191.0
columns = 7
offset_left = 199.0
offset_top = 9.0
offset_right = 957.0
offset_bottom = 334.0
current_tab = 2
tabs_position = 1
tab_focus_mode = 0
[node name="Label" type="Label" parent="TabContainer/ПРД-Н1/ukp_2"]
[node name="ukp_1" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar"]
visible = false
layout_mode = 2
columns = 7
metadata/_tab_index = 0
[node name="Label" type="Label" parent="TabContainer/ПРД-Н1/TabBar/ukp_1"]
custom_minimum_size = Vector2(0, 30)
layout_mode = 2
theme_override_styles/normal = SubResource("StyleBoxFlat_ig7tw")
text = "Температуры"
horizontal_alignment = 1
[node name="TextEdit" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["temperature_ukp"]]
[node name="TextEdit" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit2" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["temperature_ukp"]]
[node name="TextEdit2" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit3" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["temperature_ukp"]]
[node name="TextEdit3" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit4" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["temperature_ukp"]]
[node name="TextEdit4" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit5" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["temperature_ukp"]]
[node name="TextEdit5" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit6" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["temperature_ukp"]]
[node name="TextEdit6" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="Label2" type="Label" parent="TabContainer/ПРД-Н1/ukp_2"]
[node name="Label2" type="Label" parent="TabContainer/ПРД-Н1/TabBar/ukp_1"]
custom_minimum_size = Vector2(0, 30)
layout_mode = 2
theme_override_styles/normal = SubResource("StyleBoxFlat_ig7tw")
text = "Мощность"
horizontal_alignment = 1
[node name="TextEdit7" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["power_ukp"]]
[node name="TextEdit7" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit8" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["power_ukp"]]
[node name="TextEdit8" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit9" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["power_ukp"]]
[node name="TextEdit9" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit10" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["power_ukp"]]
[node name="TextEdit10" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit11" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["power_ukp"]]
[node name="TextEdit11" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit12" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["power_ukp"]]
[node name="TextEdit12" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="ukp_2" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar"]
visible = false
layout_mode = 2
columns = 7
metadata/_tab_index = 1
[node name="Label" type="Label" parent="TabContainer/ПРД-Н1/TabBar/ukp_2"]
custom_minimum_size = Vector2(0, 30)
layout_mode = 2
theme_override_styles/normal = SubResource("StyleBoxFlat_ig7tw")
text = "Температуры"
horizontal_alignment = 1
[node name="TextEdit" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit2" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit3" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit4" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit5" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit6" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["temperature_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="Label2" type="Label" parent="TabContainer/ПРД-Н1/TabBar/ukp_2"]
custom_minimum_size = Vector2(0, 30)
layout_mode = 2
theme_override_styles/normal = SubResource("StyleBoxFlat_ig7tw")
text = "Мощность"
horizontal_alignment = 1
[node name="TextEdit7" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit8" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit9" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit10" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit11" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="TextEdit12" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["power_ukp"]]
custom_minimum_size = Vector2(100, 35)
layout_mode = 2
placeholder_text = "0"
metadata/device = "ПРД-Н1"
[node name="ug" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar"]
layout_mode = 2
columns = 5
metadata/_tab_index = 2
[node name="GridContainer4" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar/ug"]
layout_mode = 2
[node name="CheckBox" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]]
layout_mode = 2
text = "ЛУЧ -5°"
metadata/bit = 0
metadata/device = "ПРД-Н1"
[node name="CheckBox2" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]]
layout_mode = 2
text = "ЛУЧ 5°"
metadata/bit = 1
metadata/device = "ПРД-Н1"
[node name="CheckBox3" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]]
layout_mode = 2
text = "ЛУЧ 15°"
metadata/bit = 2
metadata/device = "ПРД-Н1"
[node name="CheckBox4" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]]
layout_mode = 2
text = "ЛУЧ 25°"
metadata/bit = 3
metadata/device = "ПРД-Н1"
[node name="CheckBox5" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]]
layout_mode = 2
text = "ЛУЧ 35°"
metadata/bit = 4
metadata/device = "ПРД-Н1"
[node name="CheckBox6" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]]
layout_mode = 2
text = "ЛУЧ 45°"
metadata/bit = 5
metadata/device = "ПРД-Н1"
[node name="CheckBox7" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]]
layout_mode = 2
text = "ЛУЧ КОНТРОЛЬ"
metadata/bit = 6
metadata/device = "ПРД-Н1"
[node name="GridContainer" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar/ug"]
layout_mode = 2
[node name="CheckBox" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]]
layout_mode = 2
text = "ЛУЧ -5°"
metadata/bit = 0
metadata/device = "ПРД-Н1"
[node name="CheckBox2" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]]
layout_mode = 2
text = "ЛУЧ 5°"
metadata/bit = 1
metadata/device = "ПРД-Н1"
[node name="CheckBox3" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]]
layout_mode = 2
text = "ЛУЧ 15°"
metadata/bit = 2
metadata/device = "ПРД-Н1"
[node name="CheckBox4" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]]
layout_mode = 2
text = "ЛУЧ 25°"
metadata/bit = 3
metadata/device = "ПРД-Н1"
[node name="CheckBox5" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]]
layout_mode = 2
text = "ЛУЧ 35°"
metadata/bit = 4
metadata/device = "ПРД-Н1"
[node name="CheckBox6" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]]
layout_mode = 2
text = "ЛУЧ 45°"
metadata/bit = 5
metadata/device = "ПРД-Н1"
[node name="CheckBox7" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]]
layout_mode = 2
text = "ЛУЧ КОНТРОЛЬ"
metadata/bit = 6
metadata/device = "ПРД-Н1"
[node name="GridContainer2" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar/ug"]
layout_mode = 2
[node name="CheckBox" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]]
layout_mode = 2
text = "АТТ 0 dB"
metadata/att = 0
metadata/device = "ПРД-Н1"
[node name="CheckBox2" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]]
layout_mode = 2
text = "АТТ 0.5 dB"
metadata/bit = 1
metadata/device = "ПРД-Н1"
[node name="CheckBox3" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]]
layout_mode = 2
text = "АТТ 2 dB"
metadata/bit = 2
metadata/device = "ПРД-Н1"
[node name="CheckBox4" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]]
layout_mode = 2
text = "АТТ 2.5 dB"
metadata/bit = 3
metadata/device = "ПРД-Н1"
[node name="CheckBox5" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]]
layout_mode = 2
text = "АТТ 8 dB"
metadata/bit = 4
metadata/device = "ПРД-Н1"
[node name="CheckBox6" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]]
layout_mode = 2
text = "АТТ 8.5 dB"
metadata/bit = 5
metadata/device = "ПРД-Н1"
[node name="CheckBox7" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]]
layout_mode = 2
text = "АТТ 10 dB"
metadata/bit = 6
metadata/device = "ПРД-Н1"
[node name="CheckBox8" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]]
layout_mode = 2
text = "АТТ 10.5 dB"
metadata/bit = 7
metadata/device = "ПРД-Н1"
[node name="GridContainer5" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar/ug"]
layout_mode = 2
[node name="CheckBox" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]]
layout_mode = 2
text = "АТТ 0 dB"
metadata/bit = 0
metadata/device = "ПРД-Н1"
[node name="CheckBox2" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]]
layout_mode = 2
text = "АТТ 0.5 dB"
metadata/bit = 1
metadata/device = "ПРД-Н1"
[node name="CheckBox3" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]]
layout_mode = 2
text = "АТТ 2 dB"
metadata/bit = 2
metadata/device = "ПРД-Н1"
[node name="CheckBox4" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]]
layout_mode = 2
text = "АТТ 2.5 dB"
metadata/bit = 3
metadata/device = "ПРД-Н1"
[node name="CheckBox5" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]]
layout_mode = 2
text = "АТТ 8 dB"
metadata/bit = 4
metadata/device = "ПРД-Н1"
[node name="CheckBox6" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]]
layout_mode = 2
text = "АТТ 8.5 dB"
metadata/bit = 5
metadata/device = "ПРД-Н1"
[node name="CheckBox7" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]]
layout_mode = 2
text = "АТТ 10 dB"
metadata/bit = 6
metadata/device = "ПРД-Н1"
[node name="CheckBox8" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]]
layout_mode = 2
text = "АТТ 10.5 dB"
metadata/bit = 7
metadata/device = "ПРД-Н1"
[node name="GridContainer3" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar/ug"]
layout_mode = 2
[node name="CheckBox" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer3" groups=["ip"]]
layout_mode = 2
text = "МАА №1"
metadata/bit = 0
metadata/device = "ПРД-Н1"
[node name="CheckBox2" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer3" groups=["ip"]]
layout_mode = 2
text = "МАА №2"
metadata/bit = 1
metadata/device = "ПРД-Н1"
[node name="CheckBox3" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer3" groups=["ip"]]
layout_mode = 2
text = "ИП9-50 №1"
metadata/bit = 2
metadata/device = "ПРД-Н1"
[node name="CheckBox4" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer3" groups=["ip"]]
layout_mode = 2
text = "ИП9-50 №2"
metadata/bit = 3
metadata/device = "ПРД-Н1"
[node name="CheckBox5" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer3" groups=["ip"]]
layout_mode = 2
text = "ИП12-50 №1"
metadata/bit = 4
metadata/device = "ПРД-Н1"
[node name="CheckBox6" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer3" groups=["ip"]]
layout_mode = 2
text = "ИП5-25"
metadata/bit = 7
metadata/device = "ПРД-Н1"
[node name="dkm" type="GridContainer" parent="TabContainer/ПРД-Н1"]
layout_mode = 0
offset_left = 10.0

View File

@@ -43,6 +43,9 @@ var _timer: Timer
var _poll_timer: Timer
var _sockets_status_bit: int = 0
var _dkm_status_bit: int = 0
var _dry_contact_status_bit: int = 0xFF
var _dou_and_att_2_status_bit: Dictionary = {0x106: 0}
var _dou_and_att_3_status_bit: Dictionary = {0x108: 0}
var _isa_ports: Dictionary = {}
var _cmd_number_count: int = 0
var _written_isa_ports: Array = []
@@ -64,6 +67,8 @@ var ukp1_data: PackedByteArray:
print('Данные UKP1 обновлены')
func _init(name: String):
"""Инициализация UDP broadcast клиента"""
_self_name = name
@@ -188,6 +193,38 @@ func get_dkm_status() -> int:
return _dkm_status_bit
func set_dou2_status(status: int) -> void:
"""Установка статуса DOU"""
var masked_status = status & 0b111 # Маска для первых 3 битов
_dou_and_att_2_status_bit[0x106] = masked_status
func get_dou2_status() -> int:
"""Получение статуса DOU"""
return _dou_and_att_2_status_bit[0x106] & 0b111
func set_dou3_status(status: int) -> void:
"""Установка статуса DOU"""
var masked_status = status & 0b111 # Маска для первых 3 битов
_dou_and_att_3_status_bit[0x108] = masked_status
func get_dou3_status() -> int:
"""Получение статуса DOU"""
return _dou_and_att_3_status_bit[0x108] & 0b111
func set_ip_status(status: int)->void:
"""Установка статуса ИП"""
_dry_contact_status_bit = status
func get_ip_status()->int:
"""Получение статуса ИП"""
return _dry_contact_status_bit
func set_isa_port(port_addr: int, value: int) -> bool:
"""Установка значения ISA порта"""
if port_addr < 0 or port_addr > 0xFFFF:
@@ -276,7 +313,7 @@ func _form_status_device_packet() -> PackedByteArray:
_encode_packet_header(buffer)
_encode_device_data(buffer)
print('_written_isa_ports.size(): ', _written_isa_ports.size())
# Добавляем поле команды после статуса
if _written_isa_ports.size() > 0:
var cmd_offset = header_size + STATUS_PACKET_SIZE
@@ -343,9 +380,11 @@ func _encode_ems_g_data(buffer: PackedByteArray) -> void:
func _encode_ug_data(buffer: PackedByteArray) -> void:
"""Кодирование данных UG"""
buffer.encode_u16(UG_DATA_OFFSET, _dkm_status_bit) # Статус DKM
buffer.encode_u16(UG_DATA_OFFSET + 2, 0x059e) # DRY CONTACT
# D15...D8 = ДКМ (старший байт)
buffer.encode_u8(UG_DATA_OFFSET + 1, _dkm_status_bit & 0xFF)
# D7...D0 = Сухие контакты (младший байт)
buffer.encode_u8(UG_DATA_OFFSET, _dry_contact_status_bit & 0xFF)
func _encode_ukp_data(buffer: PackedByteArray) -> void:
"""Кодирование данных UKP"""