This is an old revision of the document!


FIXME - dopřeložit

Připojení skrze protokol Modbus

Jedním z nejčastějších úkonů v průmyslové automatizaci je nastavování komunikace za pomoci komunikačního protokolu Modbus.

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ů.

Pokud jste provedli vše výše uvedené, vaše pracovní plocha by měla vypadat zhruba takto:

K nastavení komunikace přes protokol Modbus RTU je zapotřebí nejprve vytvořit odpovídající kanál. Klikněte pravým tlačítkem na PLC a v kontextovém menu klikněte na Přidat kanál.

V levém panelu se pod PLC objeví nový kanál nazvaný channel. Vyberte jej a v panelu Vlastnosti změňte jeho název na něco lépe vyjadřující účel kanálu. Jelikož bude kanál použit ke komunikaci přes Modbus RTU, nejlepší volbou bude nazvat jej ModbusRTU.

Ve stejném panelu vyberte z rozbalovacího menu protokol Modbus.

Linkový protokol je ve výchozím stavu nastaven na Serial, zde je proto třeba pouze nastavit správné Parametry sériové linky. Z rozbalovacího menu Číslo portu vyberte správný port.

Zbytek parametrů sériové linky pak musí být nastaven zcela identicky jako u všech zařízení, která jsou k sériové sběrnici připojena.

Kanál ModbusRTU je tím nastaven. Nyní můžeme přidat zařízení, se kterými budeme chtít komunikovat. V levém panelu na kanál klikněte a v kontextovém menu vyberte Přidat 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.

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.

Na předchozích řádcích jsme provedli základní konfiguraci Modbus RTU zařízení a nyní se můžeme pustit do složitějšího úkolu - mapy registrů. Dvojitě klikněte na název nově přidaného zařízení. Na hlavním panelu se objeví prázdný seznam Modbusových registrů.

Hodnoty Modbusových slave zařízení jsou “sdíleny” skrze registry (vyjádřené v 16-bitových hodnotách) či coily (pouze jednobitové stavy). Abychom ze slave zařízení mohli tyto hodnoty vyčítat, musíme nejprve nadefinovat, jaké registry chceme vyčítat a jak je budeme převádět na proměnné použitelné později.

Nyní je na čase představit si Modbus RTU zařízení, ze kterého budeme data odečítat: chytrý elektroměr Inepro PRO1-Mod.

Jako první krok doporučujeme pročíst si 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.

Na straně 25 naleznete kompletní seznam registrů Modbus, jejich adresy, hodnoty a velikosti. Jako první budeme vyčítat proudové napětí.

Zde se věci naneštěstí rapidně komplikují, především kvůli široké škále způsobů implementace protokolu Modbus, které se mezi jednotlivými výrobci mohou výrazně lišit.

Jak můžete vidět, adresy registrů jsou v šestnáctkové soustavě. Hodnota registru Voltage (tj. napětí) nám nepomůže, neboť adresa 5000 může být v šestnáctkovém i desítkovém formátu. Pokud se ale podíváte na registr Current (tj. proud), u zde přítomné hodnoty 500A poměrně snadno poznáte, že jde o šestnáctkový formát.

Pro Modbusové registry Mervis IDE podporuje pouze desítkové hodnoty, hodnoty z manuálu proto budeme muset manuálně převést, a to za pomoci kalkulačky či programu MS Excel

Dalším zrádným krokem je rozdíl mezi číslem registru a adresou registru. Čísla registrů začínají od jedničky, ale adresy registrů začínají od nuly. Mervis IDE dokáže čísla registrů využít, v manuálu k elektroměru ale používají adresy registrů.

Sečteno a podtrženo, adresa registru Voltage je 5000 v šestnáctkové soustavě, což v desítkové soustavě činí 20480 a číslo registru je tak 20481 (adresa + 1)

V mnoha případech je těžké tyto hodnoty rozpoznat a manuál je příliš obecný. Budete se proto muset uchýlit k metodě pokus-omyl.

Podívejme se nyní na to, jak můžeme registr Voltage přidat do Mervisu. Na Hlavním panelu by měl být vidět prázdný seznam registrů. Pokud ne, v levém panelu dvojitě klikněte na název zařízení.

Pro zjištění hodnoty kteréhokoliv z registrů nejprve musíme přidat skupinu. Skupina obsahuje alespoň jeden registr, který může být přečten naráz a následně parsován do datových bodů. Tento způsob odpovídá tomu, jak Modbus pracuje, zvláště funkčního kódu 4. Klikněte pravým tlačítkem na Hlavní panel a v kontextovém menu vyberte Přidat skupinu

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.

Pro převod skupiny registrů na proměnné je třeba definovat datový bod. Klikněte pravým tlačítkem na prázdný prostor na hlavním panelu a v kontextovém menu klikněte na Přidejte datový bod.

Na seznamu se objeví nový datový bod s názvem IO. Vyberte jej a v panelu Vlastnosti změňte jeho jméno na Napětí.

Dalším krokem je určit skupinu, do které bude datový bod náležet. Vyberte skupinu 5000-5000B z rozbalovacího menu sekce Skupina.

Datový bod je reprezentovaný proměnnou, které musíme přiřadit nějaký typ. Jelikož napětí je obvykle vyjádřeno v reálných číslech, vyberte možnost Builtin z menu Typ mapované kom. hodnoty.

Z rozbalovací nabídky Typ ST pak vyberte možnost real.

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.

Po dokončení definice datového bodu je nyní na řadě vygenerování proměnných skrze funkci Nastavit Autogen. Klikněte pravým tlačítkem na zařízení v levém panelu a v kontextovém menu vyberte Nastavit Autogen.

Zobrazí se dialogové okno Nastavit Autogen, který potvrdťe kliknutím na OK.

Nyní můžete sestavu zkompilovat a nahrát do kontroléru. Pokud je vše v pořádku a program je spuštěn, klikněte na Start ladění, v hlavním panelu přepněte na Prohlížeč proměnných a vyhledejte napětí. Jedinou zobrazenou proměnnou by nyní měl být datový bod s aktuální výší napětí na lince.

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.

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 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).

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.

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:

  • We named the datapoint GridFrequency
  • We specified to take data from group 5000-500B
  • The Comm. Value Mapped Type is Builtin and the ST Type is real
  • The Data Offset (Parser) = (address of the register - address of the first register in group) * 2 = (5008H-5000H) * 2 = 16
  • The MultiByte Length (Parser) is 4 (4 bytes = 2 16bit registers)

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: