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

Inclusão de lib-reactsim 2_0 e script de importação

INSTMPA-933
parent c61d62f3
-- =============================================================================
-- Copyright (C) 2003-2020 Tecgraf/PUC-Rio, PETROBRAS S/A
-- Instituto Tecgraf <mpa@tecgraf.puc-rio.br>
-- Arquivo gerado pelo programa MPA
-- Verso: 6.3.1alpha20200615c
-- Arquivo: lib-reactsim.mpad
-- Data: 26/08/2020 11:18:55
-- =============================================================================
MPA_5_0 = true
DisabledDiagrams = {
}
Diagrams = {
{
id = "[[REACTSIM]]",
name = "[[REACTSIM]]",
kind = "Flow",
description = "Obtm lista, e executa todas para\nas instncias de classe a Simulao\nReativa.",
isApplication = true,
globals = {
},
errorFunction = nil,
haltDiagram = nil,
Nodes = {
{
type = "Command",
description = "$results =\nobtm\n$Name",
action = {
_switch = "FUNCTIONCALL",
beforemsg = nil,
aftermsg = nil,
expressions = {},
variables = {
"allreactsims",
},
functionid = "reactsim_get_all",
},
xmin = 4080,
ymin = 5340,
xmax = 4280,
ymax = 5460,
},
{
type = "Foreach",
description = nil,
action = {
_switch = "LISTITERATION",
variable = "reactsim",
index = nil,
list = "allreactsims",
listtype = "api_reactsim",
},
xmin = 4360,
ymin = 5340,
xmax = 4560,
ymax = 5460,
},
{
type = "Fork",
description = nil,
x = 4460,
y = 5200,
r = 40,
},
{
type = "Command",
description = nil,
action = {
_switch = "OBJECTCALL",
beforemsg = nil,
aftermsg = nil,
expressions = {},
variables = {
"intervalo",
},
classid = "api_reactsim",
objname = "reactsim",
member = "intervalo",
operation = "get",
},
xmin = 4360,
ymin = 4940,
xmax = 4560,
ymax = 5060,
},
{
type = "Command",
description = "$Name\n$parameter_1\nsegundos",
action = {
_switch = "FUNCTIONCALL",
beforemsg = nil,
aftermsg = nil,
expressions = {
"intervalo",
},
variables = {},
functionid = "esperar",
},
xmin = 4920,
ymin = 4740,
xmax = 5120,
ymax = 4860,
},
{
type = "Command",
description = "$Name\n($object)",
action = {
_switch = "OBJECTCALL",
beforemsg = nil,
aftermsg = nil,
expressions = {},
variables = {},
classid = "api_reactsim",
objname = "reactsim",
member = "executar",
operation = "call",
},
xmin = 4640,
ymin = 4740,
xmax = 4840,
ymax = 4860,
},
{
type = "Command",
description = nil,
action = {
_switch = "OBJECTCALL",
beforemsg = "string.format(\"%s: Inicia Simulao Reativa...\", tostring(reactsim))",
aftermsg = nil,
expressions = {},
variables = {},
classid = "api_reactsim",
objname = "reactsim",
member = "reset",
operation = "call",
},
xmin = 4360,
ymin = 4740,
xmax = 4560,
ymax = 4860,
},
},
Links = {
{
type = "Link",
description = nil,
from = 1,
to = 2,
x = {
4180,
4460,
},
y = {
5400,
5400,
},
},
{
type = "Link",
description = nil,
from = nil,
to = 1,
x = {
3960,
4180,
},
y = {
5400,
5400,
},
},
{
type = "Link",
description = "I",
from = 2,
to = 3,
x = {
4460,
4460,
},
y = {
5400,
5200,
},
},
{
type = "Link",
description = nil,
from = 3,
to = 4,
x = {
4460,
4460,
},
y = {
5200,
5000,
},
},
{
type = "Link",
description = nil,
from = 6,
to = 5,
x = {
4740,
4740,
5020,
5020,
},
y = {
4800,
4700,
4700,
4800,
},
},
{
type = "Link",
description = nil,
from = 5,
to = 6,
x = {
5020,
4740,
},
y = {
4800,
4800,
},
},
{
type = "Link",
description = nil,
from = 4,
to = 7,
x = {
4460,
4460,
},
y = {
5000,
4800,
},
},
{
type = "Link",
description = nil,
from = 7,
to = 6,
x = {
4460,
4740,
},
y = {
4800,
4800,
},
},
},
Areas = {
},
Hidden = {
},
},
}
Dependencies = {
}
This diff is collapsed.
scripts.add {
name = "Simulao Reativa: Importa Instncias",
author = "Daniel Lima Freixo (danlimfreixo@tecgraf.puc-rio.br); Bernardo Quaresma Dias (bernardo@tecgraf.puc-rio.br)",
description = [[
Importa configuraes de instncias a partir de arquivo CSV.
Cada linha corresponde configurao de uma instncia onde ss parmetros so separados por vrgula e o primeiro catectere
indica o tipo de Simulao Reativa da Linha.
Os tipos de simulao reativa esperados so:
'c' - Simulao Reativa Constante
'l' - Simulao Reativa Linear
'b' - Simulao Reativa por Bloco de Clculo
Parmetros de Simulaes Reativas Constantes:
c,<tag varivel simulada>,<valor constante>,<rudo>,<valor mnimo>,<valor mximo>,[Modo Inativo],[Condio Ativao]
Parmetros de Simulaes Reativas Lineares:
l,<tag varivel simulada>,<tag variavel entrada>,<coeficiente angular>,<coeficiente linear>,<rudo>,<valor mnimo>,<valor mximo>,[Modo Inativo],[Condio]
Parmetros de Simulao Reativa por Bloco de Clculo:
b,<tag varivel simulada>,<tag varivel entrada>,<rudo>,<valor mnimo>,<valor mximo>,[Modo Inativo],<bloco clculo>,[Condio]
- Tempo Morto:
tm,<intervalo>,<atraso>,<referncia>
- Filtro:
bf,<intervalo>,<k>,<t>,<valor inicial>
- Mdia:
mm,<intervalo>,<periodo>
[Modo Inativo] Cada Simulao Reativa pode ter uma condio de ativao que, quando atendida, ir efetivar a simulao.
Quando essa condio for configurada, mas no for atendida, o valor da simulao ser ajustado de acordo com o
modo inativo:
min: O <Valor Mnimo> ser usado para simulao
max: O <Valor Mximo> ser usado para simulao
off: O valor da varivei simulada no ser atualizado (padro)
[Condio Ativao] A configurao de condies feita incluindo um sufixo, tambm separado por vrgula, iniciado com o tipo de condio
e seguido pelos seus attributos.
A saber:
- Cond. Lgica: cl,<variavel>,<tipo condio:{true|false|reset|set}>
- Cond. Numrica: cn,<variavel>,<tipo condio:{min|max|equal}>,<valor referncia>
O formato sperado para as linhas de configurao :
Exemplos:
#linha comentada
#var_a=20.2 + 20.2*([+/-]15/100)
c,var_a,20.2,15
#var_j = var_c * 0.96 + 51 + var_c*([+/-]11/100)
l,var_j,var_c,0.96,51,11
#_______________
#outros:
c,var_b,20.2,100,1.1,38.8,min,cl,var_cl,true
c,var_c,20.2,100,1.1,38.8,off,cn,var_cn,max,10,1
l,var_d,var_a,20.1,100,10,30.6
l,var_d,var_a,20.1,100,10,30.6,cn,var_cn,min,10,1
b,var_bc_bm_3,var_bc_bm_3_out,10,5,95,,mm,10,1
b,var_bc_bf_1,var_bc_bf_1_out,10,5,95,,tm,30,15,10
b,var_bc_bf_2,var_bc_bf_2_out,10,5,95,,bf,10,1,10,12,cl,var_cond_l_true,true
]],
CommentString = "#",
FieldStringSep = ",",
PrefixVars = "reactsim",
trim = function(self, s)
return s:match'^%s*(.*%S)' or ''
end,
functionsfields = {
amostras = {
{ attrid = "intervalo_min";
func = function(actual, old) if not tonumber(old) then return actual end return math.min(actual, old) end,
},
{ attrid = "validade";
func = function(actual, old) if not tonumber(old) then return actual end return math.max(actual, old) end,
},
},
},
adjustfieldvalue = function(self, classid, attrid, value, oldvalue) -- [[DEBUG]]MPA.PrintOut("adjustfieldvalue", classid, attrid, value, oldvalue)
if (self.functionsfields[classid]) then
for attridx, attrtbl in pairs(self.functionsfields[classid]) do
-- [[DEBUG]]MPA.PrintOut("adjustfield", classid, attrtbl.attrid, attrid, value, oldvalue, attrtbl.func(value, oldvalue))
if (attrtbl.attrid == attrid) then
local val = attrtbl.func(value, oldvalue)
-- [[DEBUG]]MPA.PrintOut("adjustfield", classid, attrid, value, oldvalue, val)
return val
end
end
end
return value
end,
--maper o preenchimento automtico de uma classe antes da sua criao lida pelo arquivo ou no
extrafields = {
cl = { attrid = "condicao", classid = "condicao_logica", configurator = function(self, conf)
conf.id = self:createReactSimId(conf.valor_processo, conf.tipo)
end;
"valor_processo", "tipo"
},
cn = { attrid = "condicao", classid = "condicao_numerica", configurator = function(self, conf)
conf.id = self:createReactSimId(conf.valor_processo, conf.tipo, conf.valor_referencia, conf.tolerancia)
end;
"valor_processo", "tipo", "valor_referencia", "tolerancia"
},
tm = { attrid = "bloco_calculo", classid = "bloco_tempo_morto";
"intervalo", "atraso", "referencia"
},
bf = { attrid = "bloco_calculo", classid = "bloco_filtro";
"intervalo", "k", "t", "v_init"
},
mm = { attrid = "bloco_calculo", classid = "bloco_media", configurator = function(self, obj)
obj["amostras"] = {
id = self:createReactSimId(obj.id, "am"),
classid = "amostras",
intervalo_min = obj.intervalo,
validade = obj.periodo,
}
end;
"intervalo", "periodo"
},
},
reactfields = {
c = { classid = "reactsim_constante";
"saida", "entrada", "ruido", "val_min", "val_max", "modo_inativa"
},
l = { classid = "reactsim_linear";
"saida", "entrada", "a", "b", "ruido", "val_min", "val_max", "modo_inativa"
},
b = { classid = "reactsim_bloco_calculo";
"saida", "entrada", "ruido", "val_min", "val_max", "modo_inativa"
},
},
--[[
conf = {
classid = "reactsim_constante",
saida = "var_xx",
entrada = 4,
ruido = 10,
val_min = 0,
val_max = 100,
condicao = {
id = <<$valor_processo>>,
classid = "condicao_numerica",
attrid = "condicao",
valor_processo = "var_yy",
tolerancia = 5,
tipo = "max",
referencia = 50,
},
}
conf = {
id = <<$self:createReactSimId($conf.saida)>>,
classid = "reactsim_bloco_calculo";
val_min = 5,
saida = "var_bc_saida",
entrada = "var_bc_entrada",
ruido = 10,
val_max = 99,
bloco_calculo = {
classid = "bloco_media",
attrid = "bloco_calculo",
intervalo = 1,
periodo = 10,
amostras = {
id = "<<$conf.entrada..amostra>>",
classid = "amostras";
attrid = "amostras",
intervalo_min = 10,
validade = 300,
}
}
}
conf
--]]
createReactSimId = function(self, ...)
local ids = { }
for i = 1, select("#",...) do
ids[#ids+1] = (select(i,...))
end
return table.concat(ids,"-")
end,
createReactSim = function(self, config)
local ok = true
-- [[DEBUG]] self:pt(config, "configrsb:")
local classid = config.classid
local configid = config.id -- [[DEBUG]] MPA.PrintOut("reactsimAddConfig",classid, configid)
--Criar nova Configurao de Simulao Reativa
MPA.AddConfig(classid, configid)
-- [[DEBUG]]for k, v in pairs(config) do MPA.PrintOut(classid, configid, k,v) if (type(v) == "table") then for x,y in pairs(v) do MPA.PrintOut(classid, configid, k,v, x, y) end end end
for fieldid, fieldval in pairs(config) do -- [[DEBUG]] MPA.PrintOut("fieldid,fieldval", fieldid, fieldval)
if fieldid ~= "classid" and fieldid ~= "reactid" and fieldid ~= "id" then
-- [[DEBUG]] MPA.PrintOut(">", fieldid, fieldval)
if type(fieldval) ~= "table" then
MPA.SetAttribute(configid, fieldid, fieldval)
else
local attrinstid = fieldval.id
self:createReactSim(fieldval)
MPA.SetAttribute(configid, fieldid, attrinstid)
end
end
end
return ok
end,
importReactSimLine = function(self, ln) --[[DEBUG]]MPA.PrintOut("importReactSimLine:", ln)
local ok = true
local idtoks = {}
local conf = {}
local fields
local ifield = 0
local extraconf
local extrafields
local iextrafields = 0
for tok in ln:gmatch("([^,;]*)[,;]?") do --TODO: evitar que o ultimo caracter vazio da linha entre aqui (rever o match)
tok = self:trim(tok)
if (tok) then -- [[DEBUG]] MPA.PrintOut(tok)
if conf.classid == nil then
fields = self.reactfields[tok]
if (fields == nil) then -- reportar erro de tipo no identificado
MPA.PrintOut("\n[ERRO]: classe '"..tok.."' desconhecida! Verifique a configurao da linha!\n", ln)
ok = false
break
end
conf.classid = fields.classid
idtoks.reacttype = tok
elseif ifield < #fields then
ifield = ifield + 1
local attrid = fields[ifield]
conf[attrid] = tok
if (ifield == 1) then
conf.id = self:createReactSimId(self.PrefixVars, idtoks.reacttype, tok)
end
elseif not extrafields then -- [[DEBUG]] MPA.PrintOut("Carregado extrafields para tok", tok)
extrafields = self.extrafields[tok]
iextrafields = 0
if extrafields == nil then
if tok and tok:len() > 0 then
MPA.PrintOut("\n[ERRO]: classe extra '"..tok.."' desconhecida! Verifique a configurao da linha!\n")
ok = false
end
break
end
extraconf = {
id = self:createReactSimId(conf.id, tok),
classid = extrafields.classid,
}
else
-- tratar os n toks em seguida como attributos do extra field
iextrafields = iextrafields + 1
local extraattrid = extrafields[iextrafields]
extraconf[extraattrid] = tok
if iextrafields == #extrafields then
conf[extrafields.attrid] = extraconf
if extrafields.configurator and type(extrafields.configurator) == "function" then
extrafields.configurator(self, extraconf)
-- [[DEBUG]] self:pt(extraconf, "extraconf")
-- [[DEBUG]] self:pt(child, "child")
end
extraconf = nil
extrafields = nil
end
end
end
end
return conf, ok
end,
--[[DEBUG
pt = function(self, tb, prefix)
if (type(tb) == "table") then
for k,v in pairs(tb) do
if (type(v) == "table") then
self:pt(v, (prefix or "")..">"..(k or "").." ")
else
MPA.PrintOut(prefix, k, v)
end
end
else
MPA.PrintOut(prefix, tb)
end
end,
---]]
callback = function(self)
local ret, fname = MPA.LoadFileDialog(
"Arquivo CSV de Sim.React para Conf.",
"*.csv",
"Arquivo CSV com Lista Simulao Reativa"
)
if (not ret) then
MPA.PrintOut("\n\nCancelado pelo usurio!\n\n")
return false
end
local all_ok = true
local ok = false
for line in io.lines(fname) do
if (line and self:trim(line):len() > 0 and line:sub(1,1) ~= self.CommentString) then --Pega linhas teis:
local config, ok = self:importReactSimLine(line) --Converte linha em estrutura conhecida de equipamento
all_ok = all_ok and ok
self:createReactSim(config) --insere equipamento na planta
end
end
if (not all_ok) then
MPA.PrintOut("\nFavor rever o arquivo, pois h algum item do script com problema!")
all_ok = nil
end
return all_ok
end,
}
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