Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
cs:sw:01-mervis:connecting-to-modbus-slave-device-hidden [2020/03/03 11:01] jan_kozak [Připojení se k Modbus RTU slave zařízení] |
cs:sw:01-mervis:connecting-to-modbus-slave-device-hidden [2021/09/15 14:51] (current) avsetula [Připojení skrze protokol Modbus] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | FIXME - dopřeložit | ||
====== Připojení skrze protokol Modbus ====== | ====== Připojení skrze protokol Modbus ====== | ||
- | + | <WRAP group> | |
- | Jedním z nejčastějších úkonů v průmyslové automatizaci je nastavování komunikace za pomoci komunikačního protokolu Modbus. | + | <WRAP half column 81%> |
+ | Jedním z nejčastějších úkonů ve vývoji průmyslové automatizace je nastavení komunikace za pomoci komunikačního protokolu Modbus. | ||
+ | </WRAP> | ||
+ | <WRAP half column 15%> | ||
+ | ;;# | ||
+ | <html><span class="dev-tag dev-patron">Patron</span></html> \\ | ||
+ | <html><span class="dev-tag dev-neuron">Neuron</span></html> \\ | ||
+ | <html><span class="dev-tag dev-gate">Gate</span></html> \\ | ||
+ | <html><span class="dev-tag dev-unipi11">Unipi 1.1</span></html> \\ | ||
+ | <html><span class="dev-tag dev-axon">Axon</span></html> | ||
+ | ;;# | ||
+ | </WRAP> | ||
+ | </WRAP> | ||
===== Připojení se k Modbus RTU slave zařízení ===== | ===== Připojení se k Modbus RTU slave zařízení ===== | ||
Line 42: | Line 53: | ||
Název by měl odrážet účel či umístění zařízení, nikoliv pouze tovární označení. Pokud chcete odečítat údaje z rozvaděče vybaveného více elektroměry, doporučujeme každý z nich pojmenovat podle okruhu, na kterém provádí měření, tj. například **energyMeterL1**. | Název by měl odrážet účel či umístění zařízení, nikoliv pouze tovární označení. Pokud chcete odečítat údaje z rozvaděče vybaveného více elektroměry, doporučujeme každý z nich pojmenovat podle okruhu, na kterém provádí měření, tj. například **energyMeterL1**. | ||
</WRAP> | </WRAP> | ||
+ | |||
===== Konfigurace ===== | ===== Konfigurace ===== | ||
Line 53: | Line 65: | ||
{{ :en:sw:01-mervis:inepro-pro1-mod.jpg?direct&500 |}} | {{ :en:sw:01-mervis:inepro-pro1-mod.jpg?direct&500 |}} | ||
- | Jako první krok doporučujeme pročíst si {{ :en:sw:01-mervis:pro1-user-manual-v2.18.pdf|manuál}}. Informace z něj jsme již využily - rychlost a nastavení sériové linky má být 9600 bps s 8 datovými bity, sudou paritou a jedním stop bitem. Výchozí Modbus ID je dle manuálu **1**, elektroměr ale je nastavený na **31**. V manuálu se dozvíte i to, jak toto číslo získat přímo z elektroměru. | + | Jako první krok doporučujeme pročíst si {{ :en:sw:01-mervis:pro1-user-manual-v2.18.pdf|manuál}}. Informace z něj jsme již využily - rychlost a nastavení sériové linky má být 9600 bps s 8 datovými bity, sudou paritou a jedním stop bitem. Výchozí Modbus adresa je dle manuálu **1**, náš elektroměr je ale nastavený na **31**. V manuálu se dozvíte i to, jak toto číslo získat přímo z elektroměru. |
Na straně 25 naleznete kompletní seznam registrů Modbus, jejich adresy, hodnoty a velikosti. Jako první budeme vyčítat proudové napětí. | Na straně 25 naleznete kompletní seznam registrů Modbus, jejich adresy, hodnoty a velikosti. Jako první budeme vyčítat proudové napětí. | ||
Line 77: | Line 89: | ||
{{ :en:sw:01-mervis:connecting-to-modbus-slave-10-add-group.png?direct |}} | {{ :en:sw:01-mervis:connecting-to-modbus-slave-10-add-group.png?direct |}} | ||
- | Objeví se nová skupina s názvem **Skupina**, společně s ní také vznikly tři **datové body**. Klikněte na řádek se jménem **Skupina** a v panelu **Vlastnosti** název změňte na něco více popisného. Rozsah adres zvolíme dle manuálu k elektroměru (tj. 5000 - 5000B). V sekci **Vlastnosti skupiny** je třeba specifikovat číslo prvního registru neboli **počátečního prvku**. Jak jsme zjistili výpočtem výše, **počátečním prvek** pro registr **Voltage** je 20481. Funkce je nastavena na **F03 Read Holding Register**. **Počet prvků** udává počet registrů, které chceme ze slave zařízení do skupiny vyčítat, abychom je mohli později převést na datové body. Vyberte číslo 12, neboť budeme později chtít zároveň odečítat **napětí**, **frekvenci** a **proud**. | + | Objeví se nová skupina s názvem **Skupina**, společně s ní také vznikly tři **datové body**. Klikněte na řádek se jménem **Skupina** a v panelu **Vlastnosti** název změňte na něco více popisného. Rozsah adres zvolíme dle manuálu k elektroměru (tj. 5000-5000B). V sekci **Vlastnosti skupiny** je třeba specifikovat číslo prvního registru neboli **počátečního prvku**. Jak jsme zjistili výpočtem výše, **počátečním prvkem** pro registr **Voltage** je 20481. Funkce je nastavena na **F03 Read Holding Register**. **Počet prvků** udává počet registrů, které chceme ze slave zařízení do skupiny vyčítat, abychom je mohli později převést na datové body. Vyberte číslo 12, neboť budeme později chtít zároveň odečítat **napětí**, **frekvenci** a **proud**. |
{{ :en:sw:01-mervis:connecting-to-modbus-slave-12-group-for-voltage.png?direct |}} | {{ :en:sw:01-mervis:connecting-to-modbus-slave-12-group-for-voltage.png?direct |}} | ||
Line 101: | Line 113: | ||
{{ :en:sw:01-mervis:connecting-to-modbus-slave-17-st-type.png?direct |}} | {{ :en:sw:01-mervis:connecting-to-modbus-slave-17-st-type.png?direct |}} | ||
- | Abychom se nemuseli zabývat složitým vysvětlováním, do políčka **Délke MultiByte (Parser)** zadejte číslo 4. K tomuto políčku se vrátíme později. | + | Abychom se nemuseli zabývat složitým vysvětlováním, do políčka **Délka MultiByte (Parser)** zadejte číslo 4. K tomuto políčku se vrátíme později. |
{{ :en:sw:01-mervis:connecting-to-modbus-slave-18-multibyte-length.png?direct |}} | {{ :en:sw:01-mervis:connecting-to-modbus-slave-18-multibyte-length.png?direct |}} | ||
Line 119: | Line 131: | ||
Pro další část tutoriálu je nyní nutné zcela pochopit způsob, kterým jsme s **napětím** pracovali a jak v Modbusu vyjádřit různé datové typy. | Pro další část tutoriálu je nyní nutné zcela pochopit způsob, kterým jsme s **napětím** pracovali a jak v Modbusu vyjádřit různé datové typy. | ||
- | Modbus pracuje pouze se 16-bitovými registry (nyní na chvíli zapomeneme, že existují i "coily"). V jednom registru tak lze uložit pouze 65536 hodnot, které představují různé typy čísel. Může jít o neznačený integer v rozmezí 0 - 65535. Může jít o značený integer v rozsahu -32768 - 32767. Případně vůbec nemusíme používat všechny možné hodnoty a převedeme je na "char" číslo s hodnotou 0 - 255. | + | Modbus pracuje pouze se 16-bitovými registry (nyní na chvíli zapomeneme, že existují i "coily"). V jednom registru tak lze uložit pouze 65536 hodnot, které představují různé typy čísel. Může jít o neznačený integer v rozmezí 0-65535. Může jít o značený integer v rozsahu -32768-32767. Případně vůbec nemusíme používat všechny možné hodnoty a převedeme je na "char" číslo s hodnotou 0-255. |
Co když ale potřebujeme vyčítat údaje ze slave zařízení, které vyžaduje více než 16 bitů? K tomu bude zapotřebí více než jeden Modbusový registr a následně bude třeba v Mervisu provést transformaci dat. Přesně to jsme provedli s **napětím**. **Napětí** je zde reálné číslo vyžadující 32 bitů. V manuálu elektroměru se dozvíme, že jako datový typ je užit "float" a délka registru je 2. Neznamená to, že registr má jinou velikost než 16 bitů, nýbrž poukazuje na fakt, že **napětí** je uloženo ve dvou registrech - na adresách 5000H a 5001H. Abychom mohli hodnotu vyjádřit v Mervisu, bylo zapotřebí vyčítat dva registry a spojit je do jedné proměnné. | Co když ale potřebujeme vyčítat údaje ze slave zařízení, které vyžaduje více než 16 bitů? K tomu bude zapotřebí více než jeden Modbusový registr a následně bude třeba v Mervisu provést transformaci dat. Přesně to jsme provedli s **napětím**. **Napětí** je zde reálné číslo vyžadující 32 bitů. V manuálu elektroměru se dozvíme, že jako datový typ je užit "float" a délka registru je 2. Neznamená to, že registr má jinou velikost než 16 bitů, nýbrž poukazuje na fakt, že **napětí** je uloženo ve dvou registrech - na adresách 5000H a 5001H. Abychom mohli hodnotu vyjádřit v Mervisu, bylo zapotřebí vyčítat dva registry a spojit je do jedné proměnné. | ||
- | Toto parsování více registrů do jednoho datového bodu (proměnné) probíhá na dvou úrovních. Nejprve je třeba Mervisu sdělit, aby četl více registrů naráz; to lze provést na úrovni **skupin**. Určili jsme **číslo prvního registru**, který chceme číst (**Počáteční prvek**) a počet registrů, ze kterých chceme od tohoto čísla vyčítat (úroveň **Skupiny**). Jak můžete vidět výše, začali jsme vyčítat od registru č. 20481 a čteme z dvanácti následujících 16bitových registrů = 24 bytů. | + | Toto parsování více registrů do jednoho datového bodu (proměnné) probíhá na dvou úrovních. Nejprve je třeba Mervisu sdělit, aby četl více registrů naráz; to lze provést na úrovni **skupin**. Určili jsme **číslo prvního registru**, který chceme číst (**Počáteční prvek**) a počet registrů, ze kterých chceme od tohoto čísla vyčítat (úroveň **Skupiny**). Jak můžete vidět výše, začali jsme vyčítat od registru č. 20481 a čteme z dvanácti následujících 16 bitových registrů = 24 bytů. |
- | + | ||
- | Dalším krokem je specifikování datového bodu **Napětí**. Tento datový bod navážeme na skupinu, aby z ní vyčítal údaje a převáděl je na určenou proměnnou. Abychom Mervis IDE sdělili, jaká data chceme použít, nastavíme **Parametry datového bodu Modbus**. Pro čtení dat ze skupiny do datového bodu je třeba nastavit **Data Offset (Parser)** a **Multibyte Length (Parser)**. | + | |
- | **Data Offset (Parser)** označuje první **byte** (nikoliv registr!) skupiny, zatímco **Multibyte Length (Parser)** vyjadřuje počet **bytů**, které budou do dané proměnné parsovány. Jak můžete vidět, vybrali jsme první čtveřici bytů (Data Offset = 0, Multibyte Length = 4), což odpovídá dvěma registrům (4×8bit = 2×16bit). Nastavením **typu ST** pak nastavíme transformaci tohoto 32bitového datového prostoru na reálné číslo. Zní to poněkud komplikovaně, u dalšího datového bodu už Vám to ale bude o něco jasnější. | + | Dalším krokem je specifikování datového bodu **Napětí**. Tento datový bod navážeme na skupinu, aby z ní vyčítal údaje a převáděl je na určenou proměnnou. Abychom Mervis IDE sdělili, jaká data chceme použít, nastavíme **Parametry datového bodu Modbus**. Pro čtení dat ze skupiny do datového bodu je třeba nastavit **Offset dat (Parser)** a **Délka MultiByte (Parser)**. |
- | Přidejme si nyníé další datový bode - **Frekvence mřížky**. Jak můžete vidět v mapě Modbus registrů, **Frekvence mřížky** je na adrese 5008 a délka registru (či spíše délka hodnoty) je 2. To už víme, neboť námi nakonfigurovaná skupina **5000-500B** pokrývá i tyto registry. Díky tomů můžeme datový bod definovat přímo. Klikněte pravým tlačítkem do prázdného prostoru v záložce **energyMeterL1** a z kontextového menu vyberte **Přidat datový bod**. Objeví se nový datový bod, u kterého můžete nastavit jeho vlastnosti. Výsledek by měl vypadat zhruba takto: | + | **Offset dat (Parser)** označuje první **byte** (nikoliv registr!) skupiny, zatímco **Délka MultiByte (Parser)** vyjadřuje počet **bytů**, které budou do dané proměnné parsovány. Jak můžete vidět, vybrali jsme první čtveřici bytů (Offset dat = 0, Délka MultiByte = 4), což odpovídá dvěma registrům (4×8 bit = 2×16 bit). Nastavením **typu ST** pak nastavíme transformaci tohoto 32 bitového datového prostoru na reálné číslo. Zní to poněkud komplikovaně, u dalšího datového bodu už Vám to ale bude o něco jasnější. |
- | So let's add another datapoint - **Grid frequency**. As you can see from the Modbus register's map, the **Grid frequency** is on the address 5008 and the register's length (more like value length) is 2. We know, we already have the group **5000-500B** configured to cover these registers as well, therefor we can define the datapoint directly. Right click on the free space on the tab **energyMeterL1** on the **Main window** and from the context menu select **Add Data Point**. A new datapoint will appear and you can change its properties. The result should look like this: | + | Přidejme si nyní další datový bod - **Frekvence mřížky**. Jak můžete vidět v mapě Modbus registrů, **Frekvence mřížky** je na adrese 5008 a délka registru (či spíše délka hodnoty) je 2. To už víme, neboť námi nakonfigurovaná skupina **5000-500B** pokrývá i tyto registry. Díky tomů můžeme datový bod definovat přímo. Klikněte pravým tlačítkem do prázdného prostoru v záložce **energyMeterL1** a z kontextového menu vyberte **Přidat datový bod**. Objeví se nový datový bod, u kterého můžete nastavit jeho vlastnosti. Výsledek by měl vypadat zhruba takto: |
{{ :en:sw:01-mervis:connecting-to-modbus-slave-22-grid-frequency.png?direct |}} | {{ :en:sw:01-mervis:connecting-to-modbus-slave-22-grid-frequency.png?direct |}} | ||
* Datový bod jsme nazvali **GridFrequency** | * Datový bod jsme nazvali **GridFrequency** | ||
- | * Určili jsme, že data budou vyčítána ze skupiny **5000-500B** | + | * Určili jsme, že data budou vyčítána ze skupiny **5000-5000B** |
- | * **Comm. Value Mapped Type** je nastavena na **Builtin** a **ST Type** je **real**. | + | * **Typ mapované kom. hodnoty** je nastaven na **Builtin** a **Typ ST** je **real**. |
- | * **Data Offset (Parser)** = (adresa registru - adresa prvního registru ve skupině) × 2 = (5008H-5000H) × 2 = 16 | + | * **Offset dat (Parser)** = (adresa registru - adresa prvního registru ve skupině) × 2 = (5008H-5000H) × 2 = 16 |
- | * **MultiByte Length (Parser)** je 4 (4 byty = 2 16bitové registry) | + | * **Délka MultiByte (Parser)** je 4 (4 byty = 2 16 bitové registry) |
- | Jelikož jsme přidali nový datový bod, je třeba na zařízení **nastavit Autogen**. Následně **nahrajte sestavu**, zapněte **mód ladění** a na **hlavním panelu** se přepněte se do **Prohlížeče proměnných**. Zde vyhledejte **energyMeterL1**. Výsledek by měl vypadat následovně: | + | Jelikož jsme přidali nový datový bod, je třeba na zařízení **nastavit Autogen**. Následně **nahrajte sestavu**, zapněte **mód ladění** a na **hlavním panelu** se přepněte do **Prohlížeče proměnných**. Zde vyhledejte **energyMeterL1**. Výsledek by měl vypadat následovně: |
{{ :en:sw:01-mervis:connecting-to-modbus-slave-23-variable-browser.png?direct |}} | {{ :en:sw:01-mervis:connecting-to-modbus-slave-23-variable-browser.png?direct |}} | ||