@@ -1,41 +1,90 @@
@ tool
extends " res://scenes/контроль/прибор.gd "
const IN_BLANK_PRD : i nt = 1
const OUT _BLANK_PRD: int = 13
const CI_2_OT_FS : int = 9
const CI_3 _OT_FS: int = 10
const CI_2_B_UF : int = 1
const CI_3 _B_UF: int = 2
const POWER_UKP_1 : int = 31
const POWER_UKP_2 : int = 63
var timer_03 : Timer = Timer . new ( )
const Consta nts = {
" IN _BLANK_PRD " : 1 ,
" OUT_BLANK_PRD " : 13 ,
" CI_2 _OT_FS " : 9 ,
" CI_3_OT_FS " : 10 ,
" CI_2 _B_UF " : 4 ,
" CI_3_B_UF " : 5 ,
" POWER_UKP_1 " : 31 ,
" POWER_UKP_2 " : 63 ,
" DKM_BIT_2 " : 1 ,
" DKM_BIT_3 " : 2 ,
" ADDR_UG_LITERA_1 " : 0x106 ,
" ADDR_UG_LITERA_2 " : 0x108 ,
" TEMP_THRESHOLD " : 70 ,
" POWER_THRESHOLD " : 40 ,
" TIMER_DELAY " : 1.0
}
enum STATE_VAL { NONE = 0 , GOOD = 1 , ERROR = 2 }
# Основные переменные
var count_packet_1 : int = 0
var power_array_1 : Array = [ ]
var count_packet_2 : int = 0
var power_array_1 : Array = [ ]
var power_array_2 : Array = [ ]
enum STATE_VAL {
NONE = 0 ,
GOOD = 1 ,
ERROR = 2 }
var currecnt_unit : String
var ug_work_1 : int
var ug_work_2 : int
# Флаги и таймеры
var control_timer : Timer = Timer . new ( )
var flag_timer_started : bool = false
# Результаты контроля
var _control_results : Dictionary = {
" block_ip " : false , # Проверка касет П1 и ИП М А 2000
" temperature " : true , # Проверка температур У М
" dkm_1 " : false , # Проверка ДКМ
" dkm_2 " : false , # Проверка ДКМ
" power_ukp " : false , # Мощность от УКП
" fs_1 " : false , # Проверка ФС
" fs_2 " : false ,
}
func _ready ( ) - > void :
initialize_connections ( )
setup_timer ( )
set_default_state ( )
func initialize_connections ( ) - > void :
signaller . conn ( signaller . fs_update_state , Callable ( self , ' on_fs_update_state ' ) )
var unit_key = settings . get_unit_key ( get_meta ( ' unit_name ' ) [ 0 ] )
var unit_prd = network . units [ unit_key ]
currecnt_unit = unit_prd . name
unit_prd . connect ( ' data_received ' , Callable ( self , ' on_data_received ' ) )
unit_prd . connect ( ' line_changed ' , Callable ( self , ' on_line_changed ' ) )
set_default_state ( )
self . add_child ( timer_03 )
timer_03 . connect ( ' timeout ' , Callable ( self , ' on_timer_03 ' ) )
#on_timer_03(unit_key)
func setup_timer ( ) - > void :
add_child ( control_timer )
control_timer . connect ( ' timeout ' , Callable ( self , ' on_stop_control ' ) )
control_timer . one_shot = true
control_timer . wait_time = 10.0
control_timer . start ( )
func set_default_state ( ) - > void :
for node in [ $ kasseta_P_1 / ref_A19 , $ kasseta_P_1 / ref_A20 , $ kasseta_P_1 / ref_A21 , $ maa2000_A23 , $ maa2000_A22 , $ dou2_A5 , $ dou3_A6 , $ kasseta_FS_ND / ref_A3 , $ kasseta_FS_ND / ref_A4 ] :
node . state = STATE_VAL . NONE
for group in get_tree ( ) . get_nodes_in_group ( ' power_amplifier ' ) :
group . state = STATE_VAL . NONE
func _enter_tree ( ) - > void :
$ control_result . text = ' '
signaller . connect ( ' р е жим_р а б о та ' , Callable ( self , ' on_mode_changed ' ) . bind ( false ) )
_on_control_fs ( true )
func _exit_tree ( ) - > void :
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 . ADDR_UG_LITERA_1 , ug_work_1 , Constants . ADDR_UG_LITERA_2 , ug_work_2 ] ] )
func on_line_changed ( unit_prd : Object ) - > void :
@@ -47,70 +96,32 @@ func on_data_received(unit_prd: Object) -> void:
if not is_inside_tree ( ) :
return
check_block_ip ( unit_prd . status )
check_temperature_um ( unit_prd . status )
var status = unit_prd . status
check_block_ip ( status )
check_temperature_um ( status )
# Обработка данных ЭМС
_process_ems_data ( status )
if flag_timer_started :
check_dkm ( status , Constants . DKM_BIT_2 )
check_dkm ( status , Constants . DKM_BIT_3 )
# Обработка мощности от УКП
_process_ukp_power ( status )
# Обрабатывает данные ЭМС и обновляет UI панели
func _process_ems_data ( status : PackedByteArray ) - > void :
## Контроль ЭМС
#_process_ems_data(unit_prd )
var in_blank : int = status . decode_u16 ( Constants . IN_BLANK_PRD )
var out_blank : int = status . decode_u16 ( Constants . OUT_BLANK_PRD )
var in_blank : int = unit_prd . status . decode_u16 ( IN_BLANK_PRD )
var out_blank : int = unit_prd . statu s. decode_u16 ( OUT_BLANK_PRD )
# Обновление фреймов для входных сигналов
$ Monitoring_panel / in_fs_1 . frame = ( in_blank >> Con stan ts. CI_2_OT_FS ) & 1
$ Monitoring_panel / in_fs_2 . frame = ( in_blank >> Constants . CI_3_OT_FS ) & 1
$ Monitoring_panel / in_fs_1 . frame = ( in_blank >> CI_2_OT_FS ) & 1
$ Monitoring_panel / in_f s_2 . frame = ( in _blank >> CI_3_OT_FS ) & 1
$ Monitoring_panel / out_ems_1 . frame = ( out_blank >> CI_2_B_UF ) & 1
$ Monitoring_panel / out_ems_2 . frame = ( out_blank >> CI_3_B_UF ) & 1
## Мощность У М от УКП 1
if ( in_blank >> CI_2_OT_FS ) & 1 :
const bit_dkm_1 : int = 1
check_dkm ( unit_prd . status , bit_dkm_1 )
var arr_power_ukp_1 : Array = [ ]
if ( unit_prd . status [ 0 ] >> 2 ) & 1 :
for i_power in range ( 6 ) :
var power_ukp_1 = unit_prd . status . decode_u16 ( POWER_UKP_1 + 2 * i_power )
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 ]
var power_amplifier : Array = get_tree ( ) . get_nodes_in_group ( ' power_amplifier ' )
for i in 6 :
power_amplifier [ i ] . value1 = ' %d ' % power_array_1 [ i ]
count_packet_1 += 1
## Мощность У М от УКП 2
if ( in_blank >> CI_3_OT_FS ) & 1 :
const bit_dkm_2 : int = 2
check_dkm ( unit_prd . status , bit_dkm_2 )
var arr_power_ukp_2 : Array = [ ]
if ( unit_prd . status [ 0 ] >> 2 ) & 1 :
for i_power in range ( 6 ) :
var power_ukp_2 = unit_prd . status . decode_u16 ( POWER_UKP_2 + 2 * i_power )
arr_power_ukp_2 . append ( power_ukp_2 )
if count_packet_2 == 0 :
power_array_2 = arr_power_ukp_2
else :
for i in arr_power_ukp_2 . size ( ) :
if arr_power_ukp_2 [ i ] > power_array_2 [ i ] :
power_array_2 [ i ] = arr_power_ukp_2 [ i ]
var power_amplifier : Array = get_tree ( ) . get_nodes_in_group ( ' power_amplifier ' )
for i in 6 :
power_amplifier [ i + 6 ] . value1 = ' %d ' % power_array_2 [ i ]
count_packet_2 += 1
# Обновление фреймов для выходных сигналов ЭМС
$ Monitoring_panel / out_em s_1 . frame = ( out _blank >> Constants . CI_2_B_UF ) & 1
$ Monitoring_panel / out_ems_2 . frame = ( out_blank >> Constants . CI_3_B_UF ) & 1
## Проверка касет П1 и ИП М А 2000
@@ -141,6 +152,14 @@ func check_block_ip(status_prd: PackedByteArray) -> void :
$ kasseta_P_1 / ref_A19 . state = STATE_VAL . NONE
$ kasseta_P_1 / ref_A20 . state = STATE_VAL . NONE
$ kasseta_P_1 / ref_A21 . state = STATE_VAL . NONE
_control_results [ " block_ip " ] = (
$ maa2000_A23 . state == STATE_VAL . GOOD and
$ maa2000_A22 . state == STATE_VAL . GOOD and
$ kasseta_P_1 / ref_A19 . state == STATE_VAL . GOOD and
$ kasseta_P_1 / ref_A20 . state == STATE_VAL . GOOD and
$ kasseta_P_1 / ref_A21 . state == STATE_VAL . GOOD
)
## Проверка температур У М от УКП
@@ -173,14 +192,155 @@ func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> void:
const DKM : int = 28
var status_dkm = status_prd [ DKM ] >> bit_dkm & 1
if bit_dkm == 1 :
$ dou2_A5 . state = STATE_VAL . GOOD if status_dkm else STATE_VAL . ERROR
$ kasseta_FS_ND / ref_A4 . state = STATE_VAL . GOOD if status_dkm else STATE_VAL . ERROR
_control_results [ " dkm_1 " ] = status_dkm
elif bit_dkm == 2 :
$ dou2 _A6 . state = STATE_VAL . GOOD if status_dkm else STATE_VAL . ERROR
$ dou3 _A6 . state = STATE_VAL . GOOD if status_dkm else STATE_VAL . ERROR
$ kasseta_FS_ND / ref_A3 . state = STATE_VAL . GOOD if status_dkm else STATE_VAL . ERROR
_control_results [ " dkm_2 " ] = status_dkm
func _process_ukp_power ( status : PackedByteArray ) - > void :
## Мощность У М от УКП 1
var arr_power_ukp_1 : Array = [ ]
if ( status [ 0 ] >> 2 ) & 1 :
for i_power in range ( 6 ) :
var power_ukp_1 = status . decode_u16 ( Constants . POWER_UKP_1 + 2 * i_power )
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 ]
var power_amplifier : Array = get_tree ( ) . get_nodes_in_group ( ' power_amplifier ' )
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 ] > 40 else STATE_VAL . ERROR
count_packet_1 += 1
## Мощность У М от УКП 2
var arr_power_ukp_2 : Array = [ ]
if ( status [ 0 ] >> 2 ) & 1 :
for i_power in range ( 6 ) :
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 :
power_array_2 = arr_power_ukp_2
else :
for i in arr_power_ukp_2 . size ( ) :
if arr_power_ukp_2 [ i ] > power_array_2 [ i ] :
power_array_2 [ i ] = arr_power_ukp_2 [ i ]
for i in 6 :
power_amplifier [ i + 6 ] . value1 = ' %d ' % power_array_2 [ i ]
power_amplifier [ i + 6 ] . state = STATE_VAL . GOOD if power_array_2 [ i ] > 40 else STATE_VAL . ERROR
count_packet_2 += 1
_control_results [ " power_ukp " ] = true
for amp in power_amplifier :
if amp . state != STATE_VAL . GOOD :
_control_results [ " power_ukp " ] = false
break
# func on_timer_03(unit_name) :
#print(unit_name)
func _on_control_fs ( mode : bool ) - > void :
var interfer_name : String
var fs_arr : Array
if mode :
interfer_name = ' k1 '
fs_arr = [ [ 90.0 , 2450.0 , 1500.0 , 23 ] ]
else :
interfer_name = ' off '
fs_arr = [ [ 90.0 , 2450.0 , 1500.0 , 23 ] ]
signaller . emit_signal ( ' interfer_init ' , interfer_name , fs_arr )
func on_stop_control ( ) - > void :
print_debug ( ' Отсановка контроля ПРД ' )
_on_control_fs ( false )
on_control_result ( )
func on_fs_update_state ( packet_type_7 : Dictionary ) - > void :
var parts = currecnt_unit . split ( ' - ' )
var last_part = parts [ - 1 ] # Прибор
# Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора
var fs_mapping = {
4 : { " node " : $ kasseta_FS_ND / ref_A1 , " condition " : last_part == ' 1н ' } ,
5 : { " node " : $ kasseta_FS_ND / ref_A1 , " condition " : last_part == ' 4н ' } ,
6 : { " node " : $ kasseta_FS_ND / ref_A1 , " condition " : last_part == ' 3н ' } ,
7 : { " node " : $ kasseta_FS_ND / ref_A1 , " condition " : last_part == ' 2н ' } ,
8 : { " node " : $ kasseta_FS_ND / ref_A2 , " condition " : last_part == ' 1н ' } ,
9 : { " node " : $ kasseta_FS_ND / ref_A2 , " condition " : last_part == ' 4н ' } ,
10 : { " node " : $ kasseta_FS_ND / ref_A2 , " condition " : last_part == ' 3н ' } ,
11 : { " node " : $ kasseta_FS_ND / ref_A2 , " condition " : last_part == ' 2н ' }
}
for fs in packet_type_7 :
if fs in fs_mapping and fs_mapping [ fs ] [ " condition " ] :
var data = packet_type_7 [ fs ]
var state = STATE_VAL . GOOD if data . isg == 1 else STATE_VAL . ERROR if data . isg == 0 else STATE_VAL . NONE
fs_mapping [ fs ] [ " node " ] . state = state
if fs < 8 :
_control_results [ " fs_1 " ] = ( data . isg == 1 )
else :
_control_results [ " fs_2 " ] = ( data . isg == 1 )
if _control_results [ ' fs_1 ' ] and _control_results [ " fs_2 " ] and not flag_timer_started :
on_ug_setting ( )
control_timer . wait_time = Constants . TIMER_DELAY
control_timer . start ( )
flag_timer_started = true
func on_ug_setting ( ) - > void :
var unit_key = settings . get_unit_key ( get_meta ( ' unit_name ' ) [ 0 ] )
var unit_prd = network . units [ unit_key ]
if unit_prd . isa_ports . has ( Constants . ADDR_UG_LITERA_1 ) :
ug_work_1 = unit_prd . isa_ports [ Constants . ADDR_UG_LITERA_1 ]
if unit_prd . isa_ports . has ( Constants . ADDR_UG_LITERA_2 ) :
ug_work_2 = unit_prd . isa_ports [ Constants . ADDR_UG_LITERA_2 ]
const dou = 0x3
const att = 0x7
var result = ( ( att & 0x07 ) << 3 ) | ( dou & 0x07 )
var prd_module = prd . prd_dict [ unit_prd . name ]
prd_module . cmd_array . append ( [ unit_prd . CmdCode . WRITE_ISA , [ Constants . ADDR_UG_LITERA_1 , result , Constants . ADDR_UG_LITERA_2 , result , 0x120 , 6666 ] ] )
func on_mode_changed ( in_tree : bool ) - > void :
if not in_tree :
queue_free ( )
func on_control_result ( ) - > void :
var result : bool = true
for key in _control_results :
if not _control_results [ key ] :
if key == ' fs_1 ' :
$ kasseta_FS_ND / ref_A1 . state = STATE_VAL . ERROR
if key == ' fs_2 ' :
$ kasseta_FS_ND / ref_A2 . state = STATE_VAL . ERROR
result = false
print_debug ( ' %s false ' % key )
var parts = currecnt_unit . split ( ' - ' )
var last_part = parts [ - 1 ] # Прибор
if result :
$ control_result . text = ' Прибор ПРД- %s исправен ' % last_part
$ control_result . add_theme_color_override ( " font_color " , Color . AQUAMARINE )
else :
$ control_result . text = ' Прибор ПРД- %s неисправен ' % last_part
$ control_result . add_theme_color_override ( " font_color " , Color . CRIMSON )
await get_tree ( ) . create_timer ( Constants . TIMER_DELAY ) . timeout
flag_timer_started = false