Stiskněte "Enter" pro přeskočení obsahu

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

6

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 v programovacím „jazyku“ FBD. 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. Samotný TIA Portal umožňuje vytvářet podobnou konstrukci programu v prostředí Graph.

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.

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, PLC 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.
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.
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.

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.

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.

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.

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ář.

  1. powerup1 powerup1

    Dobry den.. super clanek! Chci se zeptat,jak takovy sekvencer vytvorim v ladderu ? V Tia portalu zacinam. Diky za odpoved 🙂

  2. Peťan: Kromě funkce AND bude vypadat úplně stejně. V ladderu se funkce jako časovače zobrazují stejně, nebo podobně jako v FBD. Pokud začínáš, doporučuji se LAD vyhnout a začít s FBD. Dneska už se v programu neřeší jenom vstupy, výstupy a jednoduché logické funkce, takže by program byl stejně mix LAD a FBD. Jak jsem již psal v článku PLC Tecomat LAD je spíš doménou starších konstruktérů z dob, kdy počítače pracovaly se semigrafikou.
  3. powerup1 powerup1

    [1] powerup1: Diky za rychlou odpoved.. zkusim i ten FBD.. kdyby ste mel chut, tak klidne udelejte nejaky dalsi clanek z prostredi Tia portal 🙂

  4. Peťan: Kdybych měl víc času, tak bych asi něco začátečnickýho mohl vypotit… Ale nevím, jestli by to mělo nějaký smysl. Nějaké materiály se dají najít, tak by to možná bylo jenom zbytečné opakování.
  5. powerup1 powerup1

    [2] powerup1:
    Dobry den.. nejak s tim sekvencerem valcim, nahodou byste mi neposkytl hotovy projekt jenom s tim sekvencerem ? diky moc.

  6. Peťan: A v čem je problém? Co to nedělá? Stačí „překreslit“ program sekvenceru do funkčního bloku. A ten pak použít. Nebo pošli nějakou ukázku – projekt, nebo jen obrázek.
  7. Noname Noname

    Great post. I was checking continuously this blog and I’m impressed!
    Extremely helpful information particularly the last part 🙂 I care
    for such information much. I was seeking this certain info
    for a very long time. Thank you and good luck.

  8. Jarda Jarda

    Dobrý den,
    v první řadě bych chtěl poděkovat za super článek. Krokové řízení jsem ve svém zkušebním projektu dělal odbdobně jako je ukázáno na začátku. (Bez FB jsem přímo v networku řešil přesun na další krok) Zkoušel jsem po vzoru tohoto článku udělat FB a opakovaně ho volat avšak narazil jsem na problém kdy mi nechce propsat interní číslo následujícího kroku. Jako kdyby mi nefungovala detekce sestupné hrany ve 3. networku a za boha nemohu přijít na to kde je problém. Zde přikládám krátké video s ukázkou problému. https://www.youtube.com/watch?v=l-E-FWxGsBg

    Peťan: Jak to vypadá v nadřazeném bloku? Jaké jsou cross-reference na proměnnou #actualStep. Je možné, že něco jiného přímo přepisuje tuto proměnnou. Ideálně by měla tato proměnná být pouze čtena (nastavována je pouze v tom bloku). Takhle jsou nastaveny proměnné. Nebo klidně něco pošli na mail info@mylms.cz Mrknu na to…

  9. Jarda Jarda

    Děkuji za rychlou odpověď. Nakonec byl problém v tom, že jsem měl #trig v TEMP a ne ve Static.

    Peťan: jj, Temp je taková černá díra na data 😀

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *