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/02 15:23]
jan_kozak
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>
 +<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> ​
  
-Jedním z nejčastějších úkonů v průmyslové automatizaci je nastavování komunikace za pomoci komunikačního protokolu Modbus.  +===== Připojení se k Modbus RTU slave zařízení ​=====
- +
-===== Connecting to ModbusRTU ​slave =====+
 Pro účely tohoto tutoriálu předpokládejme,​ že jste v **Plném módu** vytvořili jednoduchý projekt. K projektu máte připojený kontrolér, vytvořili jste **spustitelný projekt** s jedním **FBD** programem a daný program je nastavený jako **task**. Rovněž předpokládejme,​ že jste na kontroléru provedli **nastavení Autogenu** a jak **kompilace**,​ tak i **nahrání** sestavy proběhlo bez problémů. ​ Pro účely tohoto tutoriálu předpokládejme,​ že jste v **Plném módu** vytvořili jednoduchý projekt. K projektu máte připojený kontrolér, vytvořili jste **spustitelný projekt** s jedním **FBD** programem a daný program je nastavený jako **task**. Rovněž předpokládejme,​ že jste na kontroléru provedli **nastavení Autogenu** a jak **kompilace**,​ tak i **nahrání** sestavy proběhlo bez problémů. ​
  
Line 36: Line 47:
  
 Pod kanálem se objeví nové zařízení. Vyberte jej a v panelu **Vlastnosti** jej přejmenujte na více popisný název. Ve stejném panelu je rovněž třeba zadat správnou Modbus adresu zařízení. ​ Pod kanálem se objeví nové zařízení. Vyberte jej a v panelu **Vlastnosti** jej přejmenujte na více popisný název. Ve stejném panelu je rovněž třeba zadat správnou Modbus adresu zařízení. ​
- 
-A new device will appear under the channel. Select it and change its name in the **Properties panel** to something more descriptive. In this properties, you also need to enter the correct Modbus device address. ​ 
  
 {{ :​en:​sw:​01-mervis:​connecting-to-modbus-slave-08-modbusrtu-device-name.png?​direct |}} {{ :​en:​sw:​01-mervis:​connecting-to-modbus-slave-08-modbusrtu-device-name.png?​direct |}}
Line 44: 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 55: 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 79: 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 103: 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 121: 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 |}}