Bestandteile eines Projekts
Ein Projekt beinhaltet alle Objekte eines Steuerungsprogramms. Ein Projekt wird in einer Datei mit dem Namen des Projekts gespeichert. Zu einem Projekt gehören folgende Objekte:
Bausteine, Datentypen, Ressourcen und Bibliotheken.
Baustein
Funktionen, Funktionsblöcke und Programme sind Bausteine, die durch Aktionen ergänzt werden können.
Jeder Baustein besteht aus einem Deklarationsteil und einem Rumpf. Der Rumpf ist in einer der IEC-Programmiersprachen AWL, ST, AS, FUP, KOP oder CFC geschrieben.
TwinCAT PLC Control unterstützt alle IEC-Standardbausteine. Wenn Sie diese Bausteine in Ihrem Projekt benutzen wollen, müssen Sie die Bibliothek standard.lib in Ihr Projekt einbinden.
Bausteine können andere Bausteine aufrufen. Rekursionen sind jedoch nicht erlaubt.
Funktion
Eine Funktion ist ein Baustein, der bei der Ausführung genau ein Datenelement (das auch mehrelementig sein kann, wie z.B. Felder oder Strukturen) liefert, und dessen Aufruf in textuellen Sprachen als ein Operator in Ausdrücken vorkommen kann.
Bei der Deklaration einer Funktion ist darauf zu achten, dass die Funktion einen Typ erhalten muss. D.h. nach dem Funktionsnamen muss ein Doppelpunkt gefolgt von einem Typ eingegeben werden.
Eine korrekte Funktionsdeklaration sieht z.B. so aus:
FUNCTION Fct: INT
Außerdem muss der Funktion ein Ergebnis zugewiesen werden. Der Funktionsname wird benutzt wie eine Ausgabevariable.
Beispiel in AWL für eine Funktion, die drei Eingangsvariablen nimmt, und als Ergebnis das Produkt der ersten beiden, dividiert durch die letzte zurückliefert:
Der Aufruf einer Funktion kann in ST als ein Operand in Ausdrücken vorkommen.
Funktionen verfügen über keine internen Zustände. D.h. Aufrufe einer Funktion mit denselben Argumenten (Eingabeparametern) liefern immer denselben Wert (Ausgabe).
![]() | Wird eine lokale Variable in einer Funktion als RETAIN deklariert, hat dies keine Auswirkung. Die Variable wird nicht im Retain-Bereich gespeichert. |
Beispiele für den Aufruf der oben beschriebenen Funktion:
in AWL:
LD 7
Fct 2,4
ST Ergebnis
in ST:
Ergebnis := Fct(7, 2, 4);
in FUP:
In AS kann ein Funktionsaufruf nur innerhalb eines Schrittes oder einer Transition erfolgen.
Wenn Sie in Ihrem Projekt eine Funktion mit Namen CheckBounds definieren, können Sie damit Bereichsüberschreitungen in Ihrem Projekt automatisch überprüfen! Der Name der Funktion ist festgelegt und darf nur diese Bezeichnung besitzen.
Das folgende Beispielprogramm zum Testen der CheckBounds-Funktion greift außerhalb der Grenzen eines definierten Arrays zu. Die Funktion CheckBounds gewährleistet, dass der Wert TRUE nicht an die Stelle A[10], sondern an der oberen noch gültigen Bereichsgrenze A[7] zugewiesen wird. Mit der CheckBounds-Funktion können somit Zugriffe außerhalb von Array-Grenzen korrigiert werden.
Wenn Sie in Ihrem Projekt Funktionen mit Namen CheckDivByte, CheckDivWord, CheckDivDWord und CheckDivReal definieren, können Sie damit bei Verwendung des Operators DIV den Wert des Divisors überprüfen, beispielsweise um eine Division durch 0 zu verhindern. Der Name der Funktion ist festgelegt und darf nur diese Bezeichnung besitzen.
Wenn Sie die Funktionen CheckRangeSigned und CheckRangeUnsigned definieren, können Sie damit im online-Betrieb automatisch Bereichsüberschreitungen bei Variablen, die mit Unterbereichstypen deklariert sind, abfangen.
Die genannten Funktionsnamen sind aufgrund der hier beschriebenen Einsatzmöglichkeit reserviert.
Funktionsblock
Ein Funktionsblock ist ein Baustein, der bei der Ausführung einen oder mehrere Werte liefert. Ein Funktionsblock liefert keinen Rückgabewert im Gegensatz zu einer Funktion. Es können Vervielfältigungen, genannt Instanzen (Kopien) eines Funktionsblocks geschaffen werden.
Beispiel in AWL für einen Funktionsblock mit zwei Eingabevariablen und zwei Ausgabevariablen. Eine Ausgabe ist das Produkt der beiden Eingaben, die andere ein Vergleich auf Gleichheit:

Instanzen von Funktionsblöcken
Es können Vervielfältigungen, genannt Instanzen (Kopien) eines Funktionsblocks geschaffen werden. Jede Instanz besitzt einen zugehörigen Bezeichner (den Instanznamen), und eine Datenstruktur, die ihre Eingaben, Ausgaben und internen Variablen beinhaltet. Instanzen werden, wie Variablen lokal oder global deklariert, indem als Typ eines Bezeichners der Name des Funktionsblocks angegeben wird.
Beispiel für eine Instanz mit Namen INSTANZ des Funktionsblocks FUB:
INSTANZ: FUB;
Aufrufe von Funktionsblöcken geschehen stets über die oben beschriebenen Instanzen.
Nur auf die Ein- und Ausgabeparameter kann von außerhalb einer Instanz eines Funktionsblocks zugegriffen werden, nicht auf dessen interne Variablen.
Beispiel für den Zugriff auf eine Eingabevariable: Der Funktionsblock fb hat eine Eingabevariable in1 vom Typ int.
PROGRAM prog
VAR
inst1:fb;
END_VAR
LD 17
ST inst1.in1
CAL inst1
END_PROGRAM
Die Deklarationsteile von Funktionsblöcken und Programmen können Instanzdeklarationen beinhalten. Instanzdeklarationen in Funktionen sind nicht zulässig.
Der Zugriff auf die Instanz eines Funktionsblocks ist auf den Baustein beschränkt, in dem sie instanziiert wurde, es sei denn, sie wurde global deklariert.
Der Instanzname einer Instanz eines Funktionsblocks kann als Eingabe einer Funktion oder eines Funktionsblocks benutzt werden.
![]() | Alle Werte bleiben von einer Ausführung des Funktionsblocks bis zur nächsten erhalten. Daher liefern Aufrufe eines Funktionsblocks mit denselben Argumenten nicht immer dieselben Ausgabewerte! |
![]() | Enthält der Funktionsblock mindestens eine Retain-Variable, wird die gesamte Instanz im Retainbereich gespeichert. |
Aufruf eines Funktionsblocks
Man kann die Eingabe- und Ausgabevariablen eines Funktionsblocks von einem anderen Baustein aus ansprechen, indem man eine Instanz des Funktionsblocks anlegt und über folgende Syntax die gewünschte Variable angibt:
<Instanzname>.<Variablenname>
Wenn man die Eingabeparameter, also Werte der Inputvariablen, beim Aufruf setzen will, dann geschieht das bei den Textsprachen AWL und ST, indem man nach dem Instanznamen des Funktionsblocks in Klammer den Parametern Werte zuweist (die Zuweisung geschieht durch ":=" wie bei der Initialisierung von Variablen an der Deklarationsstelle).
Beachten Sie, dass Ein/Ausgabevariablen (VAR_IN_OUT) eines Funktionsblocks als Pointer übergeben werden. Ihnen können deshalb beim Aufruf keine Konstanten zugewiesen werden und es kann nicht lesend oder schreibend von außen auf sie zugegriffen werden. Beispiel für den Aufruf einer VAR_IN_OUT Variable inout1 des Funktionsblocks fubo in einem ST-Baustein:
VAR
inst:fubo;
var1:int;
END_VAR
var1:=2;
inst(inout1:=var1);
Nicht zulässig wäre: inst(inout1:=2); bzw. inst.inout1:=2;
Beispiele für den Aufruf des oben beschriebenen Funktionsblocks FUB. Das Multiplikationsergebnis wird in der Variablen ERG abgelegt, das Ergebnis des Vergleichs wird in QUAD gespeichert. Es sei eine Instanz von FUB mit dem Namen INSTANZ deklariert.
In AWL wird die Instanz eines Funktionsblocks wie folgt aufgerufen:
Im Beispiel unten ist der Aufruf in ST abgebildet, wobei der Deklarationsteil gleich ist wie bei AWL:
In FUP würde es wie folgt aussehen (Deklarationsteil ebenfalls wie bei AWL):
In AS können Aufrufe von Funktionsblöcken nur in Schritten vorkommen.
Programm
Ein Programm ist ein Baustein, der bei der Ausführung einen oder mehrere Werte liefert. Programme sind global im gesamten Projekt bekannt. Alle Werte bleiben von einer Ausführung des Programms bis zur nächsten erhalten.
Programme können von Programmen und Funktionsblöcken aufgerufen werden. Ein Programmaufruf in einer Funktion ist nicht erlaubt. Es gibt auch keine Instanzen von Programmen.
Wenn ein Baustein ein Programm aufruft, und es werden dabei Werte des Programms verändert, dann bleiben diese Veränderungen beim nächsten Aufruf des Programms erhalten, auch wenn das Programm von einem anderen Baustein aus aufgerufen wird.
Dies ist anders als beim Aufruf eines Funktionsblocks. Dort werden nur die Werte in der jeweiligen Instanz eines Funktionsblocks geändert. Diese Veränderungen spielen also auch nur eine Rolle, wenn dieselbe Instanz aufgerufen wird.
Beispiele für Aufrufe des oben beschriebenen Programms:
In AWL:
CAL PRGbeispiel
LD PRGbeispiel.PAR
ST ERG
In ST:
PRGbeispiel;
Erg := PRGbeispiel.PAR;
In FUP:

Wenn von einem Hauptprogramm aus zunächst die Variable PAR des Programms PRGbeispiel mit 0 initialisiert wird, und dann nacheinander Programme mit den obigen Programmaufrufen aufgerufen werden, dann wird das Ergebnis Erg in den Programmen die Werte 1,2 und 3 haben. Wenn man die Reihenfolge der Aufrufe vertauscht, ändern sich dementsprechend auch die Werte der jeweiligen Ergebnisparameter.
Aktion
Zu Funktionsblöcken und Programmen können Aktionen definiert werden. Die Aktion stellt eine weitere Implementation dar, die durchaus in einer anderen Sprache als die 'normale' Implementation erstellt werden kann. Jede Aktion erhält einen Namen.
Eine Aktion arbeitet mit den Daten des Funktionsblocks bzw. Programmes, zu dem sie gehört. Die Aktion verwendet die gleichen Ein-/ Ausgabevariablen und lokalen Variablen, wie die 'normale' Implementation.

In diesem Beispiel wird bei Aufruf des Funktionsblocks Counter die Ausgabevariable out erhöht bzw. erniedrigt in Abhängigkeit der Eingabevariablen in. Bei Aufruf der Aktion Reset des Funktionsblocks wird die Ausgabevariable out auf Null gesetzt. Es wird in beiden Fällen die gleiche Variable out beschrieben.
Eine Aktion wird aufgerufen mit <Programmname>.<Aktionsname> bzw. <Instanzname>.<Aktionsname>. Soll die Aktion innerhalb des eigenen Bausteins aufgerufen werden, so verwendet man in den Texteditoren nur den Aktionsnamen und in den grafischen den Funktionsblockaufruf ohne Instanzangabe.
Beispiele für Aufrufe der obigen Aktion:
Deklaration für alle Beispiele:
PROGRAM PLC_PRG
VAR
Inst : Counter;
END_VAR
In AWL:
CAL Inst.Reset(In := FALSE)
LD Inst.out
ST ERG
In ST:
Inst.Reset(In := FALSE);
Erg := Inst.out;
In FUP:

Bei Bausteinen in Ablaufsprache spielen Aktionen eine besondere Rolle, siehe hierzu Kapitel Ablaufsprache.
Die IEC-Norm kennt keine Aktionen, außer die der Ablaufsprache.
Ressourcen
Die Ressourcen werden zum Konfigurieren und Organisieren Ihres Projektes und zur Verfolgung von Variablenwerten benötigt:
- Globale Variablen, die im ganzen Projekt verwendet werden können
- Steuerungskonfiguration zum Konfigurieren Ihrer Hardware
- Taskkonfiguration zur Steuerung Ihres Programms über Tasks
- Traceaufzeichnung zur grafischen Aufzeichnung von Variablenwerten
- Watch- und Rezepturverwalter zum Anzeigen und Vorbelegen von Variablenwerten
Siehe hierzu das Kapitel 'Die Ressourcen'.
Bibliotheken
Sie können in Ihr Projekt eine Reihe von Bibliotheken einbinden, deren Bausteine, Datentypen und globale Variablen Sie genauso benutzen können, wie selbstdefinierte. Die Bibliothek 'standard.lib' steht Ihnen standardmäßig zur Verfügung.
Siehe hierzu das Kapitel 'Bibliotheksverwaltung'.
Datentypen
Neben den Standarddatentypen können vom Benutzer eigene Datentypen definiert werden. Strukturen, Aufzählungstypen und Referenzen können angelegt werden.
Siehe hierzu 'Standard-' und 'definierte Datentypen' im Anhang.