Programování PLC (3): Práce s externími periferiemi skrze Modbus

Domů Novinky Programování PLC (3): Práce s externími periferiemi skrze Modbus Zpět
Blog

13.08.2020 Ve třetím díle série blogových článků o použití open-source nástrojů na PLC Unipi si vyzkoušíme komunikaci s externími zařízeními pomocí protokolu Modbus. ‌

Úvod

Vítejte u třetího dílu série věnované open-source softwaru ve světě PLC Unipi. V minulém díle jsme si vyzkoušeli práci se vstupy a výstupy integrovanými přímo v jednotce, změřili si teplotu přes 1-Wire teplotní čidlo a jako ukázkový projekt si vytvořili jednoduchý termostat s hysterezí v prostředí Node-RED.

V reálných projektech však může vyvstat potřeba vyššího počtu vstupů/výstupů a nebo jiných periferií (případně jiného typu) než může samotná jednotka nabídnout. V takovém případě je jedním z možných řešení připojení rozšiřujícího modulu (angl. Extension), který potřebná rozhraní obsahuje. Tyto moduly mohou se samotným PLC komunikovat různými způsoby - sériová linka standardu RS485 a ethernet patří mezi ty nejobvyklejší. Právě jim je věnován tento díl.

Pro ukázku jsme vybrali dva produkty z nabídky Unipi, konkrétně pak interiérový senzor kvality vzduchu Unipi a rozšiřující modul Unipi Extension xG18. Obě tato zařízení ke komunikaci využívají protokol Modbus, díky jehož rozšířenosti napříč produkty různých výrobců lze obdobným způsobem integrovat i širokou škálu dalších zařízení.

Modbus

Tento komunikační protokol, který je používán již od roku 1979, patří mezi vůbec nejpoužívanější v oblasti měření a regulace a jeho největšími výhodami jsou relativní jednoduchost a nízké nároky na systémové prostředky. Detailnější seznámení se s protokolem je nad rámec tohoto textu, veškeré potřebné informace naleznete na tomto odkazu. 

Co do charakteristiky je Modbus protokolem typu Client-Server, kdy je nadřazeným zařízení klient (v našem případě PLC), zatímco roli serveru plní rozšiřující modul, chytrý senzor nebo jiné externí zařízení. Protokol existuje ve více variantách - RTU, ASCII a TCP - lišících se formátem rámce či kódováním jednotlivých znaků. Pro následující ukázku, věnující se nejčastěji používaným variantám RTU a TCP, jsou pak klíčové následující vlastnosti. Ty je třeba na obou komunikujících stranách odpovídajícím způsobem nastavit: 

  1. Adresa/identifikátor zařízení - unikátní číslo použité pro jednoznačnou identifikaci daného modbus serveru
  2. Parita a bitová rychlost, případně počet stopbitů (netýká se ethernet/TCP spojení) - všechna zařízení v rámci jednoho segmentu zpravidla sdílí stejné parametry linky RS485.
  3. IP adresa a port (pouze TCP varianta) - IP přiřazená staticky nebo dynamicky, TCP port je obvykle volně konfigurovatelný, avšak nejčastěji jde o port 502.

Modbus zařízení obvykle poskytují více hodnot v podobě naměřených dat, konfiguračních parametrů apod. Tyto hodnoty jsou reprezentovány tzv. registry. Ty jsou uspořádány do registrové mapy, jejíž popis by měl být nedílnou součástí dokumentace každého Modbus zařízení.

Interiérový senzor kvality vzduchu RW-THC 

První ukázkové zařízení, které k jednotce Unipi připojíme, je interiérový senzor kvality vzduchu RW-THC.

Senzor je určen k montáži do interiéru budov a umožňuje měřit tyto veličiny:

  • Teplota
  • Vlhkost
  • Koncentrace CO2
  • Množství těkavých látek v ovzduší
  • Barometrický tlak
  • Okolní osvětlení

S nadřazeným systémem senzor komunikuje skrze dvě komunikační rozhraní - RS485 (Modbus RTU) a bezdrátové Wi-Fi rozhraní (Modbus TCP). Právě druhou jmenovanou variantu si vyzkoušíme v příkladu níže. 

Unipi Extension xG18

Přes Modbus RTU je ke kontroléru připojen i rozšiřující modul xG18, který umožňuje připojení až osmi teplotních čidel Unipi 1-Wire DS18B20.

Modul umožňuje nastavit periodu vyčítání nezávisle pro každý 1-Wire kanál a samozřejmě také parametry sériové komunikace. (adresa, bitová rychlost a parita). 

Otestování komunikace

Před integrací samotného zařízení do některého IDE doporučujeme samotnou komunikaci nejprve otestovat. Zjistíte tak, zda je fyzické propojení průchozí a parametry jako adresa nebo bitová rychlost sériové linky jsou správně nastavené. Jednoduchým a rychlým způsobem může být použití programu mbpoll, který je součástí standardního repozitáře OS Debian.


-----------------------------

pi@M203-sn55:~ $ sudo apt install mbpoll

-----------------------------

Tento nástroj slouží jako klient jak pro Modbus RTU, tak i TCP.

Nejprve otestujeme komunikaci s xG18, která je k řídicí jednotce Unipi Neuron M203 připojena přes rozhraní RS485. To je v tomto konkrétním modelu PLC jediné a je reprezentováno cestou /dev/extcomm/0/0. Přehled sériových linek pro všechny modely z řady Axon naleznete ZDE, pro řadu Neuron pak ZDE. Pokud jde o jediné či poslední zařízení na dané sběrnici, je třeba příslušným DIP přepínačem připnout zakončovací odpor 120Ω. 

Modul. xG18 umožňuje nastavit své parametry komunikace dvěma způsoby:

  • Softwarová konfigurace: parametry odpovídají obsahu příslušných registrů,
  • Hardwarová konfigurace: parametry jsou určené polohou DIP přepínačů.

Pro ukázku použijeme druhou možnost, která je vhodná v případě, že neznáte obsah konfiguračních registrů. Pokud jsou všechny přepínače v poloze ON, má xG18 adresu 15, bitovou rychlost 9600 baud a přenos probíhá bez parity. Úspěšný test pomocí nástroje mbpoll pak může s uvedeným nastavením vypadat následovně:


pi@M203-sn55:~ $ mbpoll -1 -a 15 -b 9600 -t 3 -r 1 -c 9 -P none /dev/extcomm/0/0 -0



-- Polling slave 15...

[1]:    3037

[2]:    2906

[3]:    2881

[4]:    2875

[5]:    2856

[6]:    2868

[7]:    2943

[8]:    3012

[9]:    255

Z pohledu na výpis mbpoll-u a Modbus mapu zahrnutou v dokumentaci výrobku vyplývá, že je připojen plný počet (tj. osm) 1-Wire teplotních senzorů. Bitová maska registru 9 nám pak sděluje, že všechny hodnoty senzorů jsou platné.  Pro získání teploty ve stupních Celsia je ale třeba obsah příslušných celočíselných registrů nejprve vydělit konstantou 100.

U zařízení připojeného přes Modbus TCP je postup velmi podobný. V případě senzoru RW-THC je třeba znát IP adresu a TCP port. IP adresu lze zjistit více způsoby, samotný senzor je pak pro tento účel vybaven službou Online discovery service popsanou v manuálu produktu. 

Předpokládejme nyní, že IP adresu známe a port zůstal nezměněn, tj. na hodnotě 502. Test skrze mbpoll tak bude vypadat následovně: 

pi@M203-sn55:~ $ mbpoll 10.251.17.15 -a 1 -B -t 3:float -r 0 -01



-- Polling slave 1...

[0]:    28.0581


Poznámka: vstupní 32 bitový registr na adrese 0 obsahuje teplotu jako datový typ 32bit float s velkou endianitou. Pro dokumentaci k přepínačům mbpoll-u viz nápověda programu vyvolaná přepínačem -h.

Integrace modulů do prostředí Node-RED

Předpokládejme nyní, že komunikace mezi PLC a oběma zařízeními je otestovaná a funkční. Nejpřímějším způsobem získání hodnot pro prostředí NodeRED je využít blok (uzel) pro práci s protokolem Modbus. Ten je potřeba nejprve nainstalovat z repozitáře pomocí následujícího postupu: z hlavní nabídky vyberte volbu Manage Palette -> Palette -> Install, do vyhledávacího řádku zadejte “modbus” a nainstalujte balík node-red-contrib-modbus.

Po instalaci se v seznamu všech uzlů zobrazí nová kategorie s uzly týkajícími se protokolu Modbus. Pro účel tohoto článku nám budou stačit uzel Modbus Read reprezentující Modbus server a uzel Modbus Response pro zobrazení surové podoby vyčtených registrů.

Prvním krokem je vytvoření dvou samostatných Modbus serverů, tj. jeden pro RS485/RTU a druhý pro TCP. Veškeré parametry zůstávají stejné jako v případě testu pomocí nástroje mbpoll: 

V dalším kroku přiřadíme daný Modbus server konkrétním zařízením. Pro zjednodušení budeme z obou připojených zařízení vyčítat pouze informace o aktuální teplotě. Postup pro další veličiny/registry zůstává shodný. Pro RW-THC pak budou parametry bloku Modbus-Read následující (vyčítají se dva dvoubajtové vstupní registry z adresy 0): 

Ne vždy ale můžeme surové hodnoty vyčtené ze zařízení použít přímo (např. pro jejich vizualizaci). V takovém případě je nutno provést jejich přepočet a nejinak tomu je i v případě xG18 a RW-THC. V prvním případě je nutné získanou celočíselnou hodnotu vydělit 100, čímž získáme teplotu ve stupních Celsia vyjádřenou desetinným číslem. U RW-THC je pak třeba ze dvou registrů (každý o šířce 16 bitů) pomocí kombinace logických operací získat číslo s plovoucí řádovou čárkou a velkou (BIG) endianitou. Obsah bloků provádějících tyto převody může vypadat následovně:


// Convert float32

var buffer = new ArrayBuffer(4);

var view = new DataView(buffer);


view.setInt16(0, msg.payload[0], false);

view.setInt16(2, msg.payload[1], false);


var res = view.getFloat32(0, false);


 

var newMsg = { payload: res };

return newMsg;

----------------------------------------------

 

// Divide by 100

var newMsg = { payload: msg.payload[0]/100 };

return newMsg;

Celý výsledný flow pro vyčítání hodnot z obou Modbus zařízení a jejich přepočet pak může vypadat například následovně: 

Bloky Debug a Modbus Response slouží pouze pro ladicí účely, kdy zobrazují přijatá data před a po provedeném přepočtu.

Celý flow si můžete stáhnout ve formátu JSON na tomto odkazu.

Závěrem

Ve třetím díle jsme k jednotce Neuron M203 připojili interiérový senzor kvality vzduchu a rozšiřující modul xG18. Obě zařízení shodně využívají protokol Modbus, liší se však použitým komunikačním rozhraním. To v případě xG18 tvoří rozhraní RS485, u senzoru RW-THC pak TCP/IP. Úsporu času zde může přinést otestování samotné komunikace pomocí jednoduchého nástroje mbpoll ještě před samotnou integrací zařízení do Node-RED. Jelikož pak jsou získané hodnoty ne vždy v námi požadovaném tvaru, ukázali jsme si i jednoduchý převod datových typů v prostředí Node-RED.

Kam dál? 

Díly

1-Wire teplotní senzor
Skladem více než 20 kusů

Interiérový senzor kvality vzduchu
Skladem více než 20 kusů

Unipi Extension xG18
Skladem více než 20 kusů

Unipi Neuron M203
Skladem více než 20 kusů

Do košíku
Přihlásit k odběru novinek


Zobrazit více