====== Funkční blok ====== 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. ==== Deklarace funkčního bloku ==== FUNCTION_BLOCK jmeno ... END_FUNCTION_BLOCK ==== Deklarace proměnných ==== 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 ==== Výkonná část funkčního bloku následuje za částí deklarační a obsahuje příkazy a instrukce. ==== Volání funkčního bloku ==== 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 {{:cs:mervis-ide:35-help:funb1.png}} {{:cs:mervis-ide:35-help:funb2.png}} 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. {{:cs:mervis-ide:35-help:namespaces.png}} ==== Ruční režim ==== 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.