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
Next revision Both sides next revision
cs:sw:01-mervis:connecting-to-modbus-slave-device-hidden [2020/03/03 11:11]
jan_kozak
cs:sw:01-mervis:connecting-to-modbus-slave-device-hidden [2021/08/05 12:29]
avsetula
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ů v průmyslové automatizaci je nastavování 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 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**.  ​+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 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 **Offset dat (Parser)** a **Délka MultiByte (Parser)**. 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)**.
  
-**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×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ší. ​+**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ší. ​
  
 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: ​ 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: ​
Line 134: Line 146:
  
   * 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 |}}