cz
en

Úvod, tvorba jednoduchého bloku

Program ve FUPLA, funkční bloky v ST

Nejčastější případ. Sestavu založíme v Zjednodušeném módu a v něm se snažíme pokračovat co nejdéle – přinejmenším do té chvíle, než máme definované všechny komunikační kanály, I/O moduly a proměnné a případně i terminály a další zařízení. Zjednodušený mód totiž automaticky nastavuje například Autogen, tedy automatické generování globálních proměnných na základě definovaných vstupů a výstupů, ale naproti tomu neumožňuje práci v jazyce ST. Jakmile se rozhodneme přepnout do Plného módu, není již cesty zpět. Musíme si tedy pak dát pozor na to, že u nově založených I/O proměnných je nutné ručně povolit Autogen a vybrat cílový projekt, v němž mají být globální proměnné, navázané na vstupy a výstupy, generovány.

Blok v jazyce ST umožňuje použít konstrukce, které jsou ve FUPLA komplikované až nemožné, například cykly. Začneme ale velmi jednoduchým blokem, na kterém si ukážeme, jak pracovat se vstupy a výstupy tak, aby výsledný blok co nejvíce připomínal FUPLA bloky ze standardních knihoven. Přepněme tedy projekt do Plného módu a jde se na to!

Jednoduchý blok „ax + b“

Tento výpočet by nebyl problém realizovat pomocí dvou funkcí ve FUPLA: add a mul. My ale půjdeme cestou ST:

  • V kontextovém menu projektu vybereme Přidat – Přidat funkční blok
  • Vyplníme název nového bloku, vybereme typ a jazyk
  • Otevře se editor těla funkčního bloku.

Připomeňme rozdíl mezi funkcí a funkčním blokem: Funkce vrací jedinou návratovou hodnotu a libovolný počet výstupních hodnot, zatímco funkční blok má jeden nebo více výstupů. (I funkce tedy může ovlivnit hodnoty více proměnných, viz příklad DECOMPOSEDATE níže.) Funkce je bezestavová: zpracuje vstupní hodnoty, poskytne je ve formě výsledku (tedy zapíše do nějaké proměnné) a „zmizí“. Naproti tomu funkční blok při vložení do programu vytvoří své vnitřní proměnné a ty si každá instance bloku pamatuje samostatně, a to během celého běhu programu. Funkční bloky si tedy mohou pamatovat hodnoty z minulých volání. Typickým příkladem funkčního bloku je čítač nebo PI regulátor. Funkce zabere oproti řešení stejné úlohy pomocí funkčního bloku méně místa v paměti. Všimněme si, že v IDE jsou v jazyce FUPLA funkce ohraničeny čárkovaně, zatímco funkční bloky plnou čarou. Programování v ST vypadá u funkce i funkčního bloku podobně, my si však programování v ST ukážeme na příkladu funkčního bloku.

Modře jsou zvýrazněna klíčová slova a zeleně komentáře. Jednořádkový komentář nebo komentář po kódu do konce řádku je uvozen dvěma lomítky:

month := m - 1; // 0=January, 1=February, etc.

// tento řádek je celý komentářem

zatímco jedno- či víceřádkový komentář je uvozen a ukončen kulatými závorkami s hvězdičkou:

(* tento
celý text
je komentářem *)

(* a toto je také komentář *)

V kódu jsou předdefinovaná klíčová slova, ohraničující deklarace vnitřních proměnných, vstupů a výstup funkčního bloku. Pro náš příklad budeme potřebovat dva vstupy a jeden výstup, žádné vnitřní proměnné nutné nebudou. Upravíme proto kód takto:

FUNCTION_BLOCK linear

    VAR_INPUT
        x, a, b: real;
    END_VAR
    VAR_OUTPUT
        y : real;
    END_VAR

    y := a * x + b;
END_FUNCTION_BLOCK

Funkční blok uložíme a zkompilujeme projekt. Ve vlastnostech funkčního bloku pak vidíme deklarované vstupy a výstupy, stejně jako je tomu u funkčních bloků z knihoven:

Tabulka vstupů a výstupů obsahuje automaticky založené proměnné en a eno. Ty slouží k zablokování vykonávání bloku a informaci o tom, zda blok je povolen. Běžně se nepoužívají a proto můžeme jejich viditelnost nastavit na False. Naopak atribut Zobrazit v průzkumníku je užitečné nastavit na True, protože pak je (po kompilaci) blok vidět v stromu FUPLA bloků a lze jej vložit do hlavního programu přetažením. Jinak bychom museli použít kontextové menu Přidat blok knihovny v programu nebo zkratku Ctrl-B a název bloku vyfiltrovat.

Vložený blok potom připojíme na proměnné a případně vstupy, které budou konstantní, zatáhneme dovnitř bloku:

Konstanty (přesněji řečeno parametry) a a b můžeme měnit i za chodu programu – právě díky tomu, že každý funkční blok představuje samostatnou instanci se svými proměnnými. V případě funkce by toto nebylo možné, konstanty bychom mohli měnit pouze ve zdrojovém kódu a navíc by byly stejné pro všechna volání této funkce. Nemohli bychom tedy mít různé „instance“ funkce s různými parametry.

Pak nezbývá než program nahrát do PLC a ověřit, že funkční blok pracuje správně:

Všimněme si, že ve spodní části bloku je štítek „Vývoj“. Tento stav bloku lze kdykoli změnit, změna se projeví po kompilaci. Používáme ho pro interní označení postupu vývoje nebo aktuálnosti.

Vývoj: blok je rozpracován, možná dojde k jeho dalším úpravám
Test: jsme přesvědčeni, že vývoj je dokončen, blok je ve stadiu testování
Vydání (čili Release): blok je otestován a určen k běžnému používání
Zastaralý: existuje nějaká novější verze bloku, v nových projektech by bylo dobré zastaralou verzi nepoužívat
Porušený: verze bloku odbočila z hlavní vývojové vetve, již na ní nebudou prováděny další opravy
Nepodporován: v bloku byla chyba, existuje novější verze a tato zastaralá je v knihovně pouze z důvodů kompatibility při kompilaci a nemá se používat.

Obvykle se pohybujeme mezi stavy Vývoj, Test a Vydání.

Pro srovnání se podívejme, jak by vypadala stejná funkcionalita rozepsaná pomocí standardních funkcí ve FUPLA:

Výpočet pomocí elementárních funkcí je na první pohled čitelnější a srozumitelnější, ale zabírá více místa a v případě opakovaných kalkulací se jedná o méně přehledné řešení, navíc obtížněji editovatelné. Ostatně výstup funkčního bloku bychom již nemuseli přivádět na globální proměnnou (Analog03), ale mohli bychom ho použít např. ve vizualizaci nebo BACnet serveru rovnou. V tom případě by ovšem bylo vhodné každou instanci funkčního bloku (zde „linear“) pojmenovat podle zpracovávané proměnné.

V režimu ladění můžeme sledovat vnitřní hodnoty proměnných v bloku po jeho rozkliknutí. Otevře se zdrojový kód a zobrazí se aktuální hodnoty pro příslušnou instanci. Chceme-li prohlížet hodnoty jiné instance bloku, vybereme ji v drop-down boxu v ribbonu s tlačítky:

Jak bylo uvedeno výše, každá instance funkčního bloku může mít jiné hodnoty parametrů – a ty se dají měnit i za běhu programu. Toto není u funkcí možné.

Pokud chceme, aby se parametry po změně okamžitě ukládaly do paměti NVRAM, deklarujeme je jako RETAIN. Celý kód bloku by pak vypadal takto:

FUNCTION_BLOCK linear

    VAR_INPUT
        x: real;
    END_VAR
    VAR_INPUT RETAIN
        a, b: real;
    END_VAR
    VAR_OUTPUT
        y : real;
    END_VAR

    y := a * x + b;
END_FUNCTION_BLOCK

Tolik tedy k základním vlastnostem funkčního bloku v ST.

V další části si ukážeme příklad detekce změny hodnoty na vstupu.

 Všechny díly