Function Block Diagram (FBD)

Über Function Block Diagrams

Function Block Diagram (FBD) ist eine der fünf SPS-Programmiersprachen, die durch IEC 61131-3:2013 — dem internationalen Standard für industrielle Automatisierung — definiert werden. Es ist die zweitmeist gezeichnete SPS-Sprache in Produktionscode (nach Ladder) und die natürliche Wahl, wenn ein Programmabschnitt als Datenfluss leichter lesbar ist als als Leistungsschienen-und-Rungen-Relais. AND/OR-Logik, Timer (TON/TOF/TP), Zähler (CTU/CTD), Vergleich (EQ/NE/GT/GE/LT/LE), Mathematik (ADD/SUB/MUL/DIV/MOVE), Flankenerkennung (R_TRIG/F_TRIG), bistabile Latches (SR/RS) — alle als benannte Port-Boxen dargestellt, die von links nach rechts verdrahtet sind.

Schematex folgt den visuellen Konventionen von IEC 61131-3 §6.4 mit IEC 60617-12 Unterscheidungssymbolen (& für AND, ≥1 für OR, =1 für XOR, 1 für NOT/BUF). Leitungen sind nach Datentyp eingefärbt (BOOL schwarz, INT blau, REAL orange, TIME magenta) gemäß der De-facto-Konvention von TIA Portal. Schwestersprache zu ladder (§6.3, rungenbasiert) und sfc (§6.5, sequenzbasiert); zusammen bilden sie den visuellen Teil von IEC 61131-3.

fbd·§
↘ preview
100%
FBD: Motor Control FBD with 2 network(s). 0 — Start/stop latch Start Latch Stop Latch OR ≥1 IN1 IN2 OUT AND & IN1 IN2 OUT 1 — Drive output Latch MotorOut MOVE IN OUT
UTF-8 · LF · 13 lines · 209 chars✓ parsed·5.2 ms·6.8 KB SVG

1. Ihr erstes FBD-Netzwerk

Das kleinste nützliche FBD-Netzwerk: ein Block, zwei Eingänge, ein Ausgang.

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

A und B werden automatisch als BOOL-Eingänge (linke Klemmen) deklariert, und Out wird automatisch mit dem OUT-Port des AND-Blocks (rechte Klemme) verdrahtet. Der Block sitzt zwischen ihnen mit Port-Stummeln und Beschriftungen.


2. Variablen

Deklarieren Sie Variablen vor allen Netzwerken. Jede Variable hat einen Namen, einen IEC-Datentyp und einen optionalen Anfangswert.

fbd "Tank Control"

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

Unterstützte Typen: bool, int, dint, uint, udint, real, lreal, time, date, tod, string, wstring, byte, word, dword, timer, counter. Jeder andere Bezeichner wird als benutzerdefinierter Funktionsblock-Typ behandelt.

Optionale Bereichspräfixe (Standard = lokal): var_input, var_output, var_in_out, var_global, var_external.


3. Netzwerke

Ein Netzwerk ist ein unabhängiges Stück Datenfluss, das innerhalb sich selbst von links nach rechts ausgewertet wird; Netzwerke werden pro Scan von oben nach unten über das Programm ausgewertet.

network 0 "Start latch":
  ...

network 1:
  ...

Die Nummer ist optional — Netzwerke werden automatisch nummeriert, wenn sie fehlt. Der Titel (in Anführungszeichen) wird oben links im Netzwerkrahmen dargestellt.


4. Block-Aufrufe — Inline-Ausdrucksnotation

Der klarste Weg, ein kombinatorisches Netzwerk zu schreiben, ist als einzelner verschachtelter Ausdruck:

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

Der Parser erstellt den Aufrufbaum: äußeres OR mit A an Eingang 1 und dem AND-Ergebnis an Eingang 2; AND hat B und das negierte C. Der Renderer legt sie von links nach rechts an (Eingänge bei Schicht 0, AND bei Schicht 1, OR bei Schicht 2, Ausgang bei Schicht 3).

~C fügt eine Negationsblase (kleiner offener Kreis) am Eingangsport hinzu — entspricht dem Einfügen eines NOT-Blocks an dieser Leitung, aber übersichtlicher.


5. Block-Aufrufe — Instanzbenannte Notation

Wenn Sie die Ausgänge eines Blocks von anderswo referenzieren müssen, geben Sie ihm ein Instanz-Tag:

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 referenzieren Ausgangsports benannter Instanzen. Das Instanz-Tag wird kursiv über dem Block-Header dargestellt.

Argumentlisten akzeptieren benannte Ports (CU: Pulse.Q) oder positionelle (CTU(Pulse.Q, Reset, 100)) — benannte Ports werden für die Lesbarkeit empfohlen und sind erforderlich, wenn Sie einen Port überspringen.


6. Inline-Konstanten

Eingangsports können Literale direkt aufnehmen — keine Leitung erforderlich:

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 werden als kleiner gelber gerahmter Text links von ihrem Port dargestellt. Zeitliterale folgen IEC 61131-3: T#10ms, T#5s, T#3m20s, T#1h. Boolesche Werte sind true / false (Groß-/Kleinschreibung irrelevant).


7. Standard-Blockbibliothek

KategorieBlöcke
BooleanAND, OR, NOT, NAND, NOR, XOR, XNOR, BUF
FlankenerkennungR_TRIG, F_TRIG
BistabilSR, RS
TimerTON, TOF, TP
ZählerCTU, CTD
MathematikADD, SUB, MUL, DIV, MOD, ABS, NEG, MOVE
VergleichEQ, NE, GT, GE, LT, LE
AuswahlSEL, MUX, MAX, MIN, LIMIT

AND, OR, NAND, NOR, ADD, MUL, MAX, MIN akzeptieren eine beliebige Anzahl von Eingängen (Standard 2). Übergeben Sie zusätzliche positionelle Argumente oder verwenden Sie [inputs: N] zum Erweitern.

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

8. Größeres Beispiel — Flaschenzähler

fbd "Bottle Counter"

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

network 0 "Debounce sensor with 50ms dwell":
  Dwell = TON(IN: BottleSensor, PT: T#50ms)

network 1 "Count one bottle on rising edge of debounced signal":
  Pulse     = R_TRIG(CLK: Dwell.Q)
  BatchSize = CTU(CU: Pulse.Q, R: BatchDone, PV: 24)

network 2 "Batch done":
  BatchDone = MOVE(BatchSize.Q)

Drei Netzwerke: Entprellung → Flankenerkennung → Zählen → Flag. Jedes Netzwerk ist ein DAG; der Renderer leitet Leitungen durch Manhattan-Pfade.


9. Einschränkungen in v0.1

Die aktuelle Engine implementiert die Standard-Block-Teilmenge, die die meisten Teams täglich verwenden. Folgendes ist zurückgestellt und wird in einer Folgeversion ergänzt:

  • EN/ENO-Leistungsflussschienen ([en]-Block-Attribut, [rail: on]-Header) — fügt eine Enable-Schiene oben im Netzwerk hinzu, Herstellerkonvention aus Studio 5000 / TIA Portal.
  • Benutzerdefinierte Funktionsblöcke mit pins_in: / pins_out:-Deklarationen — für benutzerdefinierte Motorsteuerungen, PID-Instanzen usw.
  • Seitenverbinder (connector_out / connector_in) für Leitungen, die sich über mehrere Seiten erstrecken.
  • Bitstring-Blöcke (SHL, SHR, ROL, ROR, AND_BIT, OR_BIT usw.).
  • Erweiterte Mathematik (SQRT, LN, LOG, EXP, SIN, COS, TAN, ASIN, ACOS, ATAN).
  • ANSI-Unterscheidungsform-Modus ([shape: ansi]) — die logic-Engine bietet dies bereits für rein-boolesche Diagramme.
  • CTUD bidirektionaler Zähler, TP retentiver Timer (RTO).

Wenn Sie diese Funktionen jetzt benötigen, eröffnen Sie ein Issue oder verwenden Sie die ladder-Engine für den vollständigen IEC 61131-3 LD-Teilsatz.


Verwandte Beispiele

Sofort einsetzbare Szenarien aus der Beispielgalerie:

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.