Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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ů ​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&​nbsp1.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)** ​**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 hodnotyje 2. To už vímeneboť 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!skupinyzatí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é čísloZní 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 lengthis 2. We knowwe already have the group **5000-500B** ​configured to cover these registers as well, therefor we can define the datapoint directlyRight 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 propertiesThe 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 hodnotyje 2. To už vímeneboť námi nakonfigurovaná skupina ​**5000-500B** ​pokrývá i tyto registry. Díky tomů můžeme datový bod definovat přímoKlikně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 vlastnostiVý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** 
-  * **CommValue Mapped Type** je nastavena ​na **Builtin** a **ST Type** je **real**. +  * **Typ mapované komhodnoty** 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 |}}