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/05/12 12:22]
avsetula [Konfigurace]
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:
-:!: - přeloženo 
 ====== 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 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 137: Line 149:
   * **Typ mapované kom. hodnoty** je nastaven na **Builtin** a **Typ ST** je **real**.   * **Typ mapované kom. hodnoty** je nastaven na **Builtin** a **Typ ST** je **real**.
   * **Offset dat (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 
-  * **Délka MultiByte (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 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ě: ​