ZOEMAQ

Programa ladder da estufa

Especificação de implementação para o CLP Delta DVP-28SV11R2. Cada bloco abaixo corresponde a uma seção do programa, com a lógica e o porquê de cada intertravamento.

Documento ZM-LD-001 Revisão 1 · agosto/2026 Mapa de memória v1.0 WPLSoft / ISPSoft
← voltar para a página central
A regra que governa este programa inteiro: o ladder segurança, nunca atua nela. Termostato limitador, solenoide de gás, detector de gás, emergência, central de incêndio e programador de chama cortam o gás por fiação, em série, sem passar por este programa. As saídas Y0 e Y1 entram depois dessa malha: o CLP só consegue pedir calor quando a segurança física já permitiu.

Não existe rung de rearme remoto de bloqueio do queimador. A ausência é decisão de projeto — não acrescente.

00Configuração inicial

Escravo Modbus RTU na COM2

Executado uma vez, no primeiro scan (M1002).

R000Configura a COM2 como escravo Modbus RTU
M1002 (primeiro scan)
  ├─ MOV  H0091   D1120    ; formato: 19200, 8, N, 1
  ├─ MOV  K1      D1121    ; endereço do escravo = 1
  ├─ SET  M1120            ; retém a configuração de D1120
  └─ SET  M1143            ; seleciona modo RTU (desligado = ASCII)
Confirme o valor de D1120 no manual da série SV2 antes de gravar. O registrador é um campo de bits (baud, paridade, stop, comprimento) e o valor muda entre famílias Delta. O valor era H0086 aqui e estava errado: decompondo, H0086 é 1000 0110 — b0=0 (7 bits), b1-b2=11 (paridade par), b3=0 (1 stop), b4-b7=1000 (9600), ou seja 9600-7-E-1, que é justamente o padrão de fábrica da Delta. O valor correto para 19200-8-N-1 é H0091 (1001 0001: 8 bits, sem paridade, 1 stop, 19200). Conferido no manual da série e validado no CLP real em 31/08/2026 — depois de gravar, o PLC Information passou a mostrar COM2: 1 (19200, 8, N, 1).

Parâmetros de partida

R001Carrega a receita 1 se a memória estiver vazia
M1002 e (D103 = K0)
  ├─ MOV  K2000   D103     ; setpoint 200,0 °C
  ├─ MOV  K1900   D104     ; mínima de cura 190,0 °C
  ├─ MOV  K50     D105     ; histerese liga 5,0 °C
  ├─ MOV  K30     D106     ; histerese desliga 3,0 °C
  ├─ MOV  K1200   D107     ; tempo de cura 1200 s = 20 min
  └─ MOV  K1      D109     ; receita ativa = 1
Sem isto, um CLP recém-gravado sobe com setpoint zero e a estufa nunca aquece — falha que parece defeito de queimador.
Os valores de cura são provisórios. D104 e D107 vêm da ficha técnica do pó que a fábrica usa e mudam por fornecedor. Ajuste antes de emitir certificado para cliente.

01Leitura de temperatura

Três canais do módulo DVP-04TC-S (termopar tipo K), lidos por FROM a cada scan. O módulo é o primeiro da direita, portanto número K0.

R010Lê as três zonas do módulo de termopar
M1000 (sempre ligado)
  └─ FROM K0  K6  D100  K3   ; CR#6..#8 → D100, D101, D102
                             ; CH1 zona 1 · CH2 zona 2 · CH3 peça
                             ; já em 0,1 °C — bate com o mapa (×10)
Confirme os números de CR no manual do DVP-04TC-S. Nos módulos da linha S os valores presentes costumam ficar a partir de CR#6, mas o endereço exato precisa ser lido do manual da revisão que você tem em mãos. Confirme também que o módulo está em Celsius e em tipo K (registrador de modo, normalmente CR#1) — em Fahrenheit o certificado inteiro sai errado sem nenhum sintoma visível.
R011Termopar rompido vira alarme, não silêncio
Para cada canal (repetir para D100, D101):
  CMP  D100  K-32768  M0    ; o módulo devolve -32768 em falha
  M2 (igual)  →  SET M116   ; alarme de termopar rompido (zona 1)
                            ; D101 → M117 (zona 2)
O valor de falha é repassado como está para o gateway, que o descarta em vez de interpolar. Não substitua por zero nem pelo último valor válido — um termopar rompido lendo "0 °C" faria o queimador ficar aceso indefinidamente.

02Segurança e alarmes

Todos os sinais de segurança são NF: contato fechado é a condição normal. Um fio rompido abre o contato e vira alarme.

EntradaSinalAlarmeGravidade
X10Termostato limitador atuouM110alta
X11Detector de gásM111alta
X12Central de incêndioM112alta
X2EmergênciaM113alta
X5Bloqueio do queimadorM114alta
X6Pressostato de gásM120média
X7Pressostato de arM121média
X14Filtro obstruídoM122baixa
R020Cada sinal NF aberto trava seu alarme
Padrão, repetido para cada linha da tabela acima:

  X10 (NF, aberto = anormal)
  ──|/|──────────────────────────── SET M110

Os alarmes são RETENTIVOS: usar SET, nunca OUT.
Só saem no bloco 10, por reconhecimento e com a causa física já normalizada.
Usar OUT em vez de SET faria o alarme sumir sozinho assim que o sinal voltasse — e um incidente que se apaga sozinho é um incidente que ninguém investiga.
R021Registra o último alarme e a fase em que ocorreu
Na borda de subida de qualquer alarme (M110..M123):
  ├─ MOV  Knnn  D150   ; número do bit M que disparou
  └─ MOV  D108     D151   ; fase do ciclo naquele instante
É o que responde "a estufa estava no patamar ou ainda na rampa quando isso aconteceu?" sem depender da nuvem estar no ar.

03Watchdog e chave local/remoto

R030Watchdog da supervisão — 30 s sem heartbeat volta ao local
; O gateway incrementa D205 a cada leitura.
; Comparar com a cópia anterior detecta se ele parou.

M1000
  └─ CMP  D205  D300  M10     ; D300 = cópia anterior do heartbeat

M12 (D205 ≠ D300)  →  MOV D205 D300
                      RST T10             ; reinicia a contagem

M11 (D205 = D300)  →  TMR T10 K300        ; 300 × 100 ms = 30 s

T10  →  RST M20                            ; M20 = supervisão viva
NOT T10 → SET M20
Sem este bloco, uma queda de rede com comando pendente vira comportamento imprevisível. Com ele, o CLP simplesmente para de aceitar comando remoto e continua o ciclo em andamento normalmente.
R031Comando remoto só passa em REMOTO e com watchdog vivo
  M20 (supervisão viva)   X20 (chave em REMOTO)
  ──| |───────────────────| |──────────────────── OUT M21

M21 = "aceita comando remoto"
A chave é física, na porta do painel. Em LOCAL o ladder ignora D203 e D204 — o app pode escrever o que quiser, nada acontece. Ajuste o endereço X20 conforme a entrada realmente usada; a lista de I/O reserva as entradas até X15, então a chave entra numa expansão ou numa das entradas livres.

04Permissivas

R040Condição única que autoriza iniciar um ciclo
  X3    X2    X10   X11   X12   X6    X7    M114
 porta  emg  limit  gás  incênd press press bloqueio
  ──| |──| |──| |──| |──| |──| |──| |──|/|──── OUT M30

M30 = "permissivas atendidas"

Observe: X3, X2, X6, X7, X10, X11 e X12 são NF — contato FECHADO
é a condição boa, por isso entram como contato NA no ladder.
M114 entra negado porque é um bit de alarme, não uma entrada.
Esta é a linha que o app espelha na aba Comando. O app apenas mostra o resultado para o operador entender o motivo da recusa — quem decide é este rung, reavaliado a cada scan.

05Máquina de estados

O estado vive em D108 e é a base de tudo — inclusive da detecção de borda de ciclo no servidor.

D108EstadoSai paraQuando
0Ocioso1comando iniciar, com permissivas
1Rampa2zona 1 ≥ setpoint − 2,0 °C
2Patamar3cura acumulada ≥ tempo exigido
3Resfriamento0zona 1 < 80,0 °C
4Abortado0após reconhecimento
5Bloqueado0após reconhecimento, causa normalizada
R050Abertura do ciclo
; Botoeira local OU comando remoto aceito
  X0 (botoeira iniciar)
  ──| |──────────────────────────┐
  M21 e (D204 = K1)              ├── e M30 (permissivas) e (D108 = K0)
  ──| |──────────────────────────┘         │
                                           ▼
  ├─ DINC D110             ; número do ciclo (32 bits)
  ├─ MOV  K1     D108      ; estado = rampa
  ├─ DMOV K0     D112      ; zera tempo decorrido
  ├─ DMOV K0     D114      ; zera tempo de chama
  ├─ DMOV K0     D116      ; zera tempo acima da cura
  ├─ MOV  K0     D118      ; zera partidas
  ├─ MOV  K0     D119      ; zera tempo de rampa
  ├─ MOV  D100   D120      ; máxima parte da temperatura atual
  ├─ MOV  K9999  D121      ; mínima do patamar começa alta
  ├─ DMOV K0     D122      ; zera soma para média
  ├─ MOV  K0     D124      ; zera contagem de amostras
  ├─ RST  M109             ; limpa "cura completa"
  └─ MOV  K0     D204      ; zera o comando IMEDIATAMENTE
Zerar D204 na mesma varredura é obrigatório. O gateway confirma pela mudança de D108, nunca pelo eco do comando — se o registrador ficasse com K1, o ciclo reiniciaria sozinho a cada scan.
R051Rampa → patamar
(D108 = K1) e (D100 ≥ D103 − K20)      ; 20 = 2,0 °C em décimos
  ├─ MOV  K2     D108
  └─ MOV  D100   D121                   ; inicia a mínima do patamar
R052Patamar → resfriamento, quando a cura completa
(D108 = K2) e (D116:D117 ≥ D107)
  ├─ SET  M109              ; cura completa — lote aprovado
  └─ MOV  K3     D108
M109 é o bit que o app usa para liberar a descarga sem esperar o resfriamento acabar.
R053Resfriamento → ocioso, fechando a queima
(D108 = K3) e (D100 < K800)             ; 80,0 °C
  ├─ DINC D130              ; queimas totais
  ├─ INC  D140              ; queimas desde a manutenção
  └─ MOV  K0     D108
R054Parada pelo operador e bloqueio por alarme
; Parar — botoeira local ou comando remoto
  X1 (NF, botão parar) aberto OU (M21 e D204 = K2)
    e (D108 ≠ K0)
  ├─ SET  M123              ; ciclo abortado pelo operador
  ├─ MOV  K4     D108       ; estado = abortado
  └─ MOV  K0     D204

; Bloqueio — qualquer alarme de gravidade alta com ciclo ativo
  (M110 ou M111 ou M112 ou M113 ou M114) e (D108 = K1 ou K2)
  └─ MOV  K5     D108       ; estado = bloqueado
O estado 5 não volta sozinho para ocioso. Exige reconhecimento e que a causa física tenha sumido — ver bloco 10.

06Queimador de 1 estágio

Controle por histerese, não PID: o queimador liga ou desliga, sem modulação.

R060Tempo mínimo desligado — protege o queimador
NOT M40 (chama desligada)
  └─ TMR  T20  K600          ; 600 × 100 ms = 60 s

T20 = "já pode religar"
Sem este temporizador o queimador cicla rápido demais e o eletrodo de ignição se desgasta em semanas. Sessenta segundos é o mínimo do fabricante — não reduza para melhorar a estabilidade de temperatura; para isso, aumente a histerese.
R061Liga e desliga por histerese
; LIGAR: temperatura caiu abaixo de (setpoint − histerese liga)
  (D108 = K1 ou K2)  e  M30 (permissivas)  e  T20
    e (D100 ≤ D103 − D105)
  ├─ SET  M40                ; pedido de chama
  ├─ INC  D118               ; partidas no ciclo
  └─ DINC D134               ; partidas totais

; DESLIGAR: passou de (setpoint + histerese desliga)
  (D100 ≥ D103 + D106)  →  RST M40

; Corte incondicional
  (D108 ≠ K1 e D108 ≠ K2)  →  RST M40
  NOT X3 (porta aberta)     →  RST M40
  M110|M111|M112|M113|M114  →  RST M40
Os três cortes incondicionais no fim são redundantes com a malha de segurança física — e é para serem. A malha corta o gás por fiação; estes rungs garantem que o CLP também pare de pedir calor, para o histórico registrar o que aconteceu de forma coerente.
R062Falha de ignição: três seguidas bloqueiam
; M40 pedindo chama, mas X4 (chama detectada) não confirma em 10 s
  M40 e NOT X4  →  TMR T21 K100        ; 10 s

T21
  ├─ SET  M115               ; falha de ignição
  ├─ INC  D141               ; falhas acumuladas
  ├─ INC  D301               ; falhas SEGUIDAS
  ├─ RST  M40
  └─ RST  T21

X4 (chama confirmou)  →  MOV K0 D301   ; zera a sequência

(D301 ≥ K3)
  ├─ SET  M114               ; bloqueio do queimador
  └─ MOV  K5     D108
O programador de chama do queimador já faz o próprio bloqueio — este rung existe para o CLP saber e registrar, não para substituí-lo. O rearme continua sendo manual, no próprio programador.

07Acumuladores do ciclo

Todos os contadores de tempo usam o pulso de 1 s do CLP (M1013), que é mais confiável que contar scans.

R070Tempos do ciclo
M1013 (pulso de 1 s) e (D108 = K1, K2 ou K3)
  └─ DINC D112               ; tempo decorrido

M1013 e (D108 = K1)
  └─ INC  D119               ; tempo de rampa

M1013 e M40 (chama acesa)
  ├─ DINC D114               ; tempo de chama no ciclo
  └─ DINC D132               ; horímetro de chama total

M1013 e Y2 (ventilador ligado)
  └─ DINC D138               ; horímetro do ventilador
R071Minutos efetivos de cura — o número do certificado
; Conta SÓ enquanto a referência está acima da mínima da receita.
; A referência é a temperatura da PEÇA (D102) quando o termopar móvel
; está instalado; senão, a MENOR das duas zonas.

; Escolhe a referência:
  D102 ≠ K-32768  →  MOV D102 D302        ; peça instalada
  D102 = K-32768  →  MOV D100 D302
                     (D101 < D302) → MOV D101 D302   ; menor zona

; Acumula:
  M1013 e (D108 = K2) e (D302 ≥ D104)
    └─ DINC D116
Este é o único número que decide se o lote é aprovado. Repare que conta apenas no patamar e apenas acima de D104 — não é a duração do ciclo. O servidor recalcula o mesmo valor a partir das amostras, e as duas contas precisam bater: divergência grande indica termopar ou relógio com problema.
R072Máxima, mínima e soma para a média
(D108 = K1, K2 ou K3) e (D100 > D120)  →  MOV D100 D120   ; máxima
(D108 = K2)          e (D100 < D121)  →  MOV D100 D121   ; mínima no patamar

M1013 e (D108 = K1, K2 ou K3)
  ├─ DADD D122  D100  D122   ; soma acumulada (32 bits)
  └─ INC  D124               ; número de amostras
Não divida no ladder. O CLP acumula soma e contagem; o servidor calcula D122:D123 ÷ D124 ÷ 10. Divisão inteira no CLP perderia precisão justamente no número que vai no laudo.

08Totalizadores retentivos

Ponto crítico que costuma passar despercebido. Na série DVP, os registradores D só são retentivos dentro de uma faixa específica — tipicamente a partir de D4000. Os totalizadores do mapa moram em D130–D141, que não é retentiva por padrão: uma queda de energia zeraria a contagem de queimas.

A contagem de queimas é o que sustenta o contador de manutenção preventiva e o histórico de produção. Perdê-la em cada falta de luz inviabiliza o produto.

Solução: acumular na área retentiva e espelhar

R080Acumule em D4130+ e copie para D130+ a cada scan
; Os rungs dos blocos 6 e 7 devem incrementar a faixa RETENTIVA:
;   D130 → D4130   queimas totais
;   D132 → D4132   horímetro de chama
;   D134 → D4134   partidas totais
;   D136 → D4136   volume de gás
;   D138 → D4138   horímetro do ventilador
;   D140 → D4140   queimas desde a manutenção
;   D141 → D4141   falhas de ignição

; E um único rung espelha para a área que o Modbus lê:
M1000
  └─ BMOV D4130  D130  K12    ; 12 registradores de uma vez
Confirme a faixa retentiva do seu CLP nos parâmetros do WPLSoft antes de escolher os endereços — ela é configurável e varia por família. O importante é o princípio: acumular no retentivo, expor no endereço do mapa. Assim o contrato com o gateway continua valendo sem que o dado se perca.
R081Volume de gás estimado
; Consumo = tempo de chama × vazão nominal. Não precisa de medidor na v1.
; Com vazão de 12 m³/h → 12000 L/h → 3,333 L/s
; Para evitar fração, acumula décimos de litro a cada segundo:

M1013 e M40
  └─ DADD D4136  K33  D4136   ; 33 décimos de litro = 3,3 L/s

; O gateway divide por 10.000 para obter m³ (mapa define litros;
; ajuste a escala aqui conforme a vazão real do SEU queimador).
A vazão nominal precisa vir do fabricante do queimador. Sem esse número, o custo por peça — uma das três coisas que o cliente compra — não fecha. Se houver medidor com pulso, use X15 e conte pulsos em vez de estimar.

09Saídas e sinaleiros

R090Saídas de processo
M40  e  M30  e  X3        →  OUT Y0    ; pedido de calor
M40  e  M30  e  X3        →  OUT Y1    ; permissiva da solenoide

(D108 = K1, K2 ou K3)     →  OUT Y2    ; ventilador de recirculação
(D108 = K1, K2 ou K3)     →  OUT Y3    ; exaustor
O ventilador permanece ligado no resfriamento — desligar antes cria ponto quente e prejudica a uniformidade do próximo ciclo.
R091Torre luminosa e sirene
; Vermelho tem prioridade sobre amarelo, amarelo sobre verde.
  M110|M111|M112|M113|M114        →  OUT Y6    ; vermelho
  M115..M123 e NOT Y6             →  OUT Y5    ; amarelo
  (D108 ≠ K0) e NOT Y6 e NOT Y5   →  OUT Y4    ; verde

; Sirene operacional: pulsa, para poder ser diferenciada da de incêndio
  Y6 e M1013                      →  OUT Y7
A sirene operacional é separada da sirene de incêndio. Se as duas soarem iguais, o operador aprende a ignorar as duas.

10Reconhecimento de alarmes

R100Reconhecer só apaga alarme cuja causa já sumiu
; Reconhecimento: botoeira local ou comando remoto aceito
  M21 e (D204 = K3)  →  SET M50
  X21 (botoeira reconhecer) → SET M50

M50
  ├─ X10 fechado  →  RST M110      ; só apaga se a causa normalizou
  ├─ X11 fechado  →  RST M111
  ├─ X12 fechado  →  RST M112
  ├─ X2  fechado  →  RST M113
  ├─ X5  aberto   →  RST M114      ; bloqueio liberado no programador
  ├─ RST M115  M118  M119  M123    ; alarmes sem causa persistente
  ├─ D100 válido  →  RST M116
  ├─ D101 válido  →  RST M117
  ├─ X6 fechado   →  RST M120
  ├─ X7 fechado   →  RST M121
  ├─ X14 aberto   →  RST M122
  ├─ RST M50
  └─ MOV K0  D204

; Só volta a ocioso quando NÃO resta alarme de gravidade alta
(D108 = K4 ou K5) e NOT (M110|M111|M112|M113|M114)
  └─ MOV K0  D108
Reconhecer não é resolver. Se o limitador ainda está atuado, M110 volta a ligar no scan seguinte de qualquer jeito — e é assim que tem que ser. O operador não consegue silenciar um problema real apertando um botão.

11Teste do programa

Executar com o gás fechado, na bancada, antes de instalar no painel. O simulador Modbus do projeto reproduz o comportamento esperado — se o ladder divergir dele, um dos dois está errado.

Comunicação

Watchdog e comando

Segurança — o mais importante

Processo

Retentividade

Recursos usados

RecursoUso
T10Watchdog da supervisão — 30 s
T20Tempo mínimo do queimador desligado — 60 s
T21Prazo de confirmação de chama — 10 s
M0–M12Resultados de comparação (CMP)
M20Supervisão viva
M21Aceita comando remoto
M30Permissivas atendidas
M40Pedido de chama
M50Pulso de reconhecimento
D300Cópia anterior do heartbeat
D301Falhas de ignição seguidas
D302Referência de temperatura para a cura
D4130–D4141Totalizadores na área retentiva
Auxiliares em faixa livre. M0–M50 e D300–D302 foram escolhidos fora de qualquer faixa do mapa de memória, justamente para não colidirem com o contrato do gateway. Se precisar de mais auxiliares, use a mesma regra: nunca entre M100–M123, D100–D151 ou D200–D205.

O que nunca fazer neste programa