Доработка. Изменение структуры юнитов и обмена. Добавлен файл прибора Щ3.

This commit is contained in:
MaD_CaT
2024-10-14 08:38:56 +03:00
parent ca581df5f8
commit 22939d0f8c
10 changed files with 203 additions and 175 deletions

View File

@@ -57,6 +57,7 @@ def run_sync_client(udp_addr, udp_port_rx, udp_port_tx, serial_port, serial_baud
udp_data = udp_data.decode('utf-8')
message = json_decoder.decode(udp_data) # type: dict
if 'code' not in message:
message['code'] = '<unknown>'
@@ -70,6 +71,7 @@ def run_sync_client(udp_addr, udp_port_rx, udp_port_tx, serial_port, serial_baud
rc = rq.isError()
elif message['code'] == 'read_holding':
data = message['data']
print('client_serial_modbus.py: data', data)
rq = client.read_holding_registers(data[0], data[1:], unit=unit_num)
rc = rq.isError()
if not rc:

View File

@@ -61,6 +61,7 @@ hotkeys="*res://scripts/hotkeys.gd"
mercator="*res://scripts/mercator.gd"
modbus="*res://scripts/modbus.gd"
tcp5p28="*res://scripts/tcp5p28.gd"
sch3="*res://scripts/sch3.gd"
[debug]

View File

@@ -2,19 +2,19 @@ class_name HotKeys extends Node
func _ready() -> void:
signaller.connect('full_screen', Callable(self, 'toggle_full_screen').bind(0))
signaller.connect('full_screen', Callable(self, 'toggle_full_screen').bind(0))
func _input(event: InputEvent) -> void:
if event is InputEventKey:
if event.pressed and event.physical_keycode == KEY_F11:
signaller.emit_signal('full_screen')
if event is InputEventKey:
if event.pressed and event.physical_keycode == KEY_F11:
signaller.emit_signal('full_screen')
## Переключает режим окна программы полный - обычный экран.
func toggle_full_screen(id: int) -> void:
var mode = DisplayServer.window_get_mode(id)
mode = DisplayServer.WINDOW_MODE_WINDOWED \
if mode == DisplayServer.WINDOW_MODE_FULLSCREEN \
else DisplayServer.WINDOW_MODE_FULLSCREEN
DisplayServer.window_set_mode(mode, id)
var mode = DisplayServer.window_get_mode(id)
mode = DisplayServer.WINDOW_MODE_WINDOWED \
if mode == DisplayServer.WINDOW_MODE_FULLSCREEN \
else DisplayServer.WINDOW_MODE_FULLSCREEN
DisplayServer.window_set_mode(mode, id)

View File

@@ -97,7 +97,7 @@ func _ready():
var ecms: Dictionary = {} ## Словарь помех.
for i in range(ID_INTERFERS_LEN): # Заполняет массив ID целей
id_array.append(i + 1)
var unit_key = repsettings.get_unit_key('уарэп-капсрпб-отп')
var unit_key = repsettings.get_unit_key('уарэп-капсрпб')
var unit = repnetwork.units[unit_key]
var unit_5p28_key = repsettings.get_unit_key('уарэп-5п28')
var unit_5p28 = repnetwork.units_tcp[unit_5p28_key]

View File

@@ -2,6 +2,7 @@ class_name mod_bus extends Node
const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды.
class ModbusClient:
## Состояние автомата выполнения команды.
@@ -44,7 +45,7 @@ class ModbusClient:
online = false
emit_signal('line_changed')
if (cmd_state == CmdState.WAIT) or (cmd_state == CmdState.SEND):
cmd_state = CmdState.FAIL
#cmd_state = CmdState.FAIL
emit_signal('command_fail')
var rc = Error.ERR_BUSY
if cmd_state == CmdState.SEND:
@@ -114,7 +115,7 @@ class ModbusClient:
## [param addr] - Начальный адрес регистров.[br]
## [param count] - Количество регистров от начального адреса.[br]
func read_holdind(addr: int, count: int = 1) -> bool:
if cmd_state != CmdState.DONE: return false
#if cmd_state != CmdState.DONE: return false
var json_dict = {'code': 'read_holding', 'data': [addr, count]}
tx_data = JSON.stringify(json_dict).to_utf8_buffer()
cmd_state = CmdState.SEND

View File

@@ -1,7 +1,7 @@
class_name rep_network extends Node
const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb, 'udp-json-mbcs': modbus.ModbusClient}
const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'json-capsrpb': capsrpb.CapsRpb, 'udp-json-mbcs': modbus.ModbusClient}
const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28}
class Socket extends PacketPeerUDP:
@@ -13,7 +13,7 @@ class Socket extends PacketPeerUDP:
class SocketTCP extends TCPServer:
const RX_TIMEOUT: int = 1000 ## Время сброса счётчика принятия части пакета.
var peerstream: = PacketPeerStream.new()
var unit_key: Array ## Клюс юнита.
var unit_key: Array ## Ключ юнита.
var head_len: int = 8 ## Длинна заголовка команды.
var len_place: int = 4 ## Номер начального байта с длинной блока данных.
var type_len: int = 4 ## Количество байт в размере длинны.
@@ -32,6 +32,8 @@ var poll_sockets: Array[Socket]
var tcp_sockets: Array
var units: Dictionary
var units_tcp: Dictionary
var dst_ports: Dictionary
var unit_keys: Dictionary
var sock_unicast: Socket
var sock_capsrpb: Socket
var logger_page: Node
@@ -39,7 +41,7 @@ var logger_page: Node
func create_socket(nm) -> Socket:
var addr = repsettings.UnitProfiles[nm][1]
var port = repsettings.UnitProfiles[nm][2]
var port = repsettings.UnitProfiles[nm][2][0]
var broad = repsettings.UnitProfiles[nm][3]
var bind = repsettings.UnitProfiles[nm][4]
var sock: = Socket.new()
@@ -52,7 +54,7 @@ func create_socket(nm) -> Socket:
func create_tcpsocket(nm) -> SocketTCP:
var addr = repsettings.UnitProfiles[nm][1]
var port = repsettings.UnitProfiles[nm][2]
var port = repsettings.UnitProfiles[nm][2][0]
var sock = SocketTCP.new()
sock.unit_key = repsettings.get_unit_key(nm)
sock.listen(port, addr)
@@ -64,7 +66,7 @@ func _ready() -> void:
log.info('Модуль работы с сетью готов')
poll_sockets.append(create_socket('уарэп-яу07-частный'))
poll_sockets.append(create_socket('уарэп-яу07-общий'))
poll_sockets.append(create_socket('уарэп-капсрпб-пол'))
poll_sockets.append(create_socket('уарэп-капсрпб'))
sock_unicast = poll_sockets[0]
sock_capsrpb = poll_sockets[2]
@@ -78,7 +80,11 @@ func _ready() -> void:
if logger_page:
unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key))
unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key))
if len(settings[2]) > 1:
dst_ports[unit_key] = settings[2][1]
else:
dst_ports[unit_key] = settings[2][0]
if proto in TCP_PROTO:
var unit = TCP_PROTO[proto].new(unit_name)
var unit_key = repsettings.get_unit_key(unit_name)
@@ -88,10 +94,11 @@ func _ready() -> void:
unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key))
tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp[repsettings.get_unit_key('уарэп-5п28')]])
for key in units: log.info('%s %s:%d' % [units[key].name, key[0], key[1]])
for key in units_tcp: log.info('%s %s:%d' % [units_tcp[key].name, key[0], key[1]])
for key in dst_ports:
unit_keys[dst_ports[key]] = key
func poll_receive(sock: Socket, tick: int) -> bool:
while sock.get_available_packet_count() > 0:
@@ -99,7 +106,11 @@ func poll_receive(sock: Socket, tick: int) -> bool:
var addr: = sock.get_packet_ip()
var port: = sock.get_packet_port()
var addr_port: = [addr, port]
if addr_port in units: units[addr_port].parse(data, tick)
if addr_port in units:
units[addr_port].parse(data, tick)
return false
if port in unit_keys:
units[unit_keys[port]].parse(data, tick)
return false
@@ -154,7 +165,7 @@ func _process(_delta: float) -> void:
for addr in units:
var unit = units[addr]
match unit.process(tick):
Error.OK: sock_unicast.send_to(addr, unit.tx_data)
Error.OK: sock_unicast.send_to([addr[0], dst_ports[addr]], unit.tx_data)
Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]])
for sock_unit in tcp_sockets:
var sock = sock_unit[0]

View File

@@ -4,30 +4,29 @@ class_name rep_settings extends Node
@export var UnitProfiles: = { \
# Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий
'уарэп-яу07-частный': ['yau07rx', '10.1.1.2', 50002, false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'],
'уарэп-яу07-общий': ['yau07rx', '10.1.1.255', 50000, true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'],
'уарэп-капсрпб-пол': ['jsonrx', '127.0.0.1', 42023, false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'],
'уарэп-капсрпб-отп': ['jsontx', '127.0.0.1', 42022, false, false, 'IP-адрес на который отправляют сообщения для КАПС РПБ'],
'уарэп-эмс': ['yau07tx', '10.1.1.27', 50027, false, false, 'IP-адрес ЯУ-07 прибора УФ'],
'уарэп-яу07-2в': ['yau07tx', '10.1.1.34', 50034, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-2н': ['yau07tx', '10.1.1.33', 50033, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-': ['yau07tx', '10.1.1.35', 50035, false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'],
'уарэп-яу07-4в': ['yau07tx', '10.1.1.66', 50066, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-4н': ['yau07tx', '10.1.1.65', 50065, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-': ['yau07tx', '10.1.1.67', 50067, false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'],
'уарэп-яу07-1в': ['yau07tx', '10.1.1.18', 50018, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-1н': ['yau07tx', '10.1.1.17', 50017, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-': ['yau07tx', '10.1.1.19', 50019, false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'],
'уарэп-яу07-3в': ['yau07tx', '10.1.1.50', 50050, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-3н': ['yau07tx', '10.1.1.49', 50049, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-3к': ['yau07tx', '10.1.1.51', 50051, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-частный': ['yau07rx', '10.1.1.2', [50002], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'],
'уарэп-яу07-общий': ['yau07rx', '10.1.1.255', [50000], true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'],
'уарэп-капсрпб': ['json-capsrpb', '127.0.0.1', [42023, 42022], false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'],
'уарэп-эмс': ['yau07tx', '10.1.1.27', [50027], false, false, 'IP-адрес ЯУ-07 прибора УФ'],
'уарэп-яу07-2в': ['yau07tx', '10.1.1.34', [50034], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-2н': ['yau07tx', '10.1.1.33', [50033], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-2к': ['yau07tx', '10.1.1.35', [50035], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'],
'уарэп-яу07-': ['yau07tx', '10.1.1.66', [50066], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-4н': ['yau07tx', '10.1.1.65', [50065], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-4к': ['yau07tx', '10.1.1.67', [50067], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'],
'уарэп-яу07-': ['yau07tx', '10.1.1.18', [50018], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-1н': ['yau07tx', '10.1.1.17', [50017], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-1к': ['yau07tx', '10.1.1.19', [50019], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'],
'уарэп-яу07-': ['yau07tx', '10.1.1.50', [50050], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'],
'уарэп-яу07-3н': ['yau07tx', '10.1.1.49', [50049], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
'уарэп-яу07-3к': ['yau07tx', '10.1.1.51', [50051], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'],
# Название | Протокол | Адрес | Порт получения | Комментарий
'уарэп-5п28': ['5p28', '127.0.0.1', 50000, 'IP-адрес комплекса 5П-28'],
'уарэп-5п28': ['5p28', '127.0.0.1', [50000], 'IP-адрес комплекса 5П-28'],
# Название | Протокол | Адрес | Порт получения | Порт отправки | Комментарий
'уарэп-щ3': ['udp-json-mbcs', 'localhost', 48000, 44100, 'IP-адрес и порты через которые производят обмен сообщения с драйвером клиента Modbus Serial'],
'уарэп-щ3': ['udp-json-mbcs', '127.0.0.1', [48000, 44100], false, true, 'IP-адрес и порты через которые производят обмен сообщения с драйвером клиента Modbus Serial'],
# Название | Протокол | Имя порта | Скорость, бод | Чётность | Комментарий
'уарэп-спт25-1': ['uart', '/dev/tty2', 115200, false, 'Адрес прибора СПТ-25 (G1)'],
'уарэп-спт25-2': ['uart', '/dev/tty3', 115200, false, 'Адрес прибора СПТ-25 (G2)'],
@@ -46,4 +45,4 @@ func _ready() -> void: log.info('Модуль настроек готов')
func get_unit_key(unit_name: String) -> Array:
assert(UnitProfiles.has(unit_name), 'ошибка: нет такого устройства \"%s\"' % unit_name)
var item = UnitProfiles[unit_name]
return [item[1], item[2]]
return [item[1], item[2][0]]

14
scripts/sch3.gd Normal file
View File

@@ -0,0 +1,14 @@
extends Node
func _ready():
var unit_key = repsettings.get_unit_key('уарэп-щ3')
var unit = repnetwork.units[unit_key]
var timer = Timer.new()
add_child(timer)
timer.connect('timeout', Callable(self, 'on_timer').bind(unit))
timer.start(1.0)
func on_timer(unit):
unit.read_holdind(0x0000)

View File

@@ -46,7 +46,7 @@ signal threats_resized(th: Dictionary)
func _ready() -> void:
log.info('Модуль обработки целей готов')
var threats = {} ## Список целей. Индекс - <номер цели>
var unit_key = repsettings.get_unit_key('уарэп-капсрпб-отп')
var unit_key = repsettings.get_unit_key('уарэп-капсрпб')
var unit = repnetwork.units[unit_key]
var unit_5p28_key = repsettings.get_unit_key('уарэп-5п28')
var unit_5p28 = repnetwork.units_tcp[unit_5p28_key]

View File

@@ -2,143 +2,143 @@ class_name yerms_consts extends Node
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
const INPUT_ROWS1 = [
[12,['283333 МР-231S, Строб ЭМС', 'X52', '0.00', '0.00']],
[13,['29НРЛС МР-231-3, УИЗП', 'X54', '0.00', '0.00']],
[14,['30НРЛС МР-231-3, Строб ЭМС', 'X55', '0.00', '0.00']],
[15,['31ЦИСВС-1010, УИЗП', 'X23', '0.00', '0.00']],
[21,['32НРЛС МР-231S, УИЗП', 'X21', '0.00', '0.00']],
[22,['33НРЛС МР-231S, Строб ЭМС', 'X22', '0.00', '0.00']],
[23,['34НРЛС МР-231-3, УИЗП', 'X24', '0.00', '0.00']],
[32,['352222 МР-231S, Строб ЭМС', 'X32', '0.00', '0.00']],
[33,['36НРЛС МР-231-3, УИЗП', 'X34', '0.00', '0.00']],
[34,['37НРЛС МР-231-3, Строб ЭМС', 'X35', '0.00', '0.00']],
[35,['38ЦИСВС-1010, УИЗП', 'X43', '0.00', '0.00']],
[38,['394302-01, 4302-04, УИЗП', 'X46', '0.00', '0.00']],
[31,['40НРЛС МР-231S, УИЗП', 'X51', '0.00', '0.00']]]
[12,['283333 МР-231S, Строб ЭМС', 'X52', '0.00', '0.00']],
[13,['29НРЛС МР-231-3, УИЗП', 'X54', '0.00', '0.00']],
[14,['30НРЛС МР-231-3, Строб ЭМС', 'X55', '0.00', '0.00']],
[15,['31ЦИСВС-1010, УИЗП', 'X23', '0.00', '0.00']],
[21,['32НРЛС МР-231S, УИЗП', 'X21', '0.00', '0.00']],
[22,['33НРЛС МР-231S, Строб ЭМС', 'X22', '0.00', '0.00']],
[23,['34НРЛС МР-231-3, УИЗП', 'X24', '0.00', '0.00']],
[32,['352222 МР-231S, Строб ЭМС', 'X32', '0.00', '0.00']],
[33,['36НРЛС МР-231-3, УИЗП', 'X34', '0.00', '0.00']],
[34,['37НРЛС МР-231-3, Строб ЭМС', 'X35', '0.00', '0.00']],
[35,['38ЦИСВС-1010, УИЗП', 'X43', '0.00', '0.00']],
[38,['394302-01, 4302-04, УИЗП', 'X46', '0.00', '0.00']],
[31,['40НРЛС МР-231S, УИЗП', 'X51', '0.00', '0.00']]]
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
const OUTPUT_ROWS1 = [
[41,['41НРЛС МР-231S, БИ', 'X61', '0.00', '0.00']],
[42,['42НРЛС МР-231S', 'X62', '0.00', '0.00']],
[43,['43НРЛС МР-231-3, БИ', 'X64', '0.00', '0.00']],
[44,['44НРЛС МР-231-3', 'X65', '0.00', '0.00']],
[45,['45ЦИСВС-1010, БИ', 'X63', '0.00', '0.00']],
[46,['464302-01, 4302-04, БИ', 'X66', '0.00', '0.00']],
[48,['47НРЛС 11111111', 'X69', '0.00', '0.00']],
[62,['48НРЛС МР-231S', 'X62', '0.00', '0.00']],
[63,['49НРЛС МР-231-3, БИ', 'X64', '0.00', '0.00']],
[64,['50НРЛС МР-231-3', 'X65', '0.00', '0.00']],
[65,['51ЦИСВС-1010, БИ', 'X63', '0.00', '0.00']],
[66,['524302-01, 4302-04, БИ', 'X66', '0.00', '0.00']],
[68,['53НРЛС 11111111', 'X69', '0.00', '0.00']]]
[41,['41НРЛС МР-231S, БИ', 'X61', '0.00', '0.00']],
[42,['42НРЛС МР-231S', 'X62', '0.00', '0.00']],
[43,['43НРЛС МР-231-3, БИ', 'X64', '0.00', '0.00']],
[44,['44НРЛС МР-231-3', 'X65', '0.00', '0.00']],
[45,['45ЦИСВС-1010, БИ', 'X63', '0.00', '0.00']],
[46,['464302-01, 4302-04, БИ', 'X66', '0.00', '0.00']],
[48,['47НРЛС 11111111', 'X69', '0.00', '0.00']],
[62,['48НРЛС МР-231S', 'X62', '0.00', '0.00']],
[63,['49НРЛС МР-231-3, БИ', 'X64', '0.00', '0.00']],
[64,['50НРЛС МР-231-3', 'X65', '0.00', '0.00']],
[65,['51ЦИСВС-1010, БИ', 'X63', '0.00', '0.00']],
[66,['524302-01, 4302-04, БИ', 'X66', '0.00', '0.00']],
[68,['53НРЛС 11111111', 'X69', '0.00', '0.00']]]
## Таблица с данными для входов, первое значение - индекс устройства в ячейке КЭМС.
const INPUT_ROWS = [
[1,['УИЗП №1', 'Х7', '0.00', '0.00']],
[2,['УИЗПФ №1', 'Х8', '0.00', '0.00']],
[3,['УИЗП №2', 'Х10', '0.00', '0.00']],
[4,['УИЗПФ №2', 'Х11', '0.00', '0.00']],
[5,['УИЗП №3', 'Х13', '0.00', '0.00']],
[6,['УИЗПФ №3', 'Х14', '0.00', '0.00']],
[7,['УИЗП №4', 'Х16', '0.00', '0.00']],
[8,['УИЗПФ №4', 'Х17', '0.00', '0.00']],
[9,['УИЗП №5', 'Х19', '0.00', '0.00']],
[10,['УИЗПФ №5', 'Х20', '0.00', '0.00']],
[11,['УИЗП №6', 'Х22', '0.00', '0.00']],
[12,['УИЗПФ №6','Х23', '0.00', '0.00']],
[13,['УИЗП №7','Х25', '0.00', '0.00']],
[14,['УИЗПФ №7','Х26', '0.00', '0.00']],
[15,['СИ1 Л1','X31 : 2', '0.00', '0.00']],
[16,['СИ1 Л6','X31 : 5', '0.00', '0.00']],
[17,['СИ1 Л7','X31 : 8', '0.00', '0.00']],
[18,['СИ2 Л1','X32 : 2', '0.00', '0.00']],
[19,['СИ2 Л6','X32 : 5', '0.00', '0.00']],
[20,['СИ2 Л7','X32 : 8', '0.00', '0.00']],
[21,['СИ3 Л1','X33 : 2', '0.00', '0.00']],
[22,['СИ3 Л6','X33 : 5', '0.00', '0.00']],
[23,['СИ3 Л7','X33 : 8', '0.00', '0.00']],
[24,['СИ4 Л1','X34 : 2', '0.00', '0.00']],
[25,['СИ4 Л6','X34 : 5', '0.00', '0.00']],
[26,['СИ4 Л7','X34 : 8', '0.00', '0.00']],
[27,['СИ1 Л2','X38 : 2', '0.00', '0.00']],
[28,['СИ1 Л3','X38 : 5', '0.00', '0.00']],
[29,['СИ2 Л2','X39 : 2', '0.00', '0.00']],
[30,['СИ2 Л3','X39 : 5', '0.00', '0.00']],
[31,['СИ3 Л2','X40 : 2', '0.00', '0.00']],
[32,['СИ3 Л3','X40 : 5', '0.00', '0.00']],
[33,['СИ4 Л2','X41 : 2', '0.00', '0.00']],
[34,['СИ4 Л3','X41 : 5', '0.00', '0.00']],
[35,['СИ1 Л4','X42 : 2', '0.00', '0.00']],
[36,['СИ1 Л5','X42 : 5', '0.00', '0.00']],
[37,['СИ2 Л4','X43 : 2', '0.00', '0.00']],
[38,['СИ2 Л5','X43 : 5', '0.00', '0.00']],
[39,['СИ3 Л4','X44 : 2', '0.00', '0.00']],
[40,['СИ3 Л5','X44 : 5', '0.00', '0.00']],
[41,['СИ4 Л4','X45 : 2', '0.00', '0.00']],
[42,['СИ4 Л5','X45 : 5', '0.00', '0.00']],
[43,['БИ В Лб','Х49 : 37', '0.00', '0.00']],
[44,['БИ В ПрБ','Х49 : 31', '0.00', '0.00']],
[45,['БИ Г Лб','Х49 : 15', '0.00', '0.00']],
[46,['БИ Г ПрБ','Х49 : 8', '0.00', '0.00']],
[47,['БИ Д Лб','Х49 : 6', '0.00', '0.00']],
[48,['БИ Д ПрБ','Х49 : 10', '0.00', '0.00']],
[49,['БИ Е Лб','Х49 : 25', '0.00', '0.00']],
[50,['БИ Е ПрБ','Х49 : 40', '0.00', '0.00']],
[51,['СЗИ В Лб','Х49 : 42', '0.00', '0.00']],
[52,['СЗИ В ПрБ','Х49 : 32', '0.00', '0.00']],
[53,['СЗИ Г Лб','Х49 : 46', '0.00', '0.00']],
[54,['СЗИ Г ПрБ','Х49 : 32', '0.00', '0.00']],
[55,['СЗИ Д Лб','Х49 : 16', '0.00', '0.00']],
[56,['СЗИ Д ПрБ','Х49 : 47', '0.00', '0.00']],
[57,['СЗИ Е Лб','Х49 : 1', '0.00', '0.00']],
[58,['СЗИ Е ПрБ','Х49 : 50', '0.00', '0.00']]]
[1,['УИЗП №1', 'Х7', '0.00', '0.00']],
[2,['УИЗПФ №1', 'Х8', '0.00', '0.00']],
[3,['УИЗП №2', 'Х10', '0.00', '0.00']],
[4,['УИЗПФ №2', 'Х11', '0.00', '0.00']],
[5,['УИЗП №3', 'Х13', '0.00', '0.00']],
[6,['УИЗПФ №3', 'Х14', '0.00', '0.00']],
[7,['УИЗП №4', 'Х16', '0.00', '0.00']],
[8,['УИЗПФ №4', 'Х17', '0.00', '0.00']],
[9,['УИЗП №5', 'Х19', '0.00', '0.00']],
[10,['УИЗПФ №5', 'Х20', '0.00', '0.00']],
[11,['УИЗП №6', 'Х22', '0.00', '0.00']],
[12,['УИЗПФ №6','Х23', '0.00', '0.00']],
[13,['УИЗП №7','Х25', '0.00', '0.00']],
[14,['УИЗПФ №7','Х26', '0.00', '0.00']],
[15,['СИ1 Л1','X31 : 2', '0.00', '0.00']],
[16,['СИ1 Л6','X31 : 5', '0.00', '0.00']],
[17,['СИ1 Л7','X31 : 8', '0.00', '0.00']],
[18,['СИ2 Л1','X32 : 2', '0.00', '0.00']],
[19,['СИ2 Л6','X32 : 5', '0.00', '0.00']],
[20,['СИ2 Л7','X32 : 8', '0.00', '0.00']],
[21,['СИ3 Л1','X33 : 2', '0.00', '0.00']],
[22,['СИ3 Л6','X33 : 5', '0.00', '0.00']],
[23,['СИ3 Л7','X33 : 8', '0.00', '0.00']],
[24,['СИ4 Л1','X34 : 2', '0.00', '0.00']],
[25,['СИ4 Л6','X34 : 5', '0.00', '0.00']],
[26,['СИ4 Л7','X34 : 8', '0.00', '0.00']],
[27,['СИ1 Л2','X38 : 2', '0.00', '0.00']],
[28,['СИ1 Л3','X38 : 5', '0.00', '0.00']],
[29,['СИ2 Л2','X39 : 2', '0.00', '0.00']],
[30,['СИ2 Л3','X39 : 5', '0.00', '0.00']],
[31,['СИ3 Л2','X40 : 2', '0.00', '0.00']],
[32,['СИ3 Л3','X40 : 5', '0.00', '0.00']],
[33,['СИ4 Л2','X41 : 2', '0.00', '0.00']],
[34,['СИ4 Л3','X41 : 5', '0.00', '0.00']],
[35,['СИ1 Л4','X42 : 2', '0.00', '0.00']],
[36,['СИ1 Л5','X42 : 5', '0.00', '0.00']],
[37,['СИ2 Л4','X43 : 2', '0.00', '0.00']],
[38,['СИ2 Л5','X43 : 5', '0.00', '0.00']],
[39,['СИ3 Л4','X44 : 2', '0.00', '0.00']],
[40,['СИ3 Л5','X44 : 5', '0.00', '0.00']],
[41,['СИ4 Л4','X45 : 2', '0.00', '0.00']],
[42,['СИ4 Л5','X45 : 5', '0.00', '0.00']],
[43,['БИ В Лб','Х49 : 37', '0.00', '0.00']],
[44,['БИ В ПрБ','Х49 : 31', '0.00', '0.00']],
[45,['БИ Г Лб','Х49 : 15', '0.00', '0.00']],
[46,['БИ Г ПрБ','Х49 : 8', '0.00', '0.00']],
[47,['БИ Д Лб','Х49 : 6', '0.00', '0.00']],
[48,['БИ Д ПрБ','Х49 : 10', '0.00', '0.00']],
[49,['БИ Е Лб','Х49 : 25', '0.00', '0.00']],
[50,['БИ Е ПрБ','Х49 : 40', '0.00', '0.00']],
[51,['СЗИ В Лб','Х49 : 42', '0.00', '0.00']],
[52,['СЗИ В ПрБ','Х49 : 32', '0.00', '0.00']],
[53,['СЗИ Г Лб','Х49 : 46', '0.00', '0.00']],
[54,['СЗИ Г ПрБ','Х49 : 32', '0.00', '0.00']],
[55,['СЗИ Д Лб','Х49 : 16', '0.00', '0.00']],
[56,['СЗИ Д ПрБ','Х49 : 47', '0.00', '0.00']],
[57,['СЗИ Е Лб','Х49 : 1', '0.00', '0.00']],
[58,['СЗИ Е ПрБ','Х49 : 50', '0.00', '0.00']]]
## Таблица с данными для выходов, первое значение - индекс устройства в ячейке КЭМС.
const OUTPUT_ROWS = [
[11,['Бланк №1','Х6', '0.00', '0.00']],
[12,['Бланк №2','Х9', '0.00', '0.00']],
[13,['Бланк №3','Х12', '0.00', '0.00']],
[14,['Бланк №4','Х15', '0.00', '0.00']],
[15,['Бланк №5','Х18', '0.00', '0.00']],
[16,['Бланк №6','Х21', '0.00', '0.00']],
[17,['Бланк №7','Х24', '0.00', '0.00']],
[18,['СЗИ1 Л1','X31 : 11', '0.00', '0.00']],
[19,['СЗИ1 Л6','X31 :14', '0.00', '0.00']],
[20,['СЗИ1 Л7','X31 : 17', '0.00', '0.00']],
[21,['СЗИ2 Л1','X32 : 11', '0.00', '0.00']],
[22,['СЗИ2 Л6','X32 : 14', '0.00', '0.00']],
[23,['СЗИ2 Л7','X32: 17', '0.00', '0.00']],
[24,['СЗИ3 Л1','X33 : 11', '0.00', '0.00']],
[25,['СЗИ3 Л6','X33 :14', '0.00', '0.00']],
[26,['СЗИ3 Л7','X33: 17', '0.00', '0.00']],
[27,['СЗИ4 Л1','X34 : 11', '0.00', '0.00']],
[28,['СЗИ4 Л6','X34 :14', '0.00', '0.00']],
[29,['СЗИ4 Л7','X34: 17', '0.00', '0.00']],
[30,['СЗИ1 Л2','X38 : 11', '0.00', '0.00']],
[31,['СЗИ1 Л3','X38 : 14', '0.00', '0.00']],
[32,['СЗИ2 Л2','X39 : 11', '0.00', '0.00']],
[33,['СЗИ2 Л3','X39 : 14', '0.00', '0.00']],
[34,['СЗИ3 Л2','X40 : 11', '0.00', '0.00']],
[35,['СЗИ3 Л3','X40 : 14', '0.00', '0.00']],
[36,['СЗИ4 Л2','X41 : 11', '0.00', '0.00']],
[37,['СЗИ4 Л3','X41 :14', '0.00', '0.00']],
[38,['СЗИ1 Л4','X42 : 11', '0.00', '0.00']],
[39,['СЗИ1 Л5','X42 :14', '0.00', '0.00']],
[40,['СЗИ2 Л4','X43 : 11', '0.00', '0.00']],
[41,['СЗИ2 Л5','X43 : 14', '0.00', '0.00']],
[42,['СЗИ3 Л4','X44 : 11', '0.00', '0.00']],
[43,['СЗИ3 Л5','X44 :14', '0.00', '0.00']],
[44,['СЗИ4 Л4','X45 : 11', '0.00', '0.00']],
[45,['СЗИ4 Л5','X45 : 14', '0.00', '0.00']],
[46,['БИ РТР №1','X47 : 2', '0.00', '0.00']],
[47,['БИ РТР №2','X47 : 5', '0.00', '0.00']],
[48,['БИ РТР №3','X47 : 8', '0.00', '0.00']],
[49,['БИ РТР №4','X47 : 11', '0.00', '0.00']],
[50,['СИ В Лб','Х49 : 21', '0.00', '0.00']],
[51,['СИ В ПрБ','Х49 : 19', '0.00', '0.00']],
[52,['СИ Г Лб','Х49 : 28', '0.00', '0.00']],
[53,['СИ Г ПрБ','Х49 : 30', '0.00', '0.00']],
[54,['СИ Д Лб','Х49 : 13', '0.00', '0.00']],
[55,['СИ Д ПрБ','Х49 : 11', '0.00', '0.00']],
[56,['СИ Е Лб','Х49 : 26', '0.00', '0.00']],
[57,['СИ Е ПрБ','Х49 : 35', '0.00', '0.00']]]
[11,['Бланк №1','Х6', '0.00', '0.00']],
[12,['Бланк №2','Х9', '0.00', '0.00']],
[13,['Бланк №3','Х12', '0.00', '0.00']],
[14,['Бланк №4','Х15', '0.00', '0.00']],
[15,['Бланк №5','Х18', '0.00', '0.00']],
[16,['Бланк №6','Х21', '0.00', '0.00']],
[17,['Бланк №7','Х24', '0.00', '0.00']],
[18,['СЗИ1 Л1','X31 : 11', '0.00', '0.00']],
[19,['СЗИ1 Л6','X31 :14', '0.00', '0.00']],
[20,['СЗИ1 Л7','X31 : 17', '0.00', '0.00']],
[21,['СЗИ2 Л1','X32 : 11', '0.00', '0.00']],
[22,['СЗИ2 Л6','X32 : 14', '0.00', '0.00']],
[23,['СЗИ2 Л7','X32: 17', '0.00', '0.00']],
[24,['СЗИ3 Л1','X33 : 11', '0.00', '0.00']],
[25,['СЗИ3 Л6','X33 :14', '0.00', '0.00']],
[26,['СЗИ3 Л7','X33: 17', '0.00', '0.00']],
[27,['СЗИ4 Л1','X34 : 11', '0.00', '0.00']],
[28,['СЗИ4 Л6','X34 :14', '0.00', '0.00']],
[29,['СЗИ4 Л7','X34: 17', '0.00', '0.00']],
[30,['СЗИ1 Л2','X38 : 11', '0.00', '0.00']],
[31,['СЗИ1 Л3','X38 : 14', '0.00', '0.00']],
[32,['СЗИ2 Л2','X39 : 11', '0.00', '0.00']],
[33,['СЗИ2 Л3','X39 : 14', '0.00', '0.00']],
[34,['СЗИ3 Л2','X40 : 11', '0.00', '0.00']],
[35,['СЗИ3 Л3','X40 : 14', '0.00', '0.00']],
[36,['СЗИ4 Л2','X41 : 11', '0.00', '0.00']],
[37,['СЗИ4 Л3','X41 :14', '0.00', '0.00']],
[38,['СЗИ1 Л4','X42 : 11', '0.00', '0.00']],
[39,['СЗИ1 Л5','X42 :14', '0.00', '0.00']],
[40,['СЗИ2 Л4','X43 : 11', '0.00', '0.00']],
[41,['СЗИ2 Л5','X43 : 14', '0.00', '0.00']],
[42,['СЗИ3 Л4','X44 : 11', '0.00', '0.00']],
[43,['СЗИ3 Л5','X44 :14', '0.00', '0.00']],
[44,['СЗИ4 Л4','X45 : 11', '0.00', '0.00']],
[45,['СЗИ4 Л5','X45 : 14', '0.00', '0.00']],
[46,['БИ РТР №1','X47 : 2', '0.00', '0.00']],
[47,['БИ РТР №2','X47 : 5', '0.00', '0.00']],
[48,['БИ РТР №3','X47 : 8', '0.00', '0.00']],
[49,['БИ РТР №4','X47 : 11', '0.00', '0.00']],
[50,['СИ В Лб','Х49 : 21', '0.00', '0.00']],
[51,['СИ В ПрБ','Х49 : 19', '0.00', '0.00']],
[52,['СИ Г Лб','Х49 : 28', '0.00', '0.00']],
[53,['СИ Г ПрБ','Х49 : 30', '0.00', '0.00']],
[54,['СИ Д Лб','Х49 : 13', '0.00', '0.00']],
[55,['СИ Д ПрБ','Х49 : 11', '0.00', '0.00']],
[56,['СИ Е Лб','Х49 : 26', '0.00', '0.00']],
[57,['СИ Е ПрБ','Х49 : 35', '0.00', '0.00']]]