Доработка. Щ3 Чтение состояния из инпут регистров.

This commit is contained in:
MaD_CaT
2025-07-04 13:46:17 +03:00
parent 388db24fc6
commit 0e303abf19
2 changed files with 18 additions and 30 deletions

View File

@@ -77,8 +77,7 @@ func _enter_tree() -> void:
unit_sch3.regs_input_count = regs_input_count
unit_sch3.request_period = request_period
unit_sch3.reconnect_period = reconnect_period
unit_sch3.connect('read', on_read.bind(unit_sch3))
unit_sch3.connect('read_input', on_input)
unit_sch3.connect('read_input', on_input.bind(unit_sch3))
unit_sch3.connect('error', on_error.bind(unit_sch3))
unit_sch3.connect('line_changed', on_line_changed_sch3)
@@ -98,23 +97,34 @@ func _exit_tree() -> void:
if Engine.is_editor_hint(): return
var unit_key = settings.get_unit_key(unit_name)
var unit_sch3 = network.units[unit_key]
unit_sch3.disconnect('read', on_read.bind(unit_sch3))
unit_sch3.disconnect('read_input', on_input.bind(unit_sch3))
external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false)
unit_sch3.disconnect('error', on_error)
unit_sch3.disconnect('line_changed', on_line_changed_sch3)
## Вызывается по сигналу "приняты данные чтения регистров хранения"[br]
## Вызывается по сигналу "приняты данные чтения регистров входов".[br]
## [param base_addr] - Начальный адрес регистров.[br]
## [param data] - Массив значений прочитанных из регистров.
func on_read(base_addr: int, data: Array, unit_sch3):
if (base_addr != base_holding_address) or (data.size() < regs_holding_count):
## [param data] - Массив значений прочитанных из регистров.[br]
func on_input(base_addr: int, data: Array, unit_sch3):
if !is_inside_tree():
return
if (base_addr != base_input_address) or (data.size() < regs_input_count):
return
# "Для контроля состояния управляющего элемента подачи электроэнергии на приборы ..."
# "Для контроля подачи электроэнергии на приборы ..."
# Таблицы 3.13 и 3.14. Ecли значения соответствующих битов в этих
# регистрах равны, то "исправно".
var items = get_tree().get_nodes_in_group('bits_items_good')
for i in data.size():
regs_holding[base_addr + i] = data[i]
regs_input[base_addr + i] = data[i]
# Разрешить работу выключателей только когда прочитано их реальное состояние
if not switches_sync:
regs_holding[0] = regs_input[0]
regs_holding[1] = regs_input[1]
for i in 16:
regs_holding[2] = tools.set_bit(regs_holding[0], i, not ((regs_holding[0] >> i) & 1))
regs_holding[3] = tools.set_bit(regs_holding[1], i, not ((regs_holding[1] >> i) & 1))
if not external_ctl:
if regs_holding.has(0) and regs_holding.has(2):
regs_holding[0] = regs_holding[0] | 1
@@ -131,23 +141,6 @@ func on_read(base_addr: int, data: Array, unit_sch3):
item.disabled = false
regs_holding[byte1] = tools.set_bit(regs_holding[byte1], bit1, not val0)
unit_sch3.push_write_holding(regs_holding)
## Вызывается по сигналу "приняты данные чтения регистров входов".[br]
## [param base_addr] - Начальный адрес регистров.[br]
## [param data] - Массив значений прочитанных из регистров.[br]
func on_input(base_addr: int, data: Array):
if !is_inside_tree():
return
if (base_addr != base_input_address) or (data.size() < regs_input_count):
return
# "Для контроля состояния управляющего элемента подачи электроэнергии на приборы ..."
# "Для контроля подачи электроэнергии на приборы ..."
# Таблицы 3.13 и 3.14. Ecли значения соответствующих битов в этих
# регистрах равны, то "исправно".
var items = get_tree().get_nodes_in_group('bits_items_good')
for i in data.size():
regs_input[base_addr + i] = data[i]
# Таблица 3.15, Регистр PowerState
$margin/vbox/grid1/lbl_freq.text = '%d' % (regs_input[4] & 0x1ff)
$margin/vbox/grid1/lbl_freq.self_modulate = Color.WHITE

View File

@@ -70,11 +70,6 @@ class Sch3 extends unit.Unit:
mbc.request_read_input(base_input_address, regs_input_count)
cmd_state = CmdState.WAIT
tx_tick = tick
step_fsm = Sch3Fsm.READ_HOLDING
elif step_fsm == Sch3Fsm.READ_HOLDING:
mbc.request_read(base_holding_address, regs_holding_count)
cmd_state = CmdState.WAIT
tx_tick = tick
step_fsm = Sch3Fsm.WRITE
elif step_fsm == Sch3Fsm.CONNECT:
try_disconnect()