MODBUS RTU – popis

Modbus RTU je komunikační protokol typu „žádost – odpověď“, dříve označovaný MASTER – SLAVE. Vzhledem k přejmenování KLIENT – SERVER došlo v některých článcích na internetu při výkladu k záměně popisů činnosti a tím se zaneslo množství nejasností pro pochopení začátečníky. Další autoři kopírují vše do svých odkazů. Jen na vysvětlenou: MASTER je KLIENT a SLAVE je SERVER.
Jako obyčejný smrtelník bych to viděl naopak, protože MASTER je vždy pouze jeden a SLAVE může být až 247, z toho tedy vyplývá že KLIENT je pouze jeden a SERVERů může být až 247. Mně to, který chce pochopit princip moc logické nepřipadá.
Kdo by to byl řekl, že někteří lidé vidí rasismus i v technickém světě. Pojmy jako Master/Slave či White / Black list se staly nepřijatelnými pojmy, které musí být z technické terminologie odstraněny. Některé velké softwarové společnosti již své kódy „optimalizovaly“. Pochopitelně nebyly tyto pojmy nahrazeny jednotně ale každý nějak jinak. Tak jen tak pro orientaci některé používané náhrady. Já se budu držek původních pojmů, aby nedošlo k mýlce a je na každém z vás, jestli se tohoto označení bude držet, nebo si jednoduše “rasistická“ slova pomocí CTRL H vymění za jiná. Výběr je velký.
Tabulka nejpoužívanějších výrazů místo MASTER – SLAVE:

Další alternativy:
Agency / Operatives, Captain / Conscripts, Master / Masons, Hive / Drones, Schemer / Patsies, Primary / Replicas, Scripture /Prophets
Nejen mně, ale i dalším vývojářům připadá, že zvolené alternativy přesně nevystihují vzájemnou vazbu Master/Slave. Možná je to tím, že tento výraz se již používá několik desetiletí a je vžitý a samozřejmý. Kdo vidí v tomto technickém pojmu rasismus, musí hledat problém někde jinde a ne v terminologii.
K dalším nejasnostem v popisu pak dochází k používání zkratek, které někteří autoři řádně nepopíší nebo nevysvětlí. Vzhledem k tomu, že MODBUS byl vyvinutý již v roce 1979 firmou Modicon a stal se z něho průmyslový standard, by si zasloužil kvalitnější a srozumitelnější popis.
Modbus po sériové lince:
Modbus preferuje sériovou komunikační sběrnici standardu RS485, s baudovou rychlostí 19200 baudů, 8 datových bitů a sudou paritu. Není-li použita parita, používají se 2 stop bity.
Protokol Modbus definuje dva vysílací režimy, Modbus RTU a Modbus ASCII.
Režim určuje, v jakém formátu jsou data vysílána. Každá jednotka musí podporovat režim RTU, ASCII je nepovinný. Všechny jednotky na jedné sběrnici musí pracovat ve stejném vysílacím režimu.
- MODBUS ASCII – V režimu ASCII je každý 8bitový byte posílán jako dvojice ASCII znaků. Oproti režimu RTU je tedy pomalejší, ale umožňuje vysílat znaky s mezerami až 1 s. Začátek a konec zprávy je totiž určen odlišně od RTU módu. Začátek zprávy je indikován znakem „ : “ a konec zprávy dvojicí řídicích znaků CR, LF. Tato verze protokolu je tak „lidsky čitelnější“, ale proti RTU verzi je málo využívaná.
Samotná komunikace jen vždy inicializována jednotkou Master. Slave jednotky nikdy nevysílají data bez předchozí žádosti jednotky Master. Slave jednotky nemohou navzájem spolu komunikovat bez účasti Masteru.
Struktura MODBUS rámce pro komunikaci po sériové lince je shodný s obecným schématem MODBUS rámce ADU. Jako Error Check se využívá metody CRC nebo LRC. Adresa udává komunikující Slave jednotku a přenáší se v obou směrech komunikace, tedy ve směru od Master k Slave i zpět od Slave k Master, aby Master vždy věděl, která jednotka právě odpovídá.
Příklad zprávy MODBUS ASCII:


Prvních 32 znaků se používá jako řídicí znaky a ostatní se již používají jako běžný text, který se nám také srozumitelně zobrazuje.
MODBUS RTU po sériové lince :
- MODBUS RTU – V režimu RTU se 8bit byte vysílá jako jeden znak, integrita zpráv je zajištěna pomocí kontrolního součtu typu CRC a pomocí paritního bitu(je-li použit). Vysílání zprávy musí být souvislé, mezery mezi znaky nesmějí být delší než 1,5 znaku. Začátek a konec zprávy je identifikován jen podle pomlky na sběrnici delší než 3,5 znaku.
Časování a definice protokolu zajišťuje rychlou komunikaci a spolehlivost po sběrnici RS485, aniž by byly kladeny přehnané nároky na připojená zařízení. Díky svým dobrým vlastnostem a otevřenosti patří MODBUS RTU k nejrozšířenějším komunikačním standardům pro průmyslovou automatizaci.
Začneme formátem posílání zprávy MASTREM:
Pro začátek budeme popisovat MODBUS, který pro komunikaci využívá sériovou linku. Existuje i varianta Modbus TCP (Ethernet) – to si ale necháme na jindy.
Pro fyzický přenos dat se nejčastěji používá sběrnice původně označovaná RS-485 nebo RS485. Jedná se o standard definovaný již v roce 1983 sdružením EIA. Proto je správné označení EIA-485. Vychází ze stejného základu jako RS-232, od kterého se liší jinou definicí napěťových úrovní. Je jednodušší o nepřítomnost modemových signálů a umožňuje vytváření sítí (sběrnice) na které může být až 32 zařízení s možností komunikace až na vzdálenost 1200m. RS-232 umožňuje komunikaci jen na vzdálenost do 20m a jen mezi dvěma zařízeními.
RS-485 (obdobně jako RS-422) se vyznačuje dvouvodičovým diferenciálním propojením jednotek. Vodiče jsou označovány písmeny A a B. Maximální vzdálenost je až udávaných 1200m.
Při komunikaci na větší vzdálenosti musí být vedení na obou koncích zakončeno odpory, tím se zabrání odrazům signálu od konců vedení a zvýší se odolnost linky proti rušení z venku. Zakončovací odpory by měly mít hodnotu 110 Ω. Impedance linky je pak 55 Ω. Zakončovací odpory je dobré mít zapojeny i při malých vzdálenostech.
Na obrázku je ukázka přenosu znaku 0xD3. Nejprve je vyslán Start bit, pak 8bitů data bez parity a nakonec Stop bit.
Vodič A je označen U- a vodič B U+.
Vysílač by měl na výstupu při logické 1 (klidový stav linky) generovat na vodiči A napětí −2 V, na vodiči B +2 V, při logické 0 by měl na vodiči A generovat +2 V, na vodiči B −2 V.
Podstatná je detekce logického stavu založená na rozdílovém napětí mezi A a B.
Výhodné je to zejména kvůli eliminaci indukovaného rušivého signálu, který se většinou přičítá k oběma vodičům stejně, což ho vlastně vyruší.
Přijímač rozlišuje logický stav „1“ (také označovaný jako „Mark“) při rozdílu napětí A − B < −200 mV. Logický stav „0“ označovaný jako „Space“ při rozdílu napětí A − B > +200 mV.
I když se pracuje s rozdílovým napětím, při spojení na delší vzdálenosti se musí kromě signálových vodičů (RxTx+ a RxTx−) propojit i země (GND, G) komunikujících zařízení (viz např. specifikace Modbusu)
Příčinou je, že ve vzdálených místech mohou existovat značné rozdíly v potenciálu „země“. Proto je často „dvouvodičová“ RS-485 ve skutečnosti spíše třívodičová a „čtyřvodičová“ , RS-422 spíše pětivodičová.
Použitelná vzdálenost přenosu je závislá na přenosové rychlosti a použití kabelu pro data nejlépe s krouceným párem. Tuto závislost znázorňují následující dva grafy.

Důležité je také začátek a konec sběrnice přizpůsobit zakončovacími odpory.
Terminátor by měl mít v ideálním případě hodnotu 110 Ω (tzv. obrazová impedance), výsledná impedance linky je pak 55 Ω (110 Ω || 110 Ω).
Příklad zprávy MODBUS RTU:
Zpráva začíná po mezeře ve vysílání delší než 3.5 znaku (šířka záleží na nastavené baudové rychlosti)


MASTER:
6F – je adresa SLAVE kterému je zpráva určena: 6F je hex adresa, což dekadicky znamená 111
05 – je požadovaná funkce (zapiš jednu cívku) – sepni výstup …
0001 – je počáteční adresa registru
FF00 – požadovaná hodnota registru FF00 je v tomto případě zapnutí (0000) je vypnutí
D574 – kontrolní součet CRC
SLAVE: v podstatě opakuje přijatý povel, jen s tím rozdílem že CRC neopakuje ale počítá
6F –
05 –
0001 –
FF00 –
D574 – CRC vypočítané-souhlasí-li s přijmutím CRC je vše v pořádku a může vykonat povel.
ADRESA SLAVE:
Je 8bitová, což představuje 256 různých adres. Uživatelsky využitelné jsou adresy 1 až 247, protože adresa 0 je rezervovaná pro speciální adresu “Broadcast”, která oslovuje všechny jednotky slave, ale žádná na ni neodpovídá. Adresy 248 až 255 jsou rezervovány.

Master nemá žádnou adresu, pouze slave jednotky musí mít jedinečnou adresu v celé síti MODBUS.
Funkce: MODBUS protokol definuje tři skupiny kódů funkcí:
1)Veřejné kódy funkcí
- jasně definované
- je garantována unikátnost
- schvalovány společností MODBUS-IDA.org
- veřejně zdokumentované
- je k nim dostupný test shody
- zahrnují veřejné přiřazené kódy funkcí i nepřiřazené kódy rezervované pro budoucí použit
2)Uživatelsky definované kódy funkcí
- dva rozsahy uživatelsky definovaných kódů funkcí: 65 ÷ 72 a 100 ÷ 110
- umožňují uživateli implementovat funkci, která není definována touto specifikací
- není garantována unikátnost kódů
- lze je po projednání přesunout do veřejných kódů
3)Rezervované kódy funkcí
- kódy funkcí, které jsou v současnosti používány a nejsou dostupné pro veřejné použití

DATA:
Jsou vždy 16ti bitová a udávají číslo registru, kde jsou data uložená, následuje hodnota která se má nastavit nebo číst. Adresa a kód funkce je 8 bitová.
Příklad PDU části komunikace pro nastavení jednoho výstupu – (Write Single Coil):
05 (0x05) Zapiš jednu cívku (Write Single Coil)
Tato funkce slouží k nastavení jednoho výstupu do stavu ON nebo OFF. V požadavku je specifikována adresa výstupu, který se má nastavit a hodnota na, kterou se má nastavit.
0x0000 znamená OFF, 0xFF00 znamená ON. Normální odpověď Slave je kopií požadavku.
Tato funkce slouží k nastavení jednoho výstupu do stavu ON nebo OFF.

Nesouhlasí – li CRC na obou stranách (vysílané MASTERem a vypočítané SLAVE) pošle SLAVE jednotka chybový kód, aby MASTER poznal že povel neprošel v pořádku.
V případě, že SLAVE nedetekuje svoji adresu, jednoduše neodpoví a nastane pomlka delší než 3.5 znaku a MASTER tak ví že neuspěl. Většinou se pokusí znovu poslat svůj požadavek.

Většinou se pokusí zaslat požadavek znovu po 1sec a neprojde-li, opakuje ho celkem třikrát.
Z popisu protokolu vyplývá, že pokud chceme například sepnout relé, byť by nám k tomu stačilo nastavit pouze jeden bit, musíme nastavit celý 16bitový registr na udané 16ti bitové adrese a to hodnotou 0xFF00 pro zapnutí a hodnotou 0x0000 pro vypnutí.
Adresy registrů jsou definovány datovým modelem MODBUS:

Diskrétní vstupy jsou jednobitové vstupy, ale každý má svůj 16bitový registr na dané adrese.
Cívky jsou jednobitové výstupy definované každý jedním registrem.
Vstupní registry analogových hodnot uložených v 16bitovém formátu na příslušné adrese.
Vstupní registry a diskrétní vstupy jdou MASTERem pouze číst, nelze do nich zapisovat.
Uchovávající registry jsou 16 bitové a lze do nich zapisovat data vytvořená programem.
Rozsah adres všech čtyř typů dat je uveden v tabulce 2.1.
Pro začátek za zmínku stojí identifikace zařízení (SLAVE)
MASTER může poslat dotaz: Čti identifikaci zařízení (Read Device Identification)
Tato funkce umožňuje čtení identifikace a dalších údajů týkajících se popisu zařízení. Identifikace
zařízení je složena z množiny objektů, z nichž každý má svou identifikaci.
Existují tři skupiny objektů:
- Základní identifikace zařízení
- Obvyklá identifikace zařízení
- Rozšířená identifikace zařízení

Záporné odpovědi:
Když klient posílá serveru požadavek, očekává na něj odpověď.
Mohou nastat čtyři situace:
- Jestliže server přijme bezchybně požadavek a je schopen jej normálně zpracovat, vrátí klientovy
normální odpověď.
- Jestliže server požadavek nepřijme z důvodu komunikační chyby, není vrácena žádná odpověď.
Na straně klienta dojde k vypršením časového limitu pro příjem odpovědi.
- Jestliže server přijme požadavek, ale detekuje komunikační chybu (parita, CRC…), nevrací žádnou
odpověď. Na straně klienta dojde k vypršením časového limitu pro příjem odpovědi.
- Jestliže server přijme bezchybně požadavek, ale není schopen jej normálně zpracovat, vrátí
klientovi zápornou odpověď s udáním důvodu neúspěchu.
Normální a záporná odpověď se liší nejvyšším bitem kódu funkce. Je-li bit nulový, jedná se o
normální odpověď, je-li bit nastavený, jedná se o zápornou odpověď. V případě záporné odpovědi je
v datové části předán kód chyby. V následující tabulce je seznam možných chybových kódů.
Poslední údaj, který musíme ve zprávě poslat je CRC. Je to 16ti bitový údaj kontrolního součtu z anglického Cyclic Redundancy Check (CRC).
K detekci chyb slouží 16-bitové CRC pole s generujícím polynomem x16 + x15 + x2 + 1.
CRC se vypočítá pro celou zprávu, počínaje adresou slave a pokračuje až do posledního bajtu před samotným CRC. To pomáhá zajistit integritu dat tím, že umožňuje přijímajícímu zařízení ověřit, že celá zpráva, včetně adresy zamýšleného příjemce, dorazila bez chyb.
CRC-16 (IBM, Modbus)
CRC-16 je druhým nejsilnějším typem kontrolního součtu. Přestože jeho výsledek je jen 16-bitový, stále ještě má výbornou citlivost na chyby. Výpočet probíhá podle polynomu x^16 + x^15 + x^2 + x^0. Používá se např. v diskových řadičích ke kontrole sektorů, na sběrnici Modbus nebo na sběrnici Dallas Maxim 1-wire. V tabulkové verzi vyžaduje tabulku o velikosti 512 bajtů. Podle výchozí hodnoty se rozlišuje několik verzí. Diskové řadiče a Dallas Maxim používají výchozí hodnotu 0. Kontrolní vzorek: “123456789” -> 0xBB3D, 0xFC 0x05 0x4A -> 0x9742. Sběrnice Modbus používá výchozí hodnotu 0xFFFF. Kontrolní vzorek: “123456789” -> 0x4B37, 0xFC 0x05 0x4A -> 0x5733.
Zde je návod, jak CRC funguje v Modbus RTU: ·
Adresa: (první bajt zprávy) je zahrnut do výpočtu CRC.·
Kód funkce a data: všechny bajty za adresou jsou také zahrnuty až do konce zprávy.· CRC: přijmutý CRC se nezařazuje do výpočtu, slouží pro porovnání s výpočtem. Nezapomenout prohodit horní a dolní byte.·
Výpočet CRC: CRC se vypočítá pomocí standardního 16bitového algoritmu CRC, který vytváří dvoubajtový kontrolní součet.·
Umístění: CRC je připojeno na konec zprávy, aby umožnilo přijímajícímu zařízení ověřit celou zprávu po přijetí. Zahrnutí adresy do CRC je zásadní, protože pomáhá zajistit, že zpráva byla přesně přenesena abyla určena pro konkrétní zařízení, které ji přijalo. Pokud se adresa nebo jakákoli jiná část zprávy během přenosu změní, ověření CRC se nezdaří a zpráva bude zahozena.
Výpočet CRC
Výpočet CRC je prováděn z celého rámce včetně MODBUS SLAVE adresy, modbus funkce a datové části rámce :
- Inicializace 16-bit CRC registru na 0xFFFF.
- Provedeme XOR prvních 8 bitů rámce se spodním bytem CRC registru a výsledek uložíme do CRC registru.
- Provedeme posun CRC registru (H i L) o 1 b doprava (směrem k LSB), MSB CRC registru vyplníme 0. Zachytíme a vyhodnotíme nejspodnější bit, který posunem vypadl.
- Pokud byl tento bit roven 1, provedeme XOR mezi CRC registrem a hodnotou 0xA001 (generující polynom=1+x2+x15+x16). Výsledek uložíme opět do CRC registru.
- Opakujeme kroky 3 a 4 dokud nebude provedeno osm posunů CRC registru. Tím máme zpracovaný 1byte a pokračujeme dál.
- Provedeme XOR dalších 8 bitů rámce (zprávy) se spodním bytem CRC registru a opakujeme kroky 3 až 5.
- Takto pokračujeme až do posledního byte rámce.
- Výsledná hodnota CRC výpočtu je uložena v CRC registru.
- Při umístění CRC hodnoty do Modbus rámce je nutné zaměnit horní a spodní byte CRC registru .
Literatura:
[1]. https://cs.wikipedia.org/wiki/Modbus
[2]. http://home.zcu.cz/~ronesova/bastl/files/modbus.pdf
[3]. http://mcu.cz/news.php?extend.1104.15
[5]. https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf
[7]. https://cyber.felk.cvut.cz/novakpe/Information/CommunProtocols/ModBus%20(2021-05-06).pdf