Commit aa29d0c4 authored by Bernardo Quaresma Dias's avatar Bernardo Quaresma Dias
Browse files

Inclusão de versão 2_0 de bandas

INSTMPA-1343
parent d2e490d0
This diff is collapsed.
-- =============================================================================
-- Copyright (C) 2003-2021 Tecgraf/PUC-Rio, PETROBRAS S/A
-- Instituto Tecgraf <mpa@tecgraf.puc-rio.br>
-- Arquivo gerado pelo programa MPA
-- Verso: 6.6
-- Arquivo: lib-bandas.mpae
-- Data: 30/09/2021 10:17:46
-- =============================================================================
MPA_3_3 = true
EXPANDED = {
true,
["Arquivos E/S"] = true,
}
PLANTNAME = "no name"
WIDTHS = {
}
DISABLED = {
}
PLANT = {
permissoes = {
["perm-CAvPert"] = {
l_cfg_perm_ids = {
"cav-pert",
},
},
["perm-ProtPV"] = {
l_cfg_perm_ids = {
"prot-pv",
},
},
["perm-full"] = {
l_cfg_perm_ids = {
"prot-pv",
"cav-pert",
},
},
},
registro = {
reg_bandas = {
cabecalhos = {
"ctrl;cav-pert-calc;gvp_banda;gvn_banda;viol_banda_pos;viol_banda_neg;gvp_mbanda;gvn_mbanda;viol_mbanda_pos;viol_mbanda_neg;gvp_grande;gvn_grande;viol_grande_pos;viol_grande_neg",
"ctrl;cav-pert;sp;banda;pv_fltr;pert;d_pert;d_mv;kp_calc;ki_calc;ret_act_ctrl",
"ctrl;mon-pv;pv;pv_fltr;pv_min;pv_max;ret_mon",
"ctrl;prot-pv;ret_mon;delta_mv;ret_act;ret_prot",
"ctrl;act-modo;cmd_id;ret_act",
"ctrl;act-modo-rec;cmd_id;rec_act",
"ctrl;act-sint;kp;ki;kp_act;ki_act;sint_man;ret_act_modo",
"ctrl;act-mv;mv_novo;mv;act_mv",
"ctrl;act-ctrl-rec;act_id;kp_act;ki_act;act_sint;delta_mv_act;act_mv;sp_rec;ret_act_modo",
},
extensao = "txt",
limite = "30",
prefixo = "log-bandas",
},
},
}
Dependencies = {
}
include 'lib-access-1_0.mpam'
include 'lib-utils-1_2.mpam'
include 'lib-plc-1_3.mpam'
include 'lib-painel-2_1.mpam'
include 'lib-blocos-3_0.mpam'
include 'lib-valvula-3_0.mpam'
class{ id = "mod_bandas", name = "Módulo de Controle por Bandas", group = "Controle por Bandas",
bases = {},
description = [[
Mantém a PV do controlador ajustando a Sintonia do Controlador e realizando Deltas
de antecipação na MV do controlador, em função da Perturbação calculada.
]],
attributes = {
{ id = "e_ctrl", name = "Controlador", type = "controlador", access = "g",
description = [[
Equipamento do controlador que terá sua PV Filtrada e monitorada
contra perturbações.
]],
},
{ id = "e_sdv", name = "Válvula SDV", type = "valvula_on_off", access = "g",
description = [[
Válvula de segurança que deve estar abertura para realização do controle.
]],
},
{ id = "m_cav_pert", name = "Módulo de C. Av. Perturbação", type = "mod_bandas_cav_pert", access = "g",
description = [[
"Módulo de Controle Avançado de Perturbação" Responsável por realizar ajustes de Sintonia e
antecipação na MV do controlador.
* os cálculos de sintonia de acordo com a perturbação serão configurados pelas
superfícies Kp e Ki da planta.
]],
},
{ id = "m_mon_pv", name = "Monitoração de PV", type = "mod_bandas_mon_pv", access = "g",
description = [[
"Módulo de Monitoração" que mantém informações do PV do Controlador filtrado
e retorna a indicação do seu estado:
. 'baixo'
. 'normal'
. 'alto'
]],
},
{ id = "m_prot_pv", name = "Módulo de Proteção de PV", type = "mod_bandas_prot_pv", access = "g",
description = [[
"Módulo de Proteção" do controlador antecipando com um delta a MV quando o "Módulo
de Monitoração" não indicar que a PV está dentro da faixa desejada
]],
},
{ id = "m_act_ctrl", name = "Módulo de Atuação Controlador", type = "mod_bandas_act_ctrl", access = "g",
description = [[
Módulo com as configurações para parametrizar como serão realizadas as atuações
de Sintonia e MV, no controlador.
]],
},
},
methods = {
},
}
class{ id = "mod_bandas_mon_pert", name = "Bandas: Monitoração de Perturbação", group = "Controle por Bandas",
bases = {},
description = [[
Módulo auxiliar do "Controle Avançado de Perturbação" com a configuração
dos diagnósticos, responsáveis por monitorar as violações dos limites
de bandas, e auxiliar na realização da tomada de decisão.
]],
attributes = {
{ id = "janela_banda", name = "Janela Diag. Banda", type = "janela_diagnostico", access = "g",
description = [[Janela de diagnósticos para monitorar violações dentro do valor da banda.]],
},
{ id = "janela_mbanda", name = "Janela Diag. Meia Banda", type = "janela_diagnostico", access = "g",
description = [[Janela de diagnósticos para monitorar violações dentro do valor de meia banda.]],
},
{ id = "janela_grande", name = "Janela Diag. Grande", type = "janela_diagnostico", access = "g",
description = [[Janela de diagnósticos para monitorar grandes violações de banda.]],
},
{ id = "cfg_grau_pert_min", name = "Grau Perturbação Mínima", type = "REAL", access = "g",
description = [[
Valor mínimo para o grau de perturbação.
* não informado o valor será '0'.
]],
},
{ id = "cfg_grau_pert_max", name = "Grau Perturbação Máxima", type = "REAL", access = "g",
description = [[
Valor máximo para o grau de perturbação.
* não informado o valor será '100'.
]],
},
{ id = "cfg_grau_pert_ini", name = "Grau Perturbação Inicial", type = "REAL", access = "g",
description = [[
Valor inicial para o grau de perturbação.
* quando o valor inicial não for informado, o valor inicial será calculado de acordo com
o valor da sintonia Kp do controlador para a banda atual configurada.
]],
},
{ id = "cfg_delta_grau_pert_banda", name = "Delta Grau Perturbação Banda", type = "REAL", access = "g",
description = [[Valor delta que será aplicado a perturbação quando a banda for violada.]],
},
{ id = "cfg_delta_grau_pert_mbanda", name = "Delta Grau Perturbação Meia Banda", type = "REAL", access = "g",
description = [[Valor delta que será subtraído da perturbação quando meia banda for contida.
]],
},
{ id = "cfg_delta_grau_pert_grande", name = "Delta Grau Perturbação Grande", type = "REAL", access = "g",
description = [[Valor delta que será aplicado a perturbação quando houver grande violação]],
},
},
}
class{ id = "mod_bandas_cav_pert", name = "Bandas: C. Av. Perturbação", group = "Controle por Bandas",
bases = {},
description = [[
Controle com a PV Filtrada do Controlador, avalia violações nas janelas
de diagnósticos configurados, por banda e atua na Sintonia ou MV do
Controlador para manter PV dentro dos limites desejados.
]],
attributes = {
{ id = "chave_hab", name = "Chave habilita", type = "chave", access = "g",
description = [[Chave de habilitação do "C. Av. Perturbação"]],
},
{ id = "ind_banda", name = "Indicador de Banda", type = "REAL_POINT", access = "r",
description = [[Indicador do valor de banda configurado]],
},
{ id = "superficie_kp_calc", name = "Superfície KP", type = "superficie_interpolada", access = "g",
description = [[
Superfície para cálculo da nova sintonia Kp do Controlador, com a relação
entre banda e perturbação atual.
]],
},
{ id = "superficie_ki_calc", name = "Superfície KI", type = "superficie_interpolada", access = "g",
description = [[
Superfície para cálculo da nova sintonia Ki do Controlador, com a relação
entre banda e perturbação atual.
]],
},
{ id = "tmr_estab", name = "Timer Estabilização", type = "timer", access = "g",
description = [[
Temporizador de intervalo que deve ser aguardado após uma alteração na sintonia antes
de iniciar um novo diagnóstico.
]],
},
{ id = "cfg_delta_mv_gpert", name = "Delta MV para Grande Perturbação", type = "REAL", access = "g",
description = [[
Valor de delta na MV quando houver grande perturbação na PV do controlador.
Havendo grande perturbação, com violação positiva o valor será somado ao valor atual da MV do controlador.
Sendo a violação negativa, o valor será subtraído o valor atual da MV do controlador.
* Se a MV do controlador realizar acionamento de abertura, em uma válvula de saída, este
valor deve ser positivo.
]],
},
{ id = "m_mon_pert", name = "Monitoração de Perturbação", type = "mod_bandas_mon_pert", access = "g",
description = [[
"Módulo de Monitoração da PV" do controlador, filtrando a PV e indicando
o nível de acordo com a configuração
]],
},
{ id = "t_intervalo_s", name = "Tempo de Intervalo (s)", type = "REAL", access = "gs",
description = [[Intervalo, em segundos, entre execuções.]],
},
},
methods = {
{ id = "calc_grau_pert_curr", name = "Calcular Grau de Perturbação Atual",
description = [[
Calcula o grau de perturbação atual de acordo com o valor de KP
do Controlador.
]],
parameters = {
{ name = "Controlador", type = "controlador" },
},
results = {
{ name = "Grau de Perturbação Atual", type = "REAL" },
},
code = [===[ function(self, e_ctrl)
local mon_pert = getattribute(self, 'm_mon_pert')
local pt_banda = getattribute(self, 'ind_banda')
local banda = pt_banda:read()
local pt_kp = getattribute(e_ctrl, 'kp')
local kp = pt_kp:read()
local dif_min
local pert_dif_min
local sup_kp = getattribute(self, 'superficie_kp_calc')
local max_curva = sup_kp:informar_maior_z()
local pert_min = mon_pert.cfg_grau_pert_min or 0
local pert_max = mon_pert.cfg_grau_pert_max or 100
local pert_inc = mon_pert.cfg_delta_grau_pert_mbanda or (pert_max-pert_min)/10
for pert = pert_min, pert_max, pert_inc do
local kp_calc = self:calc_kp(banda, pert)
if kp_calc then
local dif = math.abs(kp_calc - kp)
if (dif_min == nil) or ( dif < dif_min ) then
dif_min = dif
pert_dif_min = pert
end
end
end
return pert_dif_min
end ]===],
},
{ id = "calc_kp", name = "Calcula KP",
description = [[Cálculo do valor de Sintonia Kp do controlador.]],
parameters = {
{ name = "Banda", type = "REAL" },
{ name = "Perturbação", type = "REAL" },
},
results = {
{ name = "Valor de KP", type = "REAL" },
},
code = [===[ function(self, b, p)
local superficie = getattribute(self, 'superficie_kp_calc')
return superficie:informar_valor_superficie(p, b)
end ]===],
},
{ id = "calc_ki", name = "Calcula KI",
description = [[Cálculo do valor de Sintonia Ki do controlador.]],
parameters = {
{ name = "Banda", type = "REAL" },
{ name = "Perturbação", type = "REAL" },
},
results = {
{ name = "Valor de KI", type = "REAL" },
},
code = [===[ function(self, b, p)
local superficie = getattribute(self, 'superficie_ki_calc')
self._ki_calculado = superficie:informar_valor_superficie(p, b)
return self._ki_calculado
end ]===],
},
},
}
class{ id = "mod_bandas_mon_pv", name = "Bandas: Monitoração de PV", group = "Controle por Bandas",
bases = {},
description = [[Módulo de monitoração da PV do Controlador. Mantém o valor da PV filtrado e retorna
o estado atual da PV de acordo com os valores máximo e mínimo configurados.
O retorno podem ser:
- 'baixo': valor de PV abaixo do valor limite mínimo configurado
- 'normal': entre os limites definidos
- 'alto': valor de PV acima do valor limite máximo configurado
* Os valores de retorno são utilizados para tomada de decisão do módulo de Proteção de PV.
]],
attributes = {
{ id = "bloco_filtro_pv_mon", name = "Filtro PV ", type = "bloco_filtro", access = "g",
description = [[]],
},
{ id = "cfg_pv_min", name = "PV Mínima", type = "REAL", access = "g",
description = [[Valor de PV mínimo permitido considerado normal.]],
},
{ id = "cfg_pv_max", name = "PV Máxima", type = "REAL", access = "g",
description = [[Valor de PV máximo permitido considerado normal.]],
},
{ id = "ret_pv_fltr", name = "Retorno PV Filtrado", type = "REAL", access = "gs",
description = [[Retorno do módulo com o valor do PV do Controlador filtrado]],
},
{ id = "ret_mon", name = "Retorno da Monitoração", type = "STRING", access = "gs",
description = [[
Retorno do módulo podem ser:
. 'baixo' - valor de PV abaixo do valor limite mínimo configurado
. 'normal' - entre os limites definidos
. 'alto' - valor de PV acima do valor limite máximo configurado
]],
},
{ id = "t_intervalo_s", name = "Tempo de Intervalo (s)", type = "REAL", access = "gs",
description = [[Intervalo, em segundos, entre execuções.]],
},
},
}
class{ id = "mod_bandas_prot_pv", name = "Bandas: Proteção de PV", group = "Controle por Bandas",
bases = {},
description = [[Módulo de Proteção de PV com antecipação na atuação da MV.]],
attributes = {
{ id = "chave_hab", name = "Chave Habilita", type = "chave", access = "g",
description = [[Habilita "Módulo de Proteção de PV" do Controlador]],
},
{ id = "cfg_delta_mv_pv_l_prot", name = "Delta MV PV Baixo", type = "REAL", access = "g",
description = [[
Delta que deve ser somado à MV do Controlador quando o "Retorno da Monitoração"
for 'baixo'.
]],
},
{ id = "cfg_delta_mv_pv_h_prot", name = "Delta MV PV Alto", type = "REAL", access = "g",
description = [[
Delta que deve ser somado à MV do Controlador quando o "Retorno da Monitoração"
for 'alto'.
]],
},
{ id = "ret_prot", name = "Retorno de Proteção", type = "BOOLEAN", access = "gs",
description = [[Retona se o "Módulo de Proteção" está ativo e atuando.]],
},
{ id = "t_intervalo_s", name = "Tempo de Intervalo (s)", type = "REAL", access = "gs",
description = [[Intervalo, em segundos, entre execuções.]],
},
},
}
class{ id = "mod_bandas_act_ctrl", name = "Bandas: Atuação em Controlador", group = "Controle por Bandas",
bases = {},
description = [[]],
attributes = {
{ id = "perm", name = "Permissões", type = "permissoes", access = "g",
description = [[
Configuração das permissões que pode realizar atuação na Sintonia e MV
do Controlador.
]],
},
{ id = "cfg_sintoniza_manual", name = "Sintonia Manual", type = "BOOLEAN", access = "g",
description = [[
Indica se é obrigatório passar o Controlador para 'manual', antes de
realizar a atuação, na sintonia do controlador.
]],
},
{ id = "cfg_delta_min_kp_act", name = "Delta Mínimo KP", type = "REAL", access = "g",
description = [[Diferença mínima necessária para atualização do valor de Kp do controlador.]],
},
{ id = "cfg_delta_min_ki_act", name = "Delta Mínimo KI", type = "REAL", access = "g",
description = [[Diferença mínima necessária para atualização do valor de Ki do controlador.]],
},
{ id = "cfg_delta_min_mv_act", name = "Delta Mínimo MV", type = "REAL", access = "g",
description = [[Diferença mínima necessária para atualização no valor de MV do controlador.]],
},
{ id = "ind_mv_min_act", name = "Indicador MV Mínimo", type = "REAL_POINT", access = "r",
description = [[Limite Mínimo para MV do Controlador.]],
},
{ id = "ind_mv_max_act", name = "Indicador MV Máximo", type = "REAL_POINT", access = "r",
description = [[Limite Máximo para MV do Controlador.]],
},
},
}
...@@ -34,20 +34,23 @@ local function createModBandasPannel(instid, classid) ...@@ -34,20 +34,23 @@ local function createModBandasPannel(instid, classid)
local cav_pert = getinstance(bandas.m_cav_pert, 'mod_bandas_cav_pert') local cav_pert = getinstance(bandas.m_cav_pert, 'mod_bandas_cav_pert')
local ctrl = getinstance(bandas.e_ctrl, 'controlador') local ctrl = getinstance(bandas.e_ctrl, 'controlador')
local sdv = bandas.e_sdv and getinstance(bandas.e_sdv, 'valvula_on_off')
local chave_hab = getinstance(cav_pert.chave_hab, 'chave') local chave_hab = getinstance(cav_pert.chave_hab, 'chave')
local box = { alignment = 'ARIGHT'; local box = { alignment = 'ARIGHT'; }
ihm.Named(ihm.Boolean(chave_hab.atuacao), "Chave"),
ihm.Named(ihm.Number(cav_pert.ind_banda), "Banda"), box[#box+1] = ihm.Named(ihm.Boolean(chave_hab.atuacao), "Chave")
ihm.Named(ihm.Number(ctrl.sp), "SP"), box[#box+1] = sdv and ihm.Named(ihm.Boolean(sdv.indicacao_aberto), "SDV")
ihm.Named(ihm.Number(ctrl.pv), "PV"), box[#box+1] = ihm.Named(ihm.Number(cav_pert.ind_banda), "Banda")
ihm.Named(ihm.Number(tag_mon_pv, 'mod_bandas_mon_pv', 'ret_pv_fltr'), "PV Fltr."), box[#box+1] = ihm.Named(ihm.Number(ctrl.sp), "SP")
ihm.Named(ihm.Number(tag_mon_pv, 'mod_bandas_mon_pv', 'ret_mon'), "PV Mon."), box[#box+1] = ihm.Named(ihm.Number(ctrl.pv), "PV")
ihm.Named(ihm.Number(ctrl.mv), "MV"), box[#box+1] = ihm.Named(ihm.Number(tag_mon_pv, 'mod_bandas_mon_pv', 'ret_pv_fltr'), "PV Fltr.")
ihm.Named(ihm.Number(ctrl.kp), "KP"), box[#box+1] = ihm.Named(ihm.Number(tag_mon_pv, 'mod_bandas_mon_pv', 'ret_mon'), "PV Mon.")
ihm.Named(ihm.Number(ctrl.ki), "KI"), box[#box+1] = ihm.Named(ihm.Number(ctrl.mv), "MV")
iup.fill{expand = "VERTICAL"}, box[#box+1] = ihm.Named(ihm.Number(ctrl.kp), "KP")
} box[#box+1] = ihm.Named(ihm.Number(ctrl.ki), "KI")
box[#box+1] = iup.fill{expand = "VERTICAL"}
return iup.frame{ title = instid; return iup.frame{ title = instid;
iup.vbox(box) iup.vbox(box)
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment