26.3.2024

Komunikácia – Modbus protokol, časť 2

V tomto pokračovaní článku "Komunikácia - Modbus protokol" sa budeme zaoberať ďalšími špecialitami, ktoré implementácia Modbus protokolu môže priniesť.

 

Tretia komplikácia: veľkosť registrov

Štandard síce definuje, že register má 16 bitov, ale existujú aj implementácie, ktoré ho nerešpektujú:

  • 1 register má 1 bajt - v D2000 je možné parametrom protokolu “Byte Mode” aktivovať bajtový mód.
  • 1 register má variabilný počet bajtov (1,2,4) – závisí od konfigurácie a typu objektu. V D2000 je možné parametrom protokolu “Variable Mode” aktivovať variabilný mód a v konfigurácii meraného bodu špecifikovať veľkosť registra.  S takýmto divokým chovaním sme sa stretli pri prietokomere FloBoss 103 firmy Emerson. Kvôli nemu sú v D2000 podporené aj ďalšie špeciálne typy, napr. registre pre textové reťazce v dĺžke 10, 20 alebo 30 bajtov alebo 6-bajtová časová značka (ss:mi:hh dd/mm/yy).
 tvar adresy meraného bodu pre variabilný mód so špecifikáciou veľkosti registra
Obr 4: tvar adresy meraného bodu pre variabilný mód so špecifikáciou veľkosti registra (xN) je paradoxne jednoduchší ako základný tvar adresy, keďže pre FloBoss 103 nebolo potrebné podporiť rôzne módy adresácie používané inými výrobcami v štandardnom móde.

 Štvrtá komplikácia: Write Multiple Registers

 Sú aplikácie, ktoré vyžadujú, aby bolo zapísaných viacero registrov naraz funkciou Write Multiple Registers (16) . Príkladom je už spomenutá rada elektromerov ABB A4x, ktorá podporuje synchronizáciu času a dátumu zápisom do registrov. Tem musí prebehnúť jedným zápisom funkciou Write Multiple Registers (16), ktorý zapíše naraz 3 registre, t.j. 6 bajtov.

Niečo podobné je v D2000-ke možné nakonfigurovať dvoma spôsobmi.

Prvý spôsob používa zápis meraného bodu konfigurovaného ako textový reťazec s dĺžkou 3 registre resp. 6 znakov (8-bitových ). V skripte je možné vyskladať reťazec podľa aktuálneho dátumu a času a následne ho zapísať.

 

skript na demonštrovanie nastavenia času v elektromeroch ABB 4x
Obr 5: skript na demonštrovanie nastavenia času v elektromeroch ABB 4x

Druhý spôsob využíva tzv. oneskorený zápis.

 

konfigurácia meraného bodu pre nastavenie času
Obr 6: konfigurácia meraného bodu pre nastavenie času: a3 znamená textový reťazec s dĺžkou 3 registre (2 znaky na register), 0-16 sú funkcie použité na čítanie/zápis (žiadne čítanie / Write Multiple Registers) a #8A00 je adresa v hexadecimálnom tvare.

Pokiaľ má výstupný meraný bod v D2000 nakonfigurovanú funkciu zápis Write Multiple Registers  (16) a za ňou príznak ‘d’, zápis sa odloží a je vykonaný až vtedy, keď príde požiadavka na zápis pre bod, ktorá nemá nakonfigurovaný odložený zápis. Následne sa snaží KOM proces vykonať všetky naakumulované zápisy jediným zápisom Write Multiple Registers . Tento spôsob je výhodný pri zápisoch, ktoré nepracujú s bajtovo a textovo orientovanými hodnotami (ako čas a dátum vyššie) ale napr. s 16/32/64-bitovými integermi alebo 32/64 float hodnotami.

 

Piata komplikácia: aplikačné špeciality

 Najvýraznejším príkladom, ako sa dá Modbus využiť na prenos ‘skoro všetkého’, sú už spomenuté elektromery ABB A4x. Okrem už spomínaného zápisu času majú podporené nasledovné vlastnosti:

  • čítanie historických dát
  • čítanie predchádzajúcich hodnôt (dňové, týždňové alebo mesačné)
  • čítanie event logov
  • čítanie profilov a konfigurácie profilov (8 kanálov s periódou od minúty po 24 hodín)
  • konfiguráciu predchádzajúcich hodnôt, profilov, alarmov, vstupov/výstupov a taríf

V konkrétnej aplikácii sme implementovali čítanie profilov (historických hodnôt), čítanie a zápis ich konfigurácie, čítanie a zápis konfigurácie alarmov a čítanie event logov (informácie o alarmoch a udalostiach, ktoré nastali a elektromer si ich udržuje v pamäti).

 Všetky spomenuté špeciality boli implementované na aplikačnej úrovni, v ESL skripte. Využívali možnosť zo skriptu zastaviť a spustiť komunikáciu s konkrétnou stanicou (a čakať na načítanie hodnôt vstupných meraných bodov) ako aj možnosť zo skriptu dynamicky zmeniť adresu meraného bodu (a znovu čakať na načítanie hodnoty).

 Pre jeden elektromer bolo vytvorených viacero staníc v D2000. Jedna slúžila na pravidelné čítanie hodnôt, ostatné boli štandardne vypnuté a v prípade potreby sa používali na vyššie spomenutú aplikačnú funkcionalitu. Napr. na čítanie profilov boli potrebné tri – jedna obsahovala body pre výber kanála (OBIS kód objektu) a nastavenie času a dátumu pre vyčítavaný profil, cez druhú sa následne načítavali informácie o profile (interval, mierka, či sa jedná o unsigned alebo signed dáta) a cez tretiu samotné historické hodnoty.

 

Šiesta komplikácia: GSM siete

GSM siete a časové pomery v nich. V čom je problém? Na jednoduchej sériovej linke odpoveď buď príde (v definovanom čase) alebo nie. Na GSM sieti – v konfigurácii, že D2000 KOM posielal výzvy cez GSM sieť na Moxa OnCell modem, za ktorým boli zariadenia na sériovej linke – sme sa stretli s problémom, že odpoveď na výzvu prišla niekedy s takým oneskorením, že medzitým KOM proces poslal výzvu znovu. Takže na druhú výzvu spracoval odpoveď prvej výzvy, všetko bolo v poriadku. Následne poslal výzvu na čítanie iných dát a na ňu prijal odpoveď druhej výzvy. Keďže odpoveď obsahuje iba dĺžku dát, ale nie ich adresu, došlo k „domixovaniu“ dát.

Čo s tým? Jednou pomôckou je nastaviť „dostatočne veľké“ časové konštanty pre príjem odpovede, aby pokryli aj variabilné oneskorenia GSM siete. Druhou pomôckou je parameter „Check Receive Length“, ktorý porovnáva dĺžku dát v odpovedi s dĺžkou, ktorá bola poslaná vo výzve. Pokiaľ sa nezhodujú, paket je zahodený. Parameter je podporený pre štandardný a bajtový mód, zatiaľ nie pre variabilný mód.

 

D2000 a Modbus server

 D2000 KOM má implementovanú aj serverovú stranu protokolu Modbus, takže vie slúžiť aj ako Modbus server. Podporuje všetky štandardné funkcie na čítanie a zápis a výstupné merané body vie zverejňovať ako 16/32-bitové celočíselné hodnoty (tj. 1 a 2-registrové) a 32-bitové reálne hodnoty (2-registrové), voliteľne v little/big endian formáte. Na rozdiel od klientskej strany Modbus protokolu nikdy nevznikla potreba implementovať veci ako variabilný alebo bajtový mód, textové premenné a podobne, preto  – asi aj preto, že v prípade potreby komunikácie D2000 s nadradeným systémom existuje viacero modernejších protokolov implementovaných v D2000 (OPC server, IEC104 server, IEC101 server, ICCP server), ktoré sú zmenovo orientované, podporujú časové značky, prípadne autentifikáciu a ďalšie možnosti. Preto je serverová časť Modbus protokolu relatívne jednoduchá a nemá zmysel písať o nej samostatný článok.

 

Záver

 Cieľom tohto článku bolo ukázať na konkrétnych príkladoch, aké rôzne ‘nárečia’ môžu v praxi vzniknúť z jednoduchého protokolu typu Modbus. Zoznam výnimiek a špecialít určite nie je úplný – spomenuli sme iba niektoré z problémov, s ktorými sme sa v praxi stretli. Ako hovorí príslovie, šedivá je teória, zelený strom praxe .. a občas na ňom vyrastú listy (alebo priam haluze :), že laik žasne a odborník sa diví ..

 

21.8.2017, Ing. Peter Humaj, www.ipesoft.com

Iné blogy