Differences
This shows you the differences between two versions of the page.
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 1.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ýše, zač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 above, we 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** datapoint. We pointed this datapoint to the group, so it will be taking data from this group and transform it to some variable. To tell exactly, which data from the group the datapoint should use, we 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 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)**. |
- | The **Data Offset (Parser)** indicates the first **byte** (not register!) from the group, and the **Multibyte Length (Parser)** is a number of **bytes** to parse into this variable. As you can check, we 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 number. It sounds a quite complicated, but with next datapoint, it will be a bit clearer hopefully. | + | **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ší. |
- | 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 length) is 2. We know, we already have the group **5000-500B** configured to cover these registers as well, therefor we can define the datapoint directly. Right 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 properties. The 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 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: |
{{ :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 **Comm. Value Mapped Type** is **Builtin** and the **ST Type** is **real** | + | * **Typ mapované kom. hodnoty** je nastaven na **Builtin** a **Typ ST** je **real**. |
- | * The **Data Offset (Parser)** = (address of the register - address of the first register in group) * 2 = (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 datapoint, you need to run the **Set Autogen** on the device. Then **Deploy** the solution, turn 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ý 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 |}} | ||