Commit 04c330ab authored by Bernardo Quaresma Dias's avatar Bernardo Quaresma Dias
Browse files

[INSTMPA-759]

+ajustes para operaiconalização de flotador de P-48 com base 2.0
parent 033b6a97
......@@ -20,6 +20,28 @@ class{ id = "bloco_calculo", group = "Classes Abstratas",
self._ret = nil
end ]===],
},
{ id = "validar", name = "Validar", description =
[[Informa se o bloco tem amostras o suficiente para realizar uma execução.]],
parameters = {
},
results = {
{ name = "Valido", type = "BOOLEAN" },
},
code = [===[ function(self)
return self:consultar() and true or false
end ]===],
},
{ id = "consultar", name = "Consultar", description =
[[Informa o valor do filtro na última execução.]],
parameters = {
},
results = {
{ name = "Resultado", type = "REAL" },
},
code = [===[ function(self)
return self._ret
end ]===],
},
{ id = "executar", name = "Executar", description =
[[Executa o bloco para uma nova amostra respeitando o intervalo configurado.]],
parameters = {
......@@ -103,7 +125,7 @@ class{ id = "bloco_filtro", name = "Bloco Filtro", group = "Blocos de C
{ name = "Resultado", type = "REAL" },
},
code = [===[ function(self)
return self._ret or self.v_init
return self._y_1 or self.v_init
end ]===],
},
{ id = "calcular", name = "Calcular", description =
......@@ -178,42 +200,46 @@ class{ id = "bloco_media", name = "Bloco M
self:apagar()
end ]===],
},
{ id = "validar", name = "Validar", description =
[[Informa se o bloco tem amostras o suficiente para realizar uma execução.]],
{ id = "calcular", name = "Calcular", description =
[[Calcula a média dos valores informados.]],
parameters = {
{ name = "Valor", type = "REAL" },
},
results = {
{ name = "Valido", type = "BOOLEAN" },
{ name = "Resultado", type = "REAL" },
},
code = [===[ function(self)
return self:consultar() and true or false
end ]===],
code = [===[ function(self, valor)
self.amostras:inserir(valor)
local historico = self.amostras:obter_historico(self.periodo)
return average(historico)
end ]===],
},
{ id = "consultar", name = "Consultar", description =
[[Informa o valor do filtro na última execução.]],
{ id = "menor", name = "Avaliar Menor", description =
[[Avalia o menor valor informado.]],
parameters = {
},
results = {
{ name = "Resultado", type = "REAL" },
{ name = "Menor Valor", type = "REAL" },
},
code = [===[ function(self)
return self._ret
end ]===],
code = [===[ function(self, valor)
local historico = self.amostras:obter_historico(self.periodo)
return minimo(historico)
end ]===],
},
{ id = "calcular", name = "Calcular", description =
[[Calcula a média dos valores informados.]],
{ id = "maior", name = "Avaliar Maior", description =
[[Avalia o maior valor informado.]],
parameters = {
{ name = "Valor", type = "REAL" },
},
results = {
{ name = "Resultado", type = "REAL" },
{ name = "Maior Valor", type = "REAL" },
},
code = [===[ function(self, valor)
self.amostras:inserir(valor)
local historico = self.amostras:obter_historico(self.periodo)
return average(historico)
return maximo(historico)
end ]===],
},
},
......
This diff is collapsed.
include('lib-controle-2_0.mpam')
include('lib-utils-1_0.mpam')
include('lib-blocos-1_0.mpam')
class{ id = "flotador", name = "Flotador", group = "Flotador",
bases = {}, description =
[[Classe que modela um flotador com um controle de vazão de entrada,
um controle de nível principal e um controle de nível de exportação.]],
attributes = {
{ id = "lic_agua", name = "LIC Água", type = "controlador", access = "g", description =
[[Controlador de nível de saída de água do flotador.]],
},
{ id = "lic_oleo", name = "LIC Óleo", type = "controlador", access = "g", description =
[[Controlador de nível de óleo do flotador.]],
},
{ id = "ft_in_1", name = "FT Entrada 1", type = "controlador",
access = "g", description =
[[Controlador de vazão de entrada 1 do flotador.]],
},
{ id = "ft_in_2", name = "FT Entrada 2", type = "controlador",
access = "g", description =
[[Controlador de vazão de entrada 2 do flotador.]],
},
},
}
class{ id = "slop", name = "Slop", group = "Slop", description =
[[Vaso do tipo Slop. Recebe o Óleo proveniente do flotador.]],
attributes = {
{ id = "lic", name = "LIC", type = "controlador", access = "g", description =
[[Controlador de nível do Slop.]],
},
{ id = "alinhado", name = "Alinhado", type = "BOOLEAN_POINT", access = "r", description =
[[Indica, quando verdadeiro que slop está alinhado ao flotador.]],
},
{ id = "lsh", name = "Nivel alto", type = "REAL_POINT", access = "r", description =
[[Ponto real que carrega o parametro que determina o valor de nível alto dentro Slop.]],
},
{ id = "lsl", name = "Nivel baixo", type = "REAL_POINT", access = "r", description =
[[Ponto real que carrega o parametro que determina o valor de nível baixo dentro Slop.]],
},
{ id = "lshh", name = "Nivel muito alto", type = "REAL_POINT", access = "r", description =
[[Ponto real que carrega o parametro que determina o valor de nível muito alto dentro Slop.
Valor para antecipar uma situação de trip.]],
},
{ id = "diagnostico", name = "Diagnóstico", type = "diag_slop", access = "g", description =
[[Slop sobre o qual o diagnóstico será realizado.]],
},
},
}
class{ id = "diag_slop", name = "Diagnóstico de Slop", group = "Slop", description =
[[Vaso do tipo Slop. Recebe o Óleo proveniente do flotador.]],
attributes = {
{ id = "filtro_nivel", name = "Filtro de nível", type = "bloco_filtro", access = "g", description =
[[Filtro de primeira ordem para o nivel do Slop a ser controlado.]],
},
{ id = "media", name = "Média Móvel de nível do Slop", type = "bloco_media", access = "g", description =
[[Média móvel para o nível do Slop a ser controlado.]],
},
{ id = "nivel_medio", name = "Nivel medio do Slop", type = "REAL_POINT", access = "rw", description =
[[Ponto real que carrega o valor do nivel medio do Slop.]],
},
{ id = "diag_normal", name = "Diag. Normal", type = "BOOLEAN_POINT", access = "rw", description =
[[Indica, quando verdadeiro, que o diagnóstico do Slop está normal.]],
},
{ id = "diag_critico", name = "Diag. Critico", type = "BOOLEAN_POINT", access = "rw", description =
[[Flag para indicar que o slop se encontra em situação crítica com nível acima do muito alto.]],
},
},
}
class{ id = "controle_flotador_rampa", name = "Controle de Flotador por Rampa", group = "Flotador", description =
[[Classe que modela a atuação em rampa no controlador de nível de um flotador e o acopla a um par de slops e seus diagnósticos.]],
attributes = {
{ id = "habilitado", name = "Habilitado", type = "BOOLEAN_POINT", access = "rw", description =
[[Indica, quando verdadeiro, que o controle está habilitado pela operação.]],
},
{ id = "sdv", name = "Válvula SDV", type = "valvula_on_off", access = "g", description =
[[Válvula de segurança.]],
},
{ id = "flotador", name = "Flotador", type = "flotador", access = "g", description =
[[Instância do flotador que alimenta o Slop ser controlado.]],
},
{ id = "slop_a", name = "Slop A", type = "slop", access = "g", description =
[[Slop A cujo diagnóstico será considerado para a revisão do tempo da rampa.]],
},
{ id = "slop_b", name = "Slop B", type = "slop", access = "g", description =
[[Slop B cujo diagnóstico será considerado para a revisão do tempo da rampa.]],
},
{ id = "timer_w_sp_agua", name = "Timer de Escritas no SP de Água", type = "timer", access = "g", description =
[[Temporizador de intervalos entre escritas no setpoint do nível de água do flotador.]],
},
{ id = "inicio_rampa", name = "Início da Rampa", type = "REAL", access = "gs", description =
[[Configuração de valor de início da rampa.]],
},
{ id = "final_rampa", name = "Final da Rampa", type = "REAL", access = "gs", description =
[[Configuração de valor final da rampa.]],
},
{ id = "amplitude_rampa", name = "Amplitude da Rampa", type = "REAL", access = "gs", description =
[[Configuração de amplitude da rampa.]],
},
{ id = "hab_rev_rampa", name = "Hab. Rev. Rampa", type = "BOOLEAN_POINT", access = "r", description =
[[Habilita, quando verdadeiro, a revisão de valores de base e de topo da rampa.]],
},
{ id = "v_min_rampa", name = "Valor Mín. Rampa", type = "REAL_POINT", access = "rw", description =
[[Indica o valor mínimo configurado para a Rampa.]],
},
{ id = "v_max_rampa", name = "Valor Máx. Rampa", type = "REAL_POINT", access = "rw", description =
[[Indica o valor máximo configurado para a rampa.]],
},
{ id = "timer_rev_rampa", name = "Timer de Rev. de Rampa", type = "timer", access = "g", description =
[[Temporizador de intervalos entre ajustes nos valores da rampa.]],
},
{ id = "indicadores", name = "Indicadores", type = "indicador_flotador[]", access = "g", description =
[[Lista de Indicadores que serão mantidos para revisão dos valores da rampa.]],
},
{ id = "t_rampa", name = "Tempo da Rampa", type = "REAL", access = "gs", description =
[[Configuração de tempo para realização de uma interação da rampa.]],
},
{ id = "t_rampa_inc", name = "T. Rampa Inc.", type = "REAL", access = "gs", description =
[[Configuração do incremento no tempo da rampa em uma revisão.]],
},
{ id = "t_rampa_min", name = "T. Rampa Mín.", type = "REAL", access = "g", description =
[[Configuração de tempo mínimo para realização de uma rampa.]],
},
{ id = "t_rampa_max", name = "T. Rampa Máx.", type = "REAL", access = "g", description =
[[Configuração de tempo máximo para realização de uma rampa.]],
},
{ id = "timer_rev_t_rampa", name = "Timer Rev. T. Rampa", type = "timer", access = "g", description =
[[Temporizador de intervalos entre revisões no tempo de uma rampa.]],
},
},
methods = {
{ id = "iniciar_indicadores", name = "Iniciar Indicadores", description =
[[Inicia o estado dos indicadores.]],
code = [===[ function(self)
for i, indicador in ipairs(self.indicadores) do
indicador:iniciar()
end
end ]===],
},
}
}
class{ id = "indicador_flotador", name = "Indicador do Flotador", group = "Flotador", description =
[[Equipamento que relaciona os parâmetros e equipamentos calculados pelo Calculo do Termo dos Indicadores no Controle e de Níveis do Slop e Flotador.]],
attributes = {
{ id = "variavel_processo", name = "Variável de Proceso", type = "REAL_POINT", access = "rw", description =
[[Variável de processo que será usada para gerar o indicador.]],
},
{ id = "condicao", name = "Condição", type = "condicao", access = "g", description =
[[Condição que indica, quando verdadeira, que o valor atual deve ser considerado para o cálculo do indicador.]],
},
{ id = "amostras", name = "Amostras", type = "bloco_media", access = "g", description =
[[Variável de processo que será usada para gerar o indicador.]],
},
{ id = "tipo", name = "Tipo", type = "STRING", access = "g", description =
[[Configuração de tipo de indicador. Os tipo de indicadorsão:
.intervalo - média dos intevalos entre duas condições verdadeiras;
.integral - somatório de produtos de intevalo de tempo entre condições verdadeiras e variável de processo. ]],
},
{ id = "v_ref", name = "Valor Referência", type = "REAL", access = "g", description =
[[Configuração de valor Referência para indicador enquanto não tem amostras necessárias para cálculo.
]],
},
{ id = "v_min", name = "Valor Mínimo", type = "REAL", access = "g", description =
[[Configuração de valor mínimo para indicador.]],
},
{ id = "d_rampa_baixo", name = "Delta na Rampa Baixo", type = "REAL", access = "gs", description =
[[Configuração de variação na rampa caso indicador esteja abaixo do valor mínimo.]],
},
{ id = "v_max", name = "Valor Máximo", type = "REAL", access = "g", description =
[[Configuração de valor máximo para indicador.]],
},
{ id = "d_rampa_alto", name = "Delta na Rampa Alto", type = "REAL", access = "gs", description =
[[Configuração de variação na rampa caso indicador esteja acima do valor máximo.]],
},
{ id = "fator", name = "Fator", type = "REAL", access = "g", description =
[[Configuração de peso do indicador.]],
},
},
code = [====[
function _CLASS:init()
self:iniciar()
end
]====],
methods = {
{ id = "iniciar", name = "Iniciar", description =
[[Iniciar indicador.]],
parameters = {
},
results = {
},
code = [===[ function(self)
self:iniciar_amostras()
self.t_1 = nil
end ]===],
},
{ id = "iniciar_amostras", name = "Iniciar Amostras", description =
[[Iniciar indicador.]],
parameters = {
},
results = {
},
code = [===[ function(self)
self.amostras:inicializar()
end ]===],
},
{ id = "atualizar", name = "Atualizar", description =
[[Atualiza as amostras do indicador.]],
parameters = {
},
results = {
},
code = [===[ function(self)
local amostras = self.amostras
local valor = 0
local dt = 0
if (self.condicao == nil) or self.condicao:avaliar_atendida() then
self.t_0 = time()
if self.t_1 then
dt = self.t_0 - self.t_1
valor = self.variavel_processo and self.variavel_processo:read() or 1
amostras:inserir(valor*dt)
end
self.t_1 = self.t_0
else
if self.tipo == 'integral' then
self.t_1 = nil
amostras:inserir(0)
end
end
end ]===],
},
{ id = "calcular", name = "Calcular", description =
[[Calcula valor do indicador de acordo com as amostras obtidas.
Se não houverem amostras, será retornado o valor de referência. Se este também não estiver definido, será retornado o valor mínimo.]],
parameters = {
},
results = {
{ name = "Valor Indicador", type = "REAL"},
},
code = [===[ function(self)
if self.tipo == 'integral' then
if not self.amostras:informar_amostragem_completa() then
return self.v_ref or self.v_min
else
return self.amostras:somatorio()
end
elseif self.tipo == 'intervalo' then
if self.amostras:informar_amostragem_vazia() then
return self.v_ref or self.v_min
else
return self.amostras:calcular_media()
end
else
error(tostring(self)..": Tipo de indicador deve ser: 'integral' ou 'intervalo'.")
end
end ]===],
},
{ id = "avaliar_alto", name = "Avaliar Alto", description =
[[varfica se o valor calculado para o indicador está acima do máximo configurado.]],
parameters = {
},
results = {
{ name = "Indicador Alto", type = "BOOLEAN"},
},
code = [===[ function(self)
return self:calcular() > self.v_max
end ]===],
},
{ id = "avaliar_baixo", name = "Avaliar Baixo", description =
[[varfica se o valor calculado para o indicador está abaixo do mínimo configurado.]],
parameters = {
},
results = {
{ name = "Indicador Baixo", type = "BOOLEAN"},
},
code = [===[ function(self)
return self:calcular() < self.v_min
end ]===],
},
},
}
......@@ -2,151 +2,8 @@ include('lib-list-1_0.mpam')
include('lib-painel-1_0.mpam')
--Registro geral
code = (code or '')..[====[
-- Relatório para mensagens do fluxo
_MPALOGID = "MPALOG"
_MPALOGS = {}
]====]
--$COMPAT:_mpa_arquivo_registros
func{ id = "criar_registro", name = "Criar Registro", description =
[[Define o arquivo de registros principal.
O número de arquivos de registros mantidos é especificado pelo parâmetro
"Limite".]],
parameters = {
{ name = "Identificador", type = "STRING" },
{ name = "Limite", type = "INTEGER" },
{ name = "Sufixo", type = "STRING" },
},
results = {
},
code = [===[ function(id, limit, sufixo)
-- define nome do arquivo
sufixo = sufixo or "_%Y%m%d%H%M%S.LOG"
local filename = os.date(id..sufixo)
-- abre arquivo
local f = io.open(filename, "a+")
if f then
_MPALOGS[#_MPALOGS+1] = filename
f:write("\nNovo arquivo de registro definido.\n")
f:close()
else
avisar("Erro ao abrir arquivo de log para escrita: "..filename)
end
-- remove versões anteriores
if limit then
while #_MPALOGS > limit do os.delete(table.remove(_MPALOGS,1)) end
end
end ]===],
}
--$COMPAT:_mpa_registrar
func{ id = "registrar", name = "Registrar", description =
[[Adiciona uma mensagem ao arquivo de registros principal.
É necessário chamar a função 'MPA definir arquivo registros' antes para definir
o arquivo onde as mensagens serão gravadas.]],
parameters = {
{ name = "Mensagem", type = "STRING" },
},
results = {
},
code = [===[ function(m)
local f = assert(io.open(_MPALOGS[#_MPALOGS], "a+"))
f:write( os.date("%Y/%m/%d-%H:%M:%S;%%s\n"):format(m))
f:close()
end ]===],
}
class{ id = "registro", name = "Registro", group = "Arquivos E/S", description =
[[Gerencia um arquivo de registro.
Por padrão o nome do arquivo de registro, se nenhuma versão for criada,
fica com o nome do equipmanetoe a extensão "log".
]],
attributes = {
{ id = "caminho", name ="Caminho", type = "STRING", access ="", description =
[[Caminho onde deve ser gravado o arquivo.
Se não for definido, é usado o diretório corrente de execução do servidor.]],
},
{ id = "prefixo", name ="Prefixo", type = "STRING", access ="", description =
[[Prefixo que das versões do arquivo.
Se não for definido, o tag do registro será usado.]],
},
{ id = "extensao", name ="Extensão", type = "STRING", access ="", description =
[[A extensão a ser usada nos arquivos de registro.
Se não for definido, é usado 'log'.
Atenção: não coloque o ponto na extensão.]],
},
{ id = "limite", name ="Limite de Versões", type = "INTEGER", access ="", description =
[[Define o limite de versões que devem ser criadas para um registro.
Caso seja definido um limite, as mais antigas serão apagadas para a criação das novas.]],
},
{ id = "lista_versoes", name ="Lista Versões", type = "lista_persistente", access ="", description =
[[Lista que armazeana o nome de versões prévias do registro incluindo execuções anteriores.]],
},
},
code = [===[
function _CLASS:init()
self:newname()
self._lista = {}
end
function _CLASS:newname()
self._filename = os.date("%%s/%%s_%Y%m%d_%H%M%S.%%s"):format(
self.caminho or ".",
self.prefixo or tostring(self),
self.extensao or "log" )
end
]===],
methods = {
{ id = "criar_nova_versao", name ="Criar Nova Versão", description =
[[Cria uma versão nova do arquivo no caminho especificado e
apaga as versões antigas que excedem o limite configurardo para o registro.
]],
parameters = {
},
results = {
},
code = [===[ function(self)
-- cria nome de novo arquivo
self:newname()
include('lib-log-1_0.mpam')
-- inclui na lista
local lista = self.lista_versoes
if lista then
lista:inserir(self._filename)
-- remove antigos e deleta
while (lista:informar_tamanho() > self.limite) do
os.remove(lista:remover())
end
else
table.insert(self._lista, self._filename)
while ( self.limite and (#self._lista > self.limite) ) do
os.remove(table.remove(self._lista, 1))
end
end
end ]===],
},
{ id = "registrar", name ="Registrar", description =
[[Adiciona um texto ao relatório.]],
parameters = {
{name = "Mensagem", type = "STRING"},
},
results = {
},
code = [===[ function(self, m)
local file, err = assert(io.open(self._filename, "a+"))
file:write(os.date("%Y/%m/%d %H:%M:%S;%%s\n"):format(m))
file:close()
end ]===],
},
},
}
-- table decat
code = (code or "") .. [====[
......@@ -385,42 +242,6 @@ func{ id = "imprimir", name = "Imprimir", description =
end ]===],
}
--$COMPAT:_mpa_avisar
func{ id = "avisar", name = "Avisar", description =
[[Exibe uma mensagem ao operador.
Os avisos podem ser gravados no arquivo de registros principal. Porém,
para isso, é necessário configurar primeiramente o arquivo, através da
função 'MPA definir arquivo registros'.]],
parameters = {
{ name = "Mensagem a ser exibida", type = "STRING" },
{ name = "Registrar aviso", type = "BOOLEAN" },
},
results = {
},
code = [===[ function(message, register)
local first, next
for id, linha in instancesof("linha_mensagem") do
if UltimaLinha == nil or linha.id > UltimaLinha then
if next == nil or linha.id < next.id then
next = linha
end
else
if first == nil or linha.id < first.id then
first = linha
end
end
end
if next == nil then next = first end
if next ~= nil then
next.linha_texto:write(message)
UltimaLinha = next.id
else
imprimir_erro( ("Sem linha_mensagem para exibir: '%s'"):format(message))
end
if register then registrar( ("AVISO;%s"):format(message) ) end
end ]===],
}
--$COMPAT:_informar_erro
func{ id = "imprimir_erro", name = "Imprimir Erro", description =
[[Imprime uma mensagem de erro no console]],
......@@ -433,53 +254,3 @@ func{ id = "imprimir_erro", name = "Imprimir Erro", description =
print(os.date("[%Y/%m/%d-%H:%M:%S] ERRO: %%s"):format(m)
end ]===],
}
--$COMPAT:_mpa_alarmar
func{ id = "alarmar", name = "Alarmar", description =
[[Gera uma mensagem de alarme para o operador, retornando o alarme escolhido.
Se nenhum alarme estiver disponível essa função retorna nil.
Utilizando o parâmetro Registrar o alarmes é armazenado no arquivo de registros principal, porém,
para isso, é necessário configurar primeiramente o arquivo, através da função 'MPA definir arquivo registros'.]],
parameters = {
{ name = "Mensagem de alarme a ser exibida", type = "STRING" },
{ name = "Registrar alarme", type = "BOOLEAN" },
},
results = {
{ name = "Alarme Escolhido", type = "alarme_mensagem" },
},
code = [===[ function(message, register, force)
local choosen
for id, alarme in instancesof("alarme_mensagem") do
if
not alarme.alarme:read()
and (choosen == nil or alarme.id < choosen.id)
then
choosen = alarme
end
end
if not choosen then
if force then
local alarmes = {}
for id, alarme in instancesof("alarme_mensagem") do
alarmes[#alarmes+1] = alarme
end
table.sort(alarmes, function(a,b)
local ts_a = a._timestamp
local ts_b = b._timestamp
if ts_a and ts_b then
return ts_a < ts_b
elseif ts_a then
return false
else
return true
end
end)
choosen = alarmes[1]
end
end
if choosen then choosen:alarmar(message) end
if register then registrar((choosen and "ALARME;" or "ALARME n/d;")..message) end
return choosen
end ]===],
}
func{ id = "minimo", name = "Calcular Mínimo de Lista", description =
[[Função que recebe lista de valores reais e retorna o mínimo desses valores.
Se o pârametro for positivo, as N primeiras amostras serão consideradas;
Se o parâmetro for negativo, as N últimas amostras serão consideradas na média;
Caso o parâmetro seja nulo, todas as amostras serão consideradas.
Se o valor absoluto de N for maior que o número de elementos da lista, todos os elementos serão considerados.
]],
parameters = {
{name = "Lista", type = "REAL[]" },
{name = "N", type = "INTEGER" },
},
results = {
{name = "Mínimo", type = "REAL" },