Pojďme se teď podívat, jak vytvořit instalační datový blok s FB blokem, jak volat programový blok s DB, jak kopírovat mezi dvěma datovými bloky nebo jak používat pointery a nastavovat časovače a čítače.
Ve spolupráci se společností FOXON s.r.o. vzniká kurz programování PLC SIEMENS SIMATIC S7-300 a práce s tímto PLC. Cílem následujících dílů, jejichž počet bude flexibilně přizpůsoben zájmu a jednotlivým tématům, nebude detailní vysvětlení kompletního programování a vlastností PLC SIMATIC, právě naopak.
Zaměříme se na ryze praktické stránky práce s PLC a nejpoužívanější programové segmenty pro začínající a občasné uživatele, kteří potřebují v základech porozumět Simatikům, dále ty, kteří se s tímto PLC setkávají jen občas, a v neposlední řadě i ty, kteří mají v zaměstnání vícero druhů PLC od různých výrobců a nelze pro všechna PLC absolvovat detailní školení. Proto uvítáme jakékoliv vaše ohlasy, abychom mohli eventuálně další díly korigovat.
Pokud nemáte k dispozici nějaké zkušební PLC pro ukázky tohoto kurzu, bude vám pro většinu příkladů stačit i SIEMENS PLC simulátor, tedy vystačíte si pouze s počítačem a softwarem.
FOXON s.r.o. & Jaroslav Blažek
5.1 Instanční datový blok s FB blokem a temporary proměnné ve STEP7
5.2 Volání programového bloku s instančním DB a syntaxe deklarovaných proměnných ve STEP7
5.3 Kopírování dat mezi dvěma datovými bloky ve STEP7
5.1 INSTANČNÍ DATOVÝ BLOK S FB BLOKEM A TEMPORARY PROMĚNNÉ
V minulém díle jsme skončili s datovým blokem vygenerovaným podle UDT struktury. Teoreticky bychom mohli práci s datovými bloky opustit, ale je to téma natolik obsáhlé, že by to byl určitý nedostatek. Datové bloky jsou totiž základ veškerých dat a práce s nimi je prakticky v každém PLC programu.
Spojíme tedy datový blok s programovým blokem, vytvoříme instanční datový blok. Nejprve si do našeho projektu vložíme nový funkční blok programu FB6.
Připomeňme si – do programového bloku se píšou jednotlivé instrukce, datový blok je pouze k ukládání hodnot proměnných.
FB6 je prázdný, takže jej otevřeme v editoru a v horní části bloku si zobrazíme jeho část interface, tažením vodorovné přepážky dolů. Následně si do složky STAT deklarujeme proměnné, podobně jako při vytváření datového bloku.
Je také možné vložit více proměnných najednou podle UDT struktury.
Každou proměnnou si můžeme pojmenovat, přiřadit jí výchozí hodnotu a také napsat komentář, který se bude dále zobrazovat.
Vyzkoušejte si vkládat různé typy proměnných, pro seznámení se všemi možnostmi.
Připravili jsme si asi 20 bytes prostoru s několika proměnnými typu bool, integer a byte.
Pozn.: Všimněte si adresace ve sloupci Address.
V interface je také složka TEMP, do které si můžeme deklarovat proměnné úplně stejně jako do STAT. Hlavní rozdíl spočívá v tom, že tyto proměnné se nevygenerují v datovém bloku, ale jsou k dispozici jen v tomto programovém bloku a cyklu programu. Slouží jen k zapsání hodnot v programu, podobně jako třeba poznámkový blok, uvidíme prakticky dále.
Poznámka: V dalším cyklu programu již hodnoty proměnných v TEMP nemusí být pravdivé, takže v jednom bloku do těchto proměnných zapíšeme, a pokud potřebujeme, i přečteme hodnotu. Prakticky se tyto TEMP používají pro mezi výpočty, zalepení nepoužívaných výstupů z funkcí a podobně. Šetří se tím místo v datových blocích a dají se lehce přidat při ladění programu.
Pokud jsme v editoru vše uložili, tak si zkusíme vložit do projektu datový blok DB6. Při jeho vytváření jej musíme deklarovat jako instanční a v roletovém menu vybereme blok programu, ke kterému bude náležet a podle kterého se vytvoří.
Tak a otevřeme si vytvořený DB6 v editoru, kde ihned vidíme, že jeho struktura je přesně stejná jakou jsme deklarovali v našem FB6, včetně komentářů.
5.2 VOLÁNÍ PROGRAMOVÉHO BLOKU S INSTANČNÍM DB A SYNTAXE DEKLAROVANÝCH PROMĚNNÝCH
Abychom mohli s naším programovým blokem FB6 pracovat, musíme jej jako obvykle zavolat z OB1, tentokrát ale jinak, než jsme si zatím ukázali. Také zápis proměnných z instančního DB může být jiný než obvykle.
Zatímco dosud jsme vždy v OB1 volali programový blok instrukcí UC, tedy nepodmíněné volání bloku programu, nyní musíme použít příkaz CALL a za čárkou číslo datového bloku, který jsme si k němu vygenerovali. Pokud si nyní zapneme zobrazení symboliky, uvidíme tento zápis ještě jinak.
Poznámka: V nápovědě si můžeme zobrazit další instrukce pro různé volání částí programu.
Nyní si do DB6 zapíšeme nějaká data. Vezme to hezky popořádku od nejjednodušší varianty. Vidíme, že nemusíme používat zápis pro transfer do DB typu DB6.DBW2, ale zde stačí jen #INT_1. Po najetí myší na proměnnou se zobrazí i její typ a popis s komentářem.
Poznámka: Tato syntaxe zápisu je možná jen u instančního DB a stačí ji z horní části okna překopírovat třeba přes schránku.
Nyní si ukážeme, jak zapíšeme naše číslo 1234 do temporary proměnné deklarované v hlavičce programového bloku FB6. Stačí na to známý příkaz MOVE, kde vstup, tedy zdroj, je naše proměnná z datového bloku a výstup, tedy cíl, temporary oblast.
Poznámka: Oba zápisy v segmentu 1 a 2 jsou identické, první segment je zobrazení v AVL, druhý LADDER.
5.3 KOPÍROVÁNÍ DAT MEZI DVĚMA DATOVÝMI BLOKY
Pokud si vytvoříme dva a více datových bloků, dříve nebo později vznikne potřeba zkopírovat nebo přenést data z jednoho DB do druhého DB. Jedná-li se o několik bytes, vystačíme si s příkazem uvedeným výše, ovšem jakmile bychom potřebovali kopírovat větší část DB, například desítky či stovky bytes, tak výše uvedený postup není efektivní.
Pro pochopení principu si vytvoříme nový standardní datový blok DB7, kterého struktura bude naprosto shodná s instančním datovým blokem DB6. To vše jen proto, aby se nám nic zbytečně nepletlo. Jen jeho inicializační hodnoty si nastavíme na 11 až 18 v oblasti celočíselných proměnných, abychom viděli, zda se nám celá oblast překopíruje do jiného datového bloku.
Poznámka: Pro kopírování jedné oblasti dat do druhé by tyto oblasti měly mít stejnou strukturu, tedy integer do integer atd.
Začneme jednou proměnnou, pro kterou použijeme standardní příkaz L a T. Kopírujeme proměnou 11 z DB7 do DB6.
Poznámka: Příkaz T = transfer je zde použit 2x, abychom si znovu připomněli různý zápis do jedné oblasti. DB6.DBW2 je standard, ale #INT_1 je stejná oblast DB6 ale zapsána syntaxí instančního DB. Je důležité si tohle zapamatovat a hlavně několikrát vyzkoušet.
Pro uživatele a programátory má PLC Simatic v sobě velké množství systémových funkcí v knihovnách, takže si najdeme SFC20, která slouží právě ke kopírování oblastí dat. Zde je nesmírně důležitá syntaxe zápisu, při které se již používá tzv. pointer, tedy ten dvojitý křížek. Ten nám říká, že zdroj dat je v DB7, začíná od 4 byte a je dlouhý 10 bytes, tedy 5 wordů.
Jako zdroj i cíl je možné také použít merkrovou oblast dat, například P#M100.0 BYTE 10.
Poznámka: Tato forma zápisu se používá v programování dost často, takže si ji zapamatujeme, nebo aspoň uložíme do komentáře segmentu.
Protože jeden z výstupů funkce SFC20 je proměnná RET_VAL, jejíž hodnota nám říká, zda přesun dat proběhl v pořádku, nebo došlo k nějaké chybě, viz. Help přes klávesu F1. Pro zápis této hodnoty použijeme novou temporary proměnou v našem FB6, takže nemusíme hledat a deklarovat žádnou volnou oblast někde v merkrech nebo datových blocích. Tohle je přesně jeden z příkladů použití temporary proměnných.
Celou funkci si vyzkoušíme vytvořením VAT tabulky, do které si vložíme zdrojová data a cílovou oblast dat. V označeném sloupci si budeme libovolně měnit hodnoty proměnných, které si jednorázově zapíšeme do PLC označeným tlačítkem. Okamžitě uvidíme ty samé hodnoty v DB6, kde se nám přenesly, výše uvedenou funkcí, v našem PLC programu. Tuto VAT tabulku budeme potřebovat i dále!
Poznámka: Délku kopírované oblasti si vyzkoušíme v PLC programu u SFC20 a můžeme ji měnit.
5.4 KOPÍROVÁNÍ DAT S POUŽITÍM POINTERU
Teď si ukážeme již trochu složitější a hlavně zajímavé postupy, které někdy nejsou ani moc známé a používané. Pokud si je ale osvojíte, dokážou v programování přesunů dat velmi pomoci. Prakticky se podobné příkazy používají například při kopírování receptur a podobně. Pokud si navíc pro práci s pointerem vytvoříte třeba vlastní funkci, pak je tohle nepřímé adresování vynikající.
Teď si zkopírujeme zatím jednu proměnnou 664 do našeho datového bloku, ale použijeme k tomu adresaci přes adresní registr.
V prvním řádku jen nahrajeme hodnotu 664 do akumulátoru 1. Dále příkazem LAR1 vložíme do adresního registru hodnotu 2.0, což je v podstatě adresa odkud, tedy byte v DB. Následně příkazem OPN otevřeme datový blok 6 a v posledním řádku přeneseme proměnnou do DBW2, tedy na adresu 2. byte, která je v AR1 v datovém bloku. Pointer za AR1 je jen offset, změníme-li jej třeba na 2.0, posune se proměnná o 2 byte dále, tedy o jedno slovo.
Poznámka: Vyzkoušejte si vše vícekrát s různými proměnnými a pointery a ve VAT tabulce sledujte, kde se vám hodnota v datovém bloku objeví. Tohle je důležité pro pochopení principu, po několika změnách pointeru a proměnné vám jistě bude princip jasný. Budeme to potřebovat pro další příklad.
A zkusíme se trochu zacyklit tak, abychom mohli celou předchozí operaci provést několikrát za sebou a každé vložení proměnné posunout do dalšího slova v našem datovém bloku. Proto si ve známém prostoru pro temporary proměnné vytvoříme proměnnou cykl, která je nezbytná pro práci s příkazem LOOP, tedy smyčka.
A zde už to máme naplno, bez ohledů na momentální znalosti. S použitím pointerů nám tento kousek programu zkopíruje počet bytes z jednoho DB do druhého. První dva řádky slouží jen jako výhybka, tedy podmínka pro kopírování, které můžeme použít jen občas. Dále nahrajeme 2x adresní registr hodnotou 2.0, neboť v našem DB6 a DB7 začínají proměnné až na 2. byte. Pak následuje smyčka s hodnotou 10, tedy 10 bytes, což je 5 slov. Uvnitř smyčky již známé příkazy adresace, jen s tím rozdílem, že se adresa v AR1 a AR2 vždy posune o 1, takže další průběh smyčkou kopíruje data o 1 byte dále.
Poznámka: Tohle si pořádně vyzkoušejte, ale až vám půjde bez potíží kopírování jen jedné proměnné z předchozí ukázky. Možná se to zdá na první pohled komplikované, ale jakmile vám to bude chodit, zjistíte, že je to bezvadná věc, hlavně pro několik desítek nebo stovek proměnných.
5.5 ČASOVAČE, ČÍTAČE A DATOVÝ BLOK
Možná na první pohled trochu odbočíme k tématu časovačů a čítačů, ale jen zdánlivě, neboť uvidíme, jak se dají datové bloky použít i v této oblasti. Někteří programátoři ani o těchto funkcích moc neví.
Nejprve si vyzkoušíme funkci čítače. Vložíme si čítač nahoru i dolů, který budeme ovládat prvním bitem z našeho DB6. Bit M1.5 je z clock merkru a mění hodnotu neustále každou vteřinu. Tuto změnu budeme počítat. Stav, proměnnou čítače, máme v MW98.
Poznámka: Význam ostatních vstupů si najděte označením čítače a Help přes klávesu F1.
Protože by nám čítač směrem nahoru počítal stále dál, napíšeme si do dalšího segmentu krátkou zarážku.
Poznámka: Segment 8 je výborný pro pokusy. Vše, co nechcete mazat a potřebujete uchovat, nakopírujete jednoduše za něj a kdykoliv si je zase vrátíte před tento příkaz BE. Ten totiž PLC řekne, že tento blok skončil a má se vrátit zpět, odkud byl volán.
Celou funkci čítače a jeho ovládání si vyzkoušíme z VAT tabulky. Zkuste například vyřadit zarážku z předchozího obrázku, stačí napsat dvě lomítka na začátek posledního řádku, změnit M1.5 za rychlejší a uvidíte, jak daleko čítač napočítá. Budete překvapeni.
Časovač se zpožděným rozběhem. Funkce je jasná, ovládání 4. bitem přes VAT tabulku. Jakmile uběhne nastavený čas 5 sekund, čítač změní svoji hodnotu a nastaví výstupní bit na H, přesně podle obrázků.
Poznámka: Zkuste si vložit i jiné typy časovačů pro seznámení s funkčními rozdíly mezi nimi.
Jenomže co když potřebujeme časovač nebo čítač a v PLC už nemáme žádný volný? U starších PLC to bylo velmi časté, počet časovačů a čítačů byl hodně omezen. Z knihovny systémových funkčních bloků vložíme do programu SFB4, což je opět časovač se zpožděným rozběhem.
Poznámka: Tímto způsobem můžeme použít časovače i čítače, stačí jen vybrat správný systémový blok SFB0 až SFB5.
SFB4 vyžaduje vlastní instanční datový blok. Napíšeme proto číslo datového bloku, který zatím nemáme, je volný. U nás DB8 a editor nám nabídne automatické vygenerování datového bloku.
Poznámka: Vstupy a výstupy této funkce jsou trochu jiné než u předchozího klasického časovače.
Vygenerovaný datový blok DB8 si prohlédneme v parametrizačním nástroji pro DB. Stačí na něj kliknout myší ve složce programu a vidíme, jak jeho jednotlivé proměnné přiřadit systémovému časovači podle jejich jména.
Přesně takhle. Jednotlivé proměnné nám korespondují s označením vstupů a výstupů funkce SFB4, našeho časovače.
Tady už vidíme, jak nám fungují oba časovače. SFB4 má symbolický název TON a datový blok 8 pak symboliku TIMER.
Poznámka: Jeden datový blok a jeden časovač nebo čítač přes systémovou funkci nám pomůže v případě nutnosti použít více časovačů nebo čítačů, než je v PLC. Datových bloků máme totiž vždy v PLC k dispozici více, než potřebujeme.
Je vidět, že datové bloky a jejich použití je základním kamenem pro programování PLC. Takže si všechno vyzkoušejte, včetně použití různých čítačů a všech druhů časovačů, nejen ty známé TON a TOF. Příště si zkusíme ukázat vytvoření jednoduché funkce a její opětovné použití v PLC programu.
Užitečné odkazy k tématu 5. dílu:
Technická podpora Siemens pro CPU Simatic S7-300
PLC Simatic hlavní stránka v češtině
Související produkty
{foxonstore id="30380,30383,30379,23201,23473,24131"}