Proměnné
Proměnné se používají pro identifikaci prvků, jejichž obsah se mění. Příkladem jsou vstupy/výstupy nebo přístup k paměti. Proměnná může být deklarována elementárním nebo odvozeným (uživatelským) datovým typem. Součástí její deklarace může být údaj o počáteční hodnotě. Každá deklarace programové organizační jednotky (programu, funkčního bloku nebo funkce) by měla v obsahovat nejméně jednu deklarační část, která definuje proměnné používané v rámci POU (Program Organisation Unit, tedy části kódu, jako je definice programu, funkce, procedury atd.).
Deklarace začíná klíčovým slovem VAR (pro vnitřní proměnné POU), nebo klíčovým slovem, které začíná VAR_:
- VAR_INPUT pro vstupní proměnné
- VAR_OUTPUT pro výstupní proměnné
- VAR_IN_OUT pro vstupně/výstupní proměnné
Deklarace končí klíčovým slovem END_VAR. Proměnné platí vždy pouze uvnitř té POU, v níž jsou deklarovány (jsou zde lokální), a nejsou přístupné pro ostatní POU. Výjimkou jsou proměnné pro předávání parametrů mezi POU a jejím okolím, a to vstupní proměnné, do kterých lze z vnějšku zapisovat (VAR_INPUT), výstupní proměnné (VAR_OUTPUT), které lze z vnějšku číst, a proměnné pro obousměrný přístup (VAR_IN_OUT).
Proměnné deklarované jako VAR mají vyhrazeno pevné místo v paměti a mají dlouhodobou platnost. Skončí-li aktivace POU, pamatují si poslední hodnotu, která je pak použita jako výchozí při opětovné aktivaci POU.
Existují ale i proměnné s všeobecnou (globální) platností VAR_GLOBAL. Jsou deklarovány vně POU (obvykle před programem) a jsou dostupné pro všechny POU v programu. Za klíčovým slovem VAR_GLOBAL může být ještě uveden kvalifikátor RETAIN (tedy VAR_GLOBAL RETAIN), který označuje zálohované proměnné, nebo CONSTANT pro označení konstantního obsahu proměnné, tedy pro deklaraci konstanty.
Příklad:
VAR_GLOBAL RETAIN GlobalniBit BOOL; GlobalniBajt BYTE := 10; END_VAR
V uvedeném příkladu jsou obě proměnné deklarovány jako globální a retain. Po zapnutí (horkém restartu) se obnovuje jejich poslední obsah, který měly těsně před vypnutím. Bitová (booleovská) paměť GlobalniBit není iniciována, zatímco proměnná GlobalniBajt je po prvním zapnutí a po studeném restartu nastavena na hodnotu 10.
Každá proměnná s flagem RETAIN je po každém komunikačním cyklu (v případě více tasků platí pro každý task) překopírována do RETAIN oblasti. Jde o speciální část paměť, která si uchovává obsah i při výpadku napájení. V případě warm-restartů (např. výpadek napájení) se před spuštěním výpočtu hodnoty RETAIN proměnných inicializují na hodnoty uložené v RETAIN oblasti. Pokud je PLC resetováno v módu cold-restartu, tak se i RETAIN proměnné inicializují na své základní hodnoty ze zdrojových kódů programu. RETAIN proměnné lze využít například na čítače provozních hodin a podobné veličiny, které je třeba zachovat při výpadku napájení nebo jiné manipulaci. U kombinací NON_RETAIN a RETAIN vnořených typů vždy platí nejvyšší flag. Uživatel tedy může přebít nastavení typů a u konkrétních proměnných nastavit RETAIN nebo NON_RETAIN. V takovém případě pak již nezáleží, jakým způsobem jsou nastaveny vnořené položky. Vše se stává RETAIN, popřípadě NON_RETAIN.
Pozn.: kromě proměnných a typů zavedených v uživatelském programu není doporučeno explicitně ošetřovat typy z knihoven. Pokud pro správnou (nebo domněle správnou) funkci je potřeba něco takového dělat, je lepší si ujasnit s autorem typu, jak je jeho používání myšleno, případně ho tím upozornit na chybu. Přemíra užívání RETAIN má vliv na výkon a využití prostředků a měla by být vždy pečlivě uvážena.
Podobnou vlastnost mohou mít proměnné deklarované jako VAR_EXTERNAL, které pocházejí z externího zdroje.
Příklad 2: