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/01/20 08:15]
avsetula
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** ​ počet registrů, ​které ​chceme ​z  +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ýšezačali jsme vyčítat od registru č. 20481 a čteme z dvanácti následujících 16 bitových registrů ​= 24 bytů
-This parsing of multiple registers into datapoint ​(variable) is done on two levels. First, we need to tell the Mervis to read more registers at once. This is done on the **Group** level. We specified **the first register number** we want to read (the **Starting Element**) and the number of registers we want to read from this number (the **Quantity of Elements**). As you can check abovewe started reading from the register number ​20481 and we read 12 consecutive 16bit registers ​= 24 bytes.+
  
-Next thing we did, is that we specified the **Voltage** datapointWe pointed this datapoint to the groupso it will be taking data from this group and transform it to some variableTo tell exactlywhich data from the group the datapoint should usewe configured the **Modbus ​Data Point Parameters**. For reading data from group to datapoint, you need to set the **Data Offset (Parser)** ​and the **Multibyte Length ​(Parser)**. ​+Dalším krokem je specifikování datového bodu **Napětí**. Tento datový bod navážeme na skupinuaby z ní vyčítal údaje a převáděl je na určenou proměnnouAbychom Mervis IDE sdělilijaká data chceme použítnastaví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)**.
  
-The **Data Offset (Parser)** ​indicates the first **byte** (not register!) from the groupand the **Multibyte Length ​(Parser)** ​is a number of **bytes** to parse into this variableAs you can checkwe selected first 4 bytes from the group (Data Offset = 0, Multibyte Length ​= 4), which corresponds with 2 registers ​(4*8bit ​2*16bit). And by setting the **ST Type**, we set the transformation of this 32bit data space into a real numberIt sounds a quite complicatedbut with next datapoint, it will be a bit clearer hopefully.+**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ányJak můžete vidětvybrali 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 |}}
  
-  * We named the datapoint ​**GridFrequency** +  * Datový bod jsme nazvali ​**GridFrequency** 
-  * We specified to take data from group **5000-500B** +  * Určili jsme, že data budou vyčítána ze skupiny ​**5000-5000B** 
-  * The **CommValue Mapped Type** is **Builtin** ​and the **ST Type** is **real** +  * **Typ mapované komhodnoty** je nastaven na **Builtin** ​**Typ ST** je **real**. 
-  * The **Data Offset (Parser)** = (address of the register ​address of the first register in group2 = (5008H-5000H) ​2 = 16 +  * **Offset ​dat (Parser)** = (adresa registru ​adresa prvního registru ve skupině× 2 = (5008H-5000H) ​× 2 = 16  
-  * The **MultiByte ​Length ​(Parser)** ​is 4 (4 bytes = 2 16bit registers)+  * **Délka ​MultiByte (Parser)** ​je 4 (4 byty = 2 16 bitové registry
  
-Because we added new datapointyou need to run the **Set Autogen** ​on the deviceThen **Deploy** the solutionturn on the **Debugging** mode and switch to **Variable Browser** tab in **Main window**. In the browser, search for the **energyMeterL1**. ​You should see this:+Jelikož jsme přidali nový datový bodje 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 |}}