Für die vom Benutzer im Projekt bzw. einer Benutzerbibliothek erstellten Funktionsbausteine wird im kompilierten Programm ein Unterprogramm angelegt. Bei jedem Aufruf werden zunächst die Eingangsparameter der Klassen VAR_INPUT und VAR_IN_OUT übergeben. Dann erfolgt ein Sprung ins entsprechende Unterprogramm. Anschließend werden die Ausgangsparameter der Klassen VAR_OUTPUT und VAR_IN_OUT sowie das Funktionsergebnis wieder gelesen. Die zulässige Anzahl von Unterprogrammen bzw. Funktionen/Funktionsbausteinen, die der Anwender definieren kann, ist vom Steuerungstyp abhängig.
Für alle Aufrufe einer benutzerdefinierten Funktion wird nur ein Unterprogramm erzeugt, das von verschiedenen Stellen aufgerufen werden kann.
Zum besseren Vergleich des erzeugten Assembler-Codes werden im folgenden Beispiel FP-Adressen verwendet. Da das Programm bei Verwendung von FP-Adressen leicht unübersichtlich wird, empfiehlt es sich, Variablen mit sinnvollen Namen zu verwenden.
Aufruf der benutzerdefinierten Funktion User_ADD im Kontaktplan-Editor:
Sie hat folgenden Inhalt:
Assembler-Code für die Steuerung (Programmcode), Erläuterungen rechts
ST |
R9010 |
Schreiben der Eingangswerte |
|
F0 |
(*MV*) |
R9010 ist immer TRUE |
|
DT0 |
DT0 -> User_ADD.In1 |
||
DT550 |
|||
F0 |
(*MV*) |
||
DT1 |
DT1 -> User_ADD.In2 |
||
DT551 |
|||
CALL |
0 |
Aufruf des Unterprogramms User_ADD |
|
ST |
R9010 |
Ausgangswerte zurückladen |
|
F0 |
(*MV*) |
||
DT552 |
|||
DT2 |
User_ADD -> DT2 |
||
... |
|||
ED |
Ende des Hauptprogramms |
||
SUB |
0 |
Unterprogramm User_ADD |
|
ST |
R9010 |
||
F22 |
(*PLUS_S*) |
||
DT550 |
|||
DT551 |
|||
DT552 |
if (TRUE) |
||
UserAdd=UserAdd.In1 + UserAdd.In2 |
|||
RET |
Rücksprung zum Hauptprogramm |