Отлажена машина состояний для ПРД-К

This commit is contained in:
Maxim
2025-08-01 01:26:07 +03:00
parent 49f52310fa
commit 58070353bb
7 changed files with 161 additions and 125 deletions

View File

@@ -34,7 +34,7 @@ offset_bottom = 183.0
fname = "Блок ФС-1"
rname = "A4"
[node name="ref_A3" parent="." instance=ExtResource("3_kqnvt")]
[node name="ref_A3" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")]
offset_left = 55.0
offset_top = 33.0
offset_right = 105.0
@@ -50,7 +50,7 @@ offset_bottom = 183.0
fname = "Блок ФС-2"
rname = "A2"
[node name="ref_A6" parent="." instance=ExtResource("3_kqnvt")]
[node name="ref_A6" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")]
offset_left = 155.0
offset_top = 33.0
offset_right = 205.0
@@ -58,7 +58,7 @@ offset_bottom = 183.0
fname = "Модуль ФС"
rname = "A5"
[node name="ref_A5" parent="." instance=ExtResource("3_kqnvt")]
[node name="ref_A5" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")]
offset_left = 205.0
offset_top = 33.0
offset_right = 255.0

View File

@@ -25,31 +25,35 @@ const Constants = {
"ADDR_UG_LITERA_3": 0x10A,
"TEMP_THRESHOLD": 70,
"POWER_THRESHOLD": 40,
"TIMER_DELAY": 4.0,
"TIMER_DELAY": 5.0,
"dou_ray_nuber": 0x3,
"attenutor_um_1": 0x7,
"attenutor_um_2": 0x7,
"attenutor_um_3": 0x7,
"POWER_UM": 15,
"POWER_UM": 75,
}
enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 }
enum STATE_MASHINE { INIT,
FS_1_TURN_ON,
FS_2_TURN_ON,
FS_3_TURN_ON,
FS_1_WORK,
FS_2_WORK,
FS_3_WORK,
UM_RUN,
READ_ISA,
FS_1_TURN_OFF,
FS_2_TURN_OFF,
FS_3_TURN_OFF,
STOP_CONTROL }
enum STATE_MASHINE { INIT,
FS_1_TURN_ON,
FS_6_TURN_ON,
FS_7_TURN_ON,
FS_1_WORK,
FS_6_WORK,
FS_7_WORK,
UM_RUN_1,
UM_RUN_6,
UM_RUN_7,
FS_1_TURN_OFF,
FS_6_TURN_OFF,
FS_7_TURN_OFF,
STOP_CONTROL_1,
STOP_CONTROL_6,
STOP_CONTROL_7 }
# Основные переменные
var state: int = STATE_MASHINE.INIT
var count_packet_1:int = 0
var count_packet_2:int = 0
var count_packet_6:int = 0
var count_packet_7:int = 0
var power_array_1: Array = []
var power_array_2: Array = []
var ug_work_1: int
@@ -59,18 +63,21 @@ var ug_work_3: int
var control_timer: Timer = Timer.new()
var mashine_timer: Timer = Timer.new()
var flag_timer_started: bool = false
var flag_check_dkm_3: bool = false
var flag_check_dkm_1: bool = false
var flag_check_dkm_6: bool = false
var flag_check_dkm_7: bool = false
var pribor: String
# Результаты контроля
var _control_results: Dictionary = {
"block_ip": false, # Проверка касет П1 и ИП МА2000
"temperature": true, # Проверка температур УМ
"dkm_1": false, # Проверка ДКМ
"dkm_2": false, # Проверка ДКМ
"dkm_1": false, # Проверка ДКМ 1
"dkm_6": false, # Проверка ДКМ 6
"dkm_7": false, # Проверка ДКМ 7
"power_ukp": false, # Мощность от УКП
"fs_1": false, # Проверка ФС
"fs_2": false,
"fs_3": false,
"fs_1": false, # Проверка ФС 1
"fs_6": false, # Проверка ФС 6
"fs_7": false, # Проверка ФС 7
}
@@ -83,50 +90,86 @@ func _ready() -> void:
func on_state_mashine() -> void:
match state:
STATE_MASHINE.INIT:
print('Стадия включения')
state = STATE_MASHINE.FS_3_TURN_ON
STATE_MASHINE.FS_3_TURN_ON:
print('Включение фс 3')
state = STATE_MASHINE.FS_1_TURN_ON
STATE_MASHINE.FS_6_TURN_ON:
_on_control_fs(true)
control_timer.wait_time = Constants.TIMER_DELAY
control_timer.start()
state = STATE_MASHINE.FS_3_WORK
STATE_MASHINE.FS_3_WORK:
print('FS 3 должен работать')
flag_check_dkm_3 = true
if _control_results["fs_3"] and not flag_timer_started:
state = STATE_MASHINE.UM_RUN
STATE_MASHINE.UM_RUN:
print('Должна идти жара')
state = STATE_MASHINE.FS_6_WORK
STATE_MASHINE.FS_6_WORK:
if flag_check_dkm_6 and not flag_timer_started:
state = STATE_MASHINE.UM_RUN_6
STATE_MASHINE.UM_RUN_6:
var unit_key = settings.get_unit_key(get_meta('unit_name')[0])
var unit_prd = network.units[unit_key]
var prd_module = prd.prd_dict[unit_prd.name]
prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.BASE_ADDR_EMS_G, 6666]])
flag_timer_started = true
state = STATE_MASHINE.FS_3_WORK
STATE_MASHINE.READ_ISA:
print('READ_ISA')
state = STATE_MASHINE.FS_6_WORK
STATE_MASHINE.FS_6_TURN_OFF:
_on_control_fs(false)
power_control_result()
state = STATE_MASHINE.STOP_CONTROL_6
STATE_MASHINE.FS_7_TURN_ON:
_on_control_fs(true)
control_timer.wait_time = Constants.TIMER_DELAY
control_timer.start()
state = STATE_MASHINE.FS_7_WORK
STATE_MASHINE.FS_7_WORK:
if flag_check_dkm_7 and not flag_timer_started:
state = STATE_MASHINE.UM_RUN_7
STATE_MASHINE.UM_RUN_7:
var unit_key = settings.get_unit_key(get_meta('unit_name')[0])
var unit_prd = network.units[unit_key]
var prd_module = prd.prd_dict[unit_prd.name]
prd_module.cmd_array.append([unit_prd.CmdCode.READ_ISA, [Constants.BASE_ADDR_EMS_G]])
STATE_MASHINE.FS_3_TURN_OFF:
print('Отключение ФС')
flag_check_dkm_3 = false
prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.BASE_ADDR_EMS_G, 6666]])
flag_timer_started = true
state = STATE_MASHINE.FS_7_WORK
STATE_MASHINE.FS_7_TURN_OFF:
_on_control_fs(false)
power_control_result()
on_control_result()
state = STATE_MASHINE.STOP_CONTROL
STATE_MASHINE.STOP_CONTROL:
print('STOP_CONTROL')
state = STATE_MASHINE.STOP_CONTROL_7
STATE_MASHINE.FS_1_TURN_ON:
_on_control_fs(true)
control_timer.wait_time = Constants.TIMER_DELAY
control_timer.start()
state = STATE_MASHINE.FS_1_WORK
STATE_MASHINE.FS_1_WORK:
if not flag_timer_started:
state = STATE_MASHINE.UM_RUN_1
STATE_MASHINE.UM_RUN_1:
var unit_key = settings.get_unit_key(get_meta('unit_name')[0])
var unit_prd = network.units[unit_key]
var prd_module = prd.prd_dict[unit_prd.name]
prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.BASE_ADDR_EMS_G, 6666]])
flag_timer_started = true
state = STATE_MASHINE.FS_1_WORK
STATE_MASHINE.FS_1_TURN_OFF:
_on_control_fs(false)
power_control_result()
state = STATE_MASHINE.STOP_CONTROL_1
STATE_MASHINE.STOP_CONTROL_1:
flag_timer_started = false
state = STATE_MASHINE.FS_6_TURN_ON
STATE_MASHINE.STOP_CONTROL_6:
flag_timer_started = false
state = STATE_MASHINE.FS_7_TURN_ON
STATE_MASHINE.STOP_CONTROL_7:
flag_timer_started = false
func initialize_connections() -> void:
@@ -145,7 +188,7 @@ func setup_timer() -> void:
mashine_timer.connect('timeout', Callable(self, 'on_state_mashine'))
mashine_timer.wait_time = 0.5
mashine_timer.start()
add_child(control_timer)
control_timer.connect('timeout', Callable(self, 'on_stop_control'))
control_timer.one_shot = true
@@ -188,17 +231,12 @@ func on_data_received(unit_prd: Object) -> void:
check_temperature_um(status)
# Обработка данных ЭМС
_process_ems_data(status)
if flag_check_dkm_3:
check_dkm(status, Constants.DKM_BIT_7)
flag_check_dkm_1 = check_dkm(status, Constants.DKM_BIT_1)
flag_check_dkm_6 = check_dkm(status, Constants.DKM_BIT_6)
flag_check_dkm_7 = check_dkm(status, Constants.DKM_BIT_7)
if flag_check_dkm_1 or flag_check_dkm_6 or flag_check_dkm_7:
_process_ukp_power(status)
#if flag_timer_started:
#check_dkm(status, Constants.DKM_BIT_1)
#check_dkm(status, Constants.DKM_BIT_6)
# Обработка мощности от УКП
#_process_ukp_power(status)
# Обрабатывает данные ЭМС и обновляет UI панели
@@ -292,28 +330,46 @@ func check_temperature_um(status_prd: PackedByteArray) -> void:
## Проверка ДКМ
func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> void:
func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> bool:
const DKM: int = 28
var status_dkm = status_prd[DKM] >> bit_dkm & 1
if bit_dkm == 5:
if bit_dkm == 5 and state == STATE_MASHINE.FS_6_WORK:
$dou6_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
$kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results["dkm_6"] = status_dkm
elif bit_dkm == 6 and state == STATE_MASHINE.FS_7_WORK:
$dou7_A8.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
$kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results["dkm_7"] = status_dkm
elif bit_dkm == 0 and state == STATE_MASHINE.FS_1_WORK:
$kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results["dkm_1"] = status_dkm
elif bit_dkm == 6:
$dou7_A8.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
$kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results["dkm_2"] = status_dkm
elif bit_dkm == 0:
$kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR
_control_results["dkm_3"] = status_dkm
return status_dkm
func _process_ukp_power(status: PackedByteArray) -> void:
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
if state == STATE_MASHINE.FS_1_WORK:
pass
elif state == STATE_MASHINE.FS_2_WORK:
## Мощность от УМ (УКП) литеры 1
var arr_power_ukp_1: Array = []
var power_ukp_1: int
power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7)
arr_power_ukp_1.append(power_ukp_1)
if count_packet_1 == 0:
power_array_1 = arr_power_ukp_1
else:
for i in arr_power_ukp_1.size():
if arr_power_ukp_1[i] > power_array_1[i]:
power_array_1[i] = arr_power_ukp_1[i]
power_amplifier[6].value1 = '%d' % power_array_1[0]
power_amplifier[6].state = STATE_VAL.GOOD if power_array_1[0] > Constants.TEMP_THRESHOLD else STATE_VAL.ERROR
count_packet_1 += 1
elif state == STATE_MASHINE.FS_6_WORK:
## Мощность УМ от УКП 1
var arr_power_ukp_1: Array = []
if (status[0] >> 2) & 1:
@@ -321,23 +377,20 @@ func _process_ukp_power(status: PackedByteArray) -> void:
for i_power in range(6):
power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * i_power)
arr_power_ukp_1.append(power_ukp_1)
# Мощность от УМ (УКП) литеры 3
power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7)
arr_power_ukp_1.append(power_ukp_1)
if count_packet_1 == 0:
if count_packet_6 == 0:
power_array_1 = arr_power_ukp_1
else:
for i in arr_power_ukp_1.size():
if arr_power_ukp_1[i] > power_array_1[i]:
power_array_1[i] = arr_power_ukp_1[i]
for i in 7:
for i in 6:
power_amplifier[i].value1 = '%d' % power_array_1[i]
power_amplifier[i].state = STATE_VAL.GOOD if power_array_1[i] > Constants.TEMP_THRESHOLD else STATE_VAL.ERROR
count_packet_1 += 1
elif state == STATE_MASHINE.FS_3_WORK:
count_packet_6 += 1
elif state == STATE_MASHINE.FS_7_WORK:
## Мощность УМ от УКП 2
var arr_power_ukp_2: Array = []
if (status[0] >> 2) & 1:
@@ -345,7 +398,7 @@ func _process_ukp_power(status: PackedByteArray) -> void:
var power_ukp_2 = status.decode_u16(Constants.POWER_UKP_2 + 2 * i_power)
arr_power_ukp_2.append(power_ukp_2)
if count_packet_2 == 0:
if count_packet_7 == 0:
power_array_2 = arr_power_ukp_2
else:
for i in arr_power_ukp_2.size():
@@ -356,7 +409,7 @@ func _process_ukp_power(status: PackedByteArray) -> void:
power_amplifier[i+7].value1 = '%d' % power_array_2[i]
power_amplifier[i+7].state = STATE_VAL.GOOD if power_array_2[i] > Constants.TEMP_THRESHOLD else STATE_VAL.ERROR
count_packet_2 += 1
count_packet_7 += 1
func power_control_result() -> void:
@@ -369,7 +422,7 @@ func power_control_result() -> void:
func _on_control_fs(mode: bool) -> void:
var angle: float = 0.0
var angle: float = 0.0
var sector_1: float = 0
var sector_2: float = 20
var sector_3: float = 24
@@ -390,36 +443,30 @@ func _on_control_fs(mode: bool) -> void:
sector_3 = 25
var interfer_name: String = 'k1' if mode else 'off'
var freq_1: float = 490.0 # ФС_1
var freq_1: float = 450.0 # ФС_1
var freq_2: float = 2450.0 # ФС_2
var freq_3: float = 5800.0 # ФС_3
var width_1: float = 100.0 # ФС_1
var width_1: float = 80.0 # ФС_1
var width_2: float = 110.0 # ФС_2
var width_3: float = 110.0 # ФС_3
var fs_arr: Array = []
if state == STATE_MASHINE.FS_1_WORK:
if state == STATE_MASHINE.FS_1_TURN_ON or state == STATE_MASHINE.FS_1_TURN_OFF:
fs_arr.append([angle, freq_1, width_1, sector_1])
elif state == STATE_MASHINE.FS_2_WORK:
elif state == STATE_MASHINE.FS_6_TURN_ON or state == STATE_MASHINE.FS_6_TURN_OFF:
fs_arr.append([angle, freq_2, width_2, sector_2])
elif STATE_MASHINE.FS_3_WORK:
elif STATE_MASHINE.FS_7_TURN_ON or state == STATE_MASHINE.FS_7_TURN_OFF:
fs_arr.append([angle, freq_3, width_3, sector_3])
print('FS arr = ', fs_arr)
signaller.emit_signal('interfer_init', interfer_name, fs_arr, Constants.POWER_UM)
func on_stop_control() -> void:
print_debug('Отсановка контроля ПРД')
if state == STATE_MASHINE.FS_1_WORK:
state = STATE_MASHINE.FS_1_TURN_OFF
elif state == STATE_MASHINE.FS_2_WORK:
state = STATE_MASHINE.FS_2_TURN_OFF
elif state == STATE_MASHINE.FS_3_WORK:
state = STATE_MASHINE.FS_3_TURN_OFF
print_debug('state = ', state)
#_on_control_fs(false)
#on_control_result()
elif state == STATE_MASHINE.FS_6_WORK:
state = STATE_MASHINE.FS_6_TURN_OFF
elif state == STATE_MASHINE.FS_7_WORK:
state = STATE_MASHINE.FS_7_TURN_OFF
func on_fs_update_state(packet_type_7: Dictionary) -> void:
@@ -446,14 +493,9 @@ func on_fs_update_state(packet_type_7: Dictionary) -> void:
if fs < 4:
_control_results["fs_1"] = (data.isg == 1)
elif fs <24:
_control_results["fs_2"] = (data.isg == 1)
_control_results["fs_6"] = (data.isg == 1)
else:
_control_results["fs_3"] = (data.isg == 1)
#if _control_results["fs_1"] and _control_results["fs_2"] and _control_results["fs_3"] and not flag_timer_started:
#on_ug_setting()
#control_timer.wait_time = Constants.TIMER_DELAY
#control_timer.start()
#flag_timer_started = true
_control_results["fs_7"] = (data.isg == 1)
func on_ug_setting() -> void:
@@ -490,12 +532,12 @@ func on_control_result() -> void:
if not _control_results[key]:
if key == 'fs_1':
$kasseta_fs_kd/ref_A3.state = STATE_VAL.ERROR
if key == 'fs_2':
if key == 'fs_6':
$kasseta_fs_kd/ref_A6.state = STATE_VAL.ERROR
if key == 'fs_3':
if key == 'fs_7':
$kasseta_fs_kd/ref_A5.state = STATE_VAL.ERROR
result = false
print_debug('%s false' % key)
#print_debug('%s false' % key)
if result:
$control_result.text = 'Прибор ПРД-%s исправен' % pribor

View File

@@ -71,7 +71,7 @@ func set_default_state() -> void:
for group in get_tree().get_nodes_in_group('power_amplifier'):
group.state = STATE_VAL.NONE
func _enter_tree() -> void:
$control_result.text = ''
@@ -283,7 +283,7 @@ func _on_control_fs(mode: bool) -> void:
var fs_arr: Array = [[angle, freq_1, width_1, sector_1], [angle, freq_2, width_2, sector_2]]
signaller.emit_signal('interfer_init', interfer_name, fs_arr, Constants.POWER_UM)
func on_stop_control() -> void:
print_debug('Отсановка контроля ПРД')

View File

@@ -1,5 +1,3 @@
@tool
extends NinePatchRect
"""

View File

@@ -1,5 +1,3 @@
@tool
extends Control
"""

View File

@@ -1,5 +1,3 @@
@tool
extends Control
@export var textures: Array

View File

@@ -599,8 +599,8 @@ func set_node_frame(i_col: int, i_row: int, node_name: String, val: int) -> void
func set_node_editable(i_col: int, i_row: int, val: bool) -> void:
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
nodes[key].editable = val
## Устанавливает контекстное меню для ячейки таблицы. Ячейка должна иметь свойство [param context_menu].[br]
## [param i_col] - Индекс колонки.[br]
## [param i_row] - Индекс ряда.[br]