Startseite Über EasyKit Über EasyLab Produkte Partner Downloads Kontakt Suche

Funktionsblöcke

Über EasyLabDokumentation für EndbenutzerModellierungSoftware-Modell → Funktionsblöcke

Ein Funktionsblock ist eine Einheit, die eine bestimmte Teilfunktionalität einer Anwendung implementiert. Im Fall von EasyLab sind die Basiselemente der Datenflusssprache und ermöglichen die Beschreibung von Berechnungsvorgängen. So existieren beispielsweise Funktionsblöcke für mathematische Berechnungen, Regelungstechnik oder die Ansteuerung von Sensoren und Aktoren.

Im Gegensatz zur konventionellen Herangehensweise, bei der Programme in Textform notiert werden, bietet die Verwendung von Funktionsblöcken viele Vorteile:
  • Abstraktion: Funktionsblöcke kapseln jeweils eine bestimmte Teilfunktionalität der Anwendung. Man spricht hierbei von Abstraktion, da nach außen hin der innere Aufbau eines Funktionsblocks nicht sichtbar ist. Dies hilft dabei, sich auf das Wesentliche zu konzentrieren. Auch lassen sich einzelne Funktionsblöcke einheitlich dokumentieren, was die Einarbeitung und das Abwägen zwischen verschiedenen Alternativen erleichtert.
  • Modularität: Programme, die mit Funktionsblöcken aufgebaut werden, sind von sich aus modular. Modularität (auch Baukastenprinzip genannt) bedeutet, dass ein System aus standardisierten Teilkomponenten besteht. Der Vorteil von Modularität liegt darin, dass Bausteine alle eine ähnliche Struktur aufweisen und damit gegenseitig ausgetauscht werden können.
  • Erweiterbarkeit und Komposition: Es ist relativ einfach, eine bestehende Bibliothek von Funktionsblöcken um neue Funktionen zu erweitern, da die Schnittstellen klar spezifiziert sind. Außerdem ist es möglich, neue Funktionsblöcke aus einer Gruppe vorhandener Funktionsblöcke zu bilden (Komposition).
  • Wiederverwendbarkeit: Funktionen, die einmal als Funktionsblock definiert wurden, können beliebig oft wiederverwendet werden. Da die Bausteine schon beim ersten Entwurf getestet wurden, ist es somit möglich, einen erheblichen Teil der Entwicklungszeit einzusparen. Ist es für eine neue Anwendung erforderlich, die Funktionalität eines Funktionsblocks abzuwandeln, so kann dies oft durch zusätzliche Parameter geschehen, so dass nicht jedes Mal ein neuer Funktionsblock entwickelt werden muss.

Weitere Themen auf dieser Seite:
  1. Aufbau von Funktionsblöcken
  2. Ausführung von Funktionsblöcken
  3. Funktionsblockbibliothek
  4. Arbeiten mit Funktionsblöcken

1. Aufbau von Funktionsblöcken

Hauptfenster von EasyLab
Funktionsblock-Symbol
Funktionsblöcke bestehen unter Anderem aus den folgenden Komponenten und Eigenschaften:
  • Eingangskonnektoren (Eingänge) liefern Daten aus dem umgebenden Programm an den Funktionsblock.
  • Der einem Funktionsblock zugeordnete Algorithmus bestimmt, wie aus den Eingabedaten die Ausgabedaten berechnet werden.
  • Zustandsvariablen speichern den aktuellen Zustand eines Funktionsblocks, so dass dieser bei der Berechnung mit einbezogen werden kann.
  • Ausgangskonnektoren (Ausgänge) geben das Ergebnis der Berechnung zurück an das umgebende Programm.
  • Zur einfachen Identifikation ist jedem Funktionsblock ein eindeutiges Symbol zugeordnet.

» Weitere Informationen zum Aufbau von Funktionsblöcken...

2. Ausführung von Funktionsblöcken

Die Ausführung von Funktionsblöcken innerhalb eines Programms erfordert zunächst die Berechnung eines Ausführungsplans. Dies wird von EasyLab implizit durchgeführt, sobald Funktionsblöcke hinzugefügt, entfernt oder verbunden werden. Der Ausführungsplan gibt an, in welcher Reihenfolge die Funktionsblöcke ausgeführt werden müssen, damit jedem Funktionsblock jeweils die von ihm benötigten Werte vorliegen. Weitere Informationen dazu finden sich in der Beschreibung der Datenflusssprache.

Die Ausführung eines einzelnen Funktionsblocks erfolgt stets wie folgt:
  1. Betreten: Beim ersten Betreten eines Unterprogramms wird auf jedem Funktionsblock zunächst die Funktion start() aufgerufen. Dies gibt dem Funktionsblock die Gelegenheit, Vorbereitungen für seine Ausführung zu treffen. So können beispielsweise interne Variablen initialisiert oder Kanäle für die Kommunikation hardwareseitig reserviert werden.
  2. Zyklisch ausführen: So lange ein Unterprogramm aktiv bleibt, werden die darin befindlichen Funktionsblöcke periodisch ausgeführt. Dies erfolgt in den folgenden Schritten:
    1. Lesen: Zunächst werden alle Werte von den Eingängen gelesen und dem Algorithmus des Funktionsblocks zur Verfügung gestellt. Ist an einen Eingang keine Kante angeschlossen, so wird stattdessen der Vorgabewert des Eingangs zurückgegeben.
    2. Berechnen: Danach wird der Algorithmus des Funktionsblock aufgerufen, indem die Funktion step() ausgeführt wird. Der Algorithmus berechnet neue Werte für die Zustandsvariablen und liefert Werte für die Ausgänge zurück (sofern jeweils vorhanden).
    3. Schreiben: Schließlich werden die berechneten Werte auf die Ausgänge des Funktionsblocks geschrieben, von wo aus sie anderen Funktionsblöcken, die mit den entsprechenden Ausgängen verbunden sind, zur Verfügung stehen.
  3. Verlassen: Ist die Ausführung eines Unterprogramms beendet (beispielsweise weil eine Übergangsbedingung im übergeordneten Ablaufprogramm wahr wurde), so wird abschließend auf jedem Funktionsblock die Funktion stop() aufgerufen. Dies gibt den Funktionsblöcken die Gelegenheit, belegte Ressourcen wieder freizugeben. Wird das Unterprogramm nicht verlassen, so erfolgt eine erneute periodische Ausführung der Funktionblöcke beginnend bei "1. Lesen".

3. Funktionsblockbibliothek

In EasyLab sind die verfügbaren Funktionsblöcke in einer Bibliothek angeordnet. Die Funktionsblöcke sind nach ihrer Funktion in verschiedene Kategorien eingeteilt, um den Überblick zu erleichtern. Außerdem ist es möglich, Funktionsblöcke nach Namen oder Stichwörtern zu suchen.

Typ, Variante und Instanz

Beim Arbeiten mit Funktionsblöcken muss zwischen drei Begriffen unterschieden werden:
  • Funktionsblocktypen sind Arten von Funktionsblöcken wie z.B. Addition, Konstante, PID-Regler oder Digitaler Eingang. Jeder Funktionsblocktyp definiert die unter "Aufbau von Funktionsblöcken" beschriebenen Eigenschaften. Jedoch sind Funktionsblocktypen in der Regel für den Benutzer nicht sichtbar.
  • Funktionsblockvarianten sind von Funktionsblocktypen abgeleitete Beschreibungen, die in der Funktionsblockbibliothek auftauchen. Jedes Element in der Funktionsblockbibliothek abgesehen von den Kategorien ist eine Variante eines bestimmten Funktionsblocktypen. Varianten können zusätzliche Eigenschaften angeben, z.B.
    • Vorgabewerte für Eingänge und Zustandsvariablen
    • Eigene visuelle Darstellungsmerkmale
  • Funktionsblockinstanzen sind Funktionsblockvarianten, die in einem Programm verwendet werden. Obwohl jede Variante nur einmal existiert, können von einer Variante oftmals mehrere Instanzen gleichzeitig in einem Programm verwendet werden. So ist es beispielsweise möglich, mehrere Funktionsblöcke zur Addition in einem Programm zu verwenden. Beim Instanziieren eines Funktionsblocks wird die jeweilige Variante als Vorlage verwendet, d.h. die Eingänge und Zustandsvariablen werden mit den entsprechenden Werten initialisiert.

Eindeutiger Name

Funktionsblock-Instanzen besitzen zusätzlich zu den von ihrem Typ oder ihrer Variante geerbten Eigenschaften noch einen innerhalb des jeweiligen Unterprogramms eindeutigen Namen. Damit können Funktionsblöcke referenziert werden. Standardmäßig entspricht der Name eines Funktionsblocks dem Namen seiner Variante sowie einer laufenden Nummer, z.B. "Addition (1)".

4. Arbeiten mit Funktionsblöcken

Hinzufügen von Funktionsblöcken


Funktionsblöcke finden
Für viele Funktionen sind bereits Funktionsblöcke vordefiniert. Um den richtigen Funktionsblock zu finden, stehen folgende Funktionen bereit:
  • Funktionsblöcke sind in der Funktionsblockbibliothek in verschiedene Kategorien eingeteilt, z.B. "Konstanten", "Mathematik" und "Regelungstechnik". Durch Öffnen der entsprechenden Kategorie werden die zugeordneten Funktionsblockvarianten und Unterkategorien sichtbar.
  • Das Feld "Suchen" über der Funktionsblockbibliothek ermöglicht es, alle Funktionsblöcke herauszufiltern, die nicht den gewünschten Suchkriterien entsprechen. Die Suche bezieht sich dabei nicht nur auf den Namen des Funktionsblockvariante, sondern auch auf Schlüsselwörter, die jedem Funktionsblock zugeordnet sind. Der Addition sind beispielsweise die Schlüsselwörter "Plus" und "+" zugeordnet.

Funktionsblöcke einfügen
Das Hinzufügen von Funktionsblöcken zu einem Programm geschieht durch Drag & Drop (Klicken und Ziehen). Dabei wird der hinzuzufügende Funktionsblock mit der ersten (meist linken) Maustaste angeklickt und der Mauscursor bei gedrückter Maustaste über dem Programm platziert. Danach wird die erste Maustaste losgelassen.

Eigene Funktionsblöcke definieren
EasyLab ermöglicht auch die Definition eigener Funktionsblöcke. Dies ist jedoch ein fortgeschrittenes Thema und erfordert detaillierte Kenntnisse über die Schnittstellen von EasyLab. Weiteren Informationen zu diesem Thema sind in der Entwickler-Dokumentation zur Funktionsblockbibliothek zu finden.

Funktionsblöcke verbinden


Die meisten Funktionsblöcke bilden von sich aus noch keine sinnvolle Berechnung. Vielmehr ist es nötig, diese mit anderen Funktionsblöcken zu verbinden. Dies geschieht durch die Verbindung von Ein- und Ausgängen mittels Kanten.

Welche Voraussetzungen müssen erfüllt sein?
Nicht alle Eingänge und Ausgänge können miteinander verbunden werden. Dies liegt daran, dass jedem Eingang und Ausgang ein Datentyp zugeordnet ist (z.B. Zahl, Wahrheitswert, Text). Es können nur solche Konnektoren miteinander verbunden werden, deren Typen identisch sind oder automatisch umgewandelt (konvertiert) werden können. Beispielsweise kann ein Ausgang vom Typ Zahl nicht direkt mit einem Eingang vom Typ Wahrheitswert verbunden werden. Jedoch ist es möglich, einen zusätzlichen Funktionsblock hinzuzufügen (z.B. "Größer als"), der einen Eingang vom Typ Zahl hat und dessen Ergebnis ein Wahrheitswert ist.
Während des Ziehens einer Kante leuchten die Konnektoren in verschiedenen Farben auf:
  • Konnektoren mit identischen oder kompatiblen Datentypen leuchten grün.
  • Konnektoren mit unpassenden Datentypen leuchten rot.

Wie kann ich einen Eingang und einen Ausgang direkt verbinden?
Um zwei Funktionsblöcke direkt miteinander zu verbinden, klickt man zunächst auf den Ausgang eines Funktionsblocks und danach auf den Eingang, mit dem der Ausgang verbunden werden soll. Dies kann ein Eingang eines anderen oder des selben Funktionsblocks sein, d.h. Rückkopplungen sind ebenfalls erlaubt. Um das Ziehen einer Kante abzubrechen, drücken Sie die Taste Esc.
Eingang und Ausgang direkt verbinden

Es ist ebenfalls möglich, Eckpunkte für Kanten zu definieren:
  • Klicken Sie während dem Ziehen einer Kante (bevor Sie den Ziel-Konnektor anklicken) an eine beliebige freie Stelle im Programm, um einen zusätzlichen Eckpunkt zu erstellen.
    Eckpunkte beim Ziehen einer Kante hinzufügen

  • Klicken Sie doppelt auf eine bestehende Kante, um an dieser Stelle einen zusätzlichen Eckpunkt einzufügen. Sie können den Eckpunkt danach per Drag & Drop (Klicken und Ziehen) verschieben.
    Eckpunkt nachträglich einfügen

Kann ein Ausgang mit mehreren Eingängen verbunden werden?
Ein Ausgang kann mit beliebig vielen Eingängen verbunden werden, was bedeutet, dass der am Ausgang gelieferte Wert an alle angeschlossenen Eingänge weitergegeben wird. Anstatt für jede Verbindung eine eigene Kante zu ziehen, können Sie an einem Eckpunkt einer Kante eine Abzweigung hinzufügen:
  • Klicken Sie auf einen beliebigen Eckpunkt einer Kante, um von dort aus eine Abzweigung hinzuzufügen. Klicken Sie danach auf den Ziel-Konnektor, mit dem Sie die neue Kante verbinden wollen. Sie können ebenfalls auf der Abweigung neue Eckpunkte hinzufügen, indem Sie bevor Sie den Ziel-Konnektor anklicken an eine beliebige freie Stelle im Programm klicken.
    Abzweigung hinzufügen

Kann ein Eingang mit mehreren Ausgängen verbunden werden?
Es ist nicht möglich, einen Eingang mit mehreren Ausgängen zu verbinden, da dann nicht klar wäre, welcher Wert am Eingang verwendet werden soll.

Können Eingänge bzw. Ausgänge mit anderen Eingängen bzw. Ausgängen verbunden werden?
Der Datenfluss muss immer von einem Ausgang zu einem Eingang erfolgen. Daher sind direkte Verbindungen von Eingängen mit Eingängen oder von Ausgängen mit Ausgängen nicht möglich. Mehrere Eingänge können jedoch mit einem gemeinsamen Ausgang verbunden werden, siehe oben.

Wie kann ich eine Verbindung mit einem bereits verbundenen Eingang herstellen?
Da immer eindeutig bestimmt sein muss, welcher Wert an einem Eingang anliegt, ist es nicht möglich, eine Kante an einen bereits verbundenen Eingang anzuschließen. Wenn Sie die entsprechende Kante statt der bestehenden Kante anschließen wollen, entfernen Sie zunächst die aktuell verbundene Kante (siehe unten) und schließen danach die gewünschte Kante an.

Müssen alle Eingänge verbunden sein?
Da jeder Eingang einen Vorgabewert besitzt, müssen *nicht* alle Eingänge verbunden sein. Jeder nicht verbundene Eingang eines Funktionsblocks liefert bei jeder Ausführung des Funktionsblocks den Vorgabewert zurück. Standardmäßig werden im Datenflussprogramm die jeweiligen Vorgabewerte neben den Eingangskonnektoren angezeigt:
Vorgabewert eines Eingangs
Meist sind die Vorgabewerte so gewählt, dass sie "neutral" für die entsprechende Berechnung sind. So tragen alle Eingänge des Funktionsblocks "Addition" als Vorgabe den Wert Null.

Wie kann ich eine Verbindung lösen?
Hierfür gibt es mehrere Möglichkeiten:
  • Markieren Sie das zu entfernende Teilstück der Kante, indem Sie darauf klicken. Drücken Sie danach die Taste Entf (auf englischsprachigen Tastaturen: Del).
  • Klicken Sie mit der zweiten (meist rechten) Maustaste auf die Kante und wählen Sie "Löschen".

Funktionsblöcke konfigurieren


Die Konfiguration von Funktionsblöcken erfolgt mit dem Eigenschaften-Dialog.