Contents — find the section you need
Tanques de nutrientes CEA — contabilizando reposição e diluição
Restaurando volume e concentração juntos
Um tanque contém 90 L a 80 mg/L de um componente rastreado. Adicionar 10 L de água livre de componente restaura o volume para 100 L, mas reduz a concentração para 72 mg/L. Um nível baixo e um déficit de componente, portanto, exigem contabilização separada.
Este guia estende os fundamentos da zona radicular para operações discretas. Todos os valores são sintéticos; 100 mg/L é uma meta aritmética, não uma recomendação de cultura. Rastreamos um componente de concentração conhecida, sem calcular uma receita de fertilizante, concentração a partir da CE, ou doses de ácido/base.
Defina o limite
Assuma um único tanque perfeitamente misturado com o suprimento e o retorno do circuito de cultura interrompidos. Durante cada operação não há absorção, evaporação, precipitação ou reação, e os volumes de líquido são aditivos. Um tanque em operação precisa de fluxos de volume e componente de suprimento e retorno em seu balanço. Se o limite envolve todo o sistema de circulação, a circulação interna não é reposição externa.
Para volume V [L], concentração C [mg/L] e massa de componente dissolvido M [mg], M=VC. Adicionar volume V_a na concentração C_a resulta em
Use C_a=0 apenas se a água adicionada não contiver o componente rastreado. O guia de gestão de nutrientes da OSU descreve a análise da água de origem e a atenção à concentração de sais, pH, alcalinidade e proporções de nutrientes.
Compare três adições
Comece com 90 L a 80 mg/L: 7.200 mg. Assuma uma concentração de estoque de 10.000 mg/L para este componente.
| Operação | Volume final | Massa final de componente | Concentração final |
|---|---|---|---|
| Adicionar 10 L de água livre de componente | 100 L | 7.200 mg | 72,00 mg/L |
| Adicionar cerca de 0,181818 L apenas de estoque | Cerca de 90,181818 L | Cerca de 9.018,18 mg | 100,00 mg/L |
| Adicionar 0,28 L de estoque e 9,72 L de água | 100 L | 10.000 mg | 100,00 mg/L |
O estoque também adiciona volume. Para a concentração alvo C_t, concentração de estoque C_s e volume de estoque x,
Aumentar a concentração requer C_s>C_t>C_0. Um estoque na concentração alvo não consegue levar uma concentração inicial mais baixa exatamente àquele alvo com uma adição finita. Uma solução negativa indica que a adição proposta não consegue atingir o objetivo.
Se o volume final V_f também for prescrito e a água de reposição não contiver o componente,
Ambas as adições devem ser não negativas e o volume final deve caber no recipiente. Aqui elas são 0,28 L de estoque e 9,72 L de água. Especificar apenas a concentração dá uma resposta diferente de especificar tanto a concentração quanto o volume.
Drenagem e diluição têm efeitos diferentes
Agora comece com 100 L a 120 mg/L: 12.000 mg. Drenar 10 L de solução bem misturada remove 1.200 mg. O restante é 90 L e 10.800 mg, ainda a 120 mg/L. Adicionar 10 L de água livre de componente resulta então em 100 L a 108 mg/L.
Adicionar 20 L de água sem drenar resulta, em vez disso, em 120 L a 100 mg/L. O tanque ainda contém 12.000 mg, e precisa de mais capacidade de reserva.
| Condição | Equação | Limite |
|---|---|---|
| Drenar D L primeiro, depois repor com água | C_1=C_0(1-D/V_0) | Mistura perfeita; reabastecimento livre de componente |
| Adicionar W L de água sem drenar | C_1=V_0C_0/(V_0+W) | O volume aumenta |
| Entrada e saída simultâneas em volume constante | C(t)=C_{in}+(C_0-C_{in})e^{-Qt/V} | Mistura perfeita, vazão constante, sem absorção ou reação |
Para a substituição simultânea de 10 L, Qt/V=0,1 e C_{in}=0 resultam em cerca de 108,58 mg/L. Isso difere dos 108 mg/L obtidos drenando primeiro. A ordem das operações pertence ao registro.
Reproduza a contabilização em Python
Salve como tank_accounting.py e execute python3 tank_accounting.py. Usa apenas a biblioteca padrão.
from math import isfinite
def mix(v, c, added_v, added_c):
values = (v, c, added_v, added_c)
if not all(isfinite(x) for x in values):
raise ValueError("finite values required")
if v <= 0 or min(c, added_v, added_c) < 0:
raise ValueError("invalid volume or concentration")
return (v * c + added_v * added_c) / (v + added_v)
v, c, target, stock = 90.0, 80.0, 100.0, 10000.0
x = v * (target - c) / (stock - target)
print(f"water top-up: {mix(v, c, 10, 0):.2f} mg/L")
print(f"stock addition: {x:.6f} L, {mix(v, c, x, stock):.2f} mg/L")
y = (100 * target - v * c) / stock
print(f"fixed final volume: stock {y:.2f} L, water {10-y:.2f} L")
print(f"drain then refill: {mix(90, 120, 10, 0):.2f} mg/L")
print(f"dilute only: {mix(100, 120, 20, 0):.2f} mg/L")
As saídas são 72,00 mg/L; 0,181818 L e 100,00 mg/L; 0,28 L e 9,72 L; 108,00 mg/L; e 100,00 mg/L. Antes de experimentar com outra concentração de estoque, verifique as condições de alcançabilidade acima e certifique-se de que o denominador não seja zero.
Da contabilização ao controle
O guia de teste de água de irrigação da OSU explica que CE e TDS não identificam concentrações individuais de sais. Substituir CE por C não consegue calcular a reposição de um componente específico. Um fertilizante misto altera vários componentes de uma vez, então atingir um alvo não restaura toda a composição.
Um sensor também não precisa alcançar a previsão de mistura perfeita imediatamente. O guia de gestão de nutrientes da OSU exige agitação e a estabilização das leituras. Com base nessa distinção, este artigo propõe o seguinte ponto de partida para o projeto de controle:
- Registre o horário inicial, o volume, o local de amostragem, a base para a concentração de componente, a CE, a temperatura do líquido e o pH.
- Registre a composição do estoque, os volumes reais de adição e drenagem, e o estado de circulação. A duração do comando da bomba isoladamente não estabelece a vazão real.
- Aguarde um intervalo de mistura estabelecido no equipamento e medições estáveis antes de reavaliar. Evite empilhar comandos adicionais em resposta a uma leitura local imediatamente após a injeção.
- Preserve os erros de previsão. Interrompa adições adicionais para investigar níveis anormais, discrepâncias de vazão ou medições desatualizadas. Estabeleça tolerâncias e limites de dose na instalação real.
Isso não é uma especificação completa de sistema de dosagem. Os exemplos trabalhados validam a consistência aritmética de volume, massa de componente e concentração sob as premissas declaradas. A próxima etapa é conectar as operações comandadas às observações usando a vazão medida da bomba e a resposta de mistura.
Bombas de dosagem CEA — calibração de volume e esperas de mistura
Duas verificações antes de chamar uma adição de "20 mL"
O guia de contabilização do tanque calculou adições a partir de balanços de água e componente. Um valor calculado de 20 mL ainda não especifica um tempo de execução da bomba. Concluir a injeção também não significa que uma leitura do tanque seja representativa.
Este guia separa a calibração de comando para volume da verificação de quando as medições pós-injeção podem ser reavaliadas. Cada conjunto de dados abaixo é um exemplo sintético original, não desempenho medido de um dispositivo ou cultura. O código não opera equipamentos nem calcula receitas de fertilizante.
Mantenha as condições de calibração constantes
O guia de injetores de fertilizante da University of Georgia explica a calibração e manutenção periódicas, faixas de vazão operacional e condições de pressão. A proporção de um injetor proporcional à água é diferente do mL/s de uma bomba comandada por tempo, considerada aqui.
Para um experimento de coleta, siga o manual do equipamento e registre as condições de forma consistente:
| Registro | Finalidade |
|---|---|
| Bomba, ajuste de velocidade, tubulação, válvulas e histórico de manutenção | Identificar a configuração calibrada |
| Líquido, temperatura e densidade, se usados | Manter um teste com água distinto de um teste com solução de estoque |
| Nível de sucção, elevação/pressão de descarga e tubulação | Preservar diferenças entre a coleta e a operação |
| Escorva, bolhas e tempo ocioso anterior | Identificar diferenças de partida |
| Início/parada do comando, fim da coleta e volume coletado | Definir se o gotejamento pós-parada está incluído |
Desconectar a tubulação de descarga para a coleta pode alterar a contrapressão. Uma configuração de coleta simples não estabelece por si só a entrega no sistema instalado. Mantenha as verificações preliminares com água separadas da confirmação com o líquido pretendido.
Ao pesar, converta a massa líquida coletada \Delta m [g] usando a densidade do líquido \rho [g/mL]: V=\Delta m/\rho [mL]. Não assuma que todo líquido tem densidade de 1 g/mL. Registre a resolução da balança, o status de calibração e a precisão de tempo.
Uma média de longo prazo pode representar mal uma adição curta
Assuma três testes em cada duração, todos começando no mesmo estado.
| Comando [s] | Três volumes sintéticos [mL] | Média [mL] |
|---|---|---|
| 10 | 15, 16, 17 | 16 |
| 20 | 35, 36, 37 | 36 |
| 30 | 55, 56, 57 | 56 |
| 60 | 115, 116, 117 | 116 |
As médias seguem V(t)=at+b=2t-4 [mL], com a em mL/s e b em mL. Uma meta de 20 mL resulta em (20-b)/a=12 s. Usar apenas a inclinação resulta em 10 s e apenas 16 mL neste exemplo.
Usar o fluxo médio de 60 s, 116/60 mL/s, resulta em cerca de 10,34 s para 20 mL. A equação sintética prevê cerca de 16,69 mL nessa duração. Qual "taxa de fluxo" é usada importa.
O intercepto de −4 mL é um coeficiente de regressão sobre a faixa amostrada, não prova de um atraso puro físico de dois segundos. Não extrapole fora de 10–60 s, especialmente em direção a zero. Para dados medidos, inspecione os resíduos e considere um modelo separado de curta duração se a relação se curvar.
Cada linha sintética tem um desvio padrão amostral de 1 mL. Um erro de regressão zero sobre as médias não remove a variação individual de cada disparo. Três repetições também não estabelecem a variabilidade dia a dia ou o viés da balança. Verifique as previsões medidas usando durações e testes adicionais excluídos do ajuste.
Separe a conclusão da injeção da confirmação da mistura
O guia de gestão de nutrientes da OSU exige agitação e leituras estáveis antes da avaliação. Estabelecer uma espera requer uma série temporal pós-injeção distinta da calibração de volume.
Registre medições sincronizadas afastadas do ponto de injeção, bem como próximas a ele. Documente o volume, a vazão de circulação, os locais de injeção e do sensor, a temperatura e a filtragem do sensor. Mistura, transporte e resposta do sensor contribuem todos para a dinâmica observada; um único tempo de resposta ajustado não é automaticamente um tempo de mistura puro.
Para ilustração, normalize uma mudança do valor inicial y_0 para um valor final conhecido y_\infty:
O tempo zero é a conclusão da injeção. Esta é uma resposta de medição local sintética, não um modelo de tanque com conservação de massa. Assuma constantes de tempo de 40 s e 80 s nos locais A e B. Suas respostas de tempo contínuo entram em uma faixa de 5% ao redor da mudança final após aproximadamente 120 s e 240 s.
Acima: três volumes coletados por duração e a linha ajustada às suas médias. Abaixo: respostas sintéticas A e B. O tempo está em segundos, o volume em mL e a resposta normalizada é adimensional. Nenhum dado medido é mostrado.
Agora imponha uma regra didática: com amostras a cada 10 s, ambos os locais devem permanecer dentro de 5% por 30 s antes da confirmação. B se qualifica primeiro aos 240 s. As quatro amostras em 240, 250, 260 e 270 s fornecem confirmação aos 270 s. Verificar apenas A se qualificaria aos 150 s e deixaria B de lado.
Nem 5% nem 30 s são um critério universal de aceitação. Escolha os critérios usando ruído/precisão da medição, desvio de concentração aceitável e intervalo de amostragem. Estime os valores finais de forma independente, por exemplo a partir de registros suficientemente longos, e também inspecione as diferenças entre os valores finais dos locais. Normalizar cada local separadamente pode ocultar diferenças espaciais persistentes de concentração. Não use essa normalização quando a mudança de inicial para final for pequena em relação ao ruído.
Reproduza os cálculos
Salve como pump_mixing.py e execute python3 pump_mixing.py. Apenas a biblioteca padrão é necessária.
from math import exp
from statistics import mean
# Synthetic data only; time [s], collected volume [mL].
runs = {10: [15, 16, 17], 20: [35, 36, 37],
30: [55, 56, 57], 60: [115, 116, 117]}
ts = list(runs)
vs = [mean(runs[t]) for t in ts]
tm, vm = mean(ts), mean(vs)
a = sum((t-tm)*(v-vm) for t, v in zip(ts, vs)) / sum((t-tm)**2 for t in ts)
b = vm - a*tm
command = (20-b)/a
if not min(ts) <= command <= max(ts):
raise ValueError("command outside calibration range")
print(f"fit: V = {a:.2f} t {b:+.2f}; 20 mL command = {command:.2f} s")
print(f"held-out 40 s: predicted {a*40+b:.2f} mL; reference 76.00 mL")
# Two synthetic normalized responses, sampled every 10 s.
# Four consecutive samples span 30 s. No missing samples here.
times = list(range(0, 401, 10))
errors = [max(exp(-t/40), exp(-t/80)) for t in times]
ready = next((times[i] for i in range(3, len(times))
if all(e <= 0.05 for e in errors[i-3:i+1])), None)
print(f"two-location confirmation = {ready} s")
As saídas são inclinação 2,00, intercepto −4,00, um comando de 12,00 s para 20 mL, 76,00 mL aos 40 s, e confirmação aos 270 s. A referência dos 40 s reservados também vem da mesma equação sintética, então não é evidência de generalização para equipamento real. Mudar a constante de tempo de 80 s para 120 s resulta em confirmação aos 390 s. Se não existir uma janela qualificadora no registro, o código retorna None.
Conecte as verificações à permissão para outra adição
Uma implementação de controle precisa de mais do que um temporizador. Este artigo propõe estágios separados para pré-verificações, uma adição, espera de mistura/medição e reavaliação. Comandos fora da faixa, leituras ausentes ou desatualizadas, circulação parada, níveis anormais ou falha em estabilizar dentro do período de observação devem impedir adições adicionais até que se investigue. Não preencha amostras ausentes com o valor anterior e conte isso como estabilidade contínua.
Uma leitura de CE abaixo do alvo após a espera não estabelece imediatamente um déficit de componente específico; preserve a distinção entre CE e composição explicada nos fundamentos da zona radicular. A próxima etapa é avaliar as previsões de entrega e os critérios de espera em relação a registros medidos antes de projetar o controle de dosagem com limites por adição, cumulativos e de repetição.
Controle de dosagem CEA — limites, esperas de medição e estados de falha
Uma leitura baixa não justifica adições repetidas
A calibração da bomba e as esperas de mistura separaram o volume entregue do momento em que as observações se estabilizam. A próxima questão é se outra adição está atualmente permitida. Uma leitura baixa durante a mistura, uma amostra antiga ou circulação parada não estabelecem essa permissão.
Este guia propõe um projeto didático com estados operacionais separados e verificações sobre volume, número de tentativas e observações. Todos os valores e entradas são sintéticos, não limites operacionais ou recomendações de fertilizante. O exemplo em Python reproduz apenas um portão de autorização; não opera uma bomba.
Calcule um candidato, depois decida se ele pode ser executado
Um candidato derivado da contabilização do tanque ainda precisa de verificações contra a faixa de calibração, o estado do equipamento e observações que possam avaliar a operação anterior.
O guia de injetores da UGA explica a calibração e manutenção periódicas. O guia de gestão de nutrientes da OSU exige agitação e leituras estáveis antes da avaliação. Os estados e limites abaixo são o projeto proposto por este artigo, não uma especificação de controlador fornecida por nenhuma das fontes.
Separe seis estados operacionais
| Estado | Atividade | Condição de transição |
|---|---|---|
| CHECK | Valida observações, candidato, orçamento restante e equipamento | Registra uma reserva antes de DOSE; vai para DONE se o objetivo já foi atingido |
| DOSE | Emite um comando para um ID de operação único | Confirma a parada antes de WAIT; timeout ou incompatibilidade de vazão leva a FAULT |
| WAIT | Proíbe novas adições e coleta observações pós-parada | Observações qualificadoras levam a REVIEW; falha em estabilizar até o prazo leva a FAULT |
| REVIEW | Reavalia observações e histórico | DONE se satisfeito, CHECK se outro candidato é justificado, FAULT para inconsistências |
| DONE | Mantém a saída parada e fecha o registro | Uma operação subsequente requer uma nova decisão operacional |
| FAULT | Solicita a parada e proíbe adições adicionais | Recuperação explícita após verificar a causa, a quantidade entregue e o equipamento |
Emitir um comando de parada é diferente de confirmar que o fluxo parou. Nomes de estado de software não conseguem evitar uma válvula ou bomba com falha. Uma implementação também precisa de retroalimentação de saída, mecanismos de parada do lado do equipamento e comportamento de reinício definido.
Não faça o FAULT retornar automaticamente ao CHECK após uma breve espera. Repetir uma operação sem resolver sua causa pode acumular adições não intencionais.
Cobre o orçamento antes de emitir o comando
Use limites ilustrativos de 16–20 mL por adição, 50 mL por sessão operacional e no máximo três autorizações. O mínimo de 16 mL corresponde à calibração sintética do artigo anterior aos 10 s. Esses números não são configurações de equipamento.
Para o volume já cobrado B [mL] e o candidato d [mL], exija
Na autorização, registre B\leftarrow B+d e n\leftarrow n+1 antes de prosseguir para o comando. Este registro representa a capacidade de autorização consumida, não a entrega medida. Se a comunicação falhar imediatamente após um comando, não assuma entrega zero e reembolse sua capacidade. Registre a entrega medida e a incerta separadamente.
| Operação sintética | Candidato | Total cobrado após a decisão | Resultado |
|---|---|---|---|
| Primeira | 16 mL | 16 mL | Permitir |
| Segunda, após parada, mistura e revisão | 16 mL | 32 mL | Permitir |
| Terceira, após revisão | 18 mL | 50 mL | Permitir |
| Quarta | 16 mL | 50 mL | Rejeitar: limite de tentativas |
Uma solicitação de 20 mL após cobrar 32 mL é rejeitada porque alcançaria 52 mL, mesmo com uma tentativa restante. Reconsidere as observações e a base do candidato em vez de cortar automaticamente a dose para a capacidade restante.
Aqui uma sessão é uma sequência de correção com início e fim registrados. Uma iteração de loop, atualização de página ou reconexão não é uma nova sessão. Um sistema operacional precisa de condições explícitas de renovação de orçamento, como uma janela de tempo definida ou substituição do tanque, e registros que sobrevivam a um reinício. Este exemplo não tem persistência.
Verifique a atualidade separadamente da estabilidade
O horário de recebimento sozinho não estabelece atualidade. Considere o horário de medição da fonte, a sincronização de relógio e a ordem em relação à operação. Aqui age_s é uma idade de medição já convertida, aceita apenas entre zero e cinco segundos. Uma idade negativa proveniente de um timestamp futuro também é rejeitada.
after_stop significa que a observação segue a confirmação da parada anterior. Para a adição inicial, use uma observação obtida após o início da pré-verificação atual. stable é uma decisão a montante baseada em uma sequência de observações, como discutido no guia anterior. Um único valor inalterado não estabelece estabilidade: avalie dados ausentes, sensores travados e discordância entre locais.
Cinco segundos é uma suposição didática. Um limite incompatível com o intervalo de amostragem e o atraso de comunicação pode rejeitar observações úteis. Simplesmente aumentá-lo não resolve problemas de dados desatualizados.
Experimente o portão de autorização em Python
Salve como dosing_gate.py e execute python3 dosing_gate.py. Apenas a biblioteca padrão é necessária.
from math import isfinite
def gate(state, dose_ml, charged_ml, attempts, age_s,
after_stop, stable, circulation, level_ok):
"""Offline authorization check; no hardware commands or persistence."""
if state != "CHECK":
return "STATE"
if not all(isfinite(x) for x in (dose_ml, charged_ml, age_s)):
return "INVALID"
if charged_ml < 0 or type(attempts) is not int or attempts < 0:
return "INVALID"
if not all(type(x) is bool for x in
(after_stop, stable, circulation, level_ok)):
return "INVALID"
if not circulation or not level_ok:
return "INTERLOCK"
if not 0 <= age_s <= 5 or not after_stop:
return "STALE"
if not stable:
return "UNSTABLE"
if not 16 <= dose_ml <= 20:
return "DOSE_RANGE"
if attempts >= 3:
return "ATTEMPTS"
if charged_ml + dose_ml > 50:
return "BUDGET"
return "ALLOW"
if __name__ == "__main__":
charged, attempts, state = 0.0, 0, "CHECK"
for requested in (16, 16, 18, 16):
result = gate(state, requested, charged, attempts, 1,
True, True, True, True)
if result == "ALLOW":
# Charge BEFORE a simulated command; never refund uncertainty.
charged += requested
attempts += 1
state = "WAIT"
print(f"{requested} mL: {result}; charged={charged:.0f} mL")
# Synthetic successful stop/mixing/reassessment, not a timer.
state = "CHECK"
As três primeiras decisões são ALLOW; a quarta é ATTEMPTS. Os totais cobrados são 16, 32, 50 e 50 mL. Redefinir o estado de demonstração para CHECK ao final de cada iteração representa parada, mistura e reavaliação bem-sucedidas sintéticas. Uma implementação não deve executar essa transição apenas porque um temporizador fixo expirou.
Esta função é um portão didático offline com argumentos numéricos. Não interpreta entradas de comunicação, não calcula uma dose, não estabelece estabilidade, não monitora o fluxo real nem executa a máquina de estados. Rejeita NaN, infinito, volumes cobrados negativos e contagens de tentativas inválidas, mas não é uma API externa completa de entrada.
Exercite os limites de rejeição
| Entrada ou situação | Resultado esperado |
|---|---|
| Outro candidato chega em WAIT | STATE; sem cobrança adicional de orçamento ou comando |
| A idade é seis segundos ou negativa | STALE |
| A observação precede a parada, ou não é estável | STALE ou UNSTABLE |
| Circulação parada ou nível anormal | INTERLOCK |
| O candidato é 15 ou 21 mL | DOSE_RANGE |
| Solicitação de 20 mL após cobrar 32 mL | BUDGET |
| O candidato ou o volume cobrado é NaN | INVALID |
Uma implementação também deve testar que o reenvio de um ID de operação não pode executar duas vezes. Confirme as alterações de orçamento e os IDs de operação juntos, para que solicitações concorrentes não consigam gastar a mesma capacidade restante. Após uma interrupção, reconcilie os comandos persistidos com o estado real do equipamento antes de retomar.
O que isso estabelece
O exemplo verifica decisões de autorização contra entradas e limites fornecidos. Não infere déficits individuais de componente a partir da CE nem quantidades de ácido a partir de diferenças de pH. Também não valida crescimento, produtividade, segurança de equipamento ou rastreamento de concentração.
Os papéis da contabilização, calibração de entrega, avaliação de mistura e autorização agora estão conectados. A validação com registros medidos de equipamento permanece em aberto. A seguir vem o caminho da água através de sistemas de produção como NFT, DWC e gotejamento, onde a relação entre o tanque e as raízes muda.

Comentários
Entre na sua conta para continuar.
Ainda não há dados.