• No results found

Datalogger proměnných v PLC

N/A
N/A
Protected

Academic year: 2022

Share "Datalogger proměnných v PLC"

Copied!
78
0
0

Loading.... (view fulltext now)

Full text

(1)

Datalogger proměnných v PLC

Diplomová práce

Studijní program: N2612 – Elektrotechnika a informatika Studijní obor: 1802T007 – Informační technologie Autor práce: Bc. Stanislav Mareš

Vedoucí práce: Ing. Leoš Beran, Ph.D.

(2)

Data logger of variables in PLC

Master thesis

Study programme: N2612 – Electrical Engineering and Informatics Study branch: 1802T007 – Information Technology

Author: Bc. Stanislav Mareš Supervisor: Ing. Leoš Beran, Ph.D.

(3)
(4)
(5)
(6)

Poděkování

Chtěl bych poděkovat vedoucímu Ing. Leoši Beranovi, Ph.D. a konzultantovi Ing.

Martinu Diblíkovi, Ph.D. za odborné vedení, přínosné rady, ochotu a vstřícnost při realizaci této diplomové práce.

(7)

Abstrakt

Cílem diplomové práce je vytvořit datalogger proměnných určený pro programovatelné logické automaty neboli PLC.

Software jsem konstruoval a testoval na simulátoru ve vývojovém prostředí Automation Studio od společnosti Bernecker a Rainer (B&R). Jako programovací jazyk jsem vybral Strukturovaný text neboli ST. Dále jsem využil několik vestavěných knihoven. Mezi ty hlavní patří: DataObj, FileIO a SYS_lib.

Datalogger disponuje celkem dvanácti kanály se stejnou časovou základnou.

K ukládání dat jsem hlavně z důvodu bezpečnosti využil datové objekty. Během vzorkování jsou data ihned převáděna na datový typ STRING a ukládána do bufferu již ve výsledném formátu, kterým je CSV. Po skončení nahrávání může uživatel data exportovat do souboru ve svém počítači.

Celá funkcionalita dataloggeru je zapouzdřena do jednoho funkčního bloku.

Uživatel tak velice snadno a rychle může začít program používat. Jeho ovládání je možné pomocí monitor módu Automation Studia. Z důvodu způsobu ukládání dat do bufferu, program velice efektivně pracuje s pamětí cílového počítače při exportu dat do souboru.

Nedostatek softwaru spočívá v použití simulátoru, který ne úplně přesně odráží práci reálného PLC a přináší další nedostatky. Např. minimální vzorkovací perioda, která činí 10ms je tím ovlivněna, protože pod touto hodnotou jsou časovače vývojového prostředí nepřesné. Dalším problémem je nemožnost změření náročnosti úlohy na procesorový čas. Existuje určitá šance, že pro drobnější časové rozlišení, a z důvodu zapouzdření celé funkcionality do jednoho funkčního bloku, by program byl na CPU příliš náročný a musel by být rozdělen na několik dílčích částí. Proto před uvedením do praxe by tedy musel software být testován ještě na reálném zařízení.

Klíčová slova

Datalogger, datové objekty, funkční blok, Programovatelný logický automat, soubory, simulátor, Strukturovaný text

(8)

simulator, Structured Text

Abstract

The goal of this master thesis is to create data logger for variables intended for programmable logic controllers or PLC.

I designed and tested the software on a simulator in the Automation Studio development environment from Bernecker and Rainer (B&R). As a programming language, I chose structured text or ST. I also used several built-in libraries. The main ones include: DataObj, FileIO and SYS_lib.

Datalogger has a total of twelve channels with the same time base. To save data I used data objects, mainly because of security reasons. During sampling, the data is immediately converted to the STRING data type and saved in the buffer already in the resulting CSV format. After recording, user can export the data to a file on his computer.

The whole datalogger functionality is encapsulated info a one function block.

Because of that, user can very easily and quickly start using the program. Its control is possible with an Automation Studio monitor mode. Due to the way, the data is stored in the buffer, the program works very efficiently with the target computer’s memory when exporting data to a file.

The imperfection of this software lies in the use of the simulator, which does not exactly reflect the work of a real PLC and thus brings other shortcomings. For example, a minimum sampling period of 10ms is affected, because below this value, the development environment timers are inaccurate. Another issue is the inability to measure task performance on CPU time. There is a certain chance that for a smaller time resolution and because of the encapsulation of the whole function block, the program would be too demanding on the CPU and would have to be divided into a several smaller sections. Therefore, before introducing the program in practice, the software should still be tested in a real device.

Key words

Datalogger, data objects, files, function block, Programmable logic controller,

(9)

Obsah

1 Úvod a cíl 13

2 Teoretický přehled 14

2.1 Programovatelné logické automaty ... 14

2.2 Programově organizační jednotky (POU) ... 15

2.3 Datalogger ... 15

3 Použité technologie 17 3.1 Automation Studio ... 17

3.2 Simulátor – ArSim ... 17

3.3 Strukturovaný Text ... 18

3.4 DataObj ... 18

3.4.1 DatObjCreate ... 19

3.4.2 DatObjDelete ... 20

3.4.3 DatObjRead ... 20

3.4.4 DatObjWrite ... 21

3.4.5 DatObjAttach ... 22

3.4.6 DatObjDetach ... 23

3.5 FileIO... 24

3.5.1 DevLink ... 24

3.5.2 DevUnlink ... 25

3.5.3 FileCreate ... 26

3.5.4 FileDelete ... 27

3.5.5 FileOpen ... 27

3.5.6 FileClose ... 28

(10)

3.5.7 FileRead ... 29

3.5.8 FileWrite ... 30

3.6 SYS_Lib ... 30

3.6.1 PV_ninfo ... 31

3.6.2 PV_item ... 33

3.6.3 PV_xgetadr ... 33

4 Struktura systému a datalogger 35 5 Návrh a implementace 37 5.1 Knihovna DataMng ... 37

5.1.1 DmngStrReplace ... 37

5.1.2 DmngToStr ... 39

5.1.3 Struktura funkčních bloků a chybové stavy ... 43

5.1.4 DmngVarsInfo ... 45

5.1.5 DmngDataObj ... 51

5.1.6 DmngFileIO ... 54

5.1.7 DmngDataRec ... 58

6 Testování a vyhodnocení 70

7 Závěr 72

Seznam Literatury 75

Přílohy 77

(11)

Seznam obrázků

Obr. 1 PLC od společnosti B&R ... 14

Obr. 2 Struktura celého systému v reálném použití ... 36

Obr. 3 Ukázka zdrojového kódu v jazyce ST – volání funkce DmngStrReplace ... 39

Obr. 4 Ukázka zdrojového kódu v jazyce ST – volání funkce DmngToStr ... 43

Obr. 5 Základní struktura programu funkčních bloků knihovny DataMng 45 Obr. 6 Grafické znázornění práce algoritmu funkce DmngVarsInfo ... 50

Obr. 7 Ukázka zdrojového kódu v jazyce ST – smazání datového objektu . 54 Obr. 8 Ukázka zdrojového kódu v jazyce ST – vytvoření souboru ... 58

Obr. 9 Stavový diagram hlavní časti funkčního bloku DmngDataRec ... 69

Seznam grafů

Graf 1: Využití paměti na základě počtu vzorků... 70

Seznam tabulek

Tab. 1 Parametry funkčního bloku DatObjCreate ... 19

Tab. 2 Parametry funkčního bloku DatObjDelete ... 20

Tab. 3 Parametry funkčního bloku DatObjRead ... 21

Tab. 4 Parametry funkčního bloku DatObjWrite ... 22

Tab. 5 Parametry funkčního bloku DatObjAttach ... 23

Tab. 6 Parametry funkčního bloku DatObjDetach ... 23

Tab. 7 Parametry funkčního bloku DevLink ... 25

Tab. 8 Parametry funkčního bloku DevUnlink ... 26

Tab. 9 Parametry funkčního bloku FileCreate ... 26

(12)

Tab. 10 Parametry funkčního bloku FileDelete ... 27

Tab. 11 Parametry funkčního bloku FileOpen ... 28

Tab. 12 Parametry funkčního bloku FileClose ... 29

Tab. 13 Parametry funkčního bloku FileRead ... 29

Tab. 14 Parametry funkčního bloku FileWrite ... 30

Tab. 15 Parametry funkce PV_ninfo ... 31

Tab. 16 Přehled datových typů s jejich číselným vyjádřením a popisem .. 32

Tab. 17 Parametry funkce PV_item ... 33

Tab. 18 Parametry funkce PV_xgetadr... 34

Tab. 19 Parametry funkce DmngStrReplace ... 38

Tab. 20 Parametry funkce DmngToStr ... 40

Tab. 21 Parametry funkčního bloku DmngVarsInfo ... 46

Tab. 22 Parametry funkčního bloku DmngDataObj ... 52

Tab. 23 Parametry funkčního bloku DmngFileIO ... 56

Tab. 24 Parametry funkčního bloku DmngDataRec ... 59

Seznam vzorců

(1)...…63

(2)... 64

(3)………. 64

(4)... 64

(13)

Seznam symbolů, zkratek a termínů

ASCII American Standard Code for Information Interchange, standardizovaná tabulka znaků

B&R Bernecker + Rainer Industrie Elektronik, rakouská společnost se zaměřením na automatizaci

CPU Central processing unit, elektronická jednotka vykonávající strojové instrukce

CSS Cascading Style Sheets, jazyk pro popis vzhledu elementů jazyka HTML CSV Comma-separated values, souborový formát pro výměnu tabulkových dat

HTML Hyper Text Markup Language, značkovací jazyk pro tvorbu webových Stránek

PC Personal computer, osobní počítač

PLC Programmable Logic Controller, programovatelný logický automat RAM Random-access memory, volatilní paměť s libovolným přístupem

ROM Read-only memory, paměť nevolatilního typu

ST Structured Text, programovací jazyk podle normy IEC61131-3

TCP/IP Transmission Control Protocol/Internet Protocol, komunikační protokol transportní vrstvy

(14)

1 Úvod a cíl

Programovatelné logické automaty se uplatňují hlavně v oblasti průmyslu, kde vykonávají různě složité automatizační úlohy. V dnešní době PLC disponují velkým výkonem (až řády gigabytů), takže mohou vykonávat i velice složité programy.

Používají se především v průmyslu strojírenském, kde řídí různé výrobní procesy, nebo vykonávají různé technologické postupy. Uplatňují se ale i v úlohách menších formátů. Mohou regulovat vytápění, osvětlení, větrání atd.

U těchto úloh a mnoho dalších je často zapotřebí sledovat různé děje v určitém časovém rozmezí, a takové informace ukládat. Jde tedy o proces monitorování a ukládání dat. Jako příklad můžeme uvést výrobní linku, kde chceme znát, kolik bylo za týden vyprodukováno kusů, kolik jich bylo vadných, a dle toho výrobu upravovat.

Právě monitoring a sběr dat, respektive vytvoření dataloggeru proměnných pro PLC je tématem této práce. Program může být využit ke sledování externích dějů (otáčky motoru, výrobní linka, aj.), ale i dějů interních (software). Jedná se tedy o datalogger softwarový.

V první části práce uvedu teoretický přehled, který jsem nastudoval z odborné literatury, pro snazší orientaci v dané problematice. Zmíním zde základní informace o PLC, funkčních blocích a dataloggerech obecně.

Ve druhé části budu podrobněji popisovat technologie, které jsem využil při tvorbě programu. Konkrétně zde přiblížím vývojové prostředí Automation Studio, simulátor, programovací jazyk ST a některé důležité knihovny a jejich obsah.

V části hlavní nejprve popíšu celou knihovnu, ve které se nachází i datalogger, resp. funkční blok. Dále uvedu všechny programové celky tzn. funkce a funkční bloky, které knihovna obsahuje, a budu pokračovat jejich popisem.

Ve čtvrté části se zaměřím na dosažené výsledky. Především na základě testů uvedu a vyhodnotím efektivitu dataloggeru z hlediska využití paměti.

Na závěr provedu celkové zhodnocení práce a uvedu nápady na možná zlepšení a pokračování nejen v programu, ale i v celé knihovně.

(15)

2 Teoretický přehled

2.1

Programovatelné logické automaty

Programovatelný logický automat neboli PLC je digitální elektronický systém, který nachází uplatnění především v oblasti průmyslu. Příslušné zařízení je vybavené programovatelnou pamětí a procesorem, dnes již s velkou kapacitou a výkonem (v řádu gigabytů), které umožňují uložení a vykonávání uživatelsky orientovaných instrukcí. Těmi mohou být např. logické funkce, funkce pro časování a čítání, aritmetické funkce atd. Sekvence takových instrukcí neboli program mohou poté pomocí analogových a číslicových vstupů/výstupů řídit různé procesy a zařízení [10].

PLC se vyznačují především svou spolehlivostí, a to i ve tvrdých průmyslových podmínkách. Za to může jejich konstrukce, která je robustní a odolná proti vnějším vlivům (prach, teplota, vlhkost, …). Další jejich výhodou je schopnost diagnostiky. Většina dnešních PLC obsahuje softwarová vybavení, která umožňují systém za jeho činnosti monitorovat a případně upozorňovat na vzniklé chyby.

V případě nedostatku počtu periferií (vstupy/výstupy) může být PLC také rozšířeno o další moduly, jedná-li se o automat modulárního typu. To znamená, že se zařízení může skládat i z více částí modulů, kde každá část má vlastní CPU, paměť a periferie. Opakem zmíněného typu jsou PLC kompaktní, které obsahují vše v jednom modulu a rozšiřitelnost takových zařízení je poté omezena [8].

Obr. 1 PLC od společnosti B&R

(16)

2.2

Programově organizační jednotky (POU)

Každý program, určený pro PLC, je složen z tzv. programově organizačních jednotek, které tvoří nejmenší nezávislé celky uživatelského softwaru. Ty mohou být celkem tři: program, funkční blok a funkce. Hlavním rozdílem mezi funkcemi a funkčními bloky je, že funkce vždy po zavolání se stejnými vstupními parametry, vrátí stejný výsledek. Můžeme také říci, že si „nepamatují“ svůj stav. Oproti tomu funkční bloky si ukládají svůj vnitřní stav, a tedy se stejnými vstupními parametry může být po každém zavolání vrácen jiný výsledek. Funkční bloky mohou také obsahovat více výstupů. Program poté tvoří nejvyšší samostatný celek, který může obsahovat oba předchozí druhy programových konstruktů, a také komunikuje se vstupy a výstupy PLC [4].

2.3

Datalogger

Datalogger je elektronické zařízení, které je schopno monitorovat a ukládat externí děje v daném časovém období. Každý datalogger je vybaven senzory, pomocí kterých se získávají data, která jsou nejčastěji přenášena v podobě napětí. Tato data jsou poté A/D převodníky transformována do digitálních hodnot, zpracována mikroprocesorem a následně uložena do vnitřní paměti.

Jedná-li se o samostatná zařízení, export dat probíhá např. výtiskem na papír.

Nejčastěji ale dataloggery přenášejí data do PC, kde může proběhnout jejich následná analýza a vyhodnocení. Komunikace je realizována např. pomocí technologie Ethernet, USB nebo dokonce i Wi-Fi. Některá zařízení disponují také LCD displejem, který má buď čistě informativní charakter tzn. zobrazuje uživateli data, anebo může být dotykový a uživatel tak smí zařízení také ovládat a konfigurovat. Dataloggery jsou také často programovatelné a nabízejí řadu nastavení. Například umožňují uživateli zadat, jak často mají být data vzorkována, ukládána atd. Dalším dělením těchto zařízení může být, zda jsou přenositelné či nikoliv.

(17)

Dataloggery mají velmi široké využití v mnoha oblastech. Běžně se používají např.

pro měření teploty, tlaku, vlhkosti nebo rychlosti větru. Mohou mít ale také specifičtější zaměření, které může být následující:

• měření životního prostředí, půdy a sklizně v reálném čase za účelem optimalizace přírodních zdrojů a zvýšení produktivity v zemědělství [5];

• vysokorychlostní měření akceleračních signálů lidského těla v normálním a rychlém pohybu za účelem charakterizovat amplitudy a frekvenční komponenty tohoto signálu pro další zpracování [3];

• nahrávání a analýza nitrolebečního tlaku a inteligentní stanovení diagnózy [6];

• monitorování dna oceánu a mikroseismická detekce [7];

• měření atmosférického elektrického pole v reálném čase [2].

Pojem datalogger nemusí vždy znamenat hotový hardwarový produkt, ale lze ho chápat i z jiného hlediska. Může to být také software, který je umístěn v konkrétním programovatelném zařízení, např. v PLC nebo PC, a celý systém řídí.

Pokud zařízení disponuje senzory, může softwarový datalogger opět monitorovat různé externí děje, ale také může sledovat děje interní, např. stav daného programu. Hlavní výhodou tohoto přístupu je především flexibilita. To znamená, že vnitřní program může být v závislosti na dané úloze měněn, ale okolní hardware zůstane stejný.

(18)

3 Použité technologie

V této části diplomové práce, pokud neuvedu jinak, především vycházím z nápovědy Automation Studia [3]. Popis daných technologií není vyčerpávající, a proto další informace související s danou problematikou mohou být nalezeny tam.

3.1

Automation Studio

Automation Studio je vývojové prostředí od společnosti B&R, určené především pro operační systémy Windows. Software slouží nejen pro vývoj a testování programů, ale také pro komunikaci s konkrétním PLC, nejčastěji pomocí technologie Ethernet. Cílovým zařízením může být i simulátor.

Toto vývojové prostředí je dnes již velmi rozsáhlé a obsahuje řadu funkcí a uživatelských nastavení. I přes svou robustnost nabízí dle mého názoru

přehledné, logicky uspořádané prostředí, takže i začátečník se v něm může rychle zorientovat a program začít používat.

3.2

Simulátor – ArSim

Simulátor, nesoucí název ArSim, je aplikace operačního systému Windows, která komunikuje s prostředím Automation Studio. Tato aplikace se může nacházet buď na stejném počítači, kde je nainstalováno zmíněné vývojové prostředí, nebo na počítači jiném. V takovém případě je komunikace zajištěna pomocí technologie Ethernet s protokolem TCP/IP. Simulátorů může být spuštěno na jednom operačním systému i několik.

Jak již z názvu vypovídá, simulátor slouží jako náhrada reálného zařízení a používá se nejčastěji z důvodu testování určitých částí programů, nebo z důvodů

výukových. Velkou výhodou tohoto virtuálního stroje je prakticky neomezený výkon, který je závislý pouze na výkonu PC, na kterém je spuštěn. Uživatel si může nastavit téměř libovolnou velikost paměti nebo frekvenci CPU. Od toho se také

(19)

odvíjí maximální perioda cyklických tříd. To může být programátorovi užitečné v případě, když potřebuje program otestovat před nasazením do reálného provozu.

3.3

Strukturovaný Text

Strukturovaný text, označený zkratkou ST, je programovací jazyk podle normy IEC 61131-3, který slouží pro popis algoritmů určených nejčastěji pro PLC. Zdrojový kód napsaný v ST se překládá pro cílovou architekturu. Syntakticky se velmi podobá jazykům Pascal nebo C a také obsahuje typovou kontrolu. Tento jazyk je velice vhodný pro práci s daty, řetězci, databázemi a pro naprogramování složitých výpočetních algoritmů. Používá se tedy například pro náročné zpracování analogových signálů [9].

3.4

DataObj

Tato knihovna je zaměřena na práci s datovými objekty, které představují jeden ze způsobů ukládání dat v PLC. Všechny možné operace knihovny jsou vykonávány dynamicky tzn. za běhu programu. Datový objekt si lze představit jako binární soubor, tedy proud bytů umístěných bezprostředně za sebou. Značnou výhodou takového ukládání informací je bezpečnost, a to ve smyslu persistence a konzistence dat. Operační systém PLC totiž automaticky vytváří zálohu každého datového objektu. Nastane-li nějaká havárie systému, např. výpadek elektrické energie, data mohou být po restartu opět obnovena.

Všechny datové objekty jsou také vybaveny informací o kontrolním součtu, který je operačním systémem cyklicky monitorován. Pokud například dojde k neautorizovanému přístupu přes pointery k datové oblasti objektu, systém zahlásí chybu a data zůstanou neporušena. Tuto volbu, tedy sledování kontrolního součtu, lze i vypnout, pak je ale konzistence dat na zodpovědnosti programátora.

Knihovna DataObj obsahuje celkem deset funkčních bloků, pomocí kterých lze s datovými objekty vykonávat různé operace. Zde se zmíním pouze o sedmi z nich, které v práci používám. Jsou jimi: DatObjCreate, DatObjDelete, DatObjRead, DatObjWrite, DatObjInfo, DatObjAttach, DatObjDetach.

(20)

3.4.1 DatObjCreate

Tento funkční blok slouží k vytváření datových objektů. Vykonávání této operace probíhá asynchronně. To znamená, že je provedena až po dokončení hlavního programu ve zbývajícím čase tzv. idle time. Je to z toho důvodu, že velikost vytvářených objektů může být i v desítkách až stovkách megabytů, a tudíž může tato operace trvat poměrně dlouhou dobu. A jelikož periody vykonávání programů bývají poměrně krátké (sekundy, milisekundy), nemuselo by se vytvoření objektu stihnout, a to by způsobilo kolaps operačního systému. Vytváření datového objektu může tedy v závislosti na velikosti trvat několik cyklů. Proto musí programátor zajistit, aby funkční blok byl volán v každém cyklu PLC.

Tab. 1 Parametry funkčního bloku DatObjCreate

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

grp I USINT skupinové ID pro datový objekt

pName I UDINT

(pointer na STRING) název datového objektu

len I UDINT velikost datového objektu

MemType I USINT typ paměti (viz výše)

Option I UDINT cyklická kontrola (viz výše)

pCpyData I UDINT

(pointer na UDINT)

ukazatel na data pro jejich zapsání do datového objektu

status O UINT udává status funkčního bloku

ident O UDINT identifikátor vytvořeného

datového objektu

pDatObjMem O UDINT ukazatel do datové oblasti objektu

(21)

Při konfiguraci funkčního bloku smí uživatel také zvolit, v jakém typu paměti bude datový objekt vytvořen (parametr MemType). V architekturách generace 4 (SG4) jsou podporovány tyto typy pamětí:

• DRAM – dynamická RAM,

• USERRAM – RAM zálohovaná baterií,

• USERROM – paměť typu ROM,

• SYSROM – systémová ROM.

Dále může programátor parametrem Option určit, zda má být monitorován kontrolní součet datového objektu (viz DataObj).

3.4.2 DatObjDelete

DatObjDelete je určen pro mazání datových objektů. Stejně jako předchozí funkční blok, je vykonáván asynchronně, a tedy musí být spouštěn v každém cyklu.

Tab. 2 Parametry funkčního bloku DatObjDelete

3.4.3 DatObjRead

Příslušný funkční blok slouží ke čtení dat z datového objektu.

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

ident I UDINT identifikátor datového objektu

status O UINT udává status funkčního bloku

(22)

Tab. 3 Parametry funkčního bloku DatObjRead

Důležitým parametrem je Offset. Pokud chceme z datového objektu číst data, musíme funkčnímu bloku přesně stanovit, kde tato data začínají, respektive jak jsou posunuty od začátku datového objektu. Abychom tedy mohli efektivně operaci čtení vykonávat, musíme mít někde, např. v poli, uloženou strukturu příslušného objektu tzn. počáteční adresy oblastí a také délky těchto oblastí. Tyto informace je dále nutné aktualizovat, pokud se data změní.

3.4.4 DatObjWrite

Pomocí funkčního bloku DatObjWrite je možné zapisovat data do datového objektu. Zde je důležité zmínit, že monitoring kontrolního součtu u příslušného objektu, nad kterým je operace zápisu prováděna, je vždy zapnutý, a to bez ohledu na nastavení datového objektu.

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

ident I UDINT identifikátor datového objektu

Offset I UDINT udává posun v datové oblasti

objektu

len I UDINT velikost čtených dat

pDestination I UDINT ukazatel do cílové oblasti pro načtení dat

status O UINT udává status funkčního bloku

(23)

Tab. 4 Parametry funkčního bloku DatObjWrite

Z výše uvedených parametrů vidíme, že jsou téměř identické s těmi u funkčního bloku DatObjRead. Výjimkou je pouze ukazatel pSource, který namísto cílové oblasti, kam mají být data načtena, ukazuje na oblast, odkud se data použijí pro zápis do datového objektu

3.4.5 DatObjAttach

Tento funkční blok se používá pro uzamknutí datového objektu. To slouží jako ochrana, aby nemohl být objekt smazán. Taková operace je zapotřebí v případě, jestliže je vypnutý monitoring kontrolního součtu u datového objektu a chceme přistupovat k jeho datové oblasti přímo přes ukazatele. Kdybychom objekt neuzamkli, mohlo by vlivem komunikace (monitor mód, PVI skripty, aj.), nebo explicitním zavoláním funkčního bloku DatObjDelete, dojít ke smazání datového objektu.

Operaci zamknutí si také můžeme představit jako způsob zajištění synchronizace. V tomto případě má operace velice blízko k semaforu, který je dobře znám v dnešních programovacích jazycích jako jedno ze synchronizačních

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

ident I UDINT identifikátor datového objektu

Offset I UDINT udává posun v datové oblasti

objektu

len I UDINT velikost čtených dat

pSource I UDINT ukazatel do oblasti zdroje dat pro operaci zápisu

status O UINT udává status funkčního bloku

(24)

primitiv, tedy prostředku k zajištění exkluzivního přístupu nebo k jeho omezení.

Zjednodušeně řečeno, semafor si lze představit jako čítač, který přičte 1, jestliže dojde k zamknutí objektu a naopak hodnotu 1 odečte po odemknutí. Stav čítače by se nakonec vždy měl vrátit na hodnotu 0. Po každé operaci zamknutí by měla být ihned volána operace odemknutí. Programátor by se měl také vyvarovat uzamykání objektu po dlouhé časové období.

Tab. 5 Parametry funkčního bloku DatObjAttach

3.4.6 DatObjDetach

Tento funkční blok slouží k odemknutí datového objektu po jeho zamknutí. Jak vidíme, je to přesně opačná operace, než kterou zajišťoval funkční blok DatObjAttach. Obě operace na sebe tedy navazují, a proto se používají v těsné blízkosti.

Tab. 6 Parametry funkčního bloku DatObjDetach

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

ident I UDINT identifikátor datového objektu

status O UINT udává status funkčního bloku

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

ident I UDINT identifikátor datového objektu

status O UINT udává status funkčního bloku

(25)

3.5

FileIO

Knihovna FileIO se používá pro práci se soubory a adresáři, a tím představuje další ze způsobů ukládání a práce s daty. Ve srovnání s knihovnou DataObj se FileIO liší v několika ohledech. Data nejsou ukládána přímo do paměti PLC, ale do externích zařízení, kterými mohou být např. Compact Flash, hard disk (PC) nebo USB paměť.

Z toho důvodu není a nemůže být prováděn cyklický monitoring kontrolního součtu jako u datových objektů, tedy není zajištěna taková bezpečnost. Na druhé straně skutečnost, že data mohou být přenášena do externích zařízení, uživateli dává nad nimi vyšší kontrolu. A také je poté může zpracovávat v kterémkoliv z dalších programů (Microsoft Excel, Matlab, GNU Octave aj).

Tato knihovna obsahuje celou řadu funkčních bloků. Je důležité zmínit, že téměř všechny pracují asynchronně (viz DatObjCreate), a to z toho důvodu, že komunikace s okolními zařízeními může probíhat relativně dlouhou dobu. Jelikož v této práci využívám jen některé funkční bloky z této knihovny, omezím se opět pouze na ně. Budu zde popisovat následující: DevLink, DevUnlink, FileCreate, FileDelete, FileOpen, FileClose, FileRead a FileWrite.

3.5.1 DevLink

Tento funkční slouží k navázání spojení s externím zařízením. To může být buď lokálního typu např. hard disk, nebo typu síťového tzn. server. Druhý z typů ale na simulátoru není podporován.

(26)

Tab. 7 Parametry funkčního bloku DevLink

Parametr pParam se používá k přesné lokalizaci zařízení. Musí být zadán ve formátu dle konkrétních pravidel, např. takto: /DEVICE=C:\\AsProjects\\Program.

Takový řetězec by odkazoval na lokální zařízení, disk C, adresář AsProjects a podadresář s názvem Program.

3.5.2 DevUnlink

Funkční blok DevUnlink je používán přesně z opačného důvodu než DevLink, tedy pro zrušení spojení s externím zařízením.

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

pDevice I

UDINT (ukazatel na

STRING)

uživatelem zvolené pojmenování zařízení

pParam I

UDINT (ukazatel na

STRING)

specifický řetězec pro navázání spojení s konkrétním zařízením

handle O UDINT identifikace konkrétního

zařízení pro zrušení spojení

status O UINT udává status funkčního bloku

(27)

Tab. 8 Parametry funkčního bloku DevUnlink

3.5.3 FileCreate

Uvedený funkční blok je určen k vytváření souborů. Předtím, než může být provedena příslušná operace, musí být pomocí funkčního bloku DevLink zajištěno spojení s konkrétním externím zařízením, aby bylo zřejmé, kam se má nový soubor vygenerovat. Dále je důležité zmínit, že operace vytvoření souboru ho také automaticky otevře. To je důležité pro operace čtení nebo zápisu dat.

Tab. 9 Parametry funkčního bloku FileCreate

V parametru pFile se nerozlišují velká písmena a může v něm být obsažena také cesta k souboru, která může vypadat následovně: program\novy_soubor.txt.

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

handle I UDINT identifikace konkrétního

zařízení pro zrušení spojení

status O UINT udává status funkčního bloku

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

pDevice I

UDINT (ukazatel na

STRING)

uživatelem zvolené pojmenování zařízení

pFile I

UDINT (ukazatel na

STRING)

název souboru

ident O UDINT ID vygenerovaného souboru

status O UINT udává status funkčního bloku

(28)

Důležitým parametrem je také ident, který značí identifikátor daného souboru. Ten je poté zapotřebí pro další operace. (čtení, zápis).

3.5.4 FileDelete

Funkční blok FileDelete je používán pro smazání souboru.

Tab. 10 Parametry funkčního bloku FileDelete

Parametr pName má zde stejný účel jako pFile u funkčního bloku FileCreate.

3.5.5 FileOpen

Tento funkční blok slouží k otevření již existujících souborů na externím zařízení.

Po každém otevření souboru je nutné zase soubor uzavřít, jelikož operační systém povoluje pouze omezený počet otevřených souborů.

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

pDevice I

UDINT (ukazatel na

STRING)

uživatelem zvolené pojmenování zařízení

pName I

UDINT (ukazatel na

STRING)

název souboru

status O UINT udává status funkčního bloku

(29)

Tab. 11 Parametry funkčního bloku FileOpen

Parametr mode určuje, které operace mohou být nad daným souborem vykonávány. Uživatel má na výběr celkem ze tří možností: pouze čtení (fiREAD_ONLY), pouze zápis (fiWRITE_ONLY) nebo čtení a zápis (fiREAD_WRITE).

3.5.6 FileClose

Následující funkční blok slouží k uzavření souboru po jeho otevření. Tato operace je nutná ze dvou důvodů. Za prvé, abychom neplýtvali omezený počet souborů, které je možno mít otevřeny najednou, a také proto, aby uživatel se souborem mohl pracovat. V případě, kdy by uzavřen nebyl, uživateli by jeho operační systém hlásil, že soubor je využíván jiným procesem.

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

pDevice I

UDINT (ukazatel na

STRING)

uživatelem zvolené pojmenování zařízení

pFile I

UDINT (ukazatel na

STRING)

název souboru

mode I USINT určuje práva pro čtení a zápis

ident O UDINT ID souboru

filelen O UDINT značí velikost souboru

status O UINT udává status funkčního bloku

(30)

Tab. 12 Parametry funkčního bloku FileClose

3.5.7 FileRead

Funkční blok FileRead je používán pro čtení dat ze souboru. Předtím, než je možno danou operaci vykonávat, musí být soubor pomocí funkčního bloku FileOpen nebo FileCreate otevřen. A jak již bylo řečeno, po skončení veškerých operací musí být soubor naopak uzavřen.

Tab. 13 Parametry funkčního bloku FileRead

Data souborů se berou jako binární. Jejich čtení tedy probíhá velmi podobně jako čtení dat z datových objektů (viz DatObjRead).

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

ident I UDINT ID souboru

status O UINT udává status funkčního bloku

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

ident I UDINT ID souboru

Offset I UDINT posun v datové oblasti souboru pDest I UDINT (ukazatel na

STRING) adresa cíle pro načtení dat

len I UDINT délka čtených dat

status O UINT udává status funkčního bloku

(31)

Jako u datových objektů, i zde platí, že pro správné čtení dat ze souboru bychom měli mít někde uloženou jeho strukturu, a tu pak průběžně aktualizovat.

3.5.8 FileWrite

Tento funkční blok slouží pro zápis dat do souboru. Pro tuto operaci platí z hlediska způsobu práce s daty identické informace jako pro čtení dat ze souboru.

Tab. 14 Parametry funkčního bloku FileWrite

3.6

SYS_Lib

SYS_Lib je systémová knihovna, která obsahuje řadu funkcí a funkčních bloků pro správu paměti a práci s operačním systémem. Ne všechny jsou ale podporovány na nejnovější architektuře SG4. Některé z nich jsou určené pouze pro architektury starší (SG3, SGC), nebo jsou nahrazeny a umístěny v nových knihovnách. Zde se zaměřím pouze na tři funkce, které ve své práci využívám. Tyto programové celky slouží pro dynamickou práci s proměnnými, které se často označují zkratkou PV (z anglického process variable). Všechny z nich jsou na SG4 podporovány. Budu popisovat následující funkce: PV_ninfo, PV_item a PV_xgetadr.

Název I/O Datový typ Popis

enable I BOOL indikuje povolení funkčního

bloku

ident I UDINT ID souboru

Offset I UDINT posun v datové oblasti souboru pSrc I UDINT (ukazatel na

STRING) adresa zdroje dat pro zápis

len I UDINT délka zapisovaných dat

status O UINT udává status funkčního bloku

(32)

3.6.1 PV_ninfo

Pomocí funkce PV_ninfo lze získat o proměnných následující informace: datový typ, délku a dimenzi. Proměnná může být jednoduchého datového typu nebo polem takových typů, strukturou nebo polem struktur.

Tab. 15 Parametry funkce PV_ninfo

Parametr pv_name musí být zadán v určitém tvaru, a to v závislosti na tom, o jaký typ proměnné se jedná. Ta může být buď lokální nebo globální. Jestliže se jedná o první typ, před název samotné proměnné musíme vložit ještě název programu, ve kterém se proměnná nachází a oddělit dvojtečkou. Takový řetězec může vypadat například takto: HlavniProgram:promenna1. Pokud se jedná o typ druhý, v řetězci musí být jen samotný název proměnné. Dále je do řetězce možno pomocí speciálních značek vkládat upřesňující informace k proměnným. Tak můžeme specifikovat, že chceme pouze třetí prvek pole či konkrétní položku struktury, nebo také, že proměnná je typu ukazatel atd.

Datový typ u parametru data_typ_p je uveden v číselné podobě. Každé číslo pak symbolizuje jeden datový typ. Přehled všech typů nalezneme v následující tabulce.

Název I/O Datový typ Popis

pv_name I UDINT (ukazatel

na STRING) značí název proměnné data_typ_p I UDINT (ukazatel

na stejný typ) číslo udávající datový typ data_len_p I UDINT (ukazatel

na stejný typ) velikost proměnné dimension_p I UINT (ukazatel na

stejný typ)

počet prvků pole nebo struktury

status O UINT udává status funkce

(33)

Tab. 16 Přehled datových typů s jejich číselným vyjádřením a popisem

Hodnota Datový typ Popis

0, 15 složený 0 – struktura, 15 – pole struktur

1 BOOL bool hodnota (TRUE/FALSE, 8 bitů)

2 SINT znaménkové celé číslo (8 bitů)

3 INT znaménkové celé číslo (16 bitů)

4 DINT znaménkové celé číslo (32 bitů) 5 USINT neznaménkové celé číslo (8 bitů) 6 UINT neznaménkové celé číslo (16 bitů) 7 UDINT neznaménkové celé číslo (32 bitů) 8 REAL číslo s pl. řád. čárkou (32 bitů)

9 STRING řetězec (znak = 1 byte)

11 DATE_AND_TIME datum a čas (32 bitů)

12 TIME čas (32 bitů)

13 DATE Datum (32 bitů)

14 LREAL číslo s pl. řád. Čárkou (64 bitů) 16 TIME_OF_DAY čas dne (32 bitů)

17 BYTE řetězec bitů (délka 8)

18 WORD řetězec bitů (délka 16)

19 DWORD řetězec bitů (délka 32)

21 WSTRING Řetězec (znak = 2 byte)

(34)

3.6.2 PV_item

Tuto funkci můžeme využít, chceme-li zjistit názvy položek struktury a příslušné indexy jejích prvků.

Tab. 17 Parametry funkce PV_item

Parametr itemname nesmí být delší než 32 znaků, jinak je řetězec oříznut na maximální povolenou délku a systém generuje chybu.

3.6.3 PV_xgetadr

Předchozí dvě funkce nám poskytly téměř všechny důležité informace, které potřebujeme o proměnné znát, abychom s ní mohli plně dynamicky pracovat.

Zbývá poslední údaj, který nám poskytuje funkce PV_xgetadr. Je jím adresa v paměti, na které se proměnná nachází. Tato informace je nezbytná a řekl bych dokonce klíčová pro práci s proměnnou za běhu PLC. Funkce poskytuje ještě další informaci, kterou je délka proměnné, ale tu nám již může zajistit funkce PV_ninfo.

Záleží na tom, jaké informace potřebuje uživatel o proměnné znát. Někdy může stačit pouze adresa a délka. Taková situace může nastat, když programátor potřebuje proměnnou pouze ukládat např. do datového objektu a poté ji zase z objektu číst. Pokud by ale programátor chtěl data také ukládat řekněme do souboru, a to v čitelné znakové podobě, musel by znát o proměnných ještě nejen

Název I/O Datový typ Popis

data_typ_p I UDINT (ukazatel na

stejný typ) číslo udávající datový typ

index I UINT index příslušného prvku

itemname I UDINT (ukazatel na

STRING) název příslušného prvku

status O UINT udává status funkce

(35)

datový typ na přetypování, ale také jejich strukturu v případě, že by se jednalo o data složeného typu.

Tab. 18 Parametry funkce PV_xgetadr

Název I/O Datový typ Popis

pv_name_p I UDINT (ukazatel na

STRING) značí název proměnné pv_address I UDINT (ukazatel na

stejný typ) adresa proměnné data_len_p I UDINT (ukazatel na

stejný typ) délka proměnné v bytech

status O UINT udává status funkce

(36)

4 Struktura systému a datalogger

Datalogger disponuje celkem dvanácti kanály, a to znamená, že uživatel může najednou zvolit 12 proměnných jednoduchého datového typu, které mají být monitorovány a jejich hodnoty ukládány. Minimální perioda, se kterou může probíhat vzorkování, činí 10ms. Naopak maximální teoreticky omezena není.

Z praktického hlediska ale nemá smysl, aby data byla snímána např. jednou za týden nebo měsíc, a tedy pomyslná hranice zde samozřejmě vyvstává. Záleží na tom, jaké děje mají být monitorovány a jak rychle se mění. Například pohyb a kontrola výrobků (odpory, kondenzátory, aj.) může na výrobní lince probíhat poměrně rychle. Naopak teplota v místnosti se zase tak rychle měnit nebude, a tedy vzorkování dat zde bude možné vykonávat s delší periodou.

Datalogger poté může běžet v nějakém z uživatelových programů na konkrétním PLC. Konkrétní data, v případě monitorování externích dějů, jsou v podobě napětí přiváděna na analogové nebo digitální periferie programovatelného automatu, a poté za pomocí A/D převodníků převedena na digitální hodnoty.

Odtud jsou data převzata a dále zpracována dataloggerem. Ve druhém případě, jestliže se jedná o data interní či lokální (např. data konkrétního programu), jsou tato data ihned zpracovávána dataloggerem.

Datalogger běžící na PLC poté komunikuje nejčastěji pomocí technologie Ethernet a protokolu TCP/IP s konkrétním uživatelským počítačem. Uživatel odtud může konfigurovat a zadávat příkazy programovatelnému automatu, a také od něj přebírat výsledná data. Příslušné ovládání probíhá pomocí monitor módu Automation Studia.

Nyní jsem popsal, jak by měl datalogger fungovat v praxi. Nicméně v této práci je program vyvíjen a testován pouze na simulátoru (viz Simulátor – ArSim). To znamená, že vše běží na jednom počítači. Z toho důvodu odpadá komunikace mezi PC a PLC, data pro monitoring jsou vytvořena uměle, a jejich vývoj simulován stejným způsobem. Na použití dataloggeru to ale nemá v praxi téměř žádný vliv. Do

(37)

jeho programu, který je navržen obecně, by se nemuselo vůbec zasahovat, ale určitě by musel být testován na reálném zařízení před použitím.

Kompletní struktura systému, tak jak by vypadala v reálném použití, je znázorněna na následujícím obrázku.

Obr. 2 Struktura celého systému v reálném použití

(38)

5 Návrh a implementace

5.1

Knihovna DataMng

Tato knihovna, kterou jsem vytvořil, slouží pro různé způsoby práce s daty. Odtud jsem vybral název DataMng (z anglického Data Management). Knihovna obsahuje celkem 6 programových celků, z toho 2 funkce a 4 funkční bloky. Funkce mají název DmngStrReplace a DmngToStr, a jsou zaměřeny především na práci s řetězci.

Zbývající obsah knihovny tvoří funkční bloky, mezi kterými je také datalogger.

Tyto funkční bloky, orientované hlavně na operace s daty, mají následující názvy:

DmngDataRec, DmngDataObj, DmngFileIO a DmngVarsInfo.

Můžeme si všimnout, že všechny programové celky obsahují prefix Dmng, který značí zkratku názvu knihovny. Je to z toho důvodu, že všechny názvy funkcí a funkčních bloků musejí být napříč všemi knihovnami unikátní, tedy sdílejí stejný jmenný prostor.

Nyní se zaměřím na každý programový celek knihovny zvlášť. Budu postupovat tak, že nejprve popíšu ostatní funkce a funkční bloky, a na závěr samotný datalogger. Ten totiž vnitřně pracuje se všemi ostatními prvky knihovny.

5.1.1 DmngStrReplace

Funkce DmngStrReplace slouží k nahrazení jednoho nebo všech výskytů nějakého znaku jiným znakem.

(39)

Tab. 19 Parametry funkce DmngStrReplace

Parametry charOrig a charNew se předávají jako reference. To znamená, že musí být zadána jejich adresa. Parametr status může nabývat hodnoty buď -1, když uživatel zadá chybný vstup, resp. nulovou adresu, nebo hodnot větší rovno nule. To znamená, že funkce proběhla v pořádku. V tomto případě je vrácen počet úspěšně naleznutých a nahrazených znaků.

Princip

Ve funkci jsou použity tyto vnitřní proměnné:

• i – slouží pro řízení iterací cyklů (UDINT),

• char – obsahuje vždy jeden znak řetězce (ukazatel na typ USINT),

• replCharNum – uchovává aktuální hodnotu o počtu doposud nahrazených znacích (UINT),

• strLen – udává délku řetězce (UDINT).

Práci algoritmu můžeme rozdělit do 6 bodů:

1. Zkontroluj vstup (str, charOrig, charNew musejí být různé od 0). Pokud je chybný, postup na bod 5.2. Jinak pokračuj bodem 2.

Název I/O Datový typ Popis

str I UDINT (ukazatel na

STRING) zdrojový řetězec charOrig I USINT (reference) původní znak charNew I USINT (reference) nový znak

allOccur I BOOL náhrada jednoho znaku nebo

všech

status O DINT udává status funkce

(40)

2. Jestliže nejsi na konci řetězce, iteruj přes každý znak. Hledej takový, který se má nahradit (charOrig). Jinak jdi na bod 5.1.

3. Nalezneš-li takový znak, nahraď ho znakem novým (charNew) a zvyš počet úspěšně nahrazených znaků v řetězci (replCharNum).

4. Jestliže se mají nahrazovat všechny znaky (allOccur = TRUE), pokračuj body 2 a 3. Jinak pokroč na bod 5.1.

5. Vrať výsledek:

5.1. Počet úspěšně nahrazených znaků (replCharNum).

5.2. Chybnou návratovou hodnotu (-1) a ukonči svoji činnost.

Ukázka volání funkce

retezec := "Abrakadabra"; //(typu STRING[11])

DmngToStr(ADR(retezec), ADR("a"), ADR("X"), TRUE);

//výsledek: pDest = AbrXkXdXbrX, replCharNum = 4

DmngToStr(ADR("Abrakadabra"), ADR("a"), 0, TRUE);

//výsledek: pDest = Abrakadabra, replCharNum = -1

Obr. 3 Ukázka zdrojového kódu v jazyce ST – volání funkce DmngStrReplace

5.1.2 DmngToStr

Tato funkce je určena pro přetypování hodnot téměř všech datových typů do typu STRING a přidání do řetězce. Je na zodpovědnosti programátora, aby zajistil, že v cílovém řetězci je dostatek místa pro uloženích zdrojových dat. Funkce totiž nemůže zjistit celkovou velikost řetězce. Pokud by byla velikost překročena, mohlo by dojít k systémové chybě z důvodu neautorizovaného přístupu k paměti.

(41)

Povolené datové typy jsou následující: BOOL, SINT, INT, DINT, USINT, UINT, UDINT, DATE_AND_TIME, TIME, DATE, TIME_OF_DAY, REAL a STRING. Jestliže uživatel použije jiný datový typ, funkce skončí s chybovou návratovou hodnotou.

Tab. 20 Parametry funkce DmngToStr

Pomocí parametru delimiter lze vložit za výsledný řetězec dodatečné znaky, které mohou sloužit např. jako oddělovače.

Parametr offsetCalc umožňuje uživateli vybrat si, zda má být automaticky počítána velikost původního řetězce. Při kladné volbě (TRUE) se zdrojová data (pSrc) připojí automaticky na konec řetězce. Tato možnost má ale výrazný vliv na výkon, jestliže cílový řetězec je vyšší délky (např. 20 000 bytů a více). Hodí se tedy spíše pro menší data. V opačném případě (hodnota FALSE) místo, odkud se v původním řetězci začne zapisovat, musí uživatel určit sám.

Parametr status nabývá hodnoty -1 při chybném vstupu (nulová adresa některého z parametrů), nebo počtu úspěšně zapsaných znaků (může být i 0).

Princip

Název I/O Datový typ Popis

pDest I UDINT (ukazatel na

STRING) značí adresu cílového řetězce

pSrc I

UDINT (ukazatel na libovolný datový

typ)

značí adresu zdrojových dat

dataType I UDINT udává číselné vyjádření

datového typu delimiter I UDINT (ukazatel na

STRING) možná přípona za řetězcem;

offsetCalc I BOOL automatický výpočtu posunu

status O DINT udává status funkce

(42)

• <type>Var – slouží pro dočasné uchování hodnoty příslušného typu (<type> – jakýkoliv povolený typ),

• offset – určuje posun v řetězci (UDINT),

• wrCharNum – značí počet úspěšně zapsaných znaků (UDINT),

• str – pro dočasné uložení řetězce (STRING[250]).

Algoritmus pracuje následujícím způsobem:

1. Zkontroluj vstup (pDest, pSrc musejí být různé od 0). Pokud je chybný, běž na bod 6.2. Jinak pokračuj bodem 2.

2. Dle příslušného datového typu (dataType) zvol jednu ze čtyř strategií přetypování a vložení do řetězce.

3. Zkopíruj data (pSrc), přetypuj (je-li nutné) do typu STRING a spočítej délku těchto dat (wrCharNum).

4. Vlož nový řetězec do cílového řetězce (pDest) na adresu poskytnutou uživatelem, nebo na adresu automaticky vypočítanou (tj. na konec řetězce).

Druhou možnost využij v případě, je-li je aktivní parametr offsetCalc (TRUE).

5. Jestliže je poskytnut parametr delimiter (adresa různá od 0) a není prázdný, přidej za výsledný řetězec ještě tento a jeho délku připočítej do celkové počtu zapsaných znaků (wrCharNum). Je-li aktivní možnost offsetCalc, postupuj stejně jako v bodě 4.

6. Vrať výsledek:

6.1. Počet úspěšně zapsaných znaků (wrCharNum) a ukonči svoji činnost.

6.2. Chybový výstup (-1).

Volba strategie přetypování a vložení do řetězce závisí na charakteru dat. Jestliže chce uživatel vložit do řetězce data typu STRING, jde o pouhé spojení řetězců.

V tomto případě není nutné data přetypovávat. Ve všech ostatních to ale již zapotřebí je. V každé strategii nám jde o totéž. Data o velikosti příslušného

(43)

datového typu zkopírovat, uložit do proměnné (<type>Var), tato data přetypovat do typu STRING a zkopírovat do výsledného řetězce.

Pro manipulaci s řetězci využívám funkce z knihovny ArBrStr. Konkrétní přetypování zajišťuji, pokud to lze, vestavěnými funkcemi určené pro tento účel.

Jde například o brsitoa (celočíselné znaménkové typy) nebo brsftoa (datové typy s plovoucí řádovou čárkou). Tyto funkce ale mají jisté omezení, a to především z hlediska velikosti datových typů, které mohou být použity pro operaci přetypování.

Datový typ UDINT má rozsah hodnot větší, a proto již nelze vestavěné funkce použít. Přetypování by bylo chybné. U těchto typů se musí využít přetypování pomocí operátorů jazyka. Poté je ještě nutné vypočíst délku nově vzniklého řetězce, jelikož operátory převádějí do typu STRING tak, že délka nově vzniklého řetězce je 80. To znamená, že v něm jsou také bílé znaky, které samozřejmě do výsledku nechceme. Na závěr vložíme tento upravený řetězec (str) do řetězce výsledného (pDest).

U datových typů kategorie datum a čas (např. TIME, DATE_OF_TIME, aj.) se postupuje stejně, jak jsem popsal v předešlém odstavci. Nicméně je zde zapotřebí ještě jeden krok navíc. Datové typy této kategorie totiž obsahují kromě jejich hodnoty určitý prefix, který znázorňuje jejich typ (např. TIME – T#, DATE_OF_TIME – DT#, atd.). Tyto předpony je třeba odfiltrovat. Toho docílíme tak, že si vypočítáme délky těchto prefixů (offset) a při kopírování do výsledného řetězce (pDest) začneme nový řetězec (str) kopírovat až od adresy posunuté o tuto délku.

Ukázka volání funkce

retezec := "retezec"; //(typu STRING[20]) hodnota := T#2500ms; //(typu TIME)

DmngToStr( ADR(retezec), ADR(hodnota), 2, ADR("Postfix"), TRUE);

(44)

//výsledek: "retezec2500msPostfix", wrCharNum = 8

Obr. 4 Ukázka zdrojového kódu v jazyce ST – volání funkce DmngToStr

5.1.3 Struktura funkčních bloků a chybové stavy

Základní struktura programu je u jednotlivých funkčních bloků vždy stejná. Taktéž chybové stavy jsou řešeny stejným způsobem. A proto tuto část zde uvedu přednostně a později se na ní budu odkazovat. Pokud nastane změna či odchylka v nějaké z částí, u konkrétního funkčního bloku na ní upozorním.

Celý program funkčního bloku můžeme rozdělit na tři části. V části první probíhá kontrola, zda uživatel nezadal reset chyby (errwarReset). Jestliže ano, veškeré informace spjaté s chybovým stavem jsou nastaveny na výchozí hodnotu.

V části druhé probíhá vyhodnocení a zpracování příkazů od uživatele, pokud je ale funkční blok uživatelem povolen (enable) a nenastala žádná chyba (typu error).

Nejprve se kontroluje, zda uživatel zadal nějaký příkaz (cmd). Pokud ne, funkční blok skončí svou činnost. Jestliže ano, pokračuje se do konkrétní sekce, která zajišťuje vykonání příslušného operace. Způsob vykonávání operací se u každého funkčního bloku již liší. Proto se této části budu vždy věnovat podrobněji u příslušného programového celku. Část třetí slouží k informování uživatele o chybě, tedy nastavují se zde všechny proměnné, které se k tomuto účelu využívají (errwarOccur, errwarInfo, …).

Dojde-li během vykonávání funkčního bloku k nějaké chybě, výstupní parametr errwarOccur se nastaví do logické 1. Bližší informace k chybě lze poté nalézt v parametru errwarInfo, kde je uveden typ chyby a slovní zpráva o problému. Typy chyb jsou celkem tři: info, warning a error. První typ slouží pouze k informování uživatele, nastane-li nějaká méně významná událost ve funkčním bloku. Druhý typ chyby může nastat v situaci, jestliže uživatel zapomene zadat nějaký z parametrů funkčního bloku, které ale nejsou nutné k vykonání funkčního bloku. Pouze informují uživatele, že se například použijí výchozí hodnoty pro tyto

(45)

parametry. Error je nejzávažnějším typem chyby a uživatel by jí měl věnovat velkou pozornost. Jedná se o chybu, která vznikne v případě, když je zadána chybná hodnota příslušného parametru tzn. například chybný datový typ či překročení limitu.

Když se uživatel seznámil s danou chybou, může provést potřebné kroky k jejímu odstranění, tedy např. zadá správné hodnoty parametrů atd. Před pokračováním v další práci musí uživatel chybu resetovat, jestliže se jedná o typ error. To provede nastavením vstupního parametru errwarReset do logické 1.

Jestliže se uživatel pokusí pracovat s funkčním blokem dál (např. zadání příkazu) bez patřičného resetu chyby, jeho příkazy budou ignorovány do doby, než tak učiní.

(46)

Obr. 5 Základní struktura programu funkčních bloků knihovny DataMng

5.1.4 DmngVarsInfo

DmngVarsInfo je funkční blok, který pracuje asynchronně. Lze ho využít v případě, když potřebujeme o konkrétní proměnné za běhu programu získat informace, kterými jsou: adresa, velikost, datový typ, název. Ta nemusí být pouze jednoduchého datového typu, ale také složeného, tedy struktura.

(47)

Tab. 21 Parametry funkčního bloku DmngVarsInfo

Parametry varsLimit a dimStrLimit umožňují nastavit maximální počet proměnných, které mají být zpracovány a také maximální počet počtu prvků struktury. Jeden prvek znamená jednu proměnnou jednoduchého datového typu.

Taková omezení může uživatel chtít v případě, zadává-li robustnější strukturu u které neví, kolik má celkem prvků. Zmíněné parametry nejsou povinné. Jestliže je

Název I/O Datový typ Popis

enable I BOOL povolení funkčního bloku

cmd I ViCmdType (viz

Struktury) značí možné příkazy pNamePV I UDINT (ukazatel na

STRING) udává název proměnné

varsLimit I USINT limit počtu proměnných v

jedné dávce

dimStrLimit I USINT limit počtu prvků pole nebo struktury v jedné dávce

errwarReset I BOOL umožňuje resetovat chybový

stav varsInfoArray O VivarsInfoType[0..255]

(viz Struktury)

výsledné pole s informacemi o proměnných

foundVarsNum O UINT udává počet zpracovaných

proměnných

errwarOccur O BOOL indikuje vznik chyby

erwarInfo O ViErrorWarningType (viz Struktury)

doplňující informace k chybě (pokud nastala)

status O UINT udává status funkčního bloku

(48)

uživatel nechá prázdné, budou zvoleny maximální možné hodnoty těchto parametrů, tedy varsLimit = 255 a dimStrLimit = 10.

Výsledné pole proměnných – varsInfoArray po úspěšném dokončení funkčního bloku obsahu obsahuje nalezené informace o proměnných (adresa, délka, datový typ, název). Platí opět, že co jeden prvek pole, to informace o jedné proměnné jednoduchého typu. Počet prvků v poli je poté možné zjistit z výstupního parametru foundVarsNum.

Parametry spjaté s chybovým stavem (errwarOccur, errwarInfo, errwarReset) zde fungují standardně (viz Struktura funkčních bloků a chybové stavy).

Informace o složených datových typech mohou být nalezeny v přidané nápovědě ke knihovně DataMng.

Princip

Dále se budu věnovat podrobněji fungování algoritmu. V průběhu budu popis také doplňovat o názvy proměnných, které jsou pro danou problematiku použity v programu. Buď se bude jednat o vstupní nebo výstupní proměnné, nebo o proměnné vnitřní, u kterých budu používat zkrácený prefix – i (v programu označeno internal). Důležité vnitřní proměnné jsou tyto:

• cmd – vnitřní stavy programu (ViVarsInfoEnum),

• temp – dočasné proměnné pro výpočty v programu (ViTempType)

• info – informace o programu (ViInfoType),

• varsLimit – omezení počtu proměnných od uživatele (UINT),

• dimStrLimit – omezení počtu dimenzí od uživatele (USINT).

Nyní se zaměřím na hlavní část programu (viz Struktura funkčních bloků a chybové stavy). Zde je nejprve zkontrolován vstup (např. cmd.pNamePV, cmd.varsLimit, ...). Po úspěšném ověření vstupu se nastaví všechny vnitřní proměnné potřebné k výpočtu (i.temp) na výchozí hodnotu.

(49)

Dále program pokračuje dle algoritmu, který pracuje na velmi podobném principu jako algoritmus průchodu do hloubky (DFS). Pro zjišťování informací o proměnných využívám funkce PV_ninfo, PV_item a PV_xgetaddr (viz SYS_Lib).

Jestliže uživatel zadá proměnnou jednoduchého typu, tedy její dimenze je 1, proměnná se ihned uloží do výsledného pole (varsInfoArray). Pokud ale je dimenze proměnné větší než 1, tedy složeného typu (např. struktura), je uložena na zásobník (i.temp.stack) a začnou se procházet jednotlivé její prvky. Pokud je prvek opět složeného typu, uloží se taktéž na zásobník a budou se procházet jeho prvky.

Tímto způsobem bude algoritmus postupovat, než narazí na proměnnou jednoduchého typu a pokud nebyl doposud překročen limit dimenzí (i.dimStrLimit) tzn. vnoření struktury.

Informace o proměnné dimenze 1 se poté uloží do výsledného pole (varsInfoArray). V tuto chvíli se pokračuje první položkou na zásobníku. Jestliže doposud nebylo dosaženo maximální dimenze, vybere se následují prvek této položky, resp. struktury a pokračuje se způsobem, jak bylo popsáno pár okamžiky (než je nalezena proměnná jednoduchého typu). Pokud již byly všechny prvky struktury zpracovány, tato struktura se odstraní ze zásobníku a program pokračuje následující položkou na vrcholu zásobníku. Vše se opakuje do chvíle, než je zásobník prázdný, nebo došlo k překročení některého z limitů.

Zásobník tedy slouží pro dočasné uložení informací o právě procházené dimenzi struktury, názvu prvku a jeho indexu v rámci této dimenze. Taková situace nastane, jestliže nějaký z prvků příslušné dimenze struktury je složeného typu.

V tom případě je tento prvek zpracován přednostně. Po jeho dokončení program pokračuje procházením zbývajících prvků předchozí dimenze struktury. Jinými slovy lze říci, že počet položek na zásobníku (i.temp.stackItemsNum) také udává míru zanoření konkrétní struktury.

V průběhu algoritmu je taktéž zapotřebí měnit název proměnné (i.temp.itemName), o které mají být nalezeny informace, pokud se jedná o strukturu. Tu můžeme reprezentovat např. stromovým rozložením, kde každé patro stromu bude symbolizovat příslušnou dimenzi struktury. Každý uzel bude

(50)

poté obsahovat konkrétní název jejího prvku včetně názvů předchozích prvků (oddělených tečkou), tedy rodičů. Pohybem ve stromu směrem vzhůru se název zkracuje, při pohybu směrem dolů se naopak prodlužuje.

Celý algoritmus lépe ilustruje následující obrázek. Schéma programu je orientované směrem dolů. To je znázorněno šipkami po levé straně. Jednotlivé kroky programu jsou očíslovány. Vstupem je struktura a výstupem její nalezené proměnné, které jsou jednoduchého typu. Tučně jsou vyznačeny důležité informace. Zásobník je zde zjednodušený, resp. jsou v něm pouze názvy prvků struktury, ačkoliv ve skutečnosti obsahuje také informace o indexu prvku a jeho dimenzi.

(51)

Obr. 6 Grafické znázornění práce algoritmu funkce DmngVarsInfo

References

Related documents

Volbou „Databáze FreeNormy“ se objeví uživateli hlavní obrazovka programu, kde uživatel může prohlížet a editovat katalogy, kterými program disponuje.. Může

Hodnocen´ı navrhovan´ e vedouc´ım bakal´ aˇ rsk´ e pr´ ace: výborně Hodnocen´ı navrhovan´ e oponentem bakal´ aˇ rsk´ e pr´ ace:?. Pr˚ ubˇ eh obhajoby bakal´ aˇ rsk´

Jak již bylo e eno, p ístroj AIRUN dokáže m it i velmi malé hodnoty propustnosti, proto byla prodyšnost nam ena u dalších dvou vzork , což je znázorn no na grafu .4.

Záporem poskytování terénní péče je, že uživatel může trpět sociálním osaměním, může být ohrožen nebezpečím vzniklým nenadálou situací (např. upadnutí,

Jsou definovány jako proměnné, které reprezentují jednoduchý datový prvek jednoho z elementárních datových typů nebo uživatelského datového typu.. Reprezentace

V tomto případě parametr pvArg1 je Interpretován jako ukazatel na pole proměnných typu long obsahujících lokalizační IDs, a parametr pvArg2 je interpretován jako ukazatel na

Obecně budu postupovat nejprve určením parciálních derivací zadané funkce. Dále počítám takto vzniklou soustavu rovnic, kde řešením jsou stacionární body. Pomocí

Správa souborů obsahuje funkční bloky, které vykonávají procesy potřebné k vytváření nových souborů, přejmenování, kopírování, přesouvání a mazání