Funkce je POU, která si neukládá svůj stav (tj. pokud je volána se stejnými vstupními parametry, musí produkovat stejný výsledek). Funkce může vracet pouze jeden výsledek, ale ten může být různého typu. Funkce nevracející výsledek by neměla být volána ve výrazu. Norma definuje standardní funkce a uživatelem definované funkce. Standardní funkce jsou např. ADD pro sčítání, ABS pro absolutní hodnotu, SQRT pro odmocninu, SIN pro sinus. Jakmile jsou jednou definovány nové uživatelské funkce, mohou být používány opakovaně.
Pozor: Parametry funkcí (např. u funkce MUL násobení vstupu konstantou) jsou v kódu vedeny jako konstanty, za běhu programu je nelze měnit. Mohou být změněny pouze úpravou zdrojového kódu a přehráním programu. Pokud budeme chtít měnit parametry funkcí, musíme je „vytáhnout“ na vstupy a připojit ke globálním proměnným.
Funkce se skládá ze dvou základních částí: deklarační a výkonné. V deklarační části POU se definují proměnné potřebné pro činnost POU. Výkonná část pak obsahuje vlastní příkazy pro realizaci požadovaného algoritmu.
FUNCTION jmeno: datový typ ... END_FUNCTION //datový typ je nepovinný pro funkci, která nevrací hodnotu
Deklarační část funkce obsahuje definice proměnných potřebných pro svoji činnost. Proměnné jsou používány pro ukládání a zpracování informací. Každá proměnná je definována jménem proměnné a datovým typem. Datový typ určuje velikost proměnné v paměti a zároveň do značné míry určuje způsob zpracování proměnné. Pro definice proměnných jsou k dispozici standardní datové typy (BOOL, BYTE, INT, …). Použití těchto typů závisí na tom, jaká informace bude v proměnné uložena (např. typ BOOL pro informace typu ano/ne, typ INT pro uložení celých čísel se znaménkem apod.). Uživatel má také možnost definovat svoje vlastní datové typy. Umístění proměnných v paměti PLC systému zajišťuje automaticky programovací prostředí. Pokud je to potřeba, může umístění proměnné v paměti definovat i uživatel.
Vstupní proměnné
VAR_INPUT ... END_VAR
Výstupní proměnné
VAR_OUTPUT ... END_VAR
Vstupně/výstupní proměnné
VAR_IN_OUT ... END_VAR
Lokální proměnné
VAR ... END_VAR
Externí proměnné
VAR_EXTERNAL ... END_VAR
Inicializace proměnných
VAR I: INT := 1; END_VAR;
Výkonná část funkce následuje za částí deklarační a obsahuje příkazy a instrukce. Ve výjimečných případech nemusí definice funkce obsahovat žádnou deklarační část a potom je výkonná část uvedena bezprostředně za definicí začátku funkce. Příkladem může být funkce, která pracuje pouze s globálními proměnnými, což sice není z hlediska architektury programu ideální řešení, ale technicky může existovat. Výkonná část funkce může obsahovat volání dalších funkcí. Při volání mohou být předávány parametry pro volané funkce resp. funkční bloky.
MY_FUNC := Value; //výsledek funkce
Formální, kompletní
A := MY_FUNC( First_Index := 1, Last_Index := 5 );
Neformální
A := MY_FUNC( 1, 5);
Příklad funkce (MY_FUNC):
VAR_GLOBAL //externí interface Data_Array: ARRAY[0..100] OF INT; END_VAR FUNCTION MY_FUNC: INT //název funkce "MY_FUNC", vraci výsledek typu INT VAR_INPUT //vstupní proměnné First_Index, Last_Index: INT; END_VAR VAR_EXTERNAL //externí proměnné Data_Array: ARRAY [0..100] OF INT; END_VAR VAR //lokální proměnné Sum, I: INT; END_VAR (* Tělo Funkce *) Sum := 0; FOR I:= First_Index TO Last_Index DO Sum := Sum + Data_Array[I]; END_FOR; MY_FUNC := Sum; //výsledek funkce END_FUNCTION
Vložená vlastní funkce do programu vytvořeném ve FUPLE.
Vstupní proměnná en slouží pro řetězení a blokování následných výpočtů. Proměnná „eno“ kopíruje stav vstupní proměnné „en“.