Trilha de aprendizado · Nível 13 · Tutorial 7

Anti-windup por integração condicional

Acrescentar anti-windup ao PI para impedir que a ação integral continue crescendo no sentido de uma saída já saturada.

  • Nível: Avançado
  • Duração: 20 min
  • 7 passos
Anti-windup por integração condicional

O que você vai percorrer

  1. Identificar windup nos registros Reconheça, em registros temporais coerentes, quando a saturação do atuador evolui para windup integral. 2 min
  2. Decidir quando integrar Use o comando e o estado integral candidatos para aceitar somente atualizações que não agravem uma saturação. 3 min
  3. Implementar a atualização protegida Implemente a sequência que testa a integral candidata antes de alterar o estado e limita o comando aplicado ao final. 3 min
  4. Testar os dois limites e suas fronteiras Verifique a regra de integração condicional nos limites superior e inferior, incluindo recuperação, igualdade e incrementos nulos. 2 min
  5. Comparar a recuperação com e sem anti-windup Compare rastreamentos numéricos de PI com limitação apenas da saída e PI com integração condicional nos limites superior e inferior. 3 min
  6. Tratar pausas e perda de medição Defina uma política explícita para interrupções: comando seguro e integral congelada durante a pausa; retomada autorizada com medição válida e reinicialização da integral antes do próximo cálculo. 3 min
  7. Validar o PI protegido de ponta a ponta Valide, por rastreamento e aplicação final, o contrato de um PI com integração condicional, incluindo saturação, recuperação, pausas e retomada. 3 min

O que você vai aprender

  • Reconhecer windup em registros de erro, estado integral e comando aplicado.
  • Implementar a decisão de aceitar ou bloquear a atualização integral.
  • Verificar a recuperação nos limites superior e inferior da saída.
  • Definir o comportamento do estado integral durante desabilitação e perda de medição.

Antes de começar

  • Controlador PI em tempo discreto
  • Controle proporcional de uma saída RC
  • Diagnóstico de aquisição e falhas de comunicação

Passo 1 de 7

Identificar windup nos registros

Reconheça, em registros temporais coerentes, quando a saturação do atuador evolui para windup integral.

Observar o limite na atuação

Comando solicitado e comando aplicado

No PI já conhecido, o controlador calcula um comando solicitado, aqui chamado de u_calculado. O atuador só pode receber valores dentro de sua faixa; depois do limitador, temos u_aplicado.

Se a faixa permitida é de 0 a 100 e o PI solicita 128, então:

  • u_calculado = 128
  • u_aplicado = 100

Isso é saturação superior. A diferença não é erro de registro: ela mostra a ação do limitador. De modo simétrico, um comando calculado abaixo de 0 resulta em comando aplicado igual a 0.

Onde ocorre a saturação

Diagrama com o comando calculado ultrapassando o limite, o comando aplicado ficando plano no limite e o estado integral continuando a crescer.

Saturação limita a atuação; o estado integral pode continuar evoluindo internamente.

Registrar para enxergar o acúmulo

Registros sincronizados

Para distinguir uma saturação passageira de windup, registre grandezas sincronizadas a cada atualização:

  • referência r e medição y, para conferir o erro;
  • erro e = r − y;
  • estado integral I;
  • u_calculado = P + I, antes do limite;
  • u_aplicado, depois do limite.

O estado I não é o comando aplicado. Comparar essas colunas ao longo do tempo mostra se a memória integral está mudando sem produzir aumento adicional de atuação.

Registro antes da mudança

Use parâmetros constantes em toda a sequência: Kp = 2, Ki × Ts = 0,6, limites de saída de 0 a 100 e I inicial igual a 0. Nas amostras de 0 a 8, mantenha r = 50 e y = 20; portanto, e = +30, P = +60 e ΔI = +18 em todas elas.

A partir da amostra 2, o atuador já está no máximo; ainda assim, I continua aumentando.
AmostraryeIu calculado / aplicado
05020+301878 / 78
15020+303696 / 96
25020+3054114 / 100
35020+3072132 / 100
45020+3090150 / 100
55020+30108168 / 100
65020+30126186 / 100
75020+30144204 / 100
85020+30162222 / 100

Ler a recuperação atrasada

Quando a saturação vira windup

Nas amostras 2 a 8, a saída já está saturada em 100. Mesmo assim, I cresce de 54 para 162 e u_calculado se afasta de 114 para 222. O comando aplicado permanece em 100.

Esse acúmulo de I no mesmo sentido da saturação é windup. Uma única amostra limitada evidencia saturação, mas não basta para evidenciar windup. Para isso, observe uma sequência: estado integral crescendo, comando calculado se afastando do limite e atuação sem aumento correspondente.

Persistência após a referência mudar

Agora a referência muda para r = 10, mantendo y = 20 como dado de teste. Logo, e = −10, P = −20 e ΔI = −6. Os mesmos ganhos continuam valendo. Embora I comece a diminuir, o valor acumulado mantém u_calculado acima de 100 por várias atualizações.

O excesso integral prolonga a saturação superior até a amostra 14. Na amostra 15, o comando volta à faixa permitida exatamente no limite; na 16, fica estritamente abaixo dele.
AmostraryeIu calculado / aplicado
91020−10156136 / 100
101020−10150130 / 100
111020−10144124 / 100
121020−10138118 / 100
131020−10132112 / 100
141020−10126106 / 100
151020−10120100 / 100
161020−1011494 / 94

Verifique sua leitura

Distinguir saturação de windup

Analise as duas tabelas em conjunto. A igualdade com um limite pertence à faixa permitida: u_calculado = 100 não excede o máximo de 100. Portanto, diferencie o instante em que a saturação termina daquele em que o comando passa a ficar estritamente abaixo do máximo.

Verifique sua leitura

Qual alternativa identifica corretamente a evidência de windup e a fronteira de recuperação neste registro?

Passo 2 de 7

Decidir quando integrar

Use o comando e o estado integral candidatos para aceitar somente atualizações que não agravem uma saturação.

Decidir sobre a soma P + I

Três ideias que não são equivalentes

Limitar apenas o comando final protege o atuador, mas não impede que I continue crescendo enquanto a saída já está no limite. Já limitar I a uma faixa fixa é uma regra diferente e pode ser inadequado: o comando é a soma u = P + I.

Por exemplo, mesmo que I = 90 esteja dentro de uma faixa de 0 a 100, uma parcela P = 80 produz u = 170. Portanto, limitar I à mesma faixa da saída não limita o comando total.

A integração condicional toma uma decisão mais direta: bloqueia somente o incremento integral que empurra o comando ainda mais para fora de um limite.

Onde a decisão deve atuar

Comparação entre limitar somente a saída, limitar o estado integral de modo fixo e bloquear apenas o incremento que agrava uma saturação.

A regra observa o efeito de ΔI sobre o comando total P + I, não apenas o valor isolado de I.

Dica

Atenção

Não escolha a faixa de I copiando automaticamente os limites da saída. A contribuição útil de I depende da parcela proporcional P naquele instante; por isso, a decisão usa o comando candidato.

Formar o candidato e aplicar a regra

Calcule antes de confirmar

Ainda não altere o estado integral persistente. Primeiro, calcule valores provisórios:

  1. I_candidato = I_anterior + ΔI
  2. u_candidato = P + I_candidato

Depois classifique o efeito de ΔI. Só então I poderá ser aceito ou preservado. Essa separação mantém disponível o valor anterior caso a atualização precise ser bloqueada.

Exemplo

Exemplo: incremento que agrava

Considere u_min = 0, u_max = 100, P = 80, I_anterior = 25 e ΔI = +10.

Então, I_candidato = 25 + 10 = 35 e u_candidato = 80 + 35 = 115.

O candidato está acima do máximo e ΔI é positivo: o incremento levaria o comando ainda mais para cima. Portanto, bloqueie a atualização e preserve I = 25.

Regra de integração condicional

A convenção deste tutorial é:

  • Bloquear se u_candidato > u_max e ΔI > 0.
  • Bloquear se u_candidato < u_min e ΔI < 0.
  • Aceitar nos demais casos.

O teste do limite identifica onde está o candidato. O sinal de ΔI mostra se a atualização aponta para fora da faixa ou de volta para ela.

Permitir a recuperação

O sentido de ΔI decide

A existência de saturação não basta para bloquear a integral. Acima do limite superior, um ΔI negativo reduz I e ajuda o comando a retornar. Abaixo do limite inferior, um ΔI positivo faz o equivalente no outro sentido.

Assim, uma atualização corretiva é aceita mesmo quando um único passo ainda não traz u_candidato de volta para dentro da faixa.

Exemplo

Exemplo: recuperação ainda saturada

Com u_min = 0, u_max = 100, P = 90, I_anterior = 40 e ΔI = -8:

I_candidato = 32 e u_candidato = 122.

O comando candidato ainda excede 100, mas ΔI é negativo: ele reduz o excesso em vez de agravá-lo. A atualização é aceita. Em chamadas sucessivas, incrementos corretivos podem continuar reduzindo I.

Dica

Critério prático

Não confunda “ainda está saturado” com “deve bloquear”. A pergunta decisiva é: este ΔI move o comando para fora ou para dentro?

Conferir a classificação

Calcule e classifique

Agora aplique a regra a casos novos. Em cada situação, some I_anterior + ΔI para obter I_candidato; depois some P para obter u_candidato. Relacione cada caso ao resultado completo correto.

Considere sempre u_min = 0 e u_max = 100.

Classificar novas situações

Associe cada situação ao valor de u_candidato e à decisão sobre a atualização integral.

Toque em um item e depois no par correspondente.

Passo 3 de 7

Implementar a atualização protegida

Implemente a sequência que testa a integral candidata antes de alterar o estado e limita o comando aplicado ao final.

Calcular antes de confirmar

A sequência protege o estado integral

A atualização protegida é uma sequência de cálculo e decisão. Trate state.i como o estado confirmado da chamada anterior: ele não deve mudar enquanto você avalia o candidato.

  1. Calcule p e deltaI.
  2. Forme iCandidate e uCandidate.
  3. Decida se deltaI agrava uma saturação.
  4. Confirme o candidato ou preserve state.i.
  5. Recalcule o comando com o I escolhido.
  6. Limite o comando final que será aplicado.

O último limite continua necessário. Mesmo com a integral bloqueada, a parcela proporcional pode manter uCalculated além da faixa permitida.

Fluxo de uma atualização protegida

Diagrama do fluxo: cálculo de P e deltaI, formação dos candidatos, decisão de bloquear ou aceitar a integral, recomposição do comando e limitação final.

O estado integral só é confirmado depois do teste com os valores candidatos.

Referência em C/C++

Uma função verificável

A função abaixo é autocontida: recebe erro, ganhos, período e limites; recebe o estado integral por referência; e devolve os valores úteis para registro. Ela não lê sensores nem escreve em periféricos.

uCandidate é usado apenas na decisão. Após a decisão, uCalculated é recomposto com o estado efetivamente escolhido. Já uApplied é sempre o comando dentro dos limites.

Atualização PI com integração condicional

Trecho de referência para estudar ou adaptar em seu próprio editor.

cpp
struct PIState { float i; };

struct PIResult {
  float deltaI, iCandidate, uCandidate;
  bool integrated;
  float i, uCalculated, uApplied;
};

float clamp(float x, float low, float high) {
  if (x < low) return low;
  if (x > high) return high;
  return x;
}

PIResult piStep(float error, float kp, float ki, float ts,
                float uMin, float uMax, PIState& state) {
  float p = kp * error;
  float deltaI = ki * ts * error;
  float iCandidate = state.i + deltaI;
  float uCandidate = p + iCandidate;

  bool blocks = (uCandidate > uMax && deltaI > 0.0f) ||
                (uCandidate < uMin && deltaI < 0.0f);
  bool integrated = !blocks;
  if (integrated) state.i = iCandidate;

  float uCalculated = p + state.i;
  float uApplied = clamp(uCalculated, uMin, uMax);
  return {deltaI, iCandidate, uCandidate, integrated,
          state.i, uCalculated, uApplied};
}

Dica

Registros que permitem conferir a lógica

Para cada chamada, registre os campos retornados. deltaI mostra o sentido da tentativa; integrated informa a decisão; i mostra o estado confirmado; uCandidate documenta o teste; e a dupla uCalculated/uApplied revela a atuação do limite.

Praticar a ordem

Sequência da atualização

Ordene as operações de uma chamada da função, da primeira à última.

Coloque na ordem correta

A ordem correta evita confirmar um estado que ainda precisava ser bloqueado. O limite final vem depois da recomposição de P + I com o estado escolhido.

Ordenar a implementação

Organize a sequência da atualização PI protegida.

  1. Calcular P, deltaI, iCandidate e uCandidate.
  2. Recalcular uCalculated com P e o I escolhido.
  3. Decidir se deltaI agrava a saturação indicada por uCandidate.
  4. Limitar uCalculated para obter uApplied.
  5. Confirmar iCandidate ou preservar o estado integral anterior.

Praticar a decisão

Complete a lógica essencial

Complete os trechos que implementam o bloqueio, a confirmação do estado e a limitação final.

Completar sem atualizar cedo demais

Preencha as lacunas da função.

cpp
bool blocks = () ||
              ();

if (!blocks) {
  state.i = ;
}

float uCalculated = p + ;
float uApplied = clamp(uCalculated, uMin, );

Passo 4 de 7

Testar os dois limites e suas fronteiras

Verifique a regra de integração condicional nos limites superior e inferior, incluindo recuperação, igualdade e incrementos nulos.

Cobertura dos limites

Estruture os testes

Uma matriz de testes para a regra

Teste cada atualização como um caso independente. Fixe u_min = 0 e u_max = 100 e registre P, I_anterior, ΔI, u_candidato, decisão, I_resultante e u_aplicado.

A regra já implementada é:

  • bloquear se u_candidato > u_max e ΔI > 0;
  • bloquear se u_candidato < u_min e ΔI < 0;
  • aceitar nos demais casos.

Após escolher o estado integral, recalcule u_calculado = P + I_resultante e limite esse valor para obter u_aplicado. Casos pontuais isolam erros de sinal e evitam que um resultado anterior esconda uma atualização incorreta.

Os dois sentidos de saturação

Diagrama de uma faixa de comando limitada, com incrementos integrais que são aceitos ao apontar para dentro e bloqueados ao agravar os limites superior ou inferior.

A decisão depende simultaneamente da posição de u_candidato e do sentido de ΔI.

Dica

Leitura do diagrama

A simetria é essencial: no limite superior, um incremento positivo agrava o excesso; no inferior, um incremento negativo agrava a falta. Já um incremento apontando de volta para a faixa deve ser aceito, mesmo que uma única atualização ainda deixe o candidato fora da faixa.

Saturação e recuperação

Casos-base

Use estes casos pontuais para conferir sinais, desigualdades e preservação do estado. Em todos, o comando aplicado é limitado ao intervalo de 0 a 100 depois da decisão.

Valores numéricos para rastreamento manual.
CasoPI anteriorΔIu candidatoDecisão esperada
Dentro da faixa4020+565Aceitar
Excesso superior8015+10105Bloquear
Excesso inferior-2010-15-25Bloquear
Recupera do superior8040-15105Aceitar
Recupera do inferior-20-30+10-40Aceitar

Exemplo

Recuperação não é bloqueio

Exemplo: recuperação ainda saturada

Com P = 80, I_anterior = 40 e ΔI = -15:

  1. I_candidato = 40 + (-15) = 25;
  2. u_candidato = 80 + 25 = 105;
  3. Embora 105 ainda seja maior que 100, ΔI é negativo: ele reduz o integral e ajuda a sair do limite superior;
  4. Aceite: I_resultante = 25;
  5. u_calculado = 105 e u_aplicado = 100.

Bloquear esse caso impediria justamente a recuperação do estado integral.

Atenção

Duas verificações diferentes

Não confunda a decisão sobre I com a limitação final. Uma parcela proporcional alta pode manter u_calculado fora da faixa mesmo quando a integral foi corretamente bloqueada ou aceita.

Teste as fronteiras

Igualdade, incremento nulo e salto grande

Fronteiras que expõem erros sutis

A comparação é estrita. Se u_candidato for exatamente 100 ou exatamente 0, a atualização é aceita: não há comando além do limite. No ciclo seguinte, qualquer avanço para fora será avaliado novamente.

Se ΔI = 0, então I_candidato é igual a I_anterior. Logo, o estado integral não muda, independentemente de a lógica classificar a chamada como aceita ou bloqueada.

Examine também saltos grandes: não basta concluir que uma mudança de sinal “recupera” o sistema. O candidato final deve ser comparado aos dois limites.

Avalie a desigualdade estrita

Complete a condição geral de bloqueio superior e avalie-a no caso a seguir: uMin = 0, uMax = 100, P = 80, I anterior = 10 e deltaI = 10.

Nesse caso, iCandidate = 20 e uCandidate = 100. A primeira comparação da condição geral deve resultar falsa, pois a igualdade com o limite é permitida. Portanto, a atualização não é bloqueada.

Condição estrita no limite superior

Preencha a condição geral. Em seguida, aplique-a mentalmente ao caso apresentado, no qual uCandidate é exatamente igual a uMax.

cpp
bool bloqueiaSuperior = () && ();

Detecte atalhos incorretos

Cheque a lógica completa

Avalie a afirmação considerando que ΔI pode ser grande o bastante para levar o comando candidato de uma região acima do máximo para uma região abaixo do mínimo em uma única chamada.

Inversão não é salvo-conduto

Uma inversão de sinal em ΔI torna a atualização automaticamente segura, mesmo se uCandidate cruzar a faixa inteira.

Dica

Checklist de validação

Antes de avançar, confira sua matriz de testes: ela deve conter operação interna, bloqueio superior, bloqueio inferior, recuperação nos dois sentidos, igualdade em cada fronteira e ΔI = 0. Esses casos isolam erros de > versus >=, de sinal e de atualização prematura de I.

Passo 5 de 7

Comparar a recuperação com e sem anti-windup

Compare rastreamentos numéricos de PI com limitação apenas da saída e PI com integração condicional nos limites superior e inferior.

Condições do rastreamento

Mesmo cenário, duas políticas

Use dois controladores com os mesmos parâmetros: Kp = 0,2, Ki × Ts = 0,1, limites numéricos de comando de −10 a +10 e I inicial igual a 0.

A única diferença é a política da integral:

  • Somente limitação da saída: atualiza I em toda chamada e limita apenas u_aplicado.
  • Integração condicional: bloqueia apenas o ΔI que agravaria uma saturação.

Para dar sentido às referências do teste, suponha uma variável medida com faixa alcançável de 0 a 40. Assim, r = 70 e r = −50 ficam propositalmente fora dessa faixa; os retornos para r = 20 ficam dentro dela. Esta faixa é uma hipótese para rastrear a lógica, não um modelo nem uma previsão de uma planta RC.

O que muda na recuperação

Comparação entre um estado integral que cresce durante saturação e outro que é preservado pela integração condicional.

Nos dois casos o limitador protege o comando aplicado; somente o anti-windup evita o acúmulo integral que prolonga a recuperação.

Dica

Entradas fixas, não resposta física

No rastreamento superior, as três primeiras entradas são r = 70 e y = 10. Logo, e = +60, P = +12 e ΔI = +6. Depois, use r = 20 e y = 30: e = −10, P = −2 e ΔI = −1.

As referências e medições são entradas fixas. Elas servem para isolar a decisão de integração. Durante a fase saturada, u_aplicado = +10 nas duas políticas; por isso, compare também I e u_calculado.

Recuperação depois do limite superior

Somente limitação da saída

A tabela usa a sequência superior declarada anteriormente. Nas três primeiras atualizações, a integral continua crescendo apesar de a saída já estar limitada. Após o retorno a r = 20, cada ΔI = −1 reduz o estado acumulado.

u_calculado é o valor antes do limitador. u_aplicado é o comando que respeita a faixa de −10 a +10.

Rastreamento completo no limite superior, sem anti-windup.
AtualizaçãoeΔII após ΔIu calculadou aplicado
1+60+6+6+18+10
2+60+6+12+24+10
3+60+6+18+30+10
4−10−1+17+15+10
5−10−1+16+14+10
6−10−1+15+13+10
7−10−1+14+12+10
8−10−1+13+11+10
9−10−1+12+10+10

Por que a recuperação demora

Sem anti-windup, I chega a +18. Mesmo quando o erro se torna corretivo, o comando calculado fica acima do máximo até a atualização 8. Na atualização 9, u_calculado = +10: ele volta à faixa porque a igualdade com o limite é permitida.

Portanto, são necessárias seis atualizações corretivas, da 4 à 9, para o comando calculado deixar de exceder o limite superior.

Integração condicional

Com integração condicional, as tentativas positivas iniciais são bloqueadas. Quando o erro muda, a atualização negativa é aceita: ela reduz I, mesmo que a decisão seja tomada a partir de um comando candidato calculado antes da confirmação do estado.

O mesmo registro superior com o estado integral protegido.
AtualizaçãoΔII candidatoDecisãoI escolhidou calculado / aplicado
1+6+6Bloquear0+12 / +10
2+6+6Bloquear0+12 / +10
3+6+6Bloquear0+12 / +10
4−1−1Aceitar−1−3 / −3

Dica

O que a técnica não faz

O anti-windup não torna r = 70 alcançável na hipótese de faixa medida de 0 a 40. Ele também não altera a parcela proporcional inicial, que já solicita um comando acima de +10. Sua função é impedir que a integral acumule ainda mais no mesmo sentido enquanto existe saturação.

Espelho no limite inferior

Sequência complementar no limite inferior

Repita o raciocínio no limite inferior, reiniciando I = 0. Nas três primeiras atualizações, use r = −50 e y = 10. Então, e = −60, P = −12 e ΔI = −6. Depois, use r = 20 e y = 10: e = +10, P = +2 e ΔI = +1.

Os valores negativos são somente dados numéricos para testar a simetria da lógica. Eles não indicam aplicar tensão negativa, alterar a alimentação ou executar esse caso no circuito.

Sem anti-windup no limite inferior

Sem anti-windup, a integral acumula valores negativos até −18. Depois da mudança para erro positivo, cada atualização soma +1 a I, mas o excesso negativo persiste por várias chamadas.

Rastreamento completo inferior com limitação apenas da saída.
AtualizaçãoeΔII após ΔIu calculadou aplicado
1−60−6−6−18−10
2−60−6−12−24−10
3−60−6−18−30−10
4+10+1−17−15−10
5+10+1−16−14−10
6+10+1−15−13−10
7+10+1−14−12−10
8+10+1−13−11−10
9+10+1−12−10−10

Recuperação protegida no limite inferior

Na versão protegida, as três tentativas de ΔI = −6 são bloqueadas, pois o candidato está abaixo de −10 e o incremento é negativo. Na primeira atualização de retorno, ΔI = +1 é aceito: I passa de 0 para +1 e u_calculado = +2 + 1 = +3, dentro da faixa.

A simetria é exata: no limite superior bloqueia-se o incremento positivo que agrava o excesso; no inferior, bloqueia-se o negativo que agrava a falta.

Atenção

Registro fixo não é simulação física

Estas tabelas reproduzem entradas fixas para verificar a regra de anti-windup. Em uma simulação de malha fechada, a medição mudaria conforme o comando e seria necessário um modelo da planta. Portanto, os registros não preveem a tensão futura de um RC, não demonstram estabilidade e não substituem ajuste de ganhos.

Prática e justificativa

Reconstrua a recuperação acumulada

Complete dois pontos do registro superior sem anti-windup. Após as três chamadas saturadas, I = +18. No retorno, P = −2 e cada chamada acrescenta ΔI = −1 ao estado integral.

Observe que o comando calculado é obtido antes do limitador. O comando aplicado continua em +10 enquanto o calculado estiver acima desse limite.

Complete o registro sem proteção

Preencha os dois valores de comando calculado no rastreamento sem proteção.

cpp
// Após três chamadas saturadas: I = +18.
// Quarta atualização de retorno: I = 18 + 4 * (-1).
float iRetorno4 = 14.0f;
float uRetorno4 = -2.0f + iRetorno4;  // 

// Sexta atualização de retorno: I = 18 + 6 * (-1).
float iRetorno6 = 12.0f;
float uRetorno6 = -2.0f + iRetorno6;  // 

Justifique a diferença de recuperação

Compare as versões após a saturação superior em 3 a 5 frases. Explique como o estado integral altera a quantidade de atualizações corretivas. Cite a diferença entre u_calculado e u_aplicado e explique por que as tabelas não são uma simulação da planta.

Escreva pelo menos 120 caracteres (0/120).

Passo 6 de 7

Tratar pausas e perda de medição

Defina uma política explícita para interrupções: comando seguro e integral congelada durante a pausa; retomada autorizada com medição válida e reinicialização da integral antes do próximo cálculo.

Separar pausa de saturação

Pausa não é saturação

O bloqueio por saturação e uma pausa de controle resolvem problemas diferentes. Na saturação, o PI continua ativo e decide se aceita ou bloqueia apenas o incremento integral que agravaria um limite. Já com o controle desabilitado ou uma medição inválida, não há uma atualização de controle confiável: não calcule erro, ΔI nem comandos candidatos.

A política usada neste tutorial é explícita:

  1. Durante a pausa, aplicar um comando seguro e congelar I.
  2. Só sair da pausa com controle habilitado, medição válida e recente e autorização de retomada.
  3. Na primeira atualização autorizada, fazer I = 0 antes de calcular o PI.

Nos exemplos numéricos do RC de baixa energia, o comando seguro é 0. Isso não é uma regra universal: outro atuador pode exigir outro comando seguro, definido pelo seu contexto.

Fluxo da política de pausa

Diagrama separando o caminho de pausa por desabilitação ou medição inválida do caminho normal do PI com anti-windup.

A verificação de habilitação e validade vem antes de qualquer cálculo do PI. O anti-windup atua somente quando o controle está ativo.

Definir uma política verificável

Estado integral durante a interrupção

Congelar I durante a pausa evita modificar o estado sem dados válidos. Porém, congelar não autoriza reutilizar esse valor indefinidamente: ele pode ter sido acumulado para uma condição anterior da planta e da referência.

Por isso, a retomada adotada reinicializa I antes da primeira atualização normal. Não some o erro durante o intervalo parado e não tente compensar a pausa executando várias atualizações atrasadas. A primeira amostra válida e autorizada inicia uma nova sequência de controle.

Atenção

Atenção na retomada

A reinicialização de I não garante um comando sem salto: a parcela proporcional ainda depende do erro presente na retomada. Registre e observe esse transiente na validação. Evite esconder esse efeito reutilizando silenciosamente um estado integral antigo.

Decisões da política

Comparação da política adotada para um RC de baixa energia.

O comando seguro de zero é específico deste exemplo didático.
CondiçãoComando aplicadoEstado IPróximo passo
DesabilitadoSeguro: 0CongelarAguardar habilitação
Medição inválidaSeguro: 0CongelarAguardar medição recente
Válido, sem autorizaçãoSeguro: 0CongelarAguardar autorização
Retomada autorizadaAinda seguro nesta decisãoReiniciar para 0Calcular próxima atualização
Controle ativoPI limitadoAtualizar pela regra anti-windupRepetir no próximo período

Implementar o bloqueio antes do PI

Porta de entrada para pausa e retomada

Use esta porta de entrada antes do cálculo do PI protegido. Se ela retornar false, mantenha o comando seguro e não calcule erro nem atualize a integral nesta chamada.

cpp
struct PiState {
  float integral;
  bool pausado;
};

// Retorna true somente quando é permitido executar a atualização do PI.
bool prepararPi(PiState& s,
                bool habilitado,
                bool medicaoValidaERecente,
                bool retomadaAutorizada,
                float& comandoAplicado) {
  const float comandoSeguro = 0.0f; // Exemplo: RC de baixa energia.

  if (!habilitado || !medicaoValidaERecente) {
    s.pausado = true;
    comandoAplicado = comandoSeguro;
    return false; // Não calcular erro, ΔI ou candidato.
  }

  if (s.pausado) {
    comandoAplicado = comandoSeguro;
    if (!retomadaAutorizada) {
      return false;
    }

    s.integral = 0.0f; // Antes da primeira atualização retomada.
    s.pausado = false;
  }

  return true; // Agora o chamador pode executar o PI com anti-windup.
}

Dica

Contrato da função

Quando prepararPi(...) retorna true, calcule normalmente P, ΔI, I_candidato e aplique a regra de integração condicional já estudada. A função não substitui o limite final do comando nem a decisão anti-windup; ela impede que esses cálculos ocorram durante uma pausa.

Verificar a retomada

Pratique a condição de pausa

Complete a condição que detecta uma pausa. Enquanto ela for verdadeira, o estado fica pausado, o comando seguro é aplicado e a função deve retornar antes de qualquer cálculo do PI.

Bloquear cálculo sem condições válidas

Preencha as duas condições de interrupção.

cpp
if ( || ) {
  s.pausado = true;
  comandoAplicado = comandoSeguro;
  return false;
}

Sequência de retomada

Ordene as ações quando chegam habilitação e medição válida após uma pausa.

  1. Verificar se a retomada foi autorizada; se não, manter o comando seguro.
  2. Confirmar que o controle está habilitado e a medição é válida e recente.
  3. Reinicializar I para zero e limpar o estado de pausa.
  4. Calcular uma única atualização normal do PI usando a medição atual.

Passo 7 de 7

Validar o PI protegido de ponta a ponta

Valide, por rastreamento e aplicação final, o contrato de um PI com integração condicional, incluindo saturação, recuperação, pausas e retomada.

Defina a evidência antes de concluir

O contrato a validar

A validação final é um rastreamento lógico: ela não energiza uma planta nem demonstra estabilidade. Para cada chamada permitida, registre error, deltaI, uCandidate, a decisão, I, uCalculated e uApplied.

O contrato está atendido quando:

  • I não avança no sentido que agrava uma saturação;
  • um deltaI corretivo é aceito, mesmo se o candidato ainda estiver fora da faixa;
  • uApplied sempre respeita os limites;
  • desabilitação ou medição inválida interrompem o cálculo, congelam I e aplicam o comando seguro;
  • uma retomada autorizada, com medição válida, zera I antes da primeira atualização.

Essas evidências verificam a lógica do software. A resposta do circuito RC e a sintonia dos ganhos serão tratadas no próximo tutorial.

Fluxo completo do PI protegido

Diagrama do PI protegido com caminho normal de cálculo, decisão condicional da integral, limitador final e caminho separado de pausa e retomada autorizada.

A pausa é um estado persistente: não basta aplicar o comando seguro em uma única chamada.

Use uma implementação verificável

Entradas e estado explícitos

A função final calcula deltaI internamente, preservando a relação do PI discreto: deltaI = ki × ts × error. Assim, com ki e ts positivos, deltaI tem o mesmo sinal do erro.

O campo persistente pausado impede uma retomada implícita. Uma entrada inválida marca a pausa e retorna sem calcular erro, candidato ou integral. Mesmo quando a medição volta a ser válida, o comando seguro permanece até existir autorização de retomada. Só então a integral é zerada, a pausa é limpa e uma atualização protegida pode ocorrer.

PI protegido com pausa e retomada explícitas

Função autocontida para estudo, rastreamento ou execução local opcional. Ela calcula deltaI a partir de ki, ts e error.

cpp
struct PiState {
  float integral;
  bool pausado;
};

struct PiResult {
  float deltaI, iCandidate, i;
  float uCandidate, uCalculated, uApplied;
  bool integrated;
};

float clamp(float x, float low, float high) {
  if (x < low) return low;
  if (x > high) return high;
  return x;
}

PiResult updatePiProtected(float error, float kp, float ki, float ts,
                           float uMin, float uMax, PiState& s,
                           bool habilitado, bool medicaoValidaERecente,
                           bool retomadaAutorizada) {
  const float comandoSeguro = 0.0f;
  PiResult r{};

  if (!habilitado || !medicaoValidaERecente) {
    s.pausado = true;
    r.i = s.integral;
    r.uApplied = comandoSeguro;
    return r;
  }

  if (s.pausado) {
    r.i = s.integral;
    r.uApplied = comandoSeguro;
    if (!retomadaAutorizada) return r;
    s.integral = 0.0f;
    s.pausado = false;
  }

  float p = kp * error;
  r.deltaI = ki * ts * error;
  r.iCandidate = s.integral + r.deltaI;
  r.uCandidate = p + r.iCandidate;

  bool blocks = (r.uCandidate > uMax && r.deltaI > 0.0f) ||
                (r.uCandidate < uMin && r.deltaI < 0.0f);
  r.integrated = !blocks;
  if (r.integrated) s.integral = r.iCandidate;

  r.i = s.integral;
  r.uCalculated = p + s.integral;
  r.uApplied = clamp(r.uCalculated, uMin, uMax);
  return r;
}

Interprete saturações, pausa e retomada

Rastreamento integrado e coerente

Use kp = 1, ki = 1, ts = 0,2 s, limites de 0 a 10 e estado inicial deliberadamente elevado: I = 14, pausado = false. Portanto, em toda chamada válida, deltaI = 0,2 × error.

Esse estado inicial é um dado de teste para verificar a recuperação de uma integral já alta. O estado confirmado em cada linha alimenta a linha seguinte. O caso começa dentro da faixa, passa por saturação superior, aceita uma correção ainda saturada, testa o limite inferior e então atravessa pausa e retomada.

Registros de validação

“—” indica que não há cálculo de erro, deltaI ou candidato durante a pausa. u* é o comando calculado depois de aceitar ou bloquear a atualização integral.

A mesma relação `deltaI = ki × ts × error` é usada em todas as linhas válidas.
ErroΔICondiçãouCandidateDecisão e I finaluApplied
−5−1,0válida, habilitada8,0aceita; I=13,0; u*=8,08,0
+3+0,6válida, habilitada16,6bloqueia alto; I=13,0; u*=16,010,0
−2−0,4válida, habilitada10,6aceita corretiva; I=12,6; u*=10,610,0
−20−4,0válida, habilitada−11,4bloqueia baixo; I=12,6; u*=−7,40,0
——habilitado=false—pausa; I=12,6 congelado0,0
——medição inválida—continua em pausa; I=12,60,0
+3+0,6válida; retomada autorizada3,6zera I, aceita; I=0,6; u*=3,63,6

Dica

Leia as decisões, não só os limites

Na recuperação superior, error = −2 produz necessariamente deltaI = −0,4. O candidato 10,6 ainda excede o máximo, mas o incremento reduz I de 13,0 para 12,6; por isso é aceito.

No limite inferior, error = −20 produz deltaI = −4,0. Como o candidato fica abaixo de zero e o incremento negativo agravaria a falta, a atualização é bloqueada. Mesmo bloqueada, a saída final continua limitada a zero.

Conclua sem confundir lógica e sintonia

Complete o núcleo da decisão

Complete o cálculo coerente de deltaI e os dois testes de bloqueio.

cpp
float deltaI =  *  * error;

bool blocks = () ||
              ();

Justifique a conclusão

Com base na tabela, justifique em 3 a 5 frases por que a lógica atende ao contrato. Cite o bloqueio superior, a atualização corretiva aceita ainda saturada, o bloqueio inferior, a pausa persistente e a retomada. Termine explicando por que isso não prova estabilidade nem sintonia na planta.

Escreva pelo menos 220 caracteres (0/220).

Resumo

Síntese final

  • Registros devem separar candidato, estado integral confirmado, comando calculado e comando aplicado.
  • Calcule deltaI por ki × ts × error; com ganhos positivos, seu sinal acompanha o erro.
  • Bloqueie somente o incremento que agrava a saturação: positivo acima de uMax ou negativo abaixo de uMin.
  • Aceite incrementos corretivos, mesmo quando o comando candidato ainda permanece além do mesmo limite.
  • O limitador final continua obrigatório após a decisão sobre a integral.
  • Desabilitação ou medição inválida criam uma pausa persistente: comando seguro, I congelado e nenhum cálculo PI.
  • Na política adotada, a retomada válida e autorizada reinicializa I antes da primeira atualização.
  • A lógica verificada não substitui a sintonia nem a validação dinâmica do PI na planta RC.

Tutorial concluído

Parabéns! Você concluiu: Anti-windup por integração condicional

PI protegido validado: saturações, recuperação, pausas e retomada seguem uma política explícita.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso