Dokumentace

Komunikační protokol Modbus

Driver protokolu Modbus je jedním z nejčastěji používaných driverů. V Idekit Studio jsou možnosti nastavení parametrů modbusových proměnných velmi široké, a proto se podíváme na definici proměnné podrobně.


Datový bod, definovaný v modbusovém zařízení, není sám od sebe dostupný v programu. Je to pouze definice komunikace. V programu ovšem potřebujeme proměnnou, s níž můžeme pracovat. Je tedy nutné namapovat (přiřadit) definici datového bodu nějaké globální proměnné. Tato abstrakce umožňuje programátorovi snadno přepojit proměnnou z jednoho HW datového bodu na jiný, například v případě fyzického poškození vstupu nebo I/O modulu. Globální proměnné mohou být tvořeny a přiřazovány k datovým bodům také automaticky, s využitím funkce Autogen.

Nejprve je třeba založit komunikační kanál. Ten určuje, na jakém fyzickém portu bude PLC komunikovat s Modbus serverem - můžeme použít jeden ze sériových portů (pro Modbus RTU) nebo rozhraní Ethernet (pro Modbus TCP).

Modbus channel

Název - obvykle se pojmenuje podle zařízení, která jsou na něj připojena, nebo sběrnice v projektu, např. "FCU", "Bus1".
Povolit
- kanál musí být povolen (True), aby komunikoval.
Linkový protokol - Serial pro Modbus RTU (na RS232 nebo RS485, tj. na portech COM...), TCP pro Modbus TCP po rozhraní Ethernet.
Mód integrace - False: čtení jsou prokládána zápisy, spouštěnými při změně zapisované hodnoty. True: při komunikaci se nejprve všechna data ke čtení čtou a pak se zapisují všechna data pro zápis. Tento mód může lépe vyhovovat některým cizím zařízením, která se po Modbusu integrují.
Max. doba trvání telegramu - tzv. timeout. Během této doby musí modbusové zařízení odpovědět na dotaz. U I/O modulů Domat stačí kratší doba, 70 ms je s velkou rezervou, ovšem u některých cizích zařízení, jako jsou frekvenční měniče, fotovoltaické střídače atd., je nutné nastavit delší dobu - cca. 200...500 ms. Příliš dlouhá doba může zpomalovat celou komunikaci, pokud některé zařízení na sběrnici je v poruše a neodpovídá.
Max. doba trvání telegramu (Oživovací mód) - tato obvykle delší doba se používá při uvádění do provozu, kde není nutná optimalizace rychlosti komunikace, ale chceme vyloučit komunikační chyby vzniklé příliš krátkým timeoutem.
Pauza mezi telegramy - někdy se používá pro zklidnění napěťových poměrů na sběrnici, aby servery lépe poznaly začátek dalšího dotazu. Při potížích s komunikací nastavte na hodnotu cca. 20...300 ms.
Číslo portu - COM port podstanice.
Následující parametry musejí být stejné pro kanál i pro všechna modbusová zařízení, na kanál připojená. Řiďte se podle dokumentace k cizím zařízením. Pokud jsou na nich parametry nastavitelné, zkontrolujte, zda nastavení na nich odpovídá nastavení v kanálu PLC.
Přenosová rychlost - komunikační rychlost v bit/s.
Počet datových bitů - počet datových bitů v jednom bajtu.
Parita - zvolte komunikační paritu - žádnou, sudou nebo lichou.
Počet stop bitů - počet bitů, které signalizují konec přenášeného bajtu.
Při komunikaci Modbus TCP tyto parametry sériové linky nejsou uvedeny, nemají zde význam.

Pravým kliknutím na kanál přidáme zařízení (device). Zařízení představuje modbusový server (jednu linkovou adresu) a obsahuje modbusové proměnné. Na sběrnici může být až 255 zařízení, v praxi se používá nejvýše cca. 60 až 80 zařízení. Nastavíme parametry zařízení:

Modbus - zařízení

Vlastnosti zařízení
Název
- zařízení je možné pojmenovat, např. VZT1FM1.
Povolit - aby zařízení komunikovalo, musí být povoleno (True).
Je uživatelský box - informace o tom, zda zařízení je z knihovny, nebo je lze upravovat (editovat).

Parametry  Modbusu
Adresa zařízení - Modbusová adresa v rozsahu 1...255. Tato adresa musí být na zařízení nastavena, obvykle zařizuje dodavatel zařízení.
Pozn. - libovolná poznámka

Definice prototypu
ID modelu - volně definovatelné, poznámka pro konkrétní typ Modbusového zařízení
ID výrobce - volně definovatelné, poznámka pro jméno výrobce Modbusového zařízení
Identifikátor verze - volně definovatelné, poznámka pro verzi Modbusového zařízení v Idekit Studio
Stav - volně definovatelné, poznámka pro fázi vývoje (Vývoj, Test, Vydání (ostrá verze), Zastaralý, Porušený (odštěpená větev od hlavní vývojové větve)).
Zámek pro linkový protokol - má být False

Informace o zařízení
Model - volně definovatelné, poznámka pro název hardwaru
Verze - volně definovatelné, poznámka pro verzi hardwaru (různé verze firmware mohou vyžadovat různé definice Modbus zařízení, podle toho jak vypadají Modbusové mapy v nich)
Výrobce - volně definovatelné, poznámka pro název výrobce
Cesta kategorie - cesta, kde se zobrazí prototyp zařízení v menu "Přidat zařízení z knihovny", používá se pro lepší orientaci ve stromu uživatelsky definovaných zařízení.

Dvojitým kliknutím na zařízení se otevře pracovní plocha pro definování skupin a proměnných v zařízení. Komunikace protokolem Modbus probíhá ve skupinách datových bodů, v rámci jedné skupiny (jednoho Modbusového dotazu pro čtení nebo zápis) se přenáší více registrů, které následují za sebou. Komunikace po skupinách optimalizuje provoz na sběrnici a zvyšuje rychlost přenosu dat. Proměnné se proto vždy definují jako členy určité skupiny.

Nejprve tedy definujeme skupinu registrů pro čtení. To je nutné i v případě, že čteme pouze jeden registr.
- Pravým kliknutím na pracovní plochu s názvem zařízení otevřeme kontextové menu
- Vybereme Přidat skupinu
-
Vyplníme parametry skupiny:

Skupina

Název - jméno skupiny, např. "Teploty_čtení". Jméno by mělo odpovídat společným vlastnostem registrů, které skupina obsahuje.
Interval čtení / zápis - jak často má skupina zakomunikovat. Pro trvalou komunikaci, tj. co nejrychleji za sebou, nechte 0 ms.
Typ skupiny - volba mezi ReadOnly (pouze pro čtení) a WriteOnly (pouze pro zápis).
Pozn. - volně definovatelná poznámka.

Parametry skupiny Modbus
Počáteční prvek
- číslo prvního registru, který se má číst.
Funkce - Modbusová funkce, musí odpovídat typu skupiny, tedy u skupin pro čtení volíme některou z funkcí pro čtení, u skupiny pro zápis volíme zápisovou funkci. Funkce musí být cílovým zařízením podporována - zkontrolujte v dokumentaci k Modbus serveru, pro který skupinu definujete.
Počet prvků - kolik registrů nebo coilů se má ve skupině číst.

Příklad: skupina má ze zařízení číst Modbusové registry 11 až 15. Hodnoty skupiny nastavíme takto: Počáteční prvek bude 11, Počet prvků bude 5.

V další části definujeme datové body, do nichž bude driver načítat hodnoty z registrů, vyčtených při komunikaci skupiny.

- Pravým kliknutím na pracovní plochu s názvem zařízení otevřeme kontextové menu
- Vybereme Přidat datový bod
- Vyplníme parametry datového bodu:

Modbus dat. bod

Název - jméno proměnné, pod ním bude proměnná identifikovaná v programu
Interval čtení / zápis - pokud má být interval pro tuto proměnnou delší než interval skupiny, v níž je čten, je možné jej zde zadat.
Přiřazené HW vlastnosti - zvláštní parametry, které se využívají např. u I/O modulů. Při integraci cizích zařízení tyto vlastnosti nepoužíváme.
Skupina - vybereme skupinu, do níž proměnná přísluší.
Typ skupiny - vyplní se automaticky po vybrání skupiny (pro čtení nebo pro zápis)
Typ mapované komunikační hodnoty - výběr mezi BuiltIn, Bit a Array.
    Bit - vybereme, pokud chceme číst hodnotu typu bool.
    BuiltIn - vybereme, pokud chceme číst hodnotu jakéhokoli jiného typu. Typ upřesníme v poli Typ ST.
    Array - vybereme, pokud chceme číst pole hodnot do proměnné typu pole (array).
Typ ST - vybereme typ proměnné, která vznikne touto definicí. Pokud není použita transformace (viz níže), typ musí mít stejnou velikost, jako rozsah Modbusové tabulky, který se má číst, upřesněný níže v Parametrech dat. typu Modbus. Přehled dostupných typů je v tabulce elementárních datových typů.
Transformace - Mezi načtením hodnoty registru z Modbusu a přiřazením do proměnné je možné hodnotu přepočítat - transformovat. Využívá se to např. v případě, že po Modbusu se přenáší analogová hodnota (teplota), pro větší rozlišení násobená 10 nebo 100 (formát tzv. HVAC Integer). Příklad: teplota je 21.5 °C, Modbus server ji ale přenáší jako integer o hodnotě 2150. Tuto hodnotu načtenou z registru je nutné pomocí transformace upravit zpět, tedy vydělit 100 pomocí lineární transformace.

Předdefinované transformace jsou tyto:
    identity - hodnota není transformována, přenáší se beze změny

    Resistance to temperature - linearizační křivka pro čidla Pt100, Pt500, Pt1000, Ni1000-5000, Ni1000-6180. Transformace má tyto parametry:
       Kind - typ čidla, podle něhož je zvolena linearizační křivka
       Pre_K - koeficient první lineární transformace y = Kx + Q, k níž dochází před linearizací
       Pre_Q - koeficient první lineární transformace y = Kx + Q, k níž dochází před linearizací (umožňuje kompenzovat odpor kabelu mezi čidlem a analogovým vstupem)
       Post_K - koeficient druhé lineární transformace y = Kx + Q, k níž dochází po linearizaci
       Post_Q - koeficient druhé lineární transformace y = Kx + Q, k níž dochází po linearizaci (umožňuje kompenzovat absolutní chybu měření čidla ve °C)

    Threshold - prahový detektor pro převod mezi analogovou a binární hodnotou (pro případ, že AI je využit ve funkci DI). Transformace má tyto parametry:
       Threshold - práh, při němž nastává přechod mezi True a False a zpět
       Invert - změna smyslu funkce: pokud je Invert = True, výstup transformace při hodnotě větší než Threshold je False.

    Window - pokud je hodnota v nastavených mezích, výstup je True, jinak je False. Příklad: detekce utržení nebo zkratu čidla: když je měřená hodnota menší než -40 °C nebo větší než 150 °C, čidlo je poškozeno a výstup transformace je True (za použití funkce Invert)
       Low - spodní mez
       High - horní mez
       Invert - obrací smysl funkce: je-li Invert = True, pak pokud je hodnota v nastavených mezích, výstup je False, jinak je True.

    LinearByTable - linearizační křivka s max. 8 body. Křivka se definuje pomocí dvojic - souřadnic ve vektorech X a Y.
       XValues - vektor s X-ovými souřadnicemi bodů linearizační křivky
       YValues - vektor s Y-ovými souřadnicemi bodů linearizační křivky
       Active points - počet bodů křivky, max. 8, berou se zleva
       Pre_K - koeficient první lineární transformace y = Kx + Q, k níž dochází před linearizací
       Pre_Q - koeficient první lineární transformace y = Kx + Q, k níž dochází před linearizací
       Post_K - koeficient druhé lineární transformace y = Kx + Q, k níž dochází po linearizaci
       Post_Q - koeficient druhé lineární transformace y = Kx + Q, k níž dochází po linearizaci

    Negate - pro hodnoty typu bool, neguje hodnotu na vstupu

    LinearByTwoPoints - jednoduchá lineární transformace, definovaná dvěma body
       X1 - X-ová souřadnice prvního bodu
       Y1 - Y-ová souřadnice prvního bodu
       X2 - X-ová souřadnice druhého bodu
       Y2 - Y-ová souřadnice druhého bodu

    Linear - jednoduchá lineární transformace, definovaná rovnicí y = Kx + Q
       K - koeficient násobení
       Q - koeficient přičítání

Autogen
Povolit Autogen - Povolením Autogenu (automatického generování) se při kompilaci automaticky vytvoří globální proměnné a namapují se na vstupní a výstupní proměnné. Teprve s globálními proměnnými je možné pracovat v programech a vkládat je do žebříčků FUPLA. Pokud není Autogen povolen, je nutné globální proměnné vytvářet a přiřazovat vstupním a výstupním proměnným manuálně. Doporučuje se nastavit Povolit Autogen = True.

Mapování
IO=>ST
- mapování vstupní proměnné na globální proměnnou ("vstup - výstup na strukturovaný text či FUPLA")
ST=>IO - mapování globální proměnné na výstupní proměnnou ("strukturovaný text či FUPLA na vstup - výstup")

Parametry datového bodu Modbus
Definice toho, z kterého registru a jak se bude proměnná číst. Základní vlastnosti, jako Modbusová funkce a počáteční číslo registru, jsou zadány ve skupině, do níž je proměnná přiřazena. Veškerá další nastavení se vztahují relativně k počátečnímu registru skupiny. Jako příklad je uvedena skupina registrů, která začíná Modbusovým registrem 2064 a obsahuje celkem 8 registrů:

Telegram a jeho dekompozice
Pořadí bytů (MSB, LSB) odpovídá pozici v Modbusovém telegramu. Driver tato data Skupiny takto načítá a při rozebírání Skupiny do proměnných musíme toto pořadí respektovat.

Mezera offsetu pro zápis
Číslo rozhraní offsetu, kam až se zapisuje (pokud proměnná je určena pro zápis). Počítá se v bytech. Příklad: pro zápis do registru 2068 by Mezera offsetu pro zápis byla 10. Musí platit, že Mezera offsetu pro zápis = Offset dat + Délka multibyte.

Offset dat (Parser)

Číslováno od 0; určuje, na kolikátém bytu (ne registru!) začínají data proměnné. Příklad: při čtení z registru 2068 by Offset dat byl 8. Maximální hodnota je dvojnásobek počtu registrů skupiny snížený o 1, čímž by se četl poslední byte ve skupině. Všimněme si, že v Modbusovém telegramu se nejprve přenáší vyšší byte (MSB) a pak nižší byte (LSB); při mapování do proměnných bytového typu (BYTE, SINT, USINT) má pak vyšší (významnější) byte Modbusového registru nižší hodnotu Offsetu dat.

Bitový offset (Parser)
Posouvání v bytu mezi jednotlivými bity - pro čtení bitových proměnných funkcemi F01 Read Coils, F02 Read Discrete Inputs a zápis F05 Write Single Coil, F06 Write Single Register. Pro čtení nebo zápis 3. bitu v bajtu (pozor, ne vždy v registru!). Počítá se od 0, tedy pro čtení 4. bitu (bit 3) bude Bitový offset = 3. Nastavuje se v intervalu 0 až 7.

Délka Multibyte (Parser)
Kolik bytů (ne registrů!) se má číst do proměnné nebo zapisovat do Modbusové tabulky. Obvykle je to 2, neboť jeden Modbusový registr má 16 bitů = 2 byty. Ve zvláštních případech, jako jsou kumulované hodnoty u elektroměrů, které využívají 4 byty, může být Délka Multibyte větší. U bitových proměnných je Délka Multibyte = 1 (stačí 1 byte, ten, který obsahuje požadovaný bit).

Pořadí Multibyte (Parser)
V tomto řetězci je možné zvolit pořadí bytů, v jakém se budou z telegramu mapovat na datový typ proměnné. Řeší se tím různé varianty formátů typu "rotate", "non-rotate", "byte swap", "word swap", "Intel byte order" atd. Výchozí hodnota je "12345678", obvykle ji není nutné měnit.

Pozn.
Volné pole pro poznámku, která může vysvětlovat mapování telegramu na proměnnou. Určeno pro komentář programátora.

Výše uvedená pravidla můžeme shrnout do čtyř odstavců:

1. Čtení vstupních / uchovávacích (holding) registrů
Pokud se čtou vstupní nebo uchovávací registry, musíme určit, kde má v rámci skupiny čtení začít a kolik bytů se má číst. Skupina je vždy definována počátečním registrem a počtem prvků. Tyto hodnoty představují Modbusové registry a délku telegramu.
Když vytvoříme nový datový bod, musíme ho přiřadit do skupiny a určit mu datový typ. Datový typ musí odpovídat formátu čtené hodnoty a je důležité, aby měl stejný počet bitů jako tato čtená hodnota. Popisy datových typů najdete v tabulce základních datových typů.

Nastavení datového bodu určuje, která a jak velká část telegramu načteného skupinou přísluší tomuto datovému bodu. Zadává se počet bitů a bytů, ne registrů. Registr má 2 byty = 16 bitů.

Délka multibyte určuje, kolik bytů přísluší datovému bodu. Tato hodnota musí odpovídat vybranému typu datového bodu. Například pro typ INT, který má 16 bitů, je hodnota multibyte = 2.
Dále musíme specifikovat, ve které části telegramu má čtení začít. Pro čtení registrů se tento parametr nastavuje v položce Offset dat.
První čtený byte má Data Offset = 0, druhý byte má Data Offset = 1, atd. Takže pokud datový typ je INT a má se číst hodnota z třetího registru v rámci skupiny, což je 5.-6. byte v telegramu, Data Offset bude 4.

Pomocí funkce pro čtení registrů lze také číst bity. Registr se rozebere některou z funkcí pro bitovou dekompozici, viz bloky FUPLA.

Pomocí data offsetu se posuňte na byte, který se má číst, a bitovým ofsetem se pohybujte v bytu mezi bity. Pro tento typ datového bodu musí být proměnná typu bit nebo bool.

Pozor také na to, že pořadí bytů v telegramu na obrázku výše je  MSB --> LSB. Pokud se má číst LSB prvního registru, data ofset musí být 1. Pokud je datový bod typu 8bit a má se číst MSB, data ofset je sudé číslo. Pokud se má číst LSB, data ofset je liché číslo. 

2. Zápis holding registrů
Parametry pro zápis do registrů jsou definovány podobně jako u definice čtení z registrů. Jediný rozdíl je v tom, že u zápisu se definuje také poslední byte, do něhož se má zapisovat.

Pokud mají být zapsány první 2 byty telegramu, délka multibyte je 2, data offset je 0 a mezera ofsetu pro zápis je 2. Znamená to, že do intervalu mezi interface 0 a interface 2 jsou zapsány 2 byty. 
Pokud se mají zapsat další 2 byty, data ofset je 2 a mezera ofsetu pro zápis je 4.

Stejně, jako se čtou jednotlivé bity, se jednotlivé bity zapisují. S využitím parametru data ofset se posuneme na příslušné místo v telegramu, a bitovým ofsetem se posuneme na požadovaný bit v tomto bytu. Je třeba si uvědomit, že se vždy zapisuje celý byte nebo registr. Pokud má tedy dojít k zápisu jen jednoho bitu, ostatní bity, které nejsou definovány jako datové body, budou vyplněny nulami.

Obecně řečeno, pokud má skupina více registrů, řada registrů musí být spojitá (bez mezer). Pokud například mají být zapsány registry 1,2,4 a 5 a registr 3 nesmí být přepsán, je nutné vytvořit dvě nezávislé skupiny pro zápis.
Pokud potřebujeme zapsat jen několik bitů, je jednodušší zapsat hodnotu jako číslo tvaru INT, kde se v programu složí bitová kompozice. Jestliže zařízení podporuje také bitově orientované funkce, je vhodné je využívat.

3. Čtení coilů a diskrétních vstupů
Při čtení coilů a diskrétních vstupů se parametry nedefinují pomocí čísla registru. Bitově orientovaná tabulka s šestnáctibitovými registry nepracuje. Místo toho je definováno číslo coilu. Pokud tedy chceme číst 10 coilů počínaje coilem 150, počáteční prvek skupiny je 150 a počet prvků je 10.
Datový typ datového bodu bude bit.
Délka multibyte se nastaví na 1. Posun v bytovém telegramu je zařízen kombinací bitového ofsetu a data ofsetu. Bitový ofset se zadává v rozsahu 0 až 7.
Pokud by byl bitový ofset větší než 7 bitů, je nutné zvýšit data ofset o 1 (byte) a bitový ofset začíná opět na 0. Příklad: pokud má být datový bod čten s posunem 35 bitů, bitový ofset je 2 a data ofset je 4.
Tyto parametry lze snadno spočítat:
Data Offset = Celočíselné dělení požadovaného posunu 8
Bit offset = Zbytek po dělení - 1

4. Zápis coilů
Zápis coilů probíhá hodně podobně jako čtení coilů. Opět: jediný rozdíl je mezera ofsetu pro zápis.
Je-li data ofset = 0, mezera ofsetu pro zápis je 1.Pokud se datový bod posune v telegramu tak, že data ofset je větší než 0, mezera ofsetu pro zápis je vždy dat ofset + 1.
Bitový posun se nastavuje stejně jako u čtení coilů.

Zrychlení práce pro mapování modbusových parametrů

Pro rychlejší mapování modbusových parametrů je možné parametry mapovat přímo z editoru komunikačního kanálu, který zobrazíte dvojklikem na komunikační kanál nebo pravým klikem myši na komunikační kanál - Otevřít editor.

Záložky "Ofset dat", "Bitový ofset", "Délka MultiByte" a "Mezera ofsetu pro zápis" umožňují rychlejší zápis modbusových parametrů

Mapování modbusových parametrů

Export modbusového zařízení

Pro vyexportování modbusového zařízení do CSV formátu klikněte pravým tlačítkem myši na zařízení - Export zařízení.

Export zařízení

Výstupní cesta - Cesta v průzkumníku pod kterou se zařízení vyexportuje
Přepsat existující - Nahrazení stávajícího souboru
Oddělovač sloupců - Čárka, Středník nebo Tabulátor
Včetně hlavičky - Hlavičku tvoří vybrané položky níže
Včetně patičky - Patičku tvoří vybrané položky níže