Pular para conteúdo

Do Permanente ao Dinâmico

Neste tutorial você leva um sistema pequeno de água, um tanque entre duas válvulas, de um estado estacionário resolvido a uma corrida dinâmica na GUI Clássica do DWSIM. O nível do tanque sobe, a vazão de saída acompanha, e depois de alguns minutos os dois se equilibram. Toda simulação dinâmica no DWSIM começa como esta: um flowsheet convergido, um holdup com volume, válvulas que transformam pressão em vazão, correntes de fronteira com especificação de pressão ou de vazão, e um schedule que diz ao integrador por quanto tempo rodar.

O que você vai aprender

  • O que muda quando o Modo Dinâmico está ligado: holdups definem pressões, válvulas definem vazões, correntes de fronteira mantêm uma pressão ou uma vazão
  • Como dar volume e altura a um tanque, Kv a uma válvula e especificação dinâmica a uma corrente
  • Como criar integrador, schedule e variáveis monitoradas no Dynamics Manager, rodar o schedule pelo Integrator Controls e ler os resultados na planilha

Pré-requisitos

  • Ter completado Aquecedor e Resfriador ou qualquer tutorial de regime permanente: você deve estar à vontade criando correntes e operações unitárias
  • A ideia de balanço de massa com acúmulo: o que entra e não sai fica no tanque

Visão Geral do Processo

Um suprimento de água a 1,3 bar alimenta um tanque por uma válvula; o tanque drena por uma segunda válvula para uma linha à pressão atmosférica:

  1. Inlet entrega 10 kg/s de água, fixados por uma especificação de Vazão
  2. V-01 é a válvula de entrada, com Kv fixo de 100 e abertura de 50 %
  3. T-01 é um tanque aberto de 2 m³ e 2 m de altura
  4. V-02 é a válvula de saída, Kv 400 na abertura total, meio aberta
  5. Outlet é mantida a 1 atm por uma especificação de Pressão

Em regime permanente o tanque não tem nível: só passa os 10 kg/s adiante. Em modo dinâmico o nível é a variável de estado do sistema, e ele se acomoda onde a coluna de líquido empurra exatamente 10 kg/s pela V-02.

Diagrama de Fluxo do Processo

graph LR
    IN["Inlet<br/>25 °C, 1,3 bar<br/>10 kg/s Água<br/>(spec Vazão)"] --> V1["V-01<br/>Kv 100, 50 %"]
    V1 --> T["T-01<br/>(Tanque)<br/>2 m³, 2 m"]
    T --> V2["V-02<br/>Kv 400, 50 %"]
    V2 --> OUT["Outlet<br/>1 atm<br/>(spec Pressão)"]

Parâmetros de Projeto

Parâmetro Valor Unidade
Composto Água -
Pacote termodinâmico Steam Tables (IAPWS-IF97) -
Temperatura da entrada 298,15 (25 °C) K
Pressão da entrada 130000 (1,3 bar) Pa
Vazão mássica da entrada 10 kg/s
Kv (fixo) e abertura da V-01 100, 50 m³/h, %
Volume e altura do tanque 2, 2 m³, m
Kv (a 100 %) e abertura da V-02 400, 50 m³/h, %
Pressão da saída 101325 Pa
Passo e duração da integração 5, 10 s, min

Passo a Passo na GUI Clássica

1. Configurar a simulação

File > New Chemical Process Model:

  • Compostos: Water
  • Pacote termodinâmico: Steam Tables (IAPWS-IF97)
  • Clique em Finish

2. Criar as correntes e as unidades

Arraste quatro Material Streams para o canvas e nomeie Inlet, S-1, S-2 e Outlet. Em Inlet ponha T = 298.15 K, P = 130000 Pa, Vazão mássica = 10 kg/s, Água = 1,0. Deixe as outras três vazias.

Arraste duas Valves e um Tank da Object Palette e renomeie para V-01, T-01 e V-02. Conecte na ordem Inlet → V-01 → S-1 → T-01 → S-2 → V-02 → Outlet.

3. Configurar as válvulas

Abra V-01:

  • Calculation Type: Liquid Service Kv/Cv (Deprecated), o modo de Kv para líquidos com que esta página foi medida
  • Kv[Cv](max) (IEC 60534): 100, com Kv selecionado
  • Valve Opening (%): 50
  • Deixe Use Opening (%) versus Kv[Cv]/Kv[Cv]max (%) relationship desmarcado: esta válvula passa o Kv inteiro qualquer que seja a abertura

Abra V-02:

  • Calculation Type: Liquid Service Kv/Cv (Deprecated)
  • Kv[Cv](max) (IEC 60534): 400, com Kv selecionado
  • Use Opening (%) versus Kv[Cv]/Kv[Cv]max (%) relationship: marcado, com Opening/Kv[Cv] rel. type = Linear
  • Valve Opening (%): 50

Por que Kv e não queda de pressão

Em modo dinâmico a válvula é o único objeto que transforma diferença de pressão em vazão. Uma válvula em modo de queda de pressão precisa que alguém de fora lhe diga a vazão; uma válvula em modo Kv calcula a vazão a partir das pressões dos dois lados, que é o que uma válvula real faz. Ponha toda válvula que vai rodar em modo dinâmico num dos modos Kv.

4. Resolver o regime permanente

Pressione Solve (F5). As válvulas calculam as pressões de saída pela equação de Kv: S-1 e S-2 saem com cerca de 1,17 bar e a Outlet com cerca de 1,14 bar. O tanque passa a vazão adiante. Esse regime permanente é o ponto de partida de toda corrida dinâmica, e precisa convergir antes de qualquer outra coisa.

O regime permanente resolvido

5. Ligar o Modo Dinâmico

Dynamics > Dynamic Mode Active, ou o botão Dynamic Mode Active/Inactive no grupo Dynamics Solver da barra de ferramentas do flowsheet. A partir daí, abrir um objeto que tem propriedades dinâmicas abre também um segundo painel, Dynamic Mode Properties, encaixado ao lado do editor, e os objetos que não rodam em modo dinâmico mostram um ícone de exclamação.

6. Dar volume e altura ao tanque

Abra T-01. No editor:

  • Volume: 2 m³

No painel Dynamic Mode Properties:

  • Height: 2 m
  • Initialize using Inlet Stream: deixe desmarcado
  • Reset Content: deixe desmarcado

O tanque começa a corrida vazio e enche pela entrada. A seção transversal é volume sobre altura, 1 m², então cada 997 kg de água dentro dele são um metro de nível.

Propriedades dinâmicas do tanque

7. Especificar as correntes de fronteira

Abra Inlet e, em Stream Conditions, ponha Dynamic P/F Spec = Flow. Abra Outlet, ponha Dynamic P/F Spec = Pressure e a pressão em 101325 Pa.

Pressão ou Vazão

Toda corrente que entra ou sai do flowsheet precisa de uma das duas. Flow quer dizer que a corrente traz uma vazão mássica fixa qualquer que seja a pressão a jusante; Pressure quer dizer que a corrente mantém uma pressão fixa e aceita a vazão que chegar. Uma bomba de alimentação ou a descarga de um compressor é uma fronteira de Vazão; um header, um flare ou a atmosfera é uma fronteira de Pressão. Dentro do flowsheet as correntes não precisam de especificação: os holdups definem as pressões e as válvulas definem as vazões.

8. Criar o integrador e o schedule

Dynamics > Dynamics Manager:

  • Integrators: adicione Int1 com Integration Step (ms) = 5000 e Duration = 10 min. Em Monitored Variables, adicione T-01 Liquid Level (m), V-02 Opening (%) e Outlet Mass Flow (kg/s).
  • Schedules: adicione Sch1, escolha Int1 como Associated Integrator, marque Use Current State e marque Reset/Empty Contents of All Volume-Defined Objects Before Running. Assim toda corrida de Sch1 parte de um tanque vazio com os ajustes que o flowsheet tem naquele momento, que é o que os exercícios do fim da página precisam.

O Dynamics Manager

9. Rodar o schedule

Dynamics > Integrator Controls: escolha Sch1 na caixa Schedule e pressione Run Schedule. O relógio avança 5 s por passo; a corrida leva alguns segundos. Quando parar, pressione View Results: uma nova aba de planilha guarda as variáveis monitoradas contra o tempo.

10. Ler os resultados

O nível começa perto de zero (a primeira amostra marca 0,01 m) e sobe: 0,23 m em 1 min, 0,30 m em 2 min, 0,32 m em 3 min, e 0,333 m a partir de 7 min. A vazão de saída acompanha o nível: 8,4 kg/s em 1 min, 9,4 kg/s em 2 min, 10,0 kg/s no fim. A abertura da V-02 fica em 50 %: nada a move ainda.

Nível e vazão de saída contra o tempo

Resultados e Validação

Variável Esperado Unidade
Nível em 1 min 0,23 m
Nível em 2 min 0,30 m
Nível final (a partir de 7 min) 0,333 m
Vazão de saída em 1 min 8,4 kg/s
Vazão de saída final 10,0 kg/s
Pressão do tanque 101325 (tanque aberto) Pa

Resultados esperados

O nível se acomoda onde a coluna de líquido empurra exatamente a vazão de entrada pela V-02. Meio aberta, a V-02 tem Kv = 200 m³/h; 10 kg/s são 36 m³/h; a equação de Kv dá ΔP = (36/200)² = 0,032 bar, e 3,2 kPa de água são 0,33 m. O simulador chega a 0,333 m.

Entendendo os Resultados

O tanque é o único objeto com estado. O balanço de massa dele é dm/dt = w_entra − w_sai: a entrada é fixada em 10 kg/s pela especificação, e a saída é o que a V-02 passa sob a diferença de pressão entre o fundo do tanque (pressão atmosférica mais a coluna de líquido) e a Outlet a 1 atm. Com o tanque vazio a coluna é zero, nada sai, e o nível sobe o mais rápido possível. Conforme o nível sobe a coluna cresce, a vazão de saída cresce com a raiz quadrada da coluna, e o nível desacelera até as duas vazões se igualarem. A aproximação é exponencial: o nível fica a 1 % do valor final depois de uns quatro minutos e meio.

Três coisas decidiram esse número, e nenhuma delas foi a válvula de entrada. A entrada é uma fronteira de Vazão, então 10 kg/s entram qualquer que seja a V-01; o tanque é aberto, então a pressão dele é atmosférica; e a saída é uma fronteira de Pressão a 1 atm, então toda a força motriz na V-02 é a coluna. Mude a Outlet para 1,2 bar e nada sai até que a coluna sozinha cubra os 0,19 bar entre a atmosfera e a Outlet, cerca de 1,9 m de água; passar 10 kg/s pela V-02 exige então 2,24 m de nível, acima do topo de 2 m do tanque. Um tanque aberto de verdade transbordaria em 2 m. O tanque do DWSIM não tem transbordo: quando o nível passa a altura do tanque ele escreve um aviso no log ("T-01: the liquid level (2.01 m) is above the tank height (2.00 m). The tank has no overflow in this model: the excess stays inside and the level goes on rising.") e o nível se acomoda em 2,24 m. Mude a V-02 para 100 % de abertura e o nível se acomoda em 0,08 m.

O Dynamics Wizard

Dynamics > Dynamics Wizard percorre um flowsheet de regime permanente resolvido pela mesma lista que você acabou de fazer à mão: um volume para cada holdup, um Kv para cada válvula, uma especificação em cada corrente de fronteira, e um integrador com um schedule, cada item com um valor proposto que você confirma ou edita. É o caminho rápido pelos passos 5 a 8 num flowsheet maior. Fazê-los à mão uma vez, como aqui, é o que torna as propostas do wizard legíveis.

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")

from DWSIM.Automation.FluentAPI import Flowsheet, PropertyPackages, Q
from DWSIM.UnitOperations.UnitOperations import Valve
from System import TimeSpan

fs = (Flowsheet.Create("WaterTankDynamic")
      .WithCompound("Water")
      .WithPropertyPackage(PropertyPackages.SteamTables))

inlet = (fs.AddMaterialStream("Inlet")
         .At(Q.Kelvin(298.15), Q.Pascal(130000.0))
         .WithMassFlow(Q.KgPerSecond(10.0))
         .AsFlowSpec())
s1 = fs.AddMaterialStream("S-1").AsPressureSpec()
s2 = fs.AddMaterialStream("S-2").AsPressureSpec()
outlet = fs.AddMaterialStream("Outlet").AsPressureSpec()

(fs.AddValve("V-01")
   .WithCalcMode(Valve.CalculationMode.Kv_Liquid)
   .WithKv(100.0).WithOpeningPercent(50.0)
   .ConnectFeed(inlet, 0).ConnectProduct(s1, 0))

tank = (fs.AddTank("T-01")
        .WithVolume(Q.CubicMeters(2.0)).WithHeight(Q.Meters(2.0))
        .ConnectFeed(s1, 0).ConnectProduct(s2, 0))

(fs.AddValve("V-02")
   .WithCalcMode(Valve.CalculationMode.Kv_Liquid)
   .WithKv(400.0).WithOpeningKvRelationship()
   .WithOpeningPercent(50.0)
   .ConnectFeed(s2, 0).ConnectProduct(outlet, 0))

fs.AutoLayout()
fs.Solve()

# the boundary pressure: set it after the steady state, which overwrote it
outlet.Object.Phases[0].Properties.pressure = 101325.0

(fs.Dynamics.DefineIntegrator("Int1")
   .WithIntegrationStep(TimeSpan.FromSeconds(5))
   .WithDuration(TimeSpan.FromMinutes(10))
   .Monitor("T-01", "Liquid Level", "m", "level")
   .Monitor("V-02", "PROP_VA_5", "", "V-02 opening")
   .Monitor("Outlet", "PROP_MS_2", "kg/s", "outlet flow"))
fs.Dynamics.DefineSchedule("Sch1").WithIntegrator("Int1").UseCurrentStateAsInitial(True).MakeCurrent()

result = fs.RunDynamics("Sch1").Execute()
level = result.GetSeries("level")
print(f"level at 1 min = {level.ValueAt(60.0):.3f} m, final = {level.Final:.3f} m")
print(f"outlet flow final = {result.GetSeries('outlet flow').Final:.2f} kg/s")
fs.Save("dynamic_tank_open_loop.dwxmz")

Construa o flowsheet com dwsim.unitop.add e dwsim.unitop.connect, resolva com dwsim.solve.run, depois use as ferramentas de dinâmica (dwsim.dynamics.*) para definir o integrador e o schedule e rodá-lo.

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.

Use o DWSIM (via servidor MCP) para construir e rodar a seguinte simulação dinâmica:

- Crie um flowsheet chamado "WaterTankDynamic" com Água e o pacote Steam Tables
- Corrente "Inlet" a 298,15 K, 130000 Pa, 10 kg/s de água, especificação dinâmica
  Flow; correntes vazias "S-1", "S-2" e "Outlet" (Outlet: especificação dinâmica
  Pressure, 101325 Pa)
- Válvula "V-01" em modo Kv líquido, Kv 100, 50 % aberta, sem relação abertura/Kv,
  de Inlet para S-1
- Tanque "T-01" com volume 2 m3 e altura 2 m, de S-1 para S-2
- Válvula "V-02" em modo Kv líquido, Kv 400 com relação abertura/Kv linear,
  50 % aberta, de S-2 para Outlet
- Resolva o regime permanente
- Defina um integrador "Int1" (passo 5 s, duração 10 min) monitorando o nível do
  tanque, a abertura da V-02 e a vazão mássica da Outlet, e um schedule "Sch1"
  que o use a partir do estado atual
- Rode o schedule e informe o nível em 1, 2 e 10 minutos e a vazão de saída final

Exercícios

  1. Ponha a pressão da Outlet em 1,2 bar e rode de novo. Para onde vai o nível, e por quê? Leia o log quando o nível passar de 2 m: o que um tanque aberto de verdade faria nesse momento, e o que faz o tanque do DWSIM?
  2. Abra a V-02 por completo. Preveja o nível final pela equação de Kv antes de rodar, depois compare.
  3. Mude o passo de integração para 30 s. O nível final muda? A forma da curva muda?

Leitura Complementar

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

  • W. L. Luyben. (1990). Process Modeling, Simulation and Control for Chemical Engineers. McGraw-Hill
  • D. E. Seborg, T. F. Edgar, D. A. Mellichamp & F. J. Doyle. (2016). Process Dynamics and Control. Wiley

Próximos Passos

Em Controle de Nível PID, você adiciona um controlador PID que move a V-02 para manter o nível num setpoint, e vê o que as ações proporcional e integral fazem cada uma.