Diagrama de Bloco de Função (FBD)

Sobre diagramas de bloco de função

Diagrama de Bloco de Função (FBD) é uma das cinco linguagens de programação CLP definidas pela IEC 61131-3:2013 — o padrão internacional para automação industrial. É a segunda linguagem CLP mais utilizada em código de produção (depois do ladder), e a escolha natural quando um trecho de programa é mais fácil de ler como fluxo de dados do que como relés de barra de alimentação e rungs. Lógica AND/OR, temporizadores (TON/TOF/TP), contadores (CTU/CTD), comparação (EQ/NE/GT/GE/LT/LE), matemática (ADD/SUB/MUL/DIV/MOVE), detectores de borda (R_TRIG/F_TRIG), travas bistáveis (SR/RS) — todos renderizados como caixas com portas nomeadas conectadas da esquerda para a direita.

O Schematex segue as convenções visuais da IEC 61131-3 §6.4 com os símbolos distintivos da IEC 60617-12 (& para AND, ≥1 para OR, =1 para XOR, 1 para NOT/BUF). Os fios são coloridos por tipo de dado (BOOL preto, INT azul, REAL laranja, TIME magenta) seguindo a convenção de facto do TIA Portal. Linguagem irmã do ladder (§6.3, baseada em rungs) e do sfc (§6.5, baseado em sequência); juntos formam a metade visual do IEC 61131-3.

fbd·§
↘ preview
100%
FBD: Controle do Motor FBD with 2 network(s). 0 — Trava start/stop Start Latch Stop Latch OR ≥1 IN1 IN2 OUT AND & IN1 IN2 OUT 1 — Saída do drive Latch MotorOut MOVE IN OUT
UTF-8 · LF · 13 lines · 215 chars✓ parsed·4.6 ms·6.8 KB SVG

1. Sua primeira rede FBD

A menor rede FBD útil: um bloco, duas entradas, uma saída.

fbd
network 0:
  Out = AND(A, B)

A e B são declarados automaticamente como entradas BOOL (terminais do lado esquerdo), e Out é conectado automaticamente à porta OUT do bloco AND (terminal do lado direito). O bloco fica entre eles com pinos e rótulos de porta.


2. Variáveis

Declare variáveis antes de qualquer rede. Cada variável tem um nome, um tipo de dado IEC e um valor inicial opcional.

fbd "Controle do Tanque"

var StartBtn: bool
var TankLevel: real
var SetPoint: real = 80.0
var DwellTimer: timer
var Pulse: counter

Tipos suportados: bool, int, dint, uint, udint, real, lreal, time, date, tod, string, wstring, byte, word, dword, timer, counter. Qualquer outro identificador é tratado como um tipo de bloco de função definido pelo usuário.

Prefixos de escopo opcionais (padrão = local): var_input, var_output, var_in_out, var_global, var_external.


3. Redes

Uma rede é um trecho independente de fluxo de dados, avaliado da esquerda para a direita dentro de si mesmo; as redes são avaliadas de cima para baixo pelo programa a cada varredura.

network 0 "Trava start":
  ...

network 1:
  ...

O número é opcional — as redes são numeradas automaticamente se ausente. O título (entre aspas) é renderizado no canto superior esquerdo do quadro da rede.


4. Chamadas de bloco — notação de expressão inline

A forma mais clara de escrever uma rede combinacional é como uma única expressão aninhada:

network 0:
  Out = OR(A, AND(B, ~C))

O parser constrói a árvore de chamadas: OR externo com A na entrada 1 e o resultado do AND na entrada 2; o AND tem B e o C negado. O renderizador os distribui da esquerda para a direita (entradas na camada 0, AND na camada 1, OR na camada 2, saída na camada 3).

~C adiciona uma bolha de negação (pequeno círculo aberto) na porta de entrada — equivalente a inserir um bloco NOT naquele fio, mas mais limpo.


5. Chamadas de bloco — notação com nome de instância

Quando você precisa referenciar as saídas de um bloco a partir de outro lugar, dê a ele uma tag de instância:

network 0:
  Pulse = R_TRIG(CLK: Sensor)
  Count = CTU(CU: Pulse.Q, R: Reset, PV: 100)
  Done  = GE(IN1: Count.CV, IN2: 100)

Pulse.Q, Count.CV referenciam portas de saída de instâncias nomeadas. A tag de instância é renderizada em itálico acima do cabeçalho do bloco.

As listas de argumentos aceitam portas nomeadas (CU: Pulse.Q) ou posicionais (CTU(Pulse.Q, Reset, 100)) — nomeadas é recomendado para legibilidade e obrigatório quando você pula uma porta.


6. Constantes inline

Portas de entrada podem receber literais diretamente — sem necessidade de fio:

network 0:
  Dwell = TON(IN: BottleSensor, PT: T#50ms)
  Cap   = LIMIT(MN: 0.0, IN: Setpoint, MX: 95.0)
  Mode  = SEL(G: ManualSwitch, IN0: AutoMode, IN1: ManualMode)

T#50ms, 0.0, 95.0 são renderizados como pequeno texto encaixotado em amarelo à esquerda de suas portas. Literais de tempo seguem a IEC 61131-3: T#10ms, T#5s, T#3m20s, T#1h. Booleanos são true / false (sem distinção de maiúsculas/minúsculas).


7. Biblioteca de blocos padrão

CategoriaBlocos
BooleanoAND, OR, NOT, NAND, NOR, XOR, XNOR, BUF
Detecção de bordaR_TRIG, F_TRIG
BistávelSR, RS
TemporizadorTON, TOF, TP
ContadorCTU, CTD
MatemáticaADD, SUB, MUL, DIV, MOD, ABS, NEG, MOVE
ComparaçãoEQ, NE, GT, GE, LT, LE
SeleçãoSEL, MUX, MAX, MIN, LIMIT

AND, OR, NAND, NOR, ADD, MUL, MAX, MIN aceitam qualquer número de entradas (padrão 2). Passe argumentos posicionais extras ou use [inputs: N] para expandir.

network 0:
  All4 = AND(A, B, C, D)
  Sum  = ADD(X, Y, Z)

8. Exemplo maior — contador de garrafas

fbd "Contador de Garrafas"

var ConveyorRunning: bool
var BottleSensor: bool
var BatchDone: bool
var BatchSize: counter
var DwellTimer: timer

network 0 "Eliminar ruído do sensor com permanência de 50ms":
  Dwell = TON(IN: BottleSensor, PT: T#50ms)

network 1 "Contar uma garrafa na borda de subida do sinal filtrado":
  Pulse     = R_TRIG(CLK: Dwell.Q)
  BatchSize = CTU(CU: Pulse.Q, R: BatchDone, PV: 24)

network 2 "Lote concluído":
  BatchDone = MOVE(BatchSize.Q)

Três redes: filtro → detecção de borda → contagem → flag. Cada rede é um DAG; o renderizador roteia os fios por caminhos Manhattan.


9. Limitações da v0.1

O motor atual implementa o subconjunto de blocos padrão que a maioria das equipes usa no dia a dia. Os seguintes itens são adiados e serão adicionados em uma atualização futura:

  • Trilhos de fluxo de alimentação EN/ENO ([en] atributo de bloco, [rail: on] cabeçalho) — adiciona um trilho de habilitação no topo da rede, convenção de fornecedor do Studio 5000 / TIA Portal.
  • Blocos de função definidos pelo usuário com declarações pins_in: / pins_out: — para controladores de motor personalizados, instâncias PID, etc.
  • Conectores de página (connector_out / connector_in) para fios que abrangem múltiplas páginas.
  • Blocos de string de bits (SHL, SHR, ROL, ROR, AND_BIT, OR_BIT, etc.).
  • Matemática estendida (SQRT, LN, LOG, EXP, SIN, COS, TAN, ASIN, ACOS, ATAN).
  • Modo de forma distintiva ANSI ([shape: ansi]) — o motor logic já fornece isso para diagramas puramente booleanos.
  • CTUD contador bidirecional, TP temporizador retentivo (RTO).

Se você precisar de algum destes agora, abra uma issue ou use o motor ladder para o subconjunto LD completo do IEC 61131-3.


Exemplos relacionados

Cenários prontos para uso da galeria de exemplos:

fbd·§ IEC 61131-3:2013 §6.4 + §2.5
FBD: Motor Control FBD with 2 network(s). 0 — Start latch Start Latch Stop EmergencyStop Latch OR ≥1 IN1 IN2 OUT AND & IN1 IN2 IN3 OUT 1 — Drive output Latch MotorOut MOVE IN OUT
Motor start/stop latch (FBD)
Two-network FBD of the canonical PLC seal-in circuit — start-button rising edge sets a latch, stop and emergency-stop break it. Exercises declared variables, multi-network programs, inline expression notation, and negation bubbles.
manufacturing
fbd·§ IEC 61131-3:2013 §6.4 + §2.5
FBD: Bottle Counter FBD with 3 network(s). 0 — Debounce sensor with 50ms dwell BottleSensor TON IN PT T#50ms Q ET 1 — Count one bottle on rising edge of debounced signal BatchDone BatchSize R_TRIG CLK Q CTU CU R PV 24 Q CV 2 — Latch batch done BatchDone MOVE IN OUT
Bottle counter — debounce → edge → count (FBD)
Three-network FBD pipeline that debounces a bottle sensor with a 50ms TON, takes the rising edge with R_TRIG, counts up to 24 bottles per case with CTU, and self-resets when the case is full. A real production-line pattern that exercises timer + edge-detector + counter + named-instance references in sequence.
manufacturing
fbd·§ IEC 61131-3:2013 §6.4 + §2.5
FBD: Tank Level Setpoint Limiter FBD with 2 network(s). 0 — Clamp setpoint to safe range DesiredSetpoint SafeSetpoint LIMIT MN 0.0 IN MX 95.0 OUT 1 — Alarm on out-of-range request DesiredSetpoint Alarm OR ≥1 IN1 IN2 OUT LT IN1 IN2 0.0 OUT GT IN1 IN2 95.0 OUT MOVE IN OUT
Tank setpoint limiter + alarm (FBD)
Two-network FBD that clamps an operator-entered tank-level setpoint to the safe range [0, 95]% via LIMIT, and raises an alarm if the operator types an out-of-range value. Uses LT and GT comparison blocks, the LIMIT selection block, and demonstrates REAL (orange) and BOOL (black) wires carrying different data types in one diagram.
chemical-processing

Found this useful?

Schematex is free, fully open source, and zero-dependency. A star helps other developers discover it.