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
- Ter completado Controle de Nível PID: o tanque, o controlador, o estado
Steadye o scheduleDisturbancesão reaproveitados - Ter lido Controle de Pressão e Nível do Separador para um segundo exemplo de eventos de setpoint
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:
- Um Level Gauge
LI-01lendo oLiquid Levelde 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 - Um conjunto de eventos
Rampque sobe a entrada de 10 para 15 kg/s ao longo de três minutos - Um conjunto de eventos
Manualque põe a LIC-01 em manual e depois dá um degrau na entrada - 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: em00:01:00, valor10kg/s, transição Stepramp: em00:04:00, valor15kg/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.

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.

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
- Script Python:
examples/dynamics/04_events_and_states.py - Flowsheet pronto:
examples/saved/dynamic_tank_events.dwxmz
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
- 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?
- 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? - Guarde um estado no topo da corrida
Manual(nível perto de 2 m) e parta o scheduleDisturbancedele. 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.