Inspiromat pro výuku a Tecomat: Díl třetí: sekvenční logické úlohy, intuitivní postup

Od textu věnovaného řešení kombinačních logických úloh nyní seriál přechází k řešení logických úloh sekvenčního a časového charakteru. Pro kombinační logické funkce platí, že hodnota jejich výstupu je jednoznačně určena okamžitou kombinací hodnot jejich vstupů. Naproti tomu výstup sekvenční logické funkce závisejí na pořadí (sekvenci) hodnot, které postupně přicházely na jeho vstupy, popř. ještě na čase – výsledně na dosaženém vnitřním stavu. V praxi se lze nejčastěji setkat s logickými úlohami sekvenčního typu. Jejich řešení je ale podstatně náročnější než řešení kombinačních úloh. 

Dosavadní průběh seriálu – shrnutí

Seriál začínal v čísle 2-3/2018 úvodní a motivační částí. Pokračoval pasáží s příklady na využití programovatelných automatů (PLC) pro vyhodnocení analogových veličin (konkrétně měření teploty) a nespojité řízení tepelných soustav (od čísla 4/2018 do 7/2018). Cílem bylo nejenom ilustrovat skutečnost, že použití programovatelných automatů už zdaleka není omezeno jen na řešení úloh logického typu. V praxi jsou využívány k řešení snad všech typů úloh. Důležitým přínosem této části bylo grafické zobrazení časových průběhů teploty, které ilustruje dynamiku různě složitých tepelných soustav. Usnadňuje tak intuitivní pochopení dějů, které probíhají v různých typech spojitých dynamických soustav, a to bez znalosti náročné teorie. Intuitivní pochopení usnadňují i příklady soustav, které se chovají analogicky tepelným soustavám (hydraulické soustavy se spojenými nádobami a elektrické obvody s rezistory a kondenzátory). S intuitivním pochopením podstaty dynamických dějů a s využitím podobnosti různých soustav může absolvent např. usoudit, že „vytápěná místnost se chová podobně, jako když shora plníme nádrž vodou, která dolním otvorem odtéká“ nebo že rychlovarná konvice může posloužit jako poměrně výstižný model vytápěné místnosti.

Dále se seriál věnoval logice a proměnil se v kurz Logika (nejenom) pro programátory (od čísla 8-9/2018 do čísla 5/2019), věnovaný řešení kombinačních logických úloh programem. Výklad byl v jeho první části (v číslech 8-9/2018 a 10/2018) veden formou jednoduchých příkladů, řešených intuitivně bez předchozího výkladu potřebné teorie – podle výukové zásady „vhození do hluboké vody“, která patrně vyhovuje mentalitě většiny mládeže. Příklady byly zadány a řešeny pro kompaktní řídicí systém „kostka Foxee“, přesněji pro jeho čtveřici barevných tlačítek a čtveřici stejnobarevných signálek. Druhý díl (od čísla 11/2018 až do čísla 5/2019) obsahoval minimum z teorie výrokové logiky a metodiky navrhování kombinačních logických systémů, jejíž znalost je užitečná nejenom pro návrháře pevné logiky, ale i pro programátory jakýchkoliv systémů (PC, PLC a mikrořadičů).

Nyní se seriál bude věnovat řešení úloh sekvenční logiky a časových úloh. Nejprve (ve třetím dílu) to bude formou jednoduchých příkladů řešených intuitivně. Opět bude předpokládáno použití čtveřice tlačítek a signálek na kostce Foxee. Programy budou uváděny v jazycích ST a LD podle normy IEC EN 61131-3 a v grafickém jazyce CFC, který lze považovat za „nadstandard“ (je komfortnější a přehlednější obdobou grafického jazyka FBD). Dále se seriál bude věnovat systematickému návrhu sekvenčních logických systémů s využitím nástroje SFC (Sequential Functional Chart) podle normy IEC, přesněji podle jeho obecnější implementace ve vývojovém systému Mosaic, která je dokončována a připravována k testování. Studentům (čtenářům) poskytne velmi výkonný prostředek pro řešení úloh z praxe logického řízení a technické diagnostiky. 


Příklad 1: paměťová funkce

Stiskem tlačítka tl_rude se rozsvítí signálka s_ruda, která svítí, dokud ji nezhasne stisk tlačítka tl_zlute. 

Řešení první – zpětnovazební řešení paměti s přednostním mazáním

S využitím zpětné vazby lze úlohu řešit jediným příkazem v jazyce ST: 

s_ruda := (tl_rude OR s_ruda) AND NOT tl_zlute;

 

Obr. 1. Programy k příkladu 1 v jazyce LD

Řešení v grafických jazycích LD a CFC je uvedeno na obr. 1obr. 2. V reléové technice se takto tradičně řeší funkce „samodržného kontaktu“. Paměťový charakter je důsledkem zpětné vazby – logický výraz obsahuje stejnou proměnnou s_ruda na obou stranách „rovnítka“. Na rozdíl od algebraických rovnic to ale nepředstavuje problém k určení hodnoty „neznámé“ podle známých postupů. Proměnná s_ruda na obou stranách příkazu sice má shodné jméno (identifikátor), a tedy i umístění v paměti, ale liší se v časové posloupnosti: na pravé straně představuje stav proměnné před aktivací příkazu s hodnotou z minulého průběhu programu (mohla by se označit jako s_ruda_k1), zatímco v levé části příkazu má již hodnotu aktuálně vyčíslenou výrazem (bylo by možné ji označit jako s_ruda_k). Pravdivá hodnota proměnné tl_rude má za následek nastavení výstupní proměnné s_ruda na hodnotu 1 (zápis, set) paměti, zatímco pravdivost proměnné tl_zlute způsobí vynulování její hodnoty (smazání, reset). Při současném stisku obou tlačítek signálka s_ruda zhasne – jde o paměť s přednostním mazáním. Při uvolnění současného stisku bude signálka v náhodném stavu, podle toho, které z obou tlačítek bylo uvolněno dřív (pojem „současný stisk“ je v praxi téměř nedosažitelný, téměř vždy uvolníme jedno tlačítko dřív než druhé).

 

Řešení druhé – paměť s přednostním zápisem

Jestliže budeme tisknout jen jedno z tlačítek tl_zlutetl_rude, příkaz v ST bude rovnocenný příkazu z předchozího řešení, podobně jako programy v LD a CFC z obr. 1obr. 2

Obr. 2. Programy k příkladu 1 v jazyce CFC

s_ruda := (s_ruda AND NOT tl_zlute) OR tl_rude; 

Při současném stisku obou tlačítek ale signálka s_ruda zůstane svítit – jde o paměť s přednostním zápisem. Při uvolnění současného stisku bude opět signálka v náhodném stavu, podle toho, které z obou tlačítek bude uvolněno dřív.

 

Řešení třetí – s funkčním blokem SR (s přednostním zápisem)

Se zpětnými vazbami lze řešit podstatně složitější sekvenční funkce. Mluvíme o asynchronních logických systémech, pro jejichž návrh sice existuje zvláštní metodika, která je ale poměrně složitá. Asynchronní řešení je pracné, nepřehledné a skrývá v sobě riziko náhodného chování (hazardů). Proto se tato technika omezuje jen na řešení základních „stavebních kamenů“ – funkčních bloků, zkráceně FB. V pevné logice se obvykle hovoří o klopných obvodech. Norma IEC EN 61131-3 definuje základní (povinné) funkční bloky se standardními sekvenčními funkcemi. Dodavatelé PLC většinou nabízejí své soubory funkčních bloků, obvykle zaměřené na různé obory aplikací pro PLC (aplikační knihovny). Uživatelé mají možnost si vytvářet své uživatelské funkční bloky.

Paměťovou funkci s přednostním (dominantním) zápisem řeší funkční blok SR (Set-Reset). Jeho použití v jazycích LD a CFC je uvedeno na obr. 1obr. 2. Funkční blok se kreslí obdélníkovou značkou a jeho typ je uveden pod horním okrajem značky (zde SR). Jméno instance funkčního bloku (jeho pojmenování při konkrétním použití) je popsáno nad značkou (zde eSeR). Symbol S1 vlevo uvnitř značky označuje vstup s dominantní funkcí zápisu, R označuje vstup s funkcí mazání, Q1 označuje výstup funkčního bloku.

 

Řešení čtvrté – s funkčním blokem RS (s přednostním mazáním)

Paměťovou funkci s přednostním (dominantním) mazáním řeší funkční blok RS (Reset-Set). Jeho použití v jazycích LD a CFC je uvedeno na obr. 1obr. 2. Symbol R1 vlevo uvnitř značky označuje vstup s dominantní funkcí mazání, S označuje vstup s funkcí zápisu. Pro ilustraci použití obou funkčních bloků je na obr. 3 uveden krátký program v jazyce ST. Obsahuje deklarace proměnných i volání obou typů funkčních bloků.

Obr. 3. Program s voláním funkčního bloku SR a RS je ST (k řešení 3 a 4 příkladu 1)

 

Řešení páté – s oddělenými funkcemi SET a RES

Ne vždy je možné (nebo vhodné) aktivovat nastavení a nulování paměťové funkce současně z jednoho místa programu. Někdy je potřebné tyto operace provádět odděleně z různých míst programu, popř. některé provádět opakovaně. Pak je užitečné samostatně řešit funkce SET pro zápis (nastavení) paměťové funkce a funkce RES (Reset) pro její vynulování. V jazyce ST lze každou řešit jednoduchým příkazem: 

s_ruda := tl_rude OR s_ruda; // funkce SET

s_ruda := s_ruda AND NOT tl_zlute; // funkce RES, RESET 

Obr. 4. Vývojový diagram a pravdivostní tabulka funkce SET

Příkazy by bylo možné „zabalit“ do formy uživatelského funkčního bloku. Není nutné je v programu psát současně a v uvedeném pořadí. Mohou být zapisovány v různých místech programu, třeba i vícekrát. Všimněme si, že funkce SET má formu logického součtu OR. Lze ji využít k „příležitostnému přičtení“ logické hodnoty (např. mezivýsledku z logického výrazu složitější operace) k jiné cílové proměnné. Jestliže jsou příkazy zapsány v uvedeném pořadí, realizují paměťovou funkci s přednostním mazáním. Zápisem obou příkazů v opačném pořadí budeme realizovat paměť s přednostním zápisem – „poslední má pravdu“. V jazyce ST lze funkce SET a RES řešit i formou podmíněných příkazů (obr. 4obr. 5): 

IF tl_rude = true THEN s_ruda := 1; // funkce SET

IF tl_zlute = true THEN s_ruda := 0; // funkce RES, RESET 

nebo rovnocenně: 

IF tl_rude THEN s_ruda := 1; // funkce SET

IF tl_zlute THEN s_ruda := 0; // funkce RES, RESET 

Obr. 5. Vývojový diagram a pravdivostní tabulka funkce RES

Varování: V tomto případě je paměťová funkce podmíněnými příkazy řešena vědomě. Při nadměrném používání jednostranných podmíněných příkazů IF-THEN ale hrozí riziko, že paměťovou funkci vytvoříme omylem, jako důsledek naší nepozornosti – stačí nedůsledně upravit všechny kombinace podmínkových proměnných. Například uvedeme-li v podmíněném příkazu jen požadovanou akci, která se má vykonat při splnění podmínky, a opomeneme uvést, co se má stát při jejím nesplnění, je zachován (pamatován) její původní stav. Při vyhodnocování několika podmínek je nutné ošetřit všechny kombinace podmínkových proměnných.

 

Řešení šesté – „paměťové cívky“ v LD

V jazyce LD lze výsledné hodnoty vyčíslené v levé části větve uložit s využitím symbolů („výstupních cívek“) –()– nebo –(/)– pro uložení přímé nebo negované hodnoty výsledku. Navíc jsou k dispozici symboly –(S)– a –(R)–, které realizují paměťové funkce SET a RES („paměťové cívky“). Příklad jejich použití je uveden na obr. 1

Úloha 1. Převod do FBD

Jste-li zvyklí používat jazyk funkčních bloků FBD podle normy IEC EN 61131-3, převeďte do něj programy řešení příkladu 1 a postupně do něj přepisujte i řešení následujících příkladů.

 

Příklad 2: vybavovací tlačítka

Tlačítky tl_rude, tl_zlute, tl_zelene zapínejte (setujte) stejnobarevné signálky s_ruda, s_zluta, s_zelena. Každým stiskem rozsviťte odpovídající signálku a současně zhasněte ostatní. Stiskem tl_modre zhasněte všechny.

 

Řešení první – s „cívkami“ SET a RES v LD

Na obr. 6 je uvedeno možné řešení v jazyce LD s využitím „paměťových cívek“ s funkcí SET a RES. 

Obr. 6. Možné řešení příkladu 2 v jazyce LD s využitím „paměťových cívek“

Úloha 2. Obecnější řešení

Analyzujte řešení z obr. 6, najděte jeho omezení a upravte jej tak, aby bylo zcela obecné a přesně respektovalo zadání – symetricky vyhodnocovalo tlačítka tl_rude, tl_zlute, tl_zelene.

 

Řešení druhé – s funkčními bloky RS

Možné řešení v jazyce CFC s použitím funkčních bloků je uvedeno na obr. 7

Obr. 7. Možné řešení příkladu 2 v jazyce CFC

Úloha 3. Oprava a obecnější řešení

Analyzujte řešení z obr. 7, opravte v něm drobné chyby (překlepy), najděte jeho omezení a upravte jej tak, aby přesně respektovalo zadání – symetricky vyhodnocovalo tlačítka tl_rude, tl_zlute, tl_zelene. 

 

Řešení třetí – asynchronní logika v ST

Zadání lze vyhovět i bez použití paměťových funkčních bloků, jen s asynchronní logikou. V jazyce ST mu odpovídá trojice příkazů se zpětnými vazbami: 

s_ruda := (s_ruda OR tl_rude) AND NOT tl_zlute AND NOT tl_zelene AND NOT tl_modre;

s_zluta := (s_zluta OR tl_zlute) AND NOT tl_rude AND NOT tl_zelene AND NOT tl_modre;

s_zelena := (s_zelena OR tl_zelene) AND NOT tl_rude AND NOT tl_zlute AND NOT tl_modre; 

Úloha 4: Převod do jazyka LD a CFC

Předchozí řešení převeďte do jazyka LD a CFC a porovnejte s odpovídajícími variantami řešení, která využívají paměťové funkční bloky.

 

Příklad 3. Klopný obvod T

Stiskem tl_rude rozsviťte s_ruda, opakovaným stiskem ji zhasněte, dalším stiskem ji opět rozsviťte atd.

 

Řešení první – rozložené

Obr. 8. Generování impulzu od náběžné hrany – logické schéma (horní část obrázku) a možné časové průběhy hodnot proměnných

Změna stavu signálky nastává v okamžiku stisku tlačítka (s náběžnou hranou), kdy se stav paměti změní na opačný. Náběžná hrana je definována podmínkou, kdy proměnná mění svou hodnotu ze stavu 0 na 1 – minulý vzorek proměnné (hodnota z předchozího programového cyklu) je 0 a současná hodnota téže proměnné je 1 (obr. 8). Postup řeší program: 

nabeh := NOT tl_rude_m AND tl_rude; // generování hrany

tl_rude_m := tl_rude; // aktualizace paměti minulého vzorku

s_ruda := nabeh XOR s_ruda; // ovládání signálky 

První příkaz vyhodnocuje okamžik náběžné hrany a definuje tak hodnotu proměnné nabeh – ta má charakter krátkého impulzu délky jednoho programového cyklu. Druhý příkaz kopíruje současnou hodnotu tl_rude do proměnné tl_rude_m, která bude mít v příštím programovém cyklu význam paměti minulého vzorku. Třetí příkaz už generuje výslednou hodnotu signálky s_ruda. Stejný program v jazyce CFC je uveden na obr. 9

Obr. 9. Programy k příkladu 3

Úloha 5: Převod do jazyka LD

Stejný postup řešte v jazyce LD.

 

Řešení druhé – s funkčním blokem R_TRIG

K detekci náběžné hrany slouží funkční blok R_TRIG a program s jeho použitím v CFC je na obr. 9.

 

Řešení třetí – s uživatelským funkčním blokem

K řešení funkce klopného obvodu T je vytvořen uživatelský funk­ční blok (pojmenovaný T_obvod). Má jediný vstup vst_T a výstup vyst. Je vytvořen v jazyce CFC. Na obr. 9 je uvedena jeho definice – s deklarací proměnných v úvodní části a pak schéma jeho činnosti v CFC. Uveden je rovněž program použití T_obvod v CFC a ST. 

Úloha 6: Převod do jazyka LD

Řešte program s použitím T_obvod v jazyce LD.

Úloha 7: Změna zadání

Změňme zadání tak, aby se stav signálky s_ruda měnil při uvolnění tlačítka tl_rude – se spádovou (sestupnou) hranou. 

Doplňující poznámka

Obr. 10. Generování impulzu od sestupné (spádové) hrany – logické schéma (horní část obrázku) a možné časové průběhy hodnot proměnných

Podobným postupem lze generovat krátký impulz od sestupné hrany (obr. 10): 

sestup := tl_rude_m AND NOT tl_rude;

tl_rude_m := tl_rude; 

Obr. 11. Generování impulzu od změny – logické schéma (horní část obrázku) a možné časové průběhy hodnot proměnných

Rovnocennou funkci vykonává funkční blok F_TRIG. Sestupnou hranu lze rovněž vygenerovat funkčním blokem R_TRIG s negovanou vstupní proměnnou (NOT tl_rude). Jestliže je požadováno vyhodnotit jakoukoliv změnu (náběžnou i sestupnou hranu), lze logicky sečíst impulzy od náběžné a sestupné hrany (zmena := nabeh OR sestup) nebo je možné jej vygenerovat postupem (obr. 11): 

zmena := tl_rude_m XOR tl_rude;

tl_rude_m := tl_rude;

 

Příklad 4: impulzní schodišťový spínač

Stiskem kteréhokoliv z tlačítek tl_rude, tl_zlute, tl_zelene, tl_modre změňte stav signálky s_ruda na opačný – je to úloha schodišťového spínače pro čtyři ovládací místa (např. pro osvětlení chodby nebo haly).

 

Řešení první – součet impulzů

Obr. 12. Programy k příkladu 4

Odděleně vygenerujeme impulzy náběžné hrany od všech tlačítek a jejich logickým součtem (OR) ovládáme paměť signálky s využitím uživatelského funkčního bloku T_obvod, který byl vytvořen jako třetí řešení příkladu 3 (obr. 9). Program v CFC a ST je na obr. 12.

 

Řešení druhé – impulz od součtu vstupů

Nejprve vytvoříme logický součet všech tlačítek (OR). Ten je přiveden na vstup uživatelského funkčního bloku T_obvod, který ovládá signálku. Program v CFC a LD je na obr 12

Úloha 8: Najdi rozdíl

Jaký je rozdíl mezi oběma řešeními? Jak se zachovají při současném tisknutí několika tlačítek?

 

 

Ing. Ladislav Šmejkal, CSc., Teco, a. s. a Automa,

Ing. Josef Kovář a Ing. Zuzana Prokopová, učitelé automatizace na SPŠ Zlín