Files
PRD_TU_MP550/PRD.gd
2024-12-12 16:35:56 +03:00

261 lines
12 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 ports_wr: Dictionary # Словарь с портами для записи
var broadcast_packet: PackedByteArray
var node_select1: Node
var timeout: float = Yau07.ONLINE_TIMEOUT
var last_update_time: float = 0.0
var flag_yau_control: bool
var CONTROL_TABLE: Array
## Класс для отправки данных в сокет
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 = Constants.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 = Constants.RED
return false
func _ready() -> void:
# Таблица 1 (temp)
node_select1 = $scroll1/table1
draw_tabl(node_select1, Constants.ROWS_REGS_DATA, Constants.ROWS_REGS_DATA.size())
# Выбор прибора для подключения
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([200, 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)
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)
match unit.process(delta):
Error.OK: soc_unicast.send_to(address, port, unit.tx_data.slice(0, unit.tx_len))
Error.FAILED: print('Ошибка отправки данных')
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 = [Constants.GREEN, Constants.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 = [Constants.GREEN, Constants.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 = [Constants.RED, Constants.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, '%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, '%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_select1.set_node_text(0, i + 8, '%d' % power_ukp_2)
for i in range(8): ## Температура от УКП_2
if len(data_from_yau_07) > 79 + 2 * i:
var temperature_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * i)
var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * Constants.TEMP
node_select1.set_node_text(1, i+8, '%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 = Constants.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)