Funkční blok si - na rozdíl od funkce - může pamatovat některé hodnoty z předchozího volání (např. stavové informace). Ty pak mohou ovlivňovat výsledek. Hlavním rozdílem mezi funkcí a funkčním blokem je tedy schopnost funkčního bloku vlastnit paměť pro zapamatování hodnot některých proměnných. Tuto schopnost funkce nemají a jejich výsledek je tedy jednoznačně určen vstupními parametry při volání funkce. Funkční blok může také (na rozdíl od funkce) vracet více než jeden výsledek.
Na funkční bloky se můžeme dívat jako na "černé skříňky", které reprezentují řešení specializované řídicí funkce. Obsahují algoritmy i data, takže mohu zachovávat informaci o minulosti (tím se liší od funkcí). Mají jasně definované rozhraní a skryté vnitřní proměnné. Klasickými příklady funkčního bloku jsou například regulační smyčka pro řízení teploty nebo PID regulátor.
FUNCTION_BLOCK jmeno ... END_FUNCTION_BLOCK
Deklarační část funkčního bloku 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 funkčního bloku následuje za částí deklarační a obsahuje příkazy a instrukce.
Formální, kompletní
MY_FB( First_Index := 1, Last_Index := 5 );
Neformální
MY_FB( 1, 5);
Příklad funkčního bloku (DEBOUNCE):
FUNCTION_BLOCK DEBOUNCE
VAR_INPUT //vstupní proměnné
IN: BOOL;
DB_TIME: TIME:= t#10ms; //výchozí hodnota 10 ms
END_VAR
VAR_OUTPUT //výstupní proměnné
OUT: BOOL;
ET_OFF: TIME;
END_VAR
VAR //lokální proměnné
DB_ON, DB_OFF: TON;
DB_FF: SR;
END_VAR
(* Tělo Funkčního bloku *)
DB_ON (IN:= IN, PT:= DB_TIME);
DB_OFF (IN:= NOT IN, PT:= DB_TIME);
DB_FF (S1:= DB_ON.Q, R:= DB_OFF.Q);
OUT:= DB_FF.Q1;
ET_OFF:= DB_OFF.ET;
END_FUNCTION_BLOCK
Vložený vlastní funkční blok do programu vytvořeném ve FUPLE.
Pokud blok použitý v programu odkazuje na zdrojový kód, který je ve spustitelném nebo knihovním projektu, a není použit z již zkompilované knihovny, lze jeho editor otevřít dvojklikem na příslušný blok. Pokud se na instanci bloku klikne v průběhu ladění, otevře se jeho editor již s předvyplněnou instancí a není již nutno jméno dané konkrétní instance dohledávat a vybírat.
Pokud je blok založen v FBD, lze jej dvojklikem otevřít bez dalších úprav. Pokud je ale založen a veden ve strukturovaném textu, je potřeba mít vždy správně doplněné jmenné prostory do samotného kódu. Definice jmenných prostorů v kódu funkčního bloku musí odpovídat výsledné deklaraci funkčního bloku. Ta je k nalezení ve vlastnostech konkrétního funkčního bloku.
Proměnné en a eno slouží pro přepnutí funkčního bloku do ručního režimu. Nastavením vstupní proměnné en na hodnotu "False" přestane funkční blok provádět výpočetní algoritmus a do výstupních proměnných je možné zapisovat hodnoty bez ohledu na vstupní proměnné. Proměnná "eno" kopíruje stav vstupní proměnné "en" a slouží jako indikační automatického a ručního režimu.