diff --git a/project.godot b/project.godot index 524ef5ad..a5bc8867 100644 --- a/project.godot +++ b/project.godot @@ -85,6 +85,7 @@ gdscript/warnings/integer_division=0 window/size/viewport_width=1600 window/size/viewport_height=1200 +window/size/mode=3 window/subwindows/embed_subwindows=false window/stretch/mode="canvas_items" window/dpi/allow_hidpi=false diff --git a/scenes/pribor-uf/pribor_uf.gd b/scenes/pribor-uf/pribor_uf.gd index c2107018..90f50f5d 100644 --- a/scenes/pribor-uf/pribor_uf.gd +++ b/scenes/pribor-uf/pribor_uf.gd @@ -88,8 +88,11 @@ func status_uf() -> void: var status_kems:int = $ref_uf/ref_kassetav13/ref_A4_KEMS.state var status_ems0:int = $ref_uf/ref_kassetav13/ref_A5_EMS.state var status_ems1:int = $ref_uf/ref_kassetav13/ref_A6_EMS.state + var status_ip5:int = $ref_uf/ref_kassetav13/ref_A3_IP5B.state + var status_ip27:int = $ref_uf/ref_kassetav13/ref_A12_IP27B.state - if (status_yay == 1) and (status_bu == 1) and (status_kems == 1) and (status_ems0 == 1) and (status_ems1 == 1): + if (status_yay == 1) and (status_bu == 1) and (status_kems == 1) \ + and (status_ems0 == 1) and (status_ems1 == 1) and (status_ip5 == 1) and (status_ip27 == 1): $lbl_header2.text = "Прибор исправен" $lbl_header2.modulate = Color(0,1,0,1) else: diff --git a/scenes/pribor-uyep/pribor-uyep.tscn b/scenes/pribor-uyep/pribor-uyep.tscn index 6b923a2b..c2484e79 100644 --- a/scenes/pribor-uyep/pribor-uyep.tscn +++ b/scenes/pribor-uyep/pribor-uyep.tscn @@ -38,17 +38,6 @@ text = "Контроль исправности устройства У-ЭП" horizontal_alignment = 1 vertical_alignment = 1 -[node name="Label" type="Label" parent="."] -self_modulate = Color(0.835294, 0.141176, 0.286275, 1) -layout_mode = 0 -offset_left = 95.0 -offset_top = 1125.0 -offset_right = 625.0 -offset_bottom = 1144.0 -text = "** Позиционные обозначения требуют уточнения **" -horizontal_alignment = 1 -vertical_alignment = 1 - [node name="spt25_A1" parent="." instance=ExtResource("6_60xs3")] layout_mode = 0 offset_left = 88.0 diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index b8d5acd1..b057192a 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -14,6 +14,7 @@ extends 'res://scenes/контроль/элемент-я.gd' @export var regs_holding_count: = 4 ## Количество регистров хранения @export var modbus_address: = 3 ## Адрес устройства на шине Modbus @export var request_period: = 1.0 ## Период отправки команд на шину Modbus +@export var reconnect_period: = 5.0 ## Период переподключения var regs_input: = {} ## Регистры входные var regs_holding: = {} ## Регистры хранения @@ -23,6 +24,7 @@ var input_stack: = [] ## Стек команд для чтения регис var read_step: = 0 var switches_sync: = false var timer = Timer.new() +var timer_reconnect = Timer.new() class StackItem: @@ -59,6 +61,14 @@ func _on_timeout(unit_sch3) -> void: read_step %= 2 +func _on_timeout_recconect(unit_sch3): + var unit_key = settings.get_unit_key(unit_sch3.name) + var mbc = network.mbcs[unit_key] + mbc.try_reconnect() + var mb_data = {'code': 'read_holding', 'data': [0, 4], 'unit': 0} + mbc.send_to(mb_data) + + ## Вызывается при изменении состояния выключателя[br] ## [param val] - Состояние выключателя[br] ## [param meta] - Адреса регистров и индексы битов назначенных выключателю[br] @@ -99,11 +109,14 @@ func _ready() -> void: timer.connect('timeout', _on_timeout.bind(unit_sch3)) add_child(timer) timer.start(request_period) + timer_reconnect.connect('timeout', _on_timeout_recconect.bind(unit_sch3)) + add_child(timer_reconnect) func on_command_fail(unit_sch3): unit_sch3.cmd_state = unit.Unit.CmdState.DONE timer.stop() + timer_reconnect.start(reconnect_period) ## Вызывается, когда состояния прибора Щ3 "на связи" изменяется[br] @@ -124,8 +137,10 @@ func on_line_changed(unit_sch3: sch_3.Sch3): $margin/vbox/grid1/state_freq.texture = textures[STATE_VAL.NONE] $margin/vbox/grid/state.texture = textures[STATE_VAL.NONE] else: + timer_reconnect.stop() timer.start(request_period) + ## Вызывается по сигналу "приняты данные чтения регистров хранения"[br] ## [param base_addr] - Начальный адрес регистров.[br] ## [param data] - Массив значений прочитанных из регистров. diff --git a/scenes/pribor-uyep/sch3.tscn b/scenes/pribor-uyep/sch3.tscn index 2b296478..f2b3dd03 100644 --- a/scenes/pribor-uyep/sch3.tscn +++ b/scenes/pribor-uyep/sch3.tscn @@ -721,7 +721,7 @@ size_flags_vertical = 4 tooltip_text = "Индикатор допуска входного напряжения" texture = ExtResource("2_ln52a") expand_mode = 1 -metadata/bits = [0, 0, 2, 0] +metadata/bits = [0, 15, 4, 0] [node name="lbl0" type="Label" parent="margin/vbox/grid1"] self_modulate = Color(1, 1, 1, 0.627451) diff --git a/scripts/network.gd b/scripts/network.gd index f42c7d10..fd7fbdac 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -49,6 +49,7 @@ class SocketTCP extends TCPServer: class Modbus extends ModbusClientRtu: + var unit_name func send_to(data): if data['code'] == 'write': var addr = data['data'].pop_at(0) @@ -58,6 +59,14 @@ class Modbus extends ModbusClientRtu: elif data['code'] == 'read_input': request_read_input(data['data'][0], data['data'][1]) + func try_reconnect(): + var port = settings.UnitProfiles[unit_name][1] + var params = settings.UnitProfiles[unit_name][2] + thread_stop() + close() + open(port, params[1], params[0], params[2], params[3], params[4]) + thread_run() + var poll_sockets: Array[Socket] var tcp_sockets: Array @@ -120,6 +129,7 @@ func create_modbus(nm, mbc_unit) -> Modbus: mbc.connect('write', mbc_unit.on_write) var _rc = mbc.open(port, params[1], params[0], params[2], params[3], params[4]) mbc.thread_run() + mbc.unit_name = nm return mbc diff --git a/scripts/sch3.gd b/scripts/sch3.gd index 978edff1..788846ab 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -51,7 +51,7 @@ class Sch3 extends unit.Unit: ## [param tick] - Текущщее время в мс.[br] func parse(message: Dictionary, tick: int) -> bool: rx_tick = tick - if not online: + if not online and (message['code'] != 'exception'): online = true emit_signal('line_changed', self) if message.has('code') and message.has('data'):