Článek ve formátu PDF je možné stáhnout
zde.
Nejprve se vrátíme k textu z předchozího pokračování seriálu a doplníme k němu několik poznámek. Pak budeme pokračovat s příklady intuitivního postupu řešení sekvenčních a časových logických funkcí. Opět předpokládáme použití barevných tlačítek a signálek na kompaktním výukovém systému kostka Foxee.
Poznámka 1: každá varianta řešení do samostatného programu
Na obr. 1 a obr. 2 (a dalších) v předchozí části třetího dílu seriálu (Automa, 2019, č. 7, str. 12 až 16) jsou souhrnně uváděny alternativní možnosti řešení zadaných příkladů. V každém řešení se vyskytují shodná jména odpovídajících vstupních a výstupních proměnných. Z jejich umístění na společném obrázku ovšem nevyplývá, že mohou být zapsána ve společném programu a následně společně přeložena a aktivována – jednotlivá řešení by nastavovala stejnojmenné výstupní proměnné a uplatnil by se jen výsledek posledního řešení. Při realizaci musí být každé řešení odděleně zapsáno jako samostatný program, takto odděleně přeloženo a aktivováno. Na obr. 3 je uveden příklad programu v jazyce ST, který paměťovou funkci (zadání příkladu 1) řeší s použitím funkčních bloků RS a SR. Abychom se vyhnuli popsané kolizi výstupních proměnných, je výstup druhé paměťové funkce SR přesměrován na proměnnou s_zluta.
Poznámka 2: funkce a funkční bloky
Norma IEC 61131-3 připouští tři typy objektů, ve kterých může být zapsán kód programu – nazývají se programové organizační jednotky (POU, Program Organization Unit). Na nejvyšší úrovni je program, ve kterém se mohou používat funkce a funkční bloky (např. obr. 3). Funkce nastavuje jedinou výstupní proměnnou a nepoužívá paměti vnitřních proměnných. Hodnota výstupní proměnné je jednoznačně určena okamžitými hodnotami vstupních proměnných. Při použití je uložena v jediném exempláři a pro získání výstupní hodnoty ji stačí jen zavolat, podobně jako při volání podprogram v jiných jazycích. Lze si ji představit jako univerzální šablonu. Typickým příkladem jsou funkce, které řeší kombinační logické úlohy nebo jednoduché výpočetní operace.
Obr. 13. K příkladu 5: čtyřstupňový binární čítač – rozložené řešení s funkčním blokem CTU
Naproti tomu funkční blok (zkráceně FB) nemusí nastavovat jen jedinou výstupní proměnnou. Používá vnitřní proměnné, jejichž obsah je dlouhodobě pamatován a při opakované aplikaci je jejich obsah z minulé aktivace využíván. Je obvyklé, že při opakované aktivaci se stejnými hodnotami vstupních proměnných předává FB odlišné hodnoty výstupních proměnných (např. hodnotu pamatované výstupní proměnné, údaj o počtu, čase apod.). Pro každé místo v programu, kde je FB aktivován, mají jeho vnitřní proměnné individuální obsah. Proto funkční bloky existují ve dvou formách – definice a instance. Definice FB je obecná matrice, která obsahuje program řešící algoritmus FB, tedy předpis, jak se má FB chovat. Její proměnné (vstupní, výstupní a vnitřní) zde mají univerzální pracovní pojmenování. Pro stejný FB existuje jediná definice, uložená v knihovním souboru. Norma IEC 61131-3 obsahuje definice standardních FB, které jsou součástí systémové knihovny. Patří sem FB pro paměťové funkce RS, SR, detekce náběžné (R_TRIG) a sestupné hrany (F_TRIG), čítače (CTU, CTD, CTUD) a časovače (TON, TOF a TP). Uživatel si dále může vytvářet své vlastní (uživatelské) FB. Od výrobce PLC nebo dodavatele vývojového systému lze získat soubory FB, obvykle specializované na určitý obor užití (knihovny FB orientované na danou skupinu problémů).
V místě každého použití FB se pak uloží jeho instance – vytvoří se individuálně pojmenovaná kopie deklarovaného FB s uvedením konkrétních jmen proměnných a hodnot parametrů. Každé instanci je přiřazeno unikátní jméno. Každý FB je tedy v paměti uložen jako unikátní exemplář deklarace a pak opakovaně jeho kopie instancí v místech použití. V jiných programovacích jazycích tomu odpovídá použití maker. Obrazně si lze deklaraci FB představit jako univerzální razítko s prázdným formulářem a instanci jako otisk razítka s individuálně vyplněnými údaji.
V grafických programovacích jazycích (např. na obr. 1 a obr. 2) jsou funkční bloky zobrazovány jako obdélníkové značky. Pod horním obrysem je uvedeno jméno FB z deklarace. Nad horním okrajem značky je uvedeno jméno konkrétní instance. Uvnitř u levého a pravého obrysu značky jsou uvedena jména vstupních a výstupních proměnných z deklarace. K nim jsou pak připojeny spoje od konkrétních vstupních a výstupních proměnných. V jazyce ST je použití FB (instance) řešeno v textové formě (např. obr. 3). Jméno instance FB je uvedeno v úvodním bloku deklarací spolu s deklaracemi proměnných. Jména vstupních a výstupních proměnných instance FB jsou uvedena uvnitř závorek za jménem instance. Program těla deklarace FB může být zapsán v jakémkoliv z jazyků. Na obr. 9 je (jako řešení 3)
uvedena deklarace uživatelského FB T_obvod v grafickém jazyce CFC a pak jeho instance v CFC a ST. Příklad s více instancemi FB je na obr. 12 (nahoře v CFC, pod ním ve ST).
Poznámka 3: chybovat je lidské
Je obvyklé, že v učebnicích a kurzech jsou uváděny bezchybně řešené příklady. V praxi se ale lze často setkat s programy, které jsou zatíženy chybami různého původu. Nejčastěji jsou to vlastní chyby. Jejich příčinou bývá nepozornost, nepřesně pochopené zadání nebo jeho nedůsledné provedení. Formální chyby způsobené nekompletním programem nebo nedodržením předepsané syntaxe obvykle odhalí překladač a upozorní na ně. Věcné chyby ale překladač nezachytí a je třeba je odhalit ve fázi testování programu – a následně je opravit. Fáze ladění programu je důležitá. V prostředí a klidu svého pracoviště můžeme program detailně analyzovat, bez velkého stresu odhalit případné chyby, opravit je a program znovu zkontrolovat. Po předání nedůsledně otestovaného programu do rutinního užívání se neodhalené chyby hledají podstatně obtížněji, v cizím (často nepohodlném až nepřívětivém) prostředí, v časovém stresu, s hrozbou penále, mnohdy s nepřívětivými otázkami typu „kdy už to bude?“ a jízlivými poznámkami netrpělivých uživatelů. Obvykle se to prodraží a utrpí pověst programátora a jeho firmy. Při ladění vlastního programu jsme ve výhodě, protože si (ještě nějaký čas) pamatujeme svůj tvůrčí záměr. Problémem ale může být autorská slepota, která nám brání vidět chyby a nedostatky vlastního programu. Kvalitněji program otestuje nezasvěcený pozorovatel. Komplikovanější je zorientovat se v cizím programu, analyzovat jeho zamýšlené řešení a odhalit příčinu jeho nesprávné funkce. Do této situace se dostáváme poměrně často, jestliže jsme nuceni zaskakovat za kolegu, opravovat nebo vylepšovat cizí program, doplňovat do něj nové funkce a řešit dodatečné požadavky zákazníka. I tyto dovednosti je třeba trénovat. Proto jsme příklady v minulém pokračování řešili jako ne zcela dokonalé a v zadání úloh vyzvali čtenáře, aby chyby a nedůsledné řešení odhalili. Odezvu čtenářů později otiskneme.
Poznámka 4: syntaxe ST versus sloupcová sazba
Některé fragmenty programů v textovém jazyce ST byly psány přímo v textu výkladu. V podkladech sice byly respektovány zásady syntaxe jazyka ST, které ale při zlomu textu do sloupcové sazby nebylo možné dodržet v případech, kdy řádky příkazů byly delší než šířka sloupce – v tomto případě byl text příkazu automaticky zlomen do dalšího řádku. Problém se projevuje zejména u řádkových komentářů, jejichž platnost je omezena jen do konce řádku příkazu. Při přepisu programu do vývojového systému je třeba tuto skutečnost respektovat a text přijímat s rezervou.
Příklad 5: binární čítač
Pro názornost předpokládejme, že barevné signálky jsou uspořádány zprava doleva v pořadí: modrá, zelená, žlutá a rudá. Signálku s_modra ovládejte tlačítkem tl_modre stejně jako v příkladu 3 – s každým stiskem změňte její stav na opačný. Signálku s_zelena ovládejte tak, že v okamžiku zhasnutí s_modra změníte stav s_zelena. Obdobně ovládejte s_zluta a s_ruda podle stavu předchozí signálky. Tlačítkem tl_rude všechny signálky zhasněte (reset). Zadání odpovídá funkci dopředného čtyřstupňového dvojkového čítače. Aktuální kombinaci signálek lze interpretovat jako dvojkové číslo. Vyjdeme-li ze stavu, kdy jsou všechny signálky zhasnuté, kombinace signálek vyjadřuje počet stisknutí tlačítka tl_modre ve dvojkové soustavě. Ze stavu, kdy svítí všechny signálky (číslo 1111 dvojkově = 15 desítkově = 0 F šestnáctkově), se stiskem tl_modre všechny signálky vynulují (ukazují hodnotu 0) a počítání pokračuje znovu – čítač pracuje v režimu modulo 16.
Řešení první: sestavení z binárních stupňů
V horní části obr. 13 je uveden postup řešení v jazyce CFC. Odpovídá tradičnímu postupu, který je obvykle uváděn v učebnicích navrhování pevné logiky. Šestnáctkový čítač je sestaven ze čtyř binárních stupňů – v tomto případě klopných obvodů typu T (uživatelského funkčního bloku T_obvod). Každý reaguje na sestupnou hranu výstupu předchozího (nižšího) stupně – na náběžnou hranu jeho negace. Negace je zobrazena kroužkem u vstupu FB. Řešení je zjednodušeno tak, že nereaguje na nulovací tlačítko tl_rude.
Řešení druhé: sestavení z binárních stupňů s nulovacím vstupem
Předchozí řešení je zobecněno tak, aby vyhovovalo zadání a výslednou hodnotu bylo možné nulovat (resetovat). Ve střední části obr. 13 je uveden program jádra nového funkčního bloku bin_st (binární stupeň), pod ním je jeho značka a pak výsledné řešení.
Ing. Ladislav Šmejkal, CSc., Teco a. s.,
Ing. Josef Kovář a Ing. Zuzana Prokopová,
učitelé automatizace na SPŠ Zlín