Pular para conteúdo

Eventos, Schedules e Estados

Neste tutorial o tanque com o controlador de nível vira uma bancada de teste do próprio Dynamics Manager, na GUI Clássica do DWSIM: conjuntos de eventos com degraus e rampas, estados guardados do flowsheet como pontos de partida, um gauge de nível com alarmes, uma matriz de causa e efeito que age sobre um alarme, e o historiador que torna as rampas possíveis. Nada disso muda o processo; tudo isso muda o que uma corrida pode pedir ao processo.

O que você vai aprender

  • As cinco partes do Dynamics Manager e como um schedule as amarra
  • Transições em degrau e em rampa, e por que uma rampa precisa do historiador e de um evento de referência
  • Como um gauge levanta alarmes, como uma matriz de causa e efeito transforma um alarme em ação, e como estados guardados tornam toda corrida repetível

Pré-requisitos

Visão Geral do Processo

O tanque dos tutoriais anteriores, com o controlador de nível LIC-01 (Kp 2, Ki 0,1, setpoint 1 m), mais:

  1. Um Level Gauge LI-01 lendo o Liquid Level de T-01, faixa de 0 a 2 m, alarmes LL 0,2 m, L 0,5 m, H 1,3 m, HH 1,6 m
  2. Um conjunto de eventos Ramp que sobe a entrada de 10 para 15 kg/s ao longo de três minutos
  3. Um conjunto de eventos Manual que põe a LIC-01 em manual e depois dá um degrau na entrada
  4. Uma matriz de causa e efeito CE1: quando a LI-01 levanta o alarme H, a LIC-01 volta para automático

Diagrama de Fluxo do Processo

graph LR
    IN["Inlet<br/>10 → 15 kg/s<br/>(rampa ou degrau)"] --> V1["V-01"]
    V1 --> T["T-01"]
    T --> V2["V-02"]
    V2 --> OUT["Outlet"]
    T -. nível .-> LIC["LIC-01"]
    LIC -. abertura .-> V2
    T -. nível .-> LI["LI-01<br/>(gauge)<br/>H 1,3 m"]
    LI -. alarme H .-> CE["CE1<br/>LIC-01 → auto"]
    CE -. ManualOverride = 0 .-> LIC

Parâmetros de Projeto

Parâmetro Valor Unidade
Estado de partida Steady: nível 1,000 m, V-02 28,8 %, entrada 10 kg/s -
Evento de rampa entrada 10 → 15 kg/s de 1 min a 4 min, linear kg/s
Eventos de degrau LIC-01 ManualOverride = 1 em 5 s; entrada 15 kg/s em 1 min -
Gauge LI-01 faixa de 0 a 2 m; LL 0,2, L 0,5, H 1,3, HH 1,6 m
Causa e efeito alarme H da LI-01 → LIC-01 ManualOverride = 0 -
Integrador passo 5 s, 10 min -

Passo a Passo na GUI Clássica

1. O Dynamics Manager numa olhada

Dynamics > Dynamics Manager tem cinco abas. Integrators dizem como avançar (tamanho do passo, duração, o que monitorar). Event Sets dizem o que muda e quando. Cause-and-Effect Matrices dizem o que acontece quando um alarme dispara. Monitored Variables vivem dentro de cada integrador. Schedules juntam um integrador, um conjunto de eventos opcional, uma matriz opcional e um estado inicial num caso que roda. Os estados são guardados com Store Current (grupo Flowsheet States da barra de ferramentas) e listados na caixa de estado inicial do schedule.

2. Uma rampa

Event Sets: adicione Ramp com dois eventos sobre Mass Flow de Inlet:

  • start: em 00:01:00, valor 10 kg/s, transição Step
  • ramp: em 00:04:00, valor 15 kg/s, transição Linear, referência Previous event

Schedule Ramp: Int1, conjunto de eventos Ramp, estado inicial Steady. Rode.

A entrada sobe em linha reta de 10 kg/s em 1 min a 15 kg/s em 4 min. O nível nunca sai de 1,01 m: o controlador segue uma mudança assim lenta sem erro visível, e a V-02 abre suavemente de 28,8 % a 43,3 %. Compare com o degrau do tutorial anterior, que empurrou o nível a 1,062 m.

Por que a rampa precisa de referência e do historiador

Uma transição linear traça uma reta do valor que a propriedade tinha no evento de referência até o novo valor no instante do próprio evento. O evento start existe só para dar à rampa um ponto e um instante de partida definidos; sem ele a rampa partiria do que o historiador registrou antes do primeiro evento. O historiador é o registro de toda propriedade a cada passo (Dynamics Manager > Settings); deixe-o ligado, ou as rampas e qualquer transição que não seja degrau não têm o que ler.

Uma rampa feita de dois eventos

3. Um gauge com alarmes

Arraste um Level Gauge da Object Palette (Indicators) e renomeie para LI-01. Abra-o: objeto T-01, propriedade Liquid Level, unidade m, mínimo 0, máximo 2. Marque os quatro alarmes e ponha-os em 0.2, 0.5, 1.3 e 1.6 m. Marque Show alarms. O gauge desenha o nível como uma barra no flowsheet e acende as faixas de alarme conforme o nível as cruza.

4. Uma matriz de causa e efeito

Cause-and-Effect Matrices: adicione CE1 com um item: indicador LI-01, alarme H, ação sobre a propriedade ManualOverride de LIC-01, valor 0. Leia como uma frase: quando o nível passa de 1,3 m, o controlador volta para automático.

5. Modo manual, um degrau, e a matriz

Event Sets: adicione Manual com ManualOverride de LIC-01 = 1 em 00:00:05 e Mass Flow de Inlet = 15 em 00:01:00. Schedule CE: Int1, conjunto de eventos Manual, matriz CE1, estado inicial Steady. Rode.

Com o controlador em manual, a V-02 fica em 29 % e o nível sobe 0,26 m por minuto depois do degrau: 1,14 m em 1,5 min, 1,26 m em 2 min. Cruza 1,3 m pouco depois de 2 min; o gauge levanta o alarme H, a matriz vira a LIC-01 para automático, e o controlador, partindo sem solavanco de 29 %, abre a V-02 para trazer o nível de volta a 1,0 m nos minutos seguintes. Sem a matriz (rode o mesmo schedule sem CE1) o nível chega ao topo do tanque por volta de 10 min.

O gauge em alarme e o controlador de volta ao automático

6. Estados guardados como pontos de partida

Todo schedule deste tutorial e do anterior parte de Steady. Guarde outro estado ao fim da corrida Ramp (nível 1,0 m, entrada 15 kg/s, V-02 43 %) como HighFeed, e rode Disturbance a partir dele: o degrau para 15 kg/s já não muda nada, porque é o estado de onde ele parte. Um estado guardado contém todos os objetos, inclusive a sintonia e o modo do controlador; é isso que torna as corridas repetíveis, e é também por isso que uma mudança de sintonia feita no editor é desfeita por um schedule que parte de um estado guardado antes da mudança.

7. Resultados na planilha

View Results depois de cada corrida escreve as variáveis monitoradas numa aba de planilha, uma coluna por variável, uma linha por passo; a ferramenta de gráfico desenha qualquer coluna contra o tempo. Exporte a planilha para comparar corridas feitas com conjuntos de eventos diferentes.

Resultados e Validação

Corrida Nível, pico Nível, final V-02, final Unidade
Rampa 10 → 15 kg/s em 3 min 1,009 1,000 43,3 m, m, %
Degrau 10 → 15 kg/s (tutorial anterior) 1,062 1,000 43,3 m, m, %
Manual + degrau, sem matriz 2,0 (em 10 min) 2,0 29 m, m, %
Manual + degrau, com CE1 cerca de 1,3, depois de volta a 1,0 1,0 43 m, m, %

Resultados esperados

A rampa mostra como uma mudança lenta se esconde dentro da banda da malha: 1 cm de desvio contra 6 cm no degrau. A matriz mostra um alarme fazendo o trabalho do operador: o nível é segurado em 1,3 m, bem antes do transbordo a 2 m.

Entendendo os Resultados

Eventos, estados e matrizes são o vocabulário de um estudo dinâmico. Um conjunto de eventos é um roteiro do que o mundo externo faz com o processo; um estado guardado é onde o roteiro começa; o schedule amarra os dois a um integrador. O mesmo flowsheet pode carregar uma dúzia de schedules, um por pergunta: e se a carga subir em rampa, e se o controlador estiver em manual, e se o setpoint mudar. Manter as perguntas em schedules, e as respostas nas abas de planilha que eles produzem, é o que transforma uma simulação num estudo que outra pessoa consegue repetir.

A matriz de causa e efeito é a camada de segurança mais simples: sem dinâmica própria, só uma tabela de pares alarme-ação lida a cada passo. Plantas reais têm intertravamentos desse formato às centenas; a matriz é onde a simulação diz "e isto é o que a planta faz quando o operador não faz nada".

O que o script da FluentAPI cobre

O script abaixo monta as corridas de rampa e de estado guardado e salva o flowsheet com o gauge e a matriz definidos. Os gauges calculam os alarmes a cada passo, antes de a matriz os ler, então a matriz age numa corrida headless pela FluentAPI como age pelo Integrator Controls.

Automatizando Este Tutorial

Arquivos neste repositório

import os
import sys

import pythonnet
pythonnet.load("netfx")              # DWSIM is a .NET Framework application
import clr  # noqa: E402

DWSIM_BIN = os.environ.get("DWSIM_BIN")
if not DWSIM_BIN:
    raise SystemExit("Set DWSIM_BIN to the DWSIM installation folder before running.")
for sub in ("", "unitops", "ppacks", "extenders"):
    sys.path.append(os.path.join(DWSIM_BIN, sub))
clr.AddReference("DWSIM.Automation")
clr.AddReference("DWSIM.Automation.FluentAPI")
clr.AddReference("DWSIM.UnitOperations")
clr.AddReference("DWSIM.Interfaces")

from DWSIM.Automation.FluentAPI import Flowsheet, Q
from DWSIM.Automation.FluentAPI.Builders import IndicatorKind
from DWSIM.Interfaces.Enums import Dynamics as DynEnums

# start from the level-control flowsheet of the previous tutorial
fs = Flowsheet.Load("dynamic_tank_level_control.dwxmz")
fs.Dynamics.WithHistorian(True, 5000)

# fill to the setpoint and keep that state
fs.RunDynamics("Fill").Execute()
fs.Dynamics.StoreCurrentStateAs("Steady")

# a ramp: a step to the starting value, then a linear change referenced to it
(fs.Dynamics.DefineEventSet("Ramp")
   .AddStepChange("Inlet", "PROP_MS_2", 10.0, Q.Seconds(60.0), "kg/s", "start")
   .AddRamp("Inlet", "PROP_MS_2", 15.0, Q.Seconds(240.0), "kg/s", "ramp"))
fs.Dynamics.DefineSchedule("Ramp").WithIntegrator("Int1").WithEventSet("Ramp").WithInitialState("Steady").MakeCurrent()
r = fs.RunDynamics("Ramp").Execute()
print(f"ramp: level peak {r.GetSeries('level').Max:.3f} m, V-02 final {r.GetSeries('V-02 opening').Final:.1f} %")

# a gauge with alarms and a matrix that returns the controller to automatic on H
(fs.AddIndicator("LI-01", IndicatorKind.Level).Reads("T-01", "Liquid Level", "m")
   .WithRange(0.0, 2.0).WithAlarms(0.2, 0.5, 1.3, 1.6))
(fs.Dynamics.DefineCauseAndEffectMatrix("CE1").AddItem("high level returns LIC-01 to auto")
   .WhenAlarm("LI-01", DynEnums.DynamicsAlarmType.H).Then("LIC-01", "ManualOverride", 0.0, ""))
(fs.Dynamics.DefineEventSet("Manual")
   .AddStepChange("LIC-01", "ManualOverride", 1.0, Q.Seconds(5.0), "", "manual")
   .AddStepChange("Inlet", "PROP_MS_2", 15.0, Q.Seconds(60.0), "kg/s", "feed step"))
(fs.Dynamics.DefineSchedule("CE").WithIntegrator("Int1").WithEventSet("Manual")
   .WithCauseAndEffectMatrix("CE1").WithInitialState("Steady").MakeCurrent())

fs.Dynamics.Schedule("Fill").MakeCurrent()
fs.Save("dynamic_tank_events.dwxmz")   # open in DWSIM and run "CE" from Integrator Controls

Use as ferramentas dwsim.dynamics.* para adicionar conjuntos de eventos (transições em degrau e linear), guardar estados, definir a matriz de causa e efeito e os schedules; adicione o gauge com dwsim.unitop.add.

A saída pode variar

Os resultados dependem da qualidade de raciocínio do LLM e da precisão no uso das ferramentas. Sempre verifique se a simulação corresponde à sua intenção antes de confiar nos números.

Abra o flowsheet de controle de nível do tanque no DWSIM via servidor MCP, rode o
schedule "Fill" e guarde o estado como "Steady". Depois:

- Defina um conjunto de eventos "Ramp" que põe a vazão de Inlet em 10 kg/s em 1 min
  e a sobe linearmente até 15 kg/s em 4 min (referência: evento anterior); rode um
  schedule a partir de "Steady" com ele e informe o pico do nível e a abertura final
  da V-02
- Adicione um gauge de nível LI-01 sobre T-01 (0 a 2 m, alarmes 0,2 / 0,5 / 1,3 /
  1,6 m) e uma matriz de causa e efeito que põe o ManualOverride da LIC-01 em 0 no
  alarme H
- Defina um conjunto de eventos "Manual" (LIC-01 ManualOverride = 1 em 5 s, Inlet
  15 kg/s em 1 min) e um schedule "CE" a partir de "Steady" com esse conjunto e a
  matriz
- Salve o flowsheet como dynamic_tank_events.dwxmz

Exercícios

  1. Faça a rampa dez vezes mais rápida (de 1 min a 1 min 18 s). Onde o desvio cai entre o 1 cm da rampa e os 6 cm do degrau?
  2. Adicione um segundo item a CE1: no alarme LL, ponha a vazão de Inlet em 20 kg/s. Rode um schedule que põe a LIC-01 em manual e abre a V-02 a 80 % em 5 s. O que acontece?
  3. Guarde um estado no topo da corrida Manual (nível perto de 2 m) e parta o schedule Disturbance dele. Quanto tempo o controlador leva para drenar o tanque de volta a 1 m, e a V-02 satura?

Leitura Complementar

Referências selecionadas da bibliografia técnica do DWSIM.

  • D. E. Seborg, T. F. Edgar, D. A. Mellichamp & F. J. Doyle. (2016). Process Dynamics and Control. Wiley
  • IEC 61511. Functional safety: safety instrumented systems for the process industry sector.

Próximos Passos

Em Reatores e Trocadores em Dinâmica, os samples de CSTR, PFR e trocador de calor distribuídos com o DWSIM mostram o que um holdup de reação e uma massa térmica de parede acrescentam a uma corrida dinâmica.