26.3.2024

Komunikácia – Modbus protokol

Modbus patrí medzi najjednoduchšie komunikačné protokoly (a asi aj vďaka tomu je stále široko použivaný). Skúsme sa pozrieť na jeho vlastnosti .. a na problémy s implementáciou v praxi.

Protokol Modbus navrhli v r. 1979 vo firme Modicon na komunikáciu s ich PLC ako jednoduchý a robustný sériový protokol typu master-slave. V súčasnosti  je za jeho rozvoj zodpovedná organizácia Modbus (http://www.modbus.org/) a aktuálna verzia štandardu je V1.1b3.

Modbus pozná iba 4 typy  objektov:

  • Coils (1-bitové  binárne stavy)
  • Discrete Inputs (1-bitové read-only binárne vstupy)
  • Holding register (16-bitové analógové stavy)
  • Input registers (16-bitové read-only analógové vstupy)

Každý typ objektu je adresovaný 16-bitovou adresou (0-65535). Dáta sú 16-bitové, posielané ako big endian (najskôr vyšší bajt , potom nižší). V prípade binárov sa posiela v 16 bitoch šestnásť hodnôt za sebou nasledujúcich objektov (napr. s adresou 16, 17, 18..31)

Na čítanie každého typu objektu a zápis typov, ktoré nie sú read-only, má protokol definované funkcie:

  • Coils: Read Coils (1), Write Single Coil (5)
  • Discrete Inputs: Read Discrete Inputs(2)
  • Holding register: Read Holding Registers(3), Write Single Register(6)
  • Input registers: Read Input Registers (4)

Pri čítaní sa špecifikuje adresa počiatočného objektu a počet čítaných objektov (1-2000 pre binárne, 1-125 pre analógové) tak, aby celková dĺžka vrátených dát nepresiahla 250 bajtov. Existuje aj funkcia Write Multiple Registers (16) na zápis viacerých registrov naraz.

Požiadavka na čítanie
Obr 1: požiadavka pre stanicu 1 na čítanie dát - funkcia Read Holding Registers(3),
adresa 0x0010, počet registrov 0x0004 

Odpoveďou na čítanie alebo zápis je paket s dátami alebo chybový kód s číslom výnimky popisujúcim, prečo čítanie alebo zápis zlyhalo. Paket s dátami obsahuje informáciu o veľkosti dát v bajtoch.

 

Modbus_2.png
Obr 2: odpoveď stanice 1 na požiadavku čítania dát - funkcia Read Holding Registers(3),
počet bajtov 0x08, dáta a CRC

Protokol definuje aj chuťovky typu Read/Write File Record a rôznu diagnostiku, ale tie bežné implementácie neobsahujú. Takže klient sa periodicky dotazuje na hodnoty všetkých objektov rôznych typov (čím viac ich dokáže dať do jednej výzvy, tým kratšie trvá celkové obvolanie) a server posiela odpovede. Žiadna podpora zmenových dát ako má napr. IEC 60870-5-101, IEC 60870-5-104, asynchrónny mód OPC, TG809 a iné protokoly. Žiadna podpora pre príznaky (validita, weak a pod). Žiadna podpora pre časové značky alebo pre vyčítavanie histórie.

Protokol používa jednobajtovú adresáciu slave zariadenia (štandardne 1-247, vyššie adresy sú rezervované), adresa 0 je broadcast. Na sériovej linke teda môže byť viacero zariadení, každé z nich musí mať unikátnu adresu.

Existuje RTU variant protokolu (binárne kódovanie) a ASCII variant (BCD kódovanie, takže je síce ‚čitateľný’ v textovom výpise, ale dvakrát pomalší, keďže každý bajt sa BCD kóduje dvoma bajtami).

 Existuje aj RTU varianta pre TCP spojenia (TCP port 502) – a to dokonca dve:

  • „MODBUS TCP“ nepoužíva kontrolnú sumu (CRC) a spolieha sa na mechanizmy TCP
  • „MODBUS over TCP“ používa kontrolnú sumu rovnako ako sériová varianta

Takže toľko teória. Aké komplikácie môžu vzniknúť v praxi?
Jednoduchá odpoveď je, že všetky :)

Prvá komplikácia: adresácia

 Kvôli niektorým zariadeniam boli zavedené 2 módy adresácie:

 "MODBUS PDU" - dáta sú adresované od 0 do 65535

  • "MODBUS data Model" - dáta sú adresované od 1 do 65536 (pri vyčítavaní meraného bodu s adresou 10 sa v protokole použije adresa 9)

Adresu meraného bodu je možné v konfiguračnom nástroji D2000 CNF zadávať v decimálnom alebo v hexadecimálnom tvare za použitia mriežky (#), napr. #50CE. Uľahčuje to konfiguráciu a kontrolu adries, pokiaľ dokumentácia konkrétneho zariadenia používa hexadecimálny tvar.

 D2000 KOM sa snaží posielať výzvy na čítanie čo najväčšieho počtu registrov (ktorý je možné obmedziť parametrom “Max. Registers“). Niektoré zariadenia ale vracajú chyby, pokiaľ výzva obsahuje aj adresy, ktoré neobsahujú dáta. Napr. ak výzva obsahuje adresu počiatočného objektu 100 a počet čítaných objektov 4 a zariadenie má definované objekty pre adresy 100, 101, 103 (ale nie 102), tak môže vrátiť chybu. Pre tento prípad existuje parameter protokolu “Skip Unconfigured“, ktorý spôsobí, že KOM proces nebude žiadať hodnoty pre adresy, na ktorých nemá definované merané body. Vyššie uvedená požiadavka by bola po aktivácii parametra “Skip Unconfigured“ rozdelená na dve: adresa 100, dĺžka 2 (t.j. adresy 100 a 101) a adresa 103, dĺžka 1.

 

Druhá komplikácia: typy premenných a indiáni

 Keďže Modbus definuje iba bináry a 16-bitové unsigned premenné (posielané ako big endian, t.j. vyšší bajt prvý, potom nižší bajt), rôzne implementácie si podľa potreby zadefinovali zvyšok pomocou reinterpretovania dát:

  • 8-bitové premenné môžu byť buď v hornom alebo dolnom bajte 16-bitového registra. Môžu byť unsigned/signed.
  • 16-bitové premenné môžu byť typu unsigned/signed integery posielané ako little/big endian
  • 32-bitové premenné vznikli spojením dvoch registrov za sebou:
  • môžu byť unsigned/signed integery posielané ako little/big endian
  • môžu byť reálne čísla (float) posielané ako little/big endian
  • 64-bitové premenné vznikli spojením štyroch registrov za sebou:
  • môžu byť unsigned/signed integery posielané ako little/big endian
  • môžu byť reálne čísla (float) posielané ako little/big endian
  • textové premenné vznikli spojením viacerých registrov za sebou:
  • jeden register môže obsahovať jeden znak (16-bitový UTF16)
  • jeden register môže obsahovať dva znaky (8-bitové ASCII) – napr. niektoré elektromery ABB A41..44 (ABB 4x)
  • ďalšou špecialitkou je kalorimeter Endress+Hauser RMS62. Ten implementuje stav reálnej hodnoty samostatným registrom nachádzajúcim sa pred ďalšími dvoma registrami, ktoré obsahujú 32-bitový float v big endian formáte.
    Stav obsahuje hodnoty zodpovedajúce napr. Invalid value, Valid value, Overflow/Underflow warning, Saturated steam alarm a iné špecifické pre konkrétny kalorimeter.

Celočíselné premené môžu byť navyše kódované  binárne (v jednom bajte hodnota 256 hodnôt) alebo BCD (v jednom bajte 100 hodnôt).

Všetky horeuvedené typy sú podporené v adresácii meraných bodov v D2000-ke v protokole Modbus IDA Client.

Modbus_3.png
Obr 3: tvar adresy meraného bodu pre Modbus protokol v helpe D2000 môže
pôsobiť odstrašujúco, ale príklady konfigurácie obavy rozptýlia.

 

 Na pokračovanie článku sa môžete tešiť zase o týždeň ..

 

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

Iné blogy