temp debug

This commit is contained in:
2024-12-13 03:26:25 +03:00
parent 3d43b6bccf
commit f5fc70fbd3
8 changed files with 584 additions and 568 deletions

315
PRD.gd
View File

@@ -1,315 +0,0 @@
extends Node2D
var unit = Yau07.YaU07.new('ЯУ07')
var soc_unicast: Socket
var soc_brodcast: Socket
var address: String = Constants.ADDRESSES[0][1]
var port: int = Constants.ADDRESSES[0][2]
var flag_mode = Constants.ADDRESSES[0][3]
var send_array: Array = []
var broadcast_packet: PackedByteArray
var node_select1: Node
var node_select2: Node
var timeout: float = Yau07.ONLINE_TIMEOUT
var last_update_time: float = 0.0
var flag_yau_control: bool
var CONTROL_TABLE: Array
var state = Constants.STATE.WAIT
var flag_read_isa: bool = false
## Класс для отправки данных в сокет
class Socket extends PacketPeerUDP:
func send_to(addr: String, port: int, data: PackedByteArray):
self.set_dest_address(addr, port)
self.put_packet(data)
func poll_receive(sock: Socket) -> bool: ## Приёмник
if timeout - last_update_time > 0:
while sock.get_available_packet_count() > 0:
broadcast_packet = sock.get_packet()
var addr_receive = sock.get_packet_ip()
var port_receive = sock.get_packet_port()
if (address == addr_receive) and (port == port_receive):
$control_dev/control_tbl.get_node2(0, 0).text = 'ЯУ-07Б НА СВЯЗИ'
$control_dev/control_tbl.get_node2(0, 0).modulate = Color.GREEN
last_update_time = 0.0
unit.parse(broadcast_packet)
else:
if sock.get_available_packet_count():
last_update_time = 0.0
else:
$control_dev/control_tbl.get_node2(0, 0).text = 'НЕТ СВЯЗИ С ЯУ-07Б'
$control_dev/control_tbl.get_node2(0, 0).modulate = Color.RED
return false
func _ready() -> void:
# Таблица УКП_1
node_select1 = $scroll1/table1
draw_tabl(node_select1, Constants.ROWS_REGS_DATA, Constants.ROWS_REGS_DATA.size())
node_select1.set_columns_min_size([120, 120])
node_select1.set_node_text(0, 0, 'Мощность')
node_select1.set_node_text(1, 0, 'Температура')
# Таблица УКП_2
node_select2 = $scroll2/table2
draw_tabl(node_select2, Constants.ROWS_UKP2_DATA, Constants.ROWS_UKP2_DATA.size())
node_select2.set_columns_min_size([120, 120])
node_select2.set_node_text(0, 0, 'Мощность')
node_select2.set_node_text(1, 0, 'Температура')
# Выбор прибора для подключения
var node_select_device = $select_dev/select_dev
draw_tabl(node_select_device, Constants.SELECT_DEVICE, Constants.SELECT_DEVICE.size())
var get_select_device = node_select_device.get_node2(1, 0)
# Заполнение адресов
for i_addr in Constants.ADDRESSES.size():
get_select_device.add_item(Constants.ADDRESSES[i_addr][0])
get_select_device.set_item_metadata(i_addr, Constants.ADDRESSES[i_addr].slice(1,4))
get_select_device.connect('item_selected', Callable(self, 'on_btn_select'))
node_select_device.get_node2(0,0).text = 'ПРИБОР'
node_select_device.set_columns_min_size([100, 100])
# Контроль
var node_control_device = $control_dev/control_tbl
for i in Constants.CONTROL_DEVICE.size():
CONTROL_TABLE.append([Constants.TableNode])
draw_tabl(node_control_device, CONTROL_TABLE, CONTROL_TABLE.size())
for i in Constants.CONTROL_DEVICE.size():
node_control_device.get_node2(0, i).text = Constants.CONTROL_DEVICE[i]
node_control_device.set_columns_min_size([300])
# Привязка для принятия широковещательного канала
soc_brodcast = Socket.new()
var rc = soc_brodcast.bind(Constants.BROADCAST_PORT, '*')
if rc != OK:
print('Ошибка: Неудачная привязка широковещательного адреса')
soc_unicast = Socket.new()
rc = soc_unicast.bind(Constants.UNICAST_PORT, Constants.UNICAST_ADDRESS)
if rc != OK:
print('Ошибка: неудачная привязка адреса: ', address)
$Zapret.connect('toggled', Callable(self, '_on_zapret').bind($Zapret))
$Zapret2.connect('toggled', Callable(self, '_on_zapret').bind($Zapret2))
unit.connect('line_changed', Callable(self, 'on_line_changed'))
unit.connect('command_fail', Callable(self, 'on_command_fail'))
unit.connect('command_done', Callable(self, 'on_command_done'))
unit.connect('data_received', Callable(self, 'data_received'))
## Рисует таблицу
func draw_tabl(tbl, row: Array, count_row: int):
for i_row in count_row:
tbl.add_row(row[i_row])
func _process(delta: float) -> void:
last_update_time += delta
poll_receive(soc_brodcast)
state_machine()
match unit.process(delta):
Error.OK: soc_unicast.send_to(address, port, unit.tx_data.slice(0, unit.tx_len))
Error.FAILED: print('Ошибка отправки данных')
func state_machine():
var fl_done = (unit.cmd_state == unit.CmdState.DONE)
## Режим ожидания
if state == Constants.STATE.WAIT and fl_done:
if flag_read_isa:
flag_read_isa = false
state = Constants.STATE.READ_ISA
elif send_array.size():
state = Constants.STATE.WRITE_ISA
## Режим чтения из ИСА
elif state == Constants.STATE.READ_ISA and fl_done:
unit.send_isa(unit.CmdCode.READ_ISA, [0x122, 0x128])
$ISA.text = 'ISA: ' + str(unit.isa_ports)
state = Constants.STATE.WAIT
## Режим записи в ИСА
elif state == Constants.STATE.WRITE_ISA and fl_done:
var ports_dict = send_array.pop_front()
var key = ports_dict.keys()
unit.send_isa(unit.CmdCode.WRITE_ISA, [key[0], ports_dict[key[0]]])
state = Constants.STATE.WAIT
func data_received(_unit):
var data_from_yau_07 = unit.status
var status_board = data_from_yau_07.decode_u8(Constants.DataIndices.STATUS_BOARD)
var in_blank: int = data_from_yau_07.decode_u16(Constants.DataIndices.IN_BLANK_PRD)
var in_imp: int = data_from_yau_07.decode_u16(Constants.DataIndices.IN_IMPULS_PRD)
var out_blank: int = data_from_yau_07.decode_u16(Constants.DataIndices.OUT_BLANK_PRD)
var out_imp: int = data_from_yau_07.decode_u16(Constants.DataIndices.OUT_IMPULS_PRD)
var dry_contact: int = data_from_yau_07.decode_u16(Constants.DataIndices.DRY_CONTACT) # Контроль сухих контактов (УГ)
var DKM: int = data_from_yau_07.decode_u16(Constants.DataIndices.DKM) # ДКМ от УГ
## УГ
#node_select1.set_node_text(2, 0, '%d' % dry_contact)
var node_control_device = $control_dev/control_tbl
for i in 4:
var node_board = node_control_device.get_node2(0, i+2)
var j = int(status_board & (1 << i) == 0 and flag_yau_control)
node_board.text = Constants.CONTROL_BOARD[i][j]
node_board.modulate = [Color.GREEN, Color.RED][j]
for i in 8:
var node_power_supply = node_control_device.get_node2(0, i+6)
var j = int(not(dry_contact & (1 << i) == 0 and flag_yau_control))
node_power_supply.text = Constants.CONTROL_POWER_SUPPLY[i][j]
node_power_supply.modulate = [Color.GREEN, Color.RED][j]
## EMS G
var CONTROL_FRAME = [$control_dev/SZI_x, $control_dev/SZI_x2, $control_dev/SZI_x3, $control_dev/SZI_x4, $control_dev/SZI_x5]
for i in 5:
var node_ems_g = node_control_device.get_node2(0, i + 14)
var j: int = 0
var frame = Constants.Frame.WORK
var in_bit_blank_UF = 1 if Constants.MODE.PRD_H == flag_mode else 3 if Constants.MODE.PRD_K == flag_mode else 6
var in_bit_blank_FS = 9 if Constants.MODE.PRD_H == flag_mode else 11 if Constants.MODE.PRD_K == flag_mode else 13
var in_bit_impuls_UF = 1 if Constants.MODE.PRD_H == flag_mode else 3 if Constants.MODE.PRD_K == flag_mode else 6
var in_bit_impuls_FS = 9 if Constants.MODE.PRD_H == flag_mode else 11 if Constants.MODE.PRD_K == flag_mode else 13
###
var out_bit_blank_UF = 1 if Constants.MODE.PRD_H == flag_mode else 1 if Constants.MODE.PRD_K == flag_mode else 0
var out_bit_blank_MODUL = 4 if Constants.MODE.PRD_H == flag_mode else 4 if Constants.MODE.PRD_K == flag_mode else 4
var out_bit_blank_FGOZ = 9 if Constants.MODE.PRD_H == flag_mode else 8 if Constants.MODE.PRD_K == flag_mode else 8
var out_bit_impuls_UF = 1 if Constants.MODE.PRD_H == flag_mode else 1 if Constants.MODE.PRD_K == flag_mode else 0
var out_bit_impuls_MODUL = 4 if Constants.MODE.PRD_H == flag_mode else 4 if Constants.MODE.PRD_K == flag_mode else 4
var out_bit_impuls_FGOZ = 9 if Constants.MODE.PRD_H == flag_mode else 8 if Constants.MODE.PRD_K == flag_mode else 8
if (in_blank & (1 << in_bit_blank_UF) != 0) and flag_yau_control:
j = 1 if i == 0 else 0
frame = Constants.Frame.CONSTANT if i == 0 else Constants.Frame.WORK
elif (in_imp & (1 << in_bit_impuls_UF) != 0) and flag_yau_control:
j = 1 if i == 0 else 0
frame = Constants.Frame.VARIABLE if i == 0 else Constants.Frame.WORK
if (in_blank & (1 << in_bit_blank_FS) != 0) and flag_yau_control:
j = 1 if i == 1 else 0
frame = Constants.Frame.CONSTANT if i == 1 else Constants.Frame.WORK
elif (in_imp & (1 << in_bit_impuls_FS) != 0) and flag_yau_control:
j = 1 if i == 1 else 0
frame = Constants.Frame.VARIABLE if i == 1 else Constants.Frame.WORK
if (out_blank & (1 << out_bit_blank_UF) != 0) and flag_yau_control:
j = 1 if i == 2 else 0
frame = Constants.Frame.CONSTANT if i == 2 else Constants.Frame.WORK
elif (out_imp & (1 << out_bit_impuls_UF) != 0) and flag_yau_control:
j = 1 if i == 2 else 0
frame = Constants.Frame.VARIABLE if i == 2 else Constants.Frame.WORK
if (out_blank & (1 << out_bit_blank_MODUL) != 0) and flag_yau_control:
j = 1 if i == 3 else 0
frame = Constants.Frame.CONSTANT if i == 3 else Constants.Frame.WORK
elif (out_imp & (1 << out_bit_impuls_MODUL) != 0) and flag_yau_control:
j = 1 if i == 3 else 0
frame = Constants.Frame.VARIABLE if i == 3 else Constants.Frame.WORK
if (out_blank & (1 << out_bit_blank_FGOZ) != 0) and flag_yau_control:
j = 1 if i == 4 else 0
frame = Constants.Frame.CONSTANT if i == 4 else Constants.Frame.WORK
elif (out_imp & (1 << out_bit_impuls_FGOZ) != 0) and flag_yau_control:
j = 1 if i == 4 else 0
frame = Constants.Frame.VARIABLE if i == 4 else Constants.Frame.WORK
node_ems_g.text = Constants.EMS_G[i][j]
node_ems_g.modulate = [Color.RED, Color.GREEN][j]
set_frame(frame, CONTROL_FRAME[i])
#node_select1.set_node_text(3, 0, '%d' % DKM)
## УКП
for i in range(8): ## Мощность от УКП_1
var power_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_1 + 2 * i)
node_select1.set_node_text(0, i+1, '%d' % power_ukp_1)
for i in range(8): ## Температура от УКП_1
var temperature_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_1 + 2 * i)
var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * Constants.TEMP
node_select1.set_node_text(1, i+1, '%d' % TMP)
for i in range(8): ## Мощность от УКП_2
var power_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_2 + 2 * i)
node_select2.set_node_text(0, i+1, '%d' % power_ukp_2)
for row in range(8): ## Температура от УКП_2
if len(data_from_yau_07) > 79 + 2 * row:
var temperature_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * row)
var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * Constants.TEMP
node_select2.set_node_text(1, row+1, '%d' % TMP)
func set_frame(val: int, node: Node): node.set_frame(val)
#func dec2bin(decimal_value, number_bit):
#var binary_string = ''
#var count = number_bit
#while(count >= 0):
#var temp: int = decimal_value >> count
#binary_string += '%d' % (temp & 1)
#count -= 1
#return binary_string
func on_line_changed(_unit) -> void:
if unit.online:
flag_yau_control = true
else:
for i in 15:
var node_board = $control_dev/control_tbl.get_node2(0, i+1)
node_board.modulate = Color.RED
flag_yau_control = false
## Ессли отсутствует подключение к ячейке ЯУ-07
func on_command_fail(_unit) -> void:
print_debug('Command send fail')
## Индикация чтения портов
func on_command_done(_unit) -> void:
pass
func _on_control_button(toggled_on: bool) -> void:
$control_dev.visible = toggled_on
$Controlpanel.visible = toggled_on
func on_btn_select(intem_from_sector):
var node_select_device = $select_dev/select_dev
var get_select_device = node_select_device.get_node2(1, 0)
var meta = get_select_device.get_item_metadata(intem_from_sector)
address = meta[0]
port = meta[1]
flag_mode = meta[2]
func fill_item(node, i_column: int, i_row: int, arr: Dictionary, select: int = 0):
var optionbutton = node.get_node2(i_column, i_row) as OptionButton
for key in arr.keys():
var item_text = key + " - " + str(arr[key])
optionbutton.add_item(item_text)
if select < arr.size():
optionbutton.select(select)
func _on_zapret(toggled_on: bool, meta) -> void:
var address_port_wr = 0x122
var ports_wr: Dictionary = {address_port_wr : meta.get_meta('litera')} ## СИ2, СИ4, СИ6 = 0x30, СИ3, СИ5, СИ7 = 0x31, СИ1 = 0x2F
send_array.append(ports_wr)
ports_wr = {}
address_port_wr = 0x128
ports_wr[address_port_wr] = 0x4000 if toggled_on else 0x0
send_array.append(ports_wr)
func _on_read_isa_pressed() -> void:
flag_read_isa = true

View File

@@ -1,6 +1,6 @@
[gd_scene load_steps=26 format=3 uid="uid://cvor2jm4xk3ha"]
[gd_scene load_steps=39 format=3 uid="uid://cvor2jm4xk3ha"]
[ext_resource type="Script" path="res://PRD.gd" id="1_v273n"]
[ext_resource type="Script" path="res://scripts/PRD.gd" id="1_v273n"]
[ext_resource type="Script" path="res://table/table.gd" id="2_vmbyo"]
[ext_resource type="Material" uid="uid://s6xe8igevnv2" path="res://Shaders/shader_edu.tres" id="3_3syd3"]
[ext_resource type="Shader" path="res://Shaders/ray.gdshader" id="4_uy5o2"]
@@ -62,12 +62,40 @@ corner_radius_bottom_left = 3
corner_detail = 3
anti_aliasing = false
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_h8aei"]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_d322q"]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_8j02b"]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_ls6vm"]
[sub_resource type="Theme" id="Theme_k5ur4"]
Button/styles/disabled = SubResource("StyleBoxFlat_ewq4n")
Button/styles/focus = SubResource("StyleBoxFlat_wlyk3")
Button/styles/hover = SubResource("StyleBoxFlat_2vbj6")
Button/styles/normal = SubResource("StyleBoxFlat_dm3xa")
Button/styles/pressed = SubResource("StyleBoxFlat_h7n4k")
TabContainer/styles/panel = SubResource("StyleBoxTexture_h8aei")
TabContainer/styles/tab_focus = SubResource("StyleBoxTexture_d322q")
TabContainer/styles/tab_selected = SubResource("StyleBoxTexture_8j02b")
TabContainer/styles/tabbar_background = SubResource("StyleBoxTexture_ls6vm")
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_rh6pm"]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_x11tp"]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_mn8w2"]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_21lc8"]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_k08q3"]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_dklg6"]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_17le6"]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_tn8m6"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ovl8a"]
bg_color = Color(0.388235, 0.227451, 0.290196, 1)
@@ -94,6 +122,20 @@ animations = [{
"speed": 5.0
}]
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_7u7p7"]
[sub_resource type="Gradient" id="Gradient_jlp41"]
colors = PackedColorArray(0, 0.647059, 0, 1, 0, 0.266667, 0, 1)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_u3yy8"]
gradient = SubResource("Gradient_jlp41")
fill = 1
fill_from = Vector2(0.5, 0.5)
fill_to = Vector2(1.145, 0)
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_otisn"]
texture = SubResource("GradientTexture2D_u3yy8")
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_723du"]
size = Vector2(1600, 1200)
@@ -114,41 +156,34 @@ shader_parameter/turn = 0.785
[sub_resource type="GradientTexture2D" id="GradientTexture2D_0pk2o"]
gradient = SubResource("Gradient_ki0n7")
[sub_resource type="Gradient" id="Gradient_jlp41"]
colors = PackedColorArray(0, 0.647059, 0, 1, 0, 0.266667, 0, 1)
[sub_resource type="GradientTexture2D" id="GradientTexture2D_u3yy8"]
gradient = SubResource("Gradient_jlp41")
fill = 1
fill_from = Vector2(0.5, 0.5)
fill_to = Vector2(1.145, 0)
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_otisn"]
texture = SubResource("GradientTexture2D_u3yy8")
[node name="Node2D" type="Node2D"]
script = ExtResource("1_v273n")
[node name="Background" type="ColorRect" parent="."]
offset_right = 2226.0
offset_bottom = 1153.0
offset_right = 1941.0
offset_bottom = 988.0
color = Color(0.356863, 0.278431, 0.356863, 1)
metadata/_edit_lock_ = true
[node name="Litera_2_4_6" type="ColorRect" parent="Background"]
visible = false
layout_mode = 0
offset_top = 54.0
offset_right = 2182.0
offset_right = 1941.0
offset_bottom = 344.0
color = Color(0.586231, 0.481877, 0.585869, 1)
[node name="Litera_3_5_7" type="ColorRect" parent="Background"]
visible = false
layout_mode = 0
offset_top = 352.0
offset_right = 2182.0
offset_bottom = 642.0
offset_right = 1941.0
offset_bottom = 656.0
color = Color(0.669446, 0.567301, 0.66881, 1)
[node name="Litera_1" type="ColorRect" parent="Background"]
visible = false
layout_mode = 0
offset_top = 647.0
offset_right = 2182.0
offset_bottom = 793.0
@@ -166,11 +201,48 @@ layout_mode = 2
script = ExtResource("2_vmbyo")
metadata/_edit_lock_ = true
[node name="control_button" type="Button" parent="."]
offset_left = 24.0
offset_top = 53.0
offset_right = 118.0
offset_bottom = 81.0
[node name="ISA" type="Label" parent="."]
offset_left = 1244.0
offset_top = 11.0
offset_right = 1495.0
offset_bottom = 34.0
[node name="read_isa" type="Button" parent="."]
offset_left = 1104.0
offset_top = 7.0
offset_right = 1229.0
offset_bottom = 38.0
text = "Прочитать ISA"
[node name="TabContainer" type="TabContainer" parent="."]
offset_top = 39.0
offset_right = 1941.0
offset_bottom = 917.0
theme = SubResource("Theme_k5ur4")
theme_override_colors/font_unselected_color = Color(0, 0, 0, 0.0392157)
theme_override_colors/font_selected_color = Color(0, 0, 0, 0)
theme_override_styles/tab_focus = SubResource("StyleBoxTexture_rh6pm")
theme_override_styles/tab_disabled = SubResource("StyleBoxTexture_x11tp")
theme_override_styles/tabbar_background = SubResource("StyleBoxTexture_mn8w2")
theme_override_styles/panel = SubResource("StyleBoxTexture_21lc8")
theme_override_styles/tab_selected = SubResource("StyleBoxTexture_k08q3")
theme_override_styles/tab_hovered = SubResource("StyleBoxTexture_dklg6")
theme_override_styles/tab_unselected = SubResource("StyleBoxTexture_17le6")
tab_alignment = 2
current_tab = 1
tab_focus_mode = 0
[node name="ControlPanel" type="Panel" parent="TabContainer"]
visible = false
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxTexture_tn8m6")
metadata/_tab_index = 0
[node name="control_button" type="Button" parent="TabContainer/ControlPanel"]
offset_left = 8.0
offset_top = 40.0
offset_right = 102.0
offset_bottom = 68.0
focus_mode = 0
mouse_default_cursor_shape = 2
theme = SubResource("Theme_k5ur4")
@@ -180,142 +252,90 @@ toggle_mode = true
button_pressed = true
text = "КОНТРОЛЬ"
[node name="Controlpanel" type="ColorRect" parent="."]
offset_left = 118.0
offset_top = 53.0
offset_right = 465.0
offset_bottom = 609.0
[node name="Controlpanel" type="ColorRect" parent="TabContainer/ControlPanel"]
offset_left = 102.0
offset_top = 40.0
offset_right = 449.0
offset_bottom = 596.0
color = Color(0.390334, 0.227948, 0.288326, 1)
[node name="control_dev" type="ScrollContainer" parent="."]
offset_left = 142.0
offset_top = 63.0
offset_right = 477.0
offset_bottom = 647.0
metadata/_edit_lock_ = true
[node name="control_dev" type="ScrollContainer" parent="TabContainer/ControlPanel"]
offset_left = 126.0
offset_top = 50.0
offset_right = 461.0
offset_bottom = 634.0
[node name="control_tbl" type="GridContainer" parent="control_dev"]
[node name="control_tbl" type="GridContainer" parent="TabContainer/ControlPanel/control_dev"]
layout_mode = 2
script = ExtResource("2_vmbyo")
metadata/_edit_lock_ = true
[node name="SZI_x" type="AnimatedSprite2D" parent="control_dev"]
[node name="SZI_x" type="AnimatedSprite2D" parent="TabContainer/ControlPanel/control_dev"]
position = Vector2(284, 404)
sprite_frames = SubResource("SpriteFrames_vex4t")
metadata/_edit_lock_ = true
[node name="SZI_x2" type="AnimatedSprite2D" parent="control_dev"]
[node name="SZI_x2" type="AnimatedSprite2D" parent="TabContainer/ControlPanel/control_dev"]
position = Vector2(284, 432)
sprite_frames = SubResource("SpriteFrames_vex4t")
metadata/_edit_lock_ = true
[node name="SZI_x3" type="AnimatedSprite2D" parent="control_dev"]
[node name="SZI_x3" type="AnimatedSprite2D" parent="TabContainer/ControlPanel/control_dev"]
position = Vector2(284, 460)
sprite_frames = SubResource("SpriteFrames_vex4t")
metadata/_edit_lock_ = true
[node name="SZI_x4" type="AnimatedSprite2D" parent="control_dev"]
[node name="SZI_x4" type="AnimatedSprite2D" parent="TabContainer/ControlPanel/control_dev"]
position = Vector2(284, 488)
sprite_frames = SubResource("SpriteFrames_vex4t")
metadata/_edit_lock_ = true
[node name="SZI_x5" type="AnimatedSprite2D" parent="control_dev"]
[node name="SZI_x5" type="AnimatedSprite2D" parent="TabContainer/ControlPanel/control_dev"]
position = Vector2(284, 517)
sprite_frames = SubResource("SpriteFrames_vex4t")
metadata/_edit_lock_ = true
[node name="scroll1" type="ScrollContainer" parent="."]
[node name="PRD" type="Panel" parent="TabContainer"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxTexture_7u7p7")
metadata/_tab_index = 1
[node name="scroll1" type="ScrollContainer" parent="TabContainer/PRD"]
offset_left = 985.0
offset_top = 63.0
offset_top = 3.0
offset_right = 1348.0
offset_bottom = 344.0
offset_bottom = 284.0
metadata/_edit_lock_ = true
[node name="table1" type="GridContainer" parent="scroll1"]
[node name="table1" type="GridContainer" parent="TabContainer/PRD/scroll1"]
layout_mode = 2
script = ExtResource("2_vmbyo")
metadata/_edit_lock_ = true
[node name="scroll2" type="ScrollContainer" parent="."]
[node name="scroll2" type="ScrollContainer" parent="TabContainer/PRD"]
offset_left = 985.0
offset_top = 367.0
offset_top = 307.0
offset_right = 1348.0
offset_bottom = 655.0
offset_bottom = 595.0
metadata/_edit_lock_ = true
[node name="table2" type="GridContainer" parent="scroll2"]
[node name="table2" type="GridContainer" parent="TabContainer/PRD/scroll2"]
layout_mode = 2
script = ExtResource("2_vmbyo")
metadata/_edit_lock_ = true
[node name="PSK" type="Sprite2D" parent="."]
material = ExtResource("3_3syd3")
position = Vector2(1388.25, 65)
scale = Vector2(0.247968, 0.234167)
texture = SubResource("PlaceholderTexture2D_723du")
offset = Vector2(800, 600)
script = SubResource("GDScript_0sobq")
[node name="PSK grad" type="TextureRect" parent="PSK"]
modulate = Color(0, 0, 0, 1)
self_modulate = Color(0, 0, 0, 1)
show_behind_parent = true
material = SubResource("ShaderMaterial_o7txs")
offset_left = 554.954
offset_top = -30.0
offset_right = 1290.95
offset_bottom = 1134.0
texture = ExtResource("5_i3nvb")
expand_mode = 1
metadata/_edit_lock_ = true
[node name="ray" type="Sprite2D" parent="PSK"]
material = SubResource("ShaderMaterial_dgiai")
position = Vector2(549.221, 560.705)
scale = Vector2(21.8765, 21.6782)
texture = SubResource("GradientTexture2D_0pk2o")
metadata/_edit_lock_ = true
[node name="PSK2" type="Sprite2D" parent="."]
material = ExtResource("3_3syd3")
position = Vector2(1388, 362)
scale = Vector2(0.247968, 0.234167)
texture = SubResource("PlaceholderTexture2D_723du")
offset = Vector2(800, 600)
script = SubResource("GDScript_0sobq")
[node name="PSK grad" type="TextureRect" parent="PSK2"]
modulate = Color(0, 0, 0, 1)
self_modulate = Color(0, 0, 0, 1)
show_behind_parent = true
material = SubResource("ShaderMaterial_o7txs")
offset_left = 554.954
offset_top = -30.0
offset_right = 1290.95
offset_bottom = 1134.0
texture = ExtResource("5_i3nvb")
expand_mode = 1
metadata/_edit_lock_ = true
[node name="ray" type="Sprite2D" parent="PSK2"]
material = SubResource("ShaderMaterial_dgiai")
position = Vector2(549.221, 560.705)
scale = Vector2(21.8765, 21.6782)
texture = SubResource("GradientTexture2D_0pk2o")
metadata/_edit_lock_ = true
[node name="LABEL" type="Label" parent="."]
[node name="LABEL" type="Label" parent="TabContainer/PRD"]
offset_left = 594.0
offset_top = 53.0
offset_top = -7.0
offset_right = 876.0
offset_bottom = 76.0
offset_bottom = 16.0
text = "ЛИТЕРА 2! ПРД-Н!"
[node name="Zapret" type="Button" parent="."]
[node name="Zapret" type="Button" parent="TabContainer/PRD"]
offset_left = 594.0
offset_top = 81.0
offset_top = 21.0
offset_right = 712.0
offset_bottom = 115.0
offset_bottom = 55.0
focus_mode = 0
mouse_default_cursor_shape = 2
theme_override_styles/pressed = SubResource("StyleBoxTexture_otisn")
@@ -323,18 +343,18 @@ toggle_mode = true
text = " Запрет СИ2"
metadata/litera = 48
[node name="LABEL2" type="Label" parent="."]
[node name="LABEL2" type="Label" parent="TabContainer/PRD"]
offset_left = 594.0
offset_top = 365.0
offset_top = 305.0
offset_right = 876.0
offset_bottom = 388.0
offset_bottom = 328.0
text = "ЛИТЕРА 3! ПРД-Н!"
[node name="Zapret2" type="Button" parent="."]
[node name="Zapret2" type="Button" parent="TabContainer/PRD"]
offset_left = 594.0
offset_top = 393.0
offset_top = 333.0
offset_right = 712.0
offset_bottom = 427.0
offset_bottom = 367.0
focus_mode = 0
mouse_default_cursor_shape = 2
theme_override_styles/pressed = SubResource("StyleBoxTexture_otisn")
@@ -342,70 +362,113 @@ toggle_mode = true
text = " Запрет СИ3"
metadata/litera = 49
[node name="Label_luch" type="Label" parent="."]
[node name="Label_luch" type="Label" parent="TabContainer/PRD"]
offset_left = 594.0
offset_top = 136.0
offset_top = 76.0
offset_right = 876.0
offset_bottom = 159.0
offset_bottom = 99.0
text = "Номер и направление луча"
[node name="LUCH" type="OptionButton" parent="."]
[node name="LUCH" type="OptionButton" parent="TabContainer/PRD"]
offset_left = 594.0
offset_top = 168.0
offset_top = 108.0
offset_right = 712.0
offset_bottom = 199.0
offset_bottom = 139.0
item_count = 2
popup/item_0/text = "Что-то"
popup/item_1/text = "Что-то"
popup/item_1/id = 1
[node name="ISA" type="Label" parent="."]
offset_left = 1492.0
offset_top = 11.0
offset_right = 1743.0
offset_bottom = 34.0
[node name="read_isa" type="Button" parent="."]
offset_left = 1360.0
offset_top = 7.0
offset_right = 1483.0
offset_bottom = 38.0
text = "Прочитать ISA"
[node name="Modul" type="Label" parent="."]
[node name="Modul" type="Label" parent="TabContainer/PRD"]
offset_left = 594.0
offset_top = 438.0
offset_top = 378.0
offset_right = 738.0
offset_bottom = 461.0
offset_bottom = 401.0
text = "Модуляция"
[node name="DKM2" type="Label" parent="."]
[node name="DKM2" type="Label" parent="TabContainer/PRD"]
offset_left = 594.0
offset_top = 219.0
offset_top = 159.0
offset_right = 736.0
offset_bottom = 242.0
offset_bottom = 182.0
text = "ДКМ ДОУ 2"
[node name="DKM3" type="Label" parent="."]
[node name="DKM3" type="Label" parent="TabContainer/PRD"]
offset_left = 594.0
offset_top = 467.0
offset_top = 407.0
offset_right = 736.0
offset_bottom = 490.0
offset_bottom = 430.0
text = "ДКМ ДОУ 3"
[node name="FGOZ2" type="Label" parent="."]
[node name="FGOZ2" type="Label" parent="TabContainer/PRD"]
offset_left = 594.0
offset_top = 242.0
offset_top = 182.0
offset_right = 767.0
offset_bottom = 265.0
offset_bottom = 205.0
text = "ФГОЗ 2"
[node name="FGOZ3" type="Label" parent="."]
[node name="FGOZ3" type="Label" parent="TabContainer/PRD"]
offset_left = 594.0
offset_top = 490.0
offset_top = 430.0
offset_right = 767.0
offset_bottom = 513.0
offset_bottom = 453.0
text = "ФГОЗ 3"
[connection signal="toggled" from="control_button" to="." method="_on_control_button"]
[node name="PSK" type="Sprite2D" parent="TabContainer/PRD"]
material = ExtResource("3_3syd3")
position = Vector2(1388.25, 5)
scale = Vector2(0.247968, 0.234167)
texture = SubResource("PlaceholderTexture2D_723du")
offset = Vector2(800, 600)
script = SubResource("GDScript_0sobq")
[node name="PSK grad" type="TextureRect" parent="TabContainer/PRD/PSK"]
modulate = Color(0, 0, 0, 1)
self_modulate = Color(0, 0, 0, 1)
show_behind_parent = true
material = SubResource("ShaderMaterial_o7txs")
offset_left = 554.954
offset_top = -30.0
offset_right = 1290.95
offset_bottom = 1134.0
texture = ExtResource("5_i3nvb")
expand_mode = 1
metadata/_edit_lock_ = true
[node name="ray" type="Sprite2D" parent="TabContainer/PRD/PSK"]
material = SubResource("ShaderMaterial_dgiai")
position = Vector2(549.221, 560.705)
scale = Vector2(21.8765, 21.6782)
texture = SubResource("GradientTexture2D_0pk2o")
metadata/_edit_lock_ = true
[node name="PSK2" type="Sprite2D" parent="TabContainer/PRD"]
material = ExtResource("3_3syd3")
position = Vector2(1388, 302)
scale = Vector2(0.247968, 0.234167)
texture = SubResource("PlaceholderTexture2D_723du")
offset = Vector2(800, 600)
script = SubResource("GDScript_0sobq")
[node name="PSK grad" type="TextureRect" parent="TabContainer/PRD/PSK2"]
modulate = Color(0, 0, 0, 1)
self_modulate = Color(0, 0, 0, 1)
show_behind_parent = true
material = SubResource("ShaderMaterial_o7txs")
offset_left = 554.954
offset_top = -30.0
offset_right = 1290.95
offset_bottom = 1134.0
texture = ExtResource("5_i3nvb")
expand_mode = 1
metadata/_edit_lock_ = true
[node name="ray" type="Sprite2D" parent="TabContainer/PRD/PSK2"]
material = SubResource("ShaderMaterial_dgiai")
position = Vector2(549.221, 560.705)
scale = Vector2(21.8765, 21.6782)
texture = SubResource("GradientTexture2D_0pk2o")
metadata/_edit_lock_ = true
[connection signal="pressed" from="read_isa" to="." method="_on_read_isa_pressed"]
[connection signal="toggled" from="TabContainer/ControlPanel/control_button" to="." method="_on_control_button"]

View File

@@ -17,13 +17,14 @@ config/icon="res://icon.svg"
[autoload]
Constants="*res://constants.gd"
Yau07="*res://yau07.gd"
Constants="*res://scripts/constants.gd"
Yau07="*res://scripts/yau07.gd"
Network="*res://scripts/network.gd"
[display]
window/size/viewport_width=1800
window/size/viewport_height=800
window/size/viewport_width=1900
window/size/viewport_height=940
[rendering]

251
scripts/PRD.gd Normal file
View File

@@ -0,0 +1,251 @@
extends Node2D
#var unit = Yau07.YaU07.new('ЯУ07')
var flag_mode = Constants.ADDRESSES[0][3]
var broadcast_packet: PackedByteArray
var node_select1: Node
var node_select2: Node
var flag_yau_control: bool
var CONTROL_TABLE: Array
func _ready() -> void:
# Таблица УКП_1
node_select1 = $TabContainer/PRD/scroll1/table1
draw_tabl(node_select1, Constants.ROWS_REGS_DATA, Constants.ROWS_REGS_DATA.size())
node_select1.set_columns_min_size([120, 120])
node_select1.set_node_text(0, 0, 'Мощность')
node_select1.set_node_text(1, 0, 'Температура')
# Таблица УКП_2
node_select2 = $TabContainer/PRD/scroll2/table2
draw_tabl(node_select2, Constants.ROWS_UKP2_DATA, Constants.ROWS_UKP2_DATA.size())
node_select2.set_columns_min_size([120, 120])
node_select2.set_node_text(0, 0, 'Мощность')
node_select2.set_node_text(1, 0, 'Температура')
# Выбор прибора для подключения
var node_select_device = $select_dev/select_dev
draw_tabl(node_select_device, Constants.SELECT_DEVICE, Constants.SELECT_DEVICE.size())
var get_select_device = node_select_device.get_node2(1, 0)
# Заполнение адресов
for i_addr in Constants.ADDRESSES.size():
get_select_device.add_item(Constants.ADDRESSES[i_addr][0])
get_select_device.set_item_metadata(i_addr, Constants.ADDRESSES[i_addr].slice(1,4))
get_select_device.connect('item_selected', Callable(self, 'on_btn_select'))
node_select_device.get_node2(0,0).text = 'ПРИБОР'
node_select_device.set_columns_min_size([100, 100])
# Контроль
var node_control_device = $TabContainer/ControlPanel/control_dev/control_tbl
for i in Constants.CONTROL_DEVICE.size():
CONTROL_TABLE.append([Constants.TableNode])
draw_tabl(node_control_device, CONTROL_TABLE, CONTROL_TABLE.size())
for i in Constants.CONTROL_DEVICE.size():
node_control_device.get_node2(0, i).text = Constants.CONTROL_DEVICE[i]
node_control_device.set_columns_min_size([300])
$TabContainer/PRD/Zapret.connect('toggled', Callable(self, '_on_zapret').bind($TabContainer/PRD/Zapret))
$TabContainer/PRD/Zapret2.connect('toggled', Callable(self, '_on_zapret').bind($TabContainer/PRD/Zapret2))
Network.connect('_yau_status_line', Callable(self, '_on_yau_status'))
Network.connect('_yau_receive', Callable(self, '_on_data_received'))
Network.connect('_yau_read_isa', Callable(self, '_on_read_isa'))
## From Network status about yau-07
func _on_yau_status(yau_status):
if yau_status:
$TabContainer/ControlPanel/control_dev/control_tbl.get_node2(0, 0).text = 'ЯУ-07Б НА СВЯЗИ'
$TabContainer/ControlPanel/control_dev/control_tbl.get_node2(0, 0).modulate = Color.GREEN
flag_yau_control = true
else:
$TabContainer/ControlPanel/control_dev/control_tbl.get_node2(0, 0).text = 'НЕТ СВЯЗИ С ЯУ-07Б'
$TabContainer/ControlPanel/control_dev/control_tbl.get_node2(0, 0).modulate = Color.RED
for dev in (Constants.CONTROL_DEVICE.size() - 1):
var node_board = $TabContainer/ControlPanel/control_dev/control_tbl.get_node2(0, dev+1)
node_board.modulate = Color.RED
flag_yau_control = false
func _on_read_isa(unit_isa_ports):
$ISA.text = 'ISA: ' + str(unit_isa_ports)
## Рисует таблицу
func draw_tabl(tbl, row: Array, count_row: int):
for i_row in count_row:
tbl.add_row(row[i_row])
func _process(delta: float) -> void:
pass
func _on_data_received(data_from_yau_07):
if flag_yau_control:
var status_board = data_from_yau_07.decode_u8(Constants.DataIndices.STATUS_BOARD)
var in_blank: int = data_from_yau_07.decode_u16(Constants.DataIndices.IN_BLANK_PRD)
var in_imp: int = data_from_yau_07.decode_u16(Constants.DataIndices.IN_IMPULS_PRD)
var out_blank: int = data_from_yau_07.decode_u16(Constants.DataIndices.OUT_BLANK_PRD)
var out_imp: int = data_from_yau_07.decode_u16(Constants.DataIndices.OUT_IMPULS_PRD)
var dry_contact: int = data_from_yau_07.decode_u16(Constants.DataIndices.DRY_CONTACT) # Контроль сухих контактов (УГ)
var _DKM: int = data_from_yau_07.decode_u16(Constants.DataIndices.DKM) # ДКМ от УГ
## УГ
#node_select1.set_node_text(2, 0, '%d' % dry_contact)
var node_control_device = $TabContainer/ControlPanel/control_dev/control_tbl
for i in 4:
var node_board = node_control_device.get_node2(0, i+2)
var j = int(status_board & (1 << i) == 0 and flag_yau_control)
node_board.text = Constants.CONTROL_BOARD[i][j]
node_board.modulate = [Color.GREEN, Color.RED][j]
for i in 8:
var node_power_supply = node_control_device.get_node2(0, i+6)
var j = int(not(dry_contact & (1 << i) == 0 and flag_yau_control))
node_power_supply.text = Constants.CONTROL_POWER_SUPPLY[i][j]
node_power_supply.modulate = [Color.GREEN, Color.RED][j]
## EMS G
var CONTROL_FRAME = [$TabContainer/ControlPanel/control_dev/SZI_x, $TabContainer/ControlPanel/control_dev/SZI_x2, $TabContainer/ControlPanel/control_dev/SZI_x3, $TabContainer/ControlPanel/control_dev/SZI_x4, $TabContainer/ControlPanel/control_dev/SZI_x5]
for i in 5:
var node_ems_g = node_control_device.get_node2(0, i + 14)
var j: int = 0
var frame = Constants.Frame.WORK
var in_bit_blank_UF = 1 if Constants.MODE.PRD_H == flag_mode else 3 if Constants.MODE.PRD_K == flag_mode else 6
var in_bit_blank_FS = 9 if Constants.MODE.PRD_H == flag_mode else 11 if Constants.MODE.PRD_K == flag_mode else 13
var in_bit_impuls_UF = 1 if Constants.MODE.PRD_H == flag_mode else 3 if Constants.MODE.PRD_K == flag_mode else 6
var in_bit_impuls_FS = 9 if Constants.MODE.PRD_H == flag_mode else 11 if Constants.MODE.PRD_K == flag_mode else 13
###
var out_bit_blank_UF = 1 if Constants.MODE.PRD_H == flag_mode else 1 if Constants.MODE.PRD_K == flag_mode else 0
var out_bit_blank_MODUL = 4 if Constants.MODE.PRD_H == flag_mode else 4 if Constants.MODE.PRD_K == flag_mode else 4
var out_bit_blank_FGOZ = 9 if Constants.MODE.PRD_H == flag_mode else 8 if Constants.MODE.PRD_K == flag_mode else 8
var out_bit_impuls_UF = 1 if Constants.MODE.PRD_H == flag_mode else 1 if Constants.MODE.PRD_K == flag_mode else 0
var out_bit_impuls_MODUL = 4 if Constants.MODE.PRD_H == flag_mode else 4 if Constants.MODE.PRD_K == flag_mode else 4
var out_bit_impuls_FGOZ = 9 if Constants.MODE.PRD_H == flag_mode else 8 if Constants.MODE.PRD_K == flag_mode else 8
if (in_blank & (1 << in_bit_blank_UF) != 0) and flag_yau_control:
j = 1 if i == 0 else 0
frame = Constants.Frame.CONSTANT if i == 0 else Constants.Frame.WORK
set_frame(CONTROL_FRAME[i], frame)
elif (in_imp & (1 << in_bit_impuls_UF) != 0) and flag_yau_control:
j = 1 if i == 0 else 0
frame = Constants.Frame.VARIABLE if i == 0 else Constants.Frame.WORK
set_frame(CONTROL_FRAME[i], frame)
elif (in_blank & (1 << in_bit_blank_FS) != 0) and flag_yau_control:
j = 1 if i == 1 else 0
frame = Constants.Frame.CONSTANT if i == 1 else Constants.Frame.WORK
set_frame(CONTROL_FRAME[i], frame)
elif (in_imp & (1 << in_bit_impuls_FS) != 0) and flag_yau_control:
j = 1 if i == 1 else 0
frame = Constants.Frame.VARIABLE if i == 1 else Constants.Frame.WORK
elif (out_blank & (1 << out_bit_blank_UF) != 0) and flag_yau_control:
j = 1 if i == 2 else 0
frame = Constants.Frame.CONSTANT if i == 2 else Constants.Frame.WORK
set_frame(CONTROL_FRAME[i], frame)
elif (out_imp & (1 << out_bit_impuls_UF) != 0) and flag_yau_control:
j = 1 if i == 2 else 0
frame = Constants.Frame.VARIABLE if i == 2 else Constants.Frame.WORK
set_frame(CONTROL_FRAME[i], frame)
elif (out_blank & (1 << out_bit_blank_MODUL) != 0) and flag_yau_control:
j = 1 if i == 3 else 0
frame = Constants.Frame.CONSTANT if i == 3 else Constants.Frame.WORK
set_frame(CONTROL_FRAME[i], frame)
elif (out_imp & (1 << out_bit_impuls_MODUL) != 0) and flag_yau_control:
j = 1 if i == 3 else 0
frame = Constants.Frame.VARIABLE if i == 3 else Constants.Frame.WORK
set_frame(CONTROL_FRAME[i], frame)
elif (out_blank & (1 << out_bit_blank_FGOZ) != 0) and flag_yau_control:
j = 1 if i == 4 else 0
frame = Constants.Frame.CONSTANT if i == 4 else Constants.Frame.WORK
set_frame(CONTROL_FRAME[i], frame)
elif (out_imp & (1 << out_bit_impuls_FGOZ) != 0) and flag_yau_control:
j = 1 if i == 4 else 0
frame = Constants.Frame.VARIABLE if i == 4 else Constants.Frame.WORK
set_frame(CONTROL_FRAME[i], frame)
node_ems_g.text = Constants.EMS_G[i][j]
node_ems_g.modulate = [Color.RED, Color.GREEN][j]
#set_frame(CONTROL_FRAME[i], frame)
#node_select1.set_node_text(3, 0, '%d' % DKM)
## УКП
for i in range(8): ## Мощность от УКП_1
var power_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_1 + 2 * i)
node_select1.set_node_text(0, i+1, '%d' % power_ukp_1)
for i in range(8): ## Температура от УКП_1
var temperature_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_1 + 2 * i)
var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * Constants.TEMP
node_select1.set_node_text(1, i+1, '%d' % TMP)
for i in range(8): ## Мощность от УКП_2
var power_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_2 + 2 * i)
node_select2.set_node_text(0, i+1, '%d' % power_ukp_2)
for row in range(8): ## Температура от УКП_2
if len(data_from_yau_07) > 79 + 2 * row:
var temperature_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * row)
var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * Constants.TEMP
node_select2.set_node_text(1, row+1, '%d' % TMP)
func set_frame(node: Node, val: int): node.set_frame(val)
#func dec2bin(decimal_value, number_bit):
#var binary_string = ''
#var count = number_bit
#while(count >= 0):
#var temp: int = decimal_value >> count
#binary_string += '%d' % (temp & 1)
#count -= 1
#return binary_string
func _on_control_button(toggled_on: bool) -> void:
$TabContainer/ControlPanel/control_dev.visible = toggled_on
$TabContainer/ControlPanel/Controlpanel.visible = toggled_on
func on_btn_select(intem_from_sector):
var node_select_device = $select_dev/select_dev
var get_select_device = node_select_device.get_node2(1, 0)
var meta = get_select_device.get_item_metadata(intem_from_sector)
Network.address = meta[0]
Network.port = meta[1]
flag_mode = meta[2]
func fill_item(node, i_column: int, i_row: int, arr: Dictionary, select: int = 0):
var optionbutton = node.get_node2(i_column, i_row) as OptionButton
for key in arr.keys():
var item_text = key + " - " + str(arr[key])
optionbutton.add_item(item_text)
if select < arr.size():
optionbutton.select(select)
func _on_zapret(toggled_on: bool, meta) -> void:
var send_array: Array = []
var address_port_wr = 0x122
var ports_wr: Dictionary = {address_port_wr : meta.get_meta('litera')} ## СИ2, СИ4, СИ6 = 0x30, СИ3, СИ5, СИ7 = 0x31, СИ1 = 0x2F
Network.send_array.append(ports_wr)
ports_wr = {}
address_port_wr = 0x128
ports_wr[address_port_wr] = 0x4000 if toggled_on else 0x0
Network.send_array.append(ports_wr)
func _on_read_isa_pressed() -> void:
Network.flag_read_isa = true

View File

@@ -11,7 +11,7 @@ const TEMP: float = 115.0 / (MAXIMUM_CODE_ADC - MINIMUM_CODE_AD)
const TableNode = preload("res://table/node.tscn")
const TableList = preload("res://table/node_list.tscn")
const SELECT_DEVICE: Array = [[TableNode, TableList]]
const CONTROL_DEVICE: Array = ['ЯЧЕЙКА ЯУ-07Б', 'ФС', 'ЯЧЕЙКА ЭМС-Г', 'ЯЧЕЙКА УГ', 'ЯЧЕЙКА УКП №1', 'ЯЧЕЙКА УКП №2', 'ИП МАА №1', 'ИП МАА №2', 'ИП9-50 №1', 'ИП9-50 №2', 'ИП12-50 №1', '-', '-','ИП5-25', 'Вход Х3:2(СЗИ2)', 'Вход Х3:19(СИ2)', 'Выход Х3:11(СИ2)', 'Выход Х3:14(СИ2)', 'Выход x3:10(ФГОЗ)']
const CONTROL_DEVICE: Array = ['ЯЧЕЙКА ЯУ-07Б', 'ФС', 'ЯЧЕЙКА ЭМС-Г', 'ЯЧЕЙКА УГ', 'ЯЧЕЙКА УКП №1', 'ЯЧЕЙКА УКП №2', 'ИП МАА №1', 'ИП МАА №2', 'ИП9-50 №1', 'ИП9-50 №2', 'ИП12-50 №1', '-', '-','ИП5-25', 'Х3:2(СЗИ2 от УФ)', 'Х3:19(СИ2 от ФС)', 'Х3:11(СИ2 в УФ)', 'Х3:14(Модуляция)', 'Х3:27(ФГОЗ)']
const ROWS_REGS_DATA: Array = [
[TableNode, TableNode],
[TableNode, TableNode],
@@ -60,11 +60,11 @@ var CONTROL_POWER_SUPPLY: Array = [
['ИП12-50 №2', 'ОШИБКА. КОНТРОЛЬ ИП12-50 №2'],
['ИП5-25', 'ОШИБКА. КОНТРОЛЬ ИП5-25']]
const EMS_G = [
['Нет Входа Х3:2(СИ2 от УФ)', 'Вход Х3:2(СИ2 от УФ)'],
['Нет Входа Х3:19(СИ2 от ФС)', 'Вход Х3:19(СИ2 от ФС)'],
['Нет Выхода Х3:2(СИ2 в УФ)', 'Выход Х3:2(СИ2 в УФ)'],
['Нет Выхода Х3:5(Модуляция)', 'Выход Х3:5(Модуляция)'],
['Нет Выхода Х3:10(ФГОЗ)', 'Выход Х3:10(ФГОЗ)']]
['Нет Х3:2(СЗИ2 от УФ)', 'Есть Х3:2(СЗИ2 от УФ)'],
['Нет Х3:19(СИ2 от ФС)', 'Есть Х3:19(СИ2 от ФС)'],
['Нет Х3:11(СИ2 в УФ)', 'Есть Х3:11(СИ2 в УФ)'],
['Нет Х3:14(Модуляция)', 'Есть Х3:14(Модуляция)'],
['Нет Х3:27(ФГОЗ)', 'Есть Х3:27(ФГОЗ)']]
enum MODE {
PRD_K,
PRD_B,

107
scripts/network.gd Normal file
View File

@@ -0,0 +1,107 @@
extends Node
var unit = Yau07.YaU07.new('ЯУ07')
var soc_unicast: Socket
var soc_brodcast: Socket
var address: String = Constants.ADDRESSES[0][1]
var port: int = Constants.ADDRESSES[0][2]
var timeout: float = Yau07.ONLINE_TIMEOUT
var last_update_time: float = 0.0
var broadcast_packet: PackedByteArray
var state = Constants.STATE.WAIT
var send_array: Array = []
var flag_read_isa: bool = false
signal _yau_status_line(_status) ## Вызывается когда меняется состояние связи с ячейкой
signal _yau_receive(_data_from_yau) ##
signal _yau_read_isa(_unit_isa_ports)
## Класс для отправки данных в сокет
class Socket extends PacketPeerUDP:
func send_to(addr: String, port: int, data: PackedByteArray):
self.set_dest_address(addr, port)
self.put_packet(data)
func poll_receive(sock: Socket) -> bool: ## Приёмник
if timeout - last_update_time > 0:
while sock.get_available_packet_count() > 0:
broadcast_packet = sock.get_packet()
var addr_receive = sock.get_packet_ip()
var port_receive = sock.get_packet_port()
if (address == addr_receive) and (port == port_receive):
last_update_time = 0.0
unit.parse(broadcast_packet)
var data_from_yau_07 = unit.status
emit_signal('_yau_receive', data_from_yau_07)
else:
if sock.get_available_packet_count():
last_update_time = 0.0
return false
func _ready() -> void:
# Привязка для принятия широковещательного канала
soc_brodcast = Socket.new()
var rc = soc_brodcast.bind(Constants.BROADCAST_PORT, '*')
if rc != OK:
print('Ошибка: Неудачная привязка широковещательного адреса')
soc_unicast = Socket.new()
rc = soc_unicast.bind(Constants.UNICAST_PORT, Constants.UNICAST_ADDRESS)
if rc != OK:
print('Ошибка: неудачная привязка адреса: ', address)
unit.connect('line_changed', Callable(self, 'on_line_changed'))
unit.connect('command_fail', Callable(self, 'on_command_fail'))
unit.connect('command_done', Callable(self, 'on_command_done'))
func _process(delta: float) -> void:
last_update_time += delta
poll_receive(soc_brodcast)
state_machine()
match unit.process(delta):
Error.OK: soc_unicast.send_to(address, port, unit.tx_data.slice(0, unit.tx_len))
Error.FAILED: print('Ошибка отправки данных')
func state_machine():
var fl_done = (unit.cmd_state == unit.CmdState.DONE)
## Режим ожидания
if state == Constants.STATE.WAIT and fl_done:
if flag_read_isa:
flag_read_isa = false
state = Constants.STATE.READ_ISA
elif send_array.size():
state = Constants.STATE.WRITE_ISA
## Режим чтения из ИСА
elif state == Constants.STATE.READ_ISA and fl_done:
unit.send_isa(unit.CmdCode.READ_ISA, [0x122, 0x128])
state = Constants.STATE.WAIT
var unit_isa_ports = unit.isa_ports
emit_signal('_yau_read_isa', unit_isa_ports)
## Режим записи в ИСА
elif state == Constants.STATE.WRITE_ISA and fl_done:
var ports_dict = send_array.pop_front()
var key = ports_dict.keys()
unit.send_isa(unit.CmdCode.WRITE_ISA, [key[0], ports_dict[key[0]]])
state = Constants.STATE.WAIT
func on_line_changed(_unit) -> void:
emit_signal('_yau_status_line', unit.online)
## Ессли отсутствует подключение к ячейке ЯУ-07
func on_command_fail(_unit) -> void:
print_debug('Command send fail')
## Индикация чтения портов
func on_command_done(_unit) -> void:
pass

View File

@@ -1,91 +0,0 @@
extends Node
## Простые часто используемые функции
## Возвращает true, если val число, false - если иначе
func type_is_num(val) -> bool: return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0))
## Возвращае значение в радианах для угла в градусах [param val].
func radians(val: float): return (val * PI) / 180.0
## Возвращает значение из байтового массива в 16 битное слово
func ibytes_to_word(buf: PackedByteArray, i: int) -> int: return buf[i] + (buf[i + 1] * 256)
## Возвращает расстояние от центра координат до точки
func hypot(x: float, y: float) -> float: return sqrt(x * x + y * y)
## Проверяет пересечение диапазона x1, x2 с диапазоном y1, y2 """
func is_overlap(x1, x2, y1, y2): return max(x1, y1) <= min(x2, y2)
## Производит преобразование из декартовой в полярную систему координат
func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, f1: float):
var df = f1 - f0
var r = ((freq - f0) / df) * r1 + r0
var aoa_rad = Tools.radians(aoa) - PI / 2.0
var x = cos(aoa_rad) * r + pos0.x
var y = sin(aoa_rad) * r + pos0.y
return Vector2(x, y)
## Отсекает значение до заданного диапазона
func clip_value(val, val_min, val_max):
if val < val_min: val = val_min
if val > val_max: val = val_max
return val
## Возвращает массив с именами членов класса [param obj]
func get_members_names(obj: Object) -> Array:
var pl = obj.get_property_list()
var names: = Array()
for item in pl: names.append(item.name)
return names
## Проверяет, что заданный массив [param val] похож на ip-адрес
func is_array_ipaddr(val: Array):
return (val.size() == 2) \
and (val[0] is String) \
and (val[1] is int) \
and (0 < val[1]) \
and (val[1] < 65536)
## Преобразует декартовые координаты в полярные. [param pos0]
## - координаты центра, [param pos] - координаты точки
func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2:
var x1: float = pos.x - pos0.x
var y1: float = pos.y - pos0.y
var ang: float = (atan2(y1, x1) * 180.0) / PI
return Vector2(ang + 360.0 * float(ang < 0.0), hypot(x1, y1))
## Переводит значение val из диапазона a0...a1 в диапазон b0...b1
func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float:
return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0
## Возвращает true, если точка внутри заданного полигона
func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool:
var sz: = p.size()
assert(sz)
var j: int = sz - 1
var odd_nodes: int = 0
for i in sz:
if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)):
odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x))
j = i
return odd_nodes > 0
## Записывает слово [param val] в элемент байтовго массива [param buf]
## расположенный по индексу [param index]. Младшее слово
func set_wordi(buf: PackedByteArray, index: int, val: int) -> void:
buf[index] = val & 0xff
buf[index + 1] = (val >> 8) & 0xff