Blockdiagramm

Über Blockdiagramme

Ein Blockdiagramm modelliert ein System als eine Menge funktionaler Blöcke, die durch gerichtete Signalleitungen verbunden sind. Jeder Block repräsentiert eine Komponente, deren Verhalten durch eine Übertragungsfunktion oder ein beschreibendes Label erfasst wird; Signale fließen durch die Blöcke in einer definierten Richtung. Regelungsingenieure verwenden sie für den Entwurf von Regelkreisen, Signalverarbeitungsingenieure nutzen sie zur Dokumentation von Filterketten, und Systemingenieure setzen sie ein, um komplexe Architekturen zu zergliedern. Die charakteristischen visuellen Elemente — rechteckige Blöcke und kreisförmige Summierstellen — sind Konventionen aus der Regelungstechnik (Ogata, Franklin, Nise) und finden sich in jedem Datenblatt und Lehrbuch, das ein Rückkopplungssystem beschreibt.

Schematex folgt der Laplace-Bereich-Übertragungsfunktions-Konvention aus Regelungstechnik-Lehrbüchern: Blöcke werden mit ihren Übertragungsfunktionen beschriftet, Summierstellen tragen explizite +/-Vorzeichen, und ein discrete-Flag an Signalen rendert eine gestrichelte Linie für abgetastete Datenpfade. Diese Seite dokumentiert, was der Parser heute akzeptiert. Maßgebliche Referenzen: Ogata (2010) Modern Control Engineering; Franklin, Powell & Emami-Naeini (2018) Feedback Control of Dynamic Systems.

blockdiagram·§
↘ preview
100%
Audio dynamics processor Block diagram with 6 blocks, 1 summing junctions, 7 signals Audio dynamics processor Input + gated compressed Output Noise gate Compressor 3-band EQ Limiter Level detect in in
UTF-8 · LF · 26 lines · 623 chars✓ parsed·0.6 ms·4.6 KB SVG

1. Ihr erstes Blockdiagramm

Das kleinstmögliche nützliche Blockdiagramm: ein Regler, eine Regelstrecke, ein Regelkreis.

blockdiagram·§
↘ preview
100%
Temperature control Block diagram with 4 blocks, 1 summing junctions, 5 signals Temperature control Setpoint + T_measured + PID Heater Thermocouple in in
UTF-8 · LF · 14 lines · 339 chars✓ parsed·0.4 ms·3.6 KB SVG

Vier Regeln decken 80 % der Anwendungsfälle ab:

  1. Beginnen Sie mit blockdiagram, optional gefolgt von einem zitierten Titel.
  2. Deklarieren Sie jede Komponente mit ID = block("label"), jede Summierstelle mit ID = sum(+a, -b) und jedes benannte Signal mit ID = signal("label").
  3. Verbinden Sie Komponenten mit ->. Mehrere Hops in einer Zeile verketten: A -> B -> C.
  4. Kommentieren Sie Verbindungen optional mit einem nachgestellten Label: A -> B ["E(s)"].

Kommentare müssen mit # auf einer eigenen Zeile beginnen.


2. Blöcke

Ein Block repräsentiert jedes funktionale Element — Regler, Regelstrecke, Filter, Aktor, Sensor. Das Label ist typischerweise eine Übertragungsfunktion oder ein beschreibender Name.

Syntax: ID = block("label") [role: X]

AttributWerteEffekt
role: plantplant, controller, sensor, actuator, reference, disturbance, genericVisuelle Farbkodierung; generic ist der Standard
route: aboveabove, belowRouting-Hinweis für Rückkopplungs- und Vorwärtskopplungsblöcke

ID-Regeln. Muss mit einem Buchstaben oder Unterstrich beginnen, gefolgt von Buchstaben, Ziffern oder Unterstrichen: [A-Za-z_]\w*.

blockdiagram·§
↘ preview
100%
Block roles Block diagram with 6 blocks, 0 summing junctions, 5 signals Block roles r(t) C(s) Actuator G(s) H(s) d(t)
UTF-8 · LF · 12 lines · 339 chars✓ parsed·0.4 ms·3.6 KB SVG

3. Summierstellen

Eine Summierstelle kombiniert mehrere Signale zu einem, mit expliziten Vorzeichen für jeden Eingang. Sie wird als Kreis mit +/-Zeichen dargestellt — das Standardsymbol der Regelungstechnik.

Syntax: ID = sum(+a, -b, +c, …)

  • Jeder Eingang ist eine vorzeichenbehaftete ID: +x addiert Signal x, -y subtrahiert Signal y.
  • Ein Eingang ohne Vorzeichen wird als positiv behandelt.
  • Die ID der Summierstelle wird dann als Ziel von Verbindungslinien verwendet, genau wie eine Block-ID.
blockdiagram·§
↘ preview
100%
Error with disturbance rejection Block diagram with 4 blocks, 2 summing junctions, 6 signals Error with disturbance rejection r (setpoint) + y_m u(t) + + PI C(s) G(s) H(s) in in
UTF-8 · LF · 20 lines · 519 chars✓ parsed·0.5 ms·4.0 KB SVG

4. Signale

Eine Signaldeklaration erstellt einen benannten Signalknoten, den der Parser als Kantenlabel einbettet. Signale sind durchleitend: Wenn der Parser A -> sig und sig -> B sieht, werden sie zu einer einzigen Kante von A nach B zusammengeführt, die mit dem Anzeigetext des Signals beschriftet wird.

Syntax: ID = signal("label") [discrete]

  • [discrete] weglassen für kontinuierliche Signale (durchgehende Linie).
  • [discrete] hinzufügen für abgetastete Signale (gestrichelte Linie).
e_sig = signal("E(s)")
u_sig = signal("U(s)") [discrete]

Signale sind rein eine Beschriftungshilfe — Sie können Kanten auch direkt mit einem nachgestellten Attribut beschriften (siehe §5).


5. Verbindungen

Eine Verbindungslinie ist from -> to. Der -> -Operator erzeugt immer eine gerichtete, mit Pfeil versehene Linie.

Einzelner Hop: A -> B

Kette: A -> B -> C — entspricht A -> B und B -> C. Beide werden in einer Zeile geschrieben.

Mit einem Signallabel: ["label text"] am Ende der Kette anhängen. Das Label gilt nur für den letzten Hop.

ctrl -> plant ["U(s)"]

Mit einem discrete-Flag: [discrete] anhängen, um den letzten Hop-Pfeil gestrichelt darzustellen.

plant -> adc ["y"] [discrete]

Sowohl Label als auch discrete: [label: "Y(s)", discrete] verwenden (kommagetrennt).

adc -> ctrl [label: "y[k]", discrete]
blockdiagram·§
↘ preview
100%
Mixed continuous/discrete Block diagram with 5 blocks, 1 summing junctions, 7 signals Mixed continuous/discrete r[k] + u[k] u(t) y(t) Digital PID DAC G(s) ADC in in
UTF-8 · LF · 16 lines · 415 chars✓ parsed·0.6 ms·4.2 KB SVG

6. Labels und Kommentare

  • Titel: blockdiagram "Mein System" — erste Zeile, in Anführungszeichen.
  • Block-Label: der zitierte String innerhalb von block("…") — erscheint im Kasten.
  • Signallabel: der zitierte String innerhalb von signal("…") — erscheint auf der zusammengeführten Kante.
  • Kantenlabel: nachgestelltes ["text"] oder [label: "text"] auf einer Verbindungszeile — erscheint auf diesem Pfeil.
  • Kommentare: # am Anfang einer Zeile (nach führendem Leerzeichen). Nachgestellte Inline-Kommentare werden nicht unterstützt.

7. Reservierte Wörter und Escaping

Am Zeilenanfang reserviert: blockdiagram (Header).

Strukturelle Schlüsselwörter (als Block-/Signal-/Sum-IDs vermeiden, um Mehrdeutigkeiten zu verhindern): block, signal, sum.

in und out sind konventionelle IDs für die externe Grenze eines Diagramms — der Parser behandelt sie als gewöhnliche Bezeichner, aber der Renderer verwendet sie als implizite Quell-/Senkenknoten. Die Verwendung von in -> r und plant -> out ist idiomatisch.

Strings mit Leerzeichen müssen in block("…") und signal("…")-Labels in doppelte Anführungszeichen gesetzt werden.


8. Häufige Fehler

Sie schriebenParser meldetLösung
G = block(G(s)) (keine Anführungszeichen)Parse-Fehler — Label muss in Anführungszeichen stehenG = block("G(s)")
err = sum(r, -ym) (kein +)r wird als +r behandelt — funktioniert, aber mehrdeutigsum(+r, -ym) für Klarheit schreiben
ctrl -> plant, plant -> out (Komma in einer Zeile), ist kein Trennzeichen — Parse-FehlerEine Verbindung pro Zeile oder Kette verwenden: ctrl -> plant -> out
s1 = signal("E(s)") [label: "E"]label: nicht für Signal gültig; für Verbindungen verwendenlabel: aus der Signaldeklaration entfernen
role: filterUnbekannte Rolle — fällt stillschweigend auf generic zurückplant, controller, sensor, actuator, reference, disturbance oder generic verwenden
A -> B [discrete, label: "e"] — Label zuerst schlägt fehlReihenfolge der Attribute in […] ist egal, aber die kurze "text"-Form funktioniert nur, wenn sie das einzige Element ist[label: "e", discrete] verwenden

9. Grammatik (EBNF)

document       = header (blank | comment | block-def | sum-def | signal-def | connection)*

header         = "blockdiagram" ( WS quoted-string )? NEWLINE
quoted-string  = '"' any-char-but-quote* '"'

block-def      = id WS "=" WS "block" "(" quoted-string ")" ( "[" block-attrs "]" )? NEWLINE
block-attrs    = block-attr ("," block-attr)*
block-attr     = "role:" role | "route:" ("above" | "below")
role           = "plant" | "controller" | "sensor" | "actuator"
               | "reference" | "disturbance" | "generic"

sum-def        = id WS "=" WS "sum" "(" sum-inputs ")" NEWLINE
sum-inputs     = sum-input ("," sum-input)*
sum-input      = ("+" | "-")? id

signal-def     = id WS "=" WS "signal" "(" quoted-string ")" ( "[" "discrete" "]" )? NEWLINE

connection     = id ("->" id)+ ( "[" conn-attrs "]" )? NEWLINE
conn-attrs     = quoted-string                          # shorthand: bare label only
               | conn-attr ("," conn-attr)*
conn-attr      = "label:" quoted-string | "discrete"

id             = [A-Za-z_] \w*
comment        = "#" any NEWLINE

Maßgebliche Quelle: src/diagrams/blockdiagram/parser.ts. Falls dies vom Parser abweicht, hat der Parser Vorrang — bitte eröffnen Sie einen Issue.


10. Standardkonformität

Schematex-Blockdiagramme folgen den Laplace-Bereich-Übertragungsfunktions-Konventionen aus Ogata (2010) und Franklin et al. (2018) — die Block-, Summierstellen- und gerichteten Signallinien-Symbole, die in jedem Regelungstechnik-Lehrbuch zu finden sind.

Was heute implementiert ist:

  • ✅ Rechteckige Blöcke mit Übertragungsfunktions-Labels
  • ✅ Kreisförmige Summierstellen mit +/-Polaritätseingängen
  • ✅ Benannte Signalknoten (durchleitend, zu Kantenlabel zusammengeführt)
  • ✅ Gerichtete Verbindungen mit Verkettung (A -> B -> C)
  • ✅ Kantenlabels — Signalnamen auf Pfeilen
  • discrete-Flag — gestrichelte Linie für abgetastete Signale
  • ✅ Rollenannotationen (plant, controller, sensor, actuator, reference, disturbance, generic)
  • route: above | below-Hinweis für Rückkopplungs-/Vorwärtskopplungsplatzierung
  • ⏳ Verzweigungspunkt — explizites Punktsymbol, an dem ein Signal zu zwei Zielen verzweigt
  • ⏳ Begrenzungsrahmen — gestricheltes Subsystem-Gehäuse mit Label
  • ⏳ Bidirektionale Pfeile — <-> für bidirektionalen Signalaustausch
  • ⏳ Bus-Notation — dicke Linie, die einen Signalvektor darstellt

Referenzen:

  • Ogata, K. (2010). Modern Control Engineering, 5. Aufl. Prentice Hall.
  • Franklin, G.F., Powell, J.D. & Emami-Naeini, A. (2018). Feedback Control of Dynamic Systems, 8. Aufl. Pearson.

11. Verwandte Beispiele


12. Roadmap

Geplant — noch nicht parsierbar. Verwenden Sie diese heute nicht in generiertem DSL; der Parser wird sie ablehnen oder ignorieren.

  • Verzweigungspunkt-Symbol — explizites dot-Primitiv, an dem ein Ausgang zu mehreren Zielen verzweigt (derzeit fügt der Renderer automatisch eine Verzweigung ein, wenn eine ID mehr als einmal als Quelle verwendet wird, aber es gibt keine explizite Syntax).
  • Subsystem-Begrenzungsrahmenboundary "label" { … } -Block, der ein gestricheltes Rechteck um die enthaltenen Blöcke zeichnet, verwendet für Mehrschleifenansichten und Subsystemansichten.
  • Bidirektionale VerbindungA <-> B für Komponenten mit gegenseitigem Informationsaustausch (z.B. eine Bus-Schnittstelle).
  • Bus-(Vektorsignal-)Notation — dicke Linie mit einer Schrägstrich-und-Anzahl-Annotation //n, die einen n-breiten Signalbus anzeigt.
  • Verschachtelte Subsysteme — ein block, dessen Inneres selbst ein Blockdiagramm ist, einklappbar in der gerenderten Ausgabe.

Verfolgen Sie dies in den GitHub-Issues, wenn Sie eines davon früher benötigen.

Found this useful?

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