mylms

... web o elektronice


Sekvenční (krokové) řízení PLC Simatic ve Step7

Při vytváření programu v PLC je často potřeba nějak řídit jeho běh. Je vhodné pro často používané části programu vytvořit vlastní funkce (FC, FB bloky). Nicméně stejně je nutné tyto funkce nějak inteligentně spouštět. U strojů, které provádějí nějakou činnost „krok za krokem“ je nutné vytvořit program, který dokáže „krok za krokem“ spouštět jednotlivé funkce, obsluhovat výstupy a načítat vstupy.

Tento článek se týká programování PLC Siemens Simatic v TIA Portal 13. Podobné to je v jiných verzích Step 7, případně jiných programovacích nástrojích podle IEC 61131–3 . Sekvenční řízení pro Siemens Logo a podobné najdete v samostatném článku.

 

sequencer-step7-1

 

PLC pracuje v cyklech, jejichž délka je řádově několik málo milisekund. Na začátku každého cyklu jsou načteny vstupy, poté proběhne celý program a po dokončení logiky programu se nastaví výstupy. To, jaká část programu je zrovna aktivní lze snadno řídit pomocí sekvenceru. Ten zjistí, jestli určitá část programu má být zrovna aktivní a pokud ano, tak provede pouze tu konkrétní část. Je to podobný styl programování jako když se dříve číslovaly řádky programu. Sekvenční řízení pomáhá i při ladění programu, protože aktivita probíhá vždy pouze v jedné části. 

sequencer-step7-7

Typický cyklus PLC



Dobré je si stroj rozdělit na několik logických částí (samostatné funkční bloky). V každém bloku použít sekvencer a jednotlivé bloky synchronizovat pomocí několika proměnných. Zdánlivě složitý stroj jde pak snadno naprogramovat. Ladění jedné části stroje víceméně neovlivňuje kód druhé. Např. program na ovládání svařovacího robotu mám rozdělený na tyto části

  • Bezpečnost (Není řízeno sekvencerem. Zde se real-time kontrolují bezpečnostní prvky stroje.) PLC má samozřejmě nadřazený bezpečnostní modul.
  • Řízení odsávání (jednoduchý blok, který není řízen sekvencerem)
  • Řízení otočného stolu (kontrola pozic robota a rotačních os, kontrola pozic pístnic, …)
  • Řízení robotu (nastavení programu pro robota, čekání na odpověď, spuštění programu, čekání na dokončení, reset v případě chyby, …)
  • Řízení rotačních os
 
Některé části jsou řízeny krokově, některé pracují bez sekvenceru. Jednotlivé bloky si mezi sebou předávají informace pomocí globálních proměnných.
 
Jak jsem již psal výše, program v každém cyklu načte vstupy, provede program a nastaví výstupy. Sekvenční řízení pracuje tak, že se souvislý program rozdělí na kroky. Každý má vlastní číslo a v každém se provádí malá část programu. Když je jedna část hotová, aktivní sekvencer změní krok programu. Program pokračuje dále.

 

 

Nejjednodušší řešení – blok CMP (compare)

Nejjednodušeji to lze udělat pouze pomocí jedné proměnné (int actualStep) a bloku CMP== (compare). Na začátku Networku se kontroluje jestli je požadovaný a aktuální krok stejný. Pokud ano, je výstup CMP== aktivní a jsou provedeny příkazy za ním. Další krok v programu se spustí tak, že se po splnění podmínek změní hodnota v proměnné ActiveStep.

  1. Pokud je aktivní krok 10 (actualStep == 10) otevře se ventil #valve1
  2. Když pístnice ovládaná ventilem dojde do pravé pozice na #sensorR změní se aktivní krok na 20
  3. V kroku 20 se ventil vypne a pístnice se začne vracet do své levé pozice
  4. Když pístnice dosáhne zpět levé pozice aktivuje se #sensorL. Změní se krok na 10. Program pokračuje od začátku.

 

sequencer-step7-1

Jednoduchý sekvencer

 

Problém nastává, pokud potřebujeme program větvit, nebo ještě hůře potřebujeme vložit to čísti programu časové zpoždění apod. Je nutné vytvořit několik proměnných pro trigery (bool), timery (IEC Timer) apod. Pokud je nutné nastavit čas pouze v jednom bloku není to takový problém. U více takových kroků se program nepříjemně rozrůstá a znepřehledňuje.

  1. Pokud je aktivní krok 10 (actualStep == 10) otevře se ventil #valve1
  2. Když pístnice ovládaná ventilem dojde do pravé pozice na #sensorR spustí se časovač #_timer1 (zpožděné zapnutí), který po uplynutí 2 sekund aktivuje svůj výstup
  3. Po aktivování výstupu časovače se změní aktivní krok na 20
  4. V kroku 20 se ventil vypne a pístnice se začne vracet do své levé pozice
  5. Když pístnice dosáhne zpět levé pozice aktivuje se #sensorL. Změní se krok na 10. Program pokračuje od začátku.

 

sequencer-step7-2

Jednoduchý sekvencer s čekáním

 

Univerzální řešení – samostatný blok sequencer

Mnohem univerzálnější je vytvořit si pro krokování samostatný blok, který se poté akorát kopíruje a vždy zajišťuje stejnou funkcionalitu. Kterou lze následně i změnit, upravit a doplnit o další funkce.

 

Blok by měl mít nějaké základní vlastnosti:

  • Mít interní proměnnou s aktuálním krokem
  • Po splnění podmínky (transition) změnit číslo kroku na nastavené pomocí vstupní proměnné
  • Zpoždění reakce na vstup transition (debounceTime)
    • Minimální doba kdy je nutné mít na vstupu transition log. 1.
    • Slouží k ignorování krátkých impulzů na vstupu.
  • Zpoždění přeskoku na další krok (delayTime)
    • Pokud je splněna podmínka transition po dobu alespoň control_time spustí se odpočet pro přechod do dalšího kroku
    • Během tohoto času již nemusí být vstup transition aktivní.
  • Možnost zakázat vstup transition (transitionEnable)
    • Hodí se pro případ zastavení provádění programu
  • Kdykoliv je možné přidat další funkce jako…
    • Pokud není aktivován signál transition do zadaného času, vyhlásit poruchu
    • Na výstupu informovat o aktuálním stavu sekvenceru (čekání na transition, delayTime, …)

 

Nějaký základní sekvencer by mohl vypadat takto…

V NTW1 se kontroluje signál transition. Pokud je signál aktivní, běží časovač #_timer1 (zpožděné zapnutí) který zajistí minimální délku signálu. Zároveň se překopíruje číslo dalšího kroku do interní proměnné. Pokud je délka signálu transition delší než debounceTime #_timer1 sepne svůj výstup.
Náběžná hrana signálu z #_trig1 spustí časovač #_timer2 (zpožděné vypnutí), který zajišťuje čas delayTime. Po „odčasování“ se vypne jeho výstup.
Vypnutí výstupu časovače #_timer2 detekuje trigger #_trig2 (detekce sestupné hrany), který vytvoří impulz jež překopíruje číslo dalšího kroku do aktuálního kroku. Zároveň se po dobu vytvoření impulzu odpojí signál transition. Kdyby se neodpojil a po sobě by následovaly dva bloky s aktivním signálem transition, tak by docházelo k zasekávání sekvenceru – nevytvořila by se další hrana v bloku #_trig1.

 

sequencer-step7-3

Program sekvenceru (FB blok SQC)

 

Takto vytvořený blok lze samozřejmě dále upravovat a vylepšovat. Blok sekvenceru se vloží do jiného bloku a vytvoří se mu instanční proměnné (všechny proměnné se budou v rámci nadřazeného bloku sdílet). Co se zapíše např. v NTW1 bude mít nastaveno blok i v NTW2.). Porovnávání aktuálního bloku je stejné jako v jednoduchém sekvenceru. Když je proměnná #SQC_Instance.actualStep shodná s číslem kroku, tak se blok SQC aktivuje a tím i jeho výstup ENO (tedy i výstupy Q8.4 a W8.2). Nasleduje nastavení parametrů. A čekání na signál transition. Po dosažení obou snímačů na válcích se chod programu bez čekání přesune do kroku 120.

 

sequencer-step7-4

Blok sekvenceru #SQC_Instance vložený do jiného bloku

 

 

Největší výhoda spočívá v možnosti časování a větvení programu. V tomto NTW je sekvencer použit jako časovač „spožděné zapnutí“. Po aktivaci kroku 150 je okamžitě aktivován výstup ENO a signál transition. Program tedy v tomto kroku čeká 100 ms (delayTime) a pokračuje na krok 100.

 

sequencer-step7-5

Zpoždění vytvořené sekvencerem

 

 

Program lze pomocí tohoto bloku efektivně větvit. Při aktivním kroku 100 se aktivují oba sekvencery (a oba jejich výstupy). Na vstupu transition jsou rozdílné podmínky. Ta podmínka, která bude splněna dřív udá další krok programu. U tohoto použití nesmí být časy debounceTime a delayTime vyplněny rozdílně! Tím že jsou oba bloky aktivní mohou si navzájem přepisovat časy. Ideální je v tomto případě vyplnit u obou časů 0 a případné zpoždění řešit až v dalším kroku.

 

sequencer-step7-6

Větvení programu sekvencerem

 

To by bylo ke krokovému řízení asi tak vše. Jak jde vidět lze pomocí několika bloků vytvořit blok, který ušetří spoustu proměnných v jiných částech programu a zjednoduší i sjednotí tvorbu většího programu. Stejně jako u Loga program probíhá lineárně krok za krokem a je tedy snadné odhalit nějakou chybu v programu. Pokud je stroj vybaven displejem je možné zobrazovat ke každému bloku aktuální číslo kroku a např. pomocí TextListu vypisovat aktuálně prováděnou operaci a podmínky pro vstup transition. V případě zaseknutí stroje obsluha/údržba snadno vyčte, kde by se mohla nacházet chyba.

Pokud vás napadá nějaká úprava, nebo používáte jiný, nebo vlastní sekvencer můžete zde zanechat komentář. 



Napsal Petan před šesti měsíci v kategorii Elektronika. Připojeno 0 komentářů.
Přečteno 920x.

Na programy zde poskytované není žádná záruka na funkčnost (viz licence). Jednotlivé články, stejně jako celý obsah stránek není návodem a slouží pouze k studijním účelům. Zapojení výše mají pouze informativní charakter! Vždy se řiďte originálním návodem k použití! Na elektrickém (vyhrazeném) zařízení smí pracovat pouze osoba s příslušnou kvalifikací dle vyhlášky 50/78 Sb! Vše tedy děláte na vlastní nebezpečí! Autor stránek nebere žádnou zodpovědnost za případné újmy na zdraví, životě, majetku a jiné!

Jakékoliv části webu je zakázáno bez svolení autora a uvedení zdroje publikovat! Některé části článků mohou obsahovat texty, případně obrázky ze stránek Wikipedia a Wikimedia Commons. Tyto části jsou dostupné pod původní licencí Creative Commons.



Doposud nebyl připojen žádný komentář. Buďte první!

Připojte váš komentář!

* Hvězdičkou jsou označena povinná pole. Autor stránek odpovídá vždy do komentáře, ne na přiložený mail!