Modbus je typický představitel rodiny protokolů určených
    pro sběrnici realizovanou na RS485. Používá 256bajtové rámce opatřené
    16bitovým CRC. Protože Modbus rozlišuje typy přenášených dat (bitové,
    bajtové, wordové), jsou zavedny typy rámců pro odlišení těchto variant.
    Modbus typ rámce popisuje číslem funkce, kterou rámec realizuje. Dále je
    uveden přehled nejčastějších funkcí protokolu Modbus.
Čte z automatu Slave stavy vystupů (relé, tranzistorové spínače,
      apod.). Zakladním jednotkou čtenou pomocí této funkce je jeden výstup –
      v našich poměrech je to jeden bit. Protože ovšem protokol umí přenést
      jako nejmenší element jeden bajt, jsou bity výstupů sdružovány do bajtů.
      Master může adresovat více bitů naráz, pak je obdrží naskládané do
      několika bajtů odpovědi.
Typické tvary rámců pak vypadají takto:
výzva
| adr/8 | fce/8 | start/16 | number/16 | crc/16 |
odpověď
| adr/8 | fce/8 | cnt/8 | data/8 * cnt | crc/16 |
| adr | 
 – adresa automatu na sběrnici Modbus, tato adresa musí být  | 
| fce | 
 – funkce, kterou automat vykoná po přijetí rámce  | 
| start | 
 – počáteční adresa dat (výstupu), která budou  | 
| number | 
 – počet položek (bitů), které budou zpracovány  | 
| cnt | 
 – počet datových bajtů rámce  | 
| data | 
 – vlastní data dotazu zarovnaná na osm bitů  | 
| adr | 
 – zabezpečovací slovo  | 
Příklad:
Mějme stav výstupů v našem automatu od nulté adresy 0x1480.
      Automat má adresu na Modbusu 0x10. Pomocí funkce 01 nejprve přečteme
      všechny naráz a pak jen druhou polovinu.
Dotaz pro první případ:1001 0000
      0010 crc – chceme 16 výstupů od nulté
      pozice
odpověď:1001 0214 80 crc –
      vráceno všech 16 výstupů. Je potřeba upozornit, že data nejsou
      zarovnávána na sudý počet bajtů, jak je obvyklé v MORSE sítích.
Dotaz pro druhý případ:1001 0008
      0008 crc – chceme 8 výstupů od osmé pozice
odpověď:
1001 0180 crc – vráceno 8 výstupů. Jak
      je vidno, výstupy jsou organizovány ve formátu Intel (malý
      endian).
Tato funkce je naprosto totožná s předcházející funkcí, ale čte ze
      Slave automatu vstupy. Tvary rámců jsou rovněž shodné.
Funkce vrací z automatu 16bitové paměťové registry. Tyto registry
      jsou obecně použitelné (General purpose). V našem případě jsou použité
      pro cache a paketový režim. Rámce pak vypadají takto:
výzva
| adr/8 | fce/8 | start/16 | number/16 | crc/16 |
odpověď
| adr/8 | fce/8 | cnt/8 | data/8 * cnt | crc/16 |
| adr | 
 – adresa automatu na sběrnici Modbus  | 
| fce | 
 – funkce, kterou automat vykoná po přijetí rámce  | 
| start | 
 – počáteční adresa dat (výstupu), která budou  | 
| number | 
 – počet položek (wordy), které budou zpracovány  | 
| cnt | 
 – počet datových bajtů rámce  | 
| data | 
 – obsah požadovaných registrů zarovnaný na 16 bitů  | 
| crc | 
 – zabezpečovací slovo  | 
Příklad:
V našem automatu z přecházejícího příkladu jsou obsahy tří registů
      od nulté adresy0x1480, 0x3450 a
      0x4054.
Dotaz:
 1003 0000 0003 crc
Odpověď:1003 0614 8034 5040 54 crc –
      opět rámec není zarovnán na sudý počet bajtů.
Funkce je v principu shodná s funkcí pro čtení registrů. Na rozdíl
      od ní ovšem vrací stavy analogových vstupů.
Tato funkce nastavuje jeden výstup, t.j. jeden bit. Protože
      binární výstup lze jen nastavit nebo smazat, jsou tvary povely velmi
      jednoduché.
výzva| adr/8 | fce/8 | start/16 | 0xFF00 | – pro nastavení 1 výstupu
      crc/16 || adr/8 | – pro smazání 1
      fce/8 | start/16 | 0x0000 | crc/16 |
      výstupu
odpověď| adr/8 | fce/8 | start/16 | 0xFF00 | nebo
      crc/16 | | adr/8 | fce/8 | start/16 | – je prostou kopií dotazu.
      0x0000 | crc/16 |
| adr | 
 – adresa automatu na sběrnici Modbus  | 
| fce | 
 – funkce, kterou automat vykoná po přijetí rámce  | 
| start | 
 – počáteční adresa dat (výstupu), která budou  | 
| crc | 
 – zabezpečovací slovo  | 
Nastaví obsah jednoho registru = 1 word. Je podobná funkci
      předcházející, jen místo stavu bitu se objevuje stav registru.
výzva| adr/8 | fce/8 | start/16 | data/16 |
      crc/16 |
odpověď| adr/8 | fce/8 | start/16 | data/16 | – je opět prostou kopií dotazu
      crc/16 |
| adr | 
 – adresa automatu na sběrnici Modbus  | 
| fce | 
 – funkce, kterou automat vykoná po přijetí rámce  | 
| start | 
 – počáteční adresa dat, která budou zpracována  | 
| data | 
 – obsah zapisovaného registru  | 
| crc | 
 – zabezpečovací slovo  | 
Současné nastavení více výstupů.
výzva| adr/8 | fce/8 | start/16 | number/16 |
      cnt/8 | data/8 * cnt | crc/16 |
odpověď | adr/8 | fce/8 | start/16 | number/16
      | crc/16 |
| adr | 
 – adresa automatu na sběrnici Modbus  | 
| fce | 
 – funkce, kterou automat vykoná po přijetí rámce  | 
| start | 
 – počáteční adresa dat (výstupu), která budou zpracována  | 
| number | 
 – počet bitů pro zápis  | 
| cnt | 
 počet byte nutných pro přenos adresované skupiny bitů  | 
| data | 
 – stavy zapisovaných výstupů, wordy obsahují prohozené bajty  | 
| crc | 
 – zabezpečovací slovo  | 
Podobně jako předcházející funkce nastavuje více registrů
      současně.
výzva| adr/8 | fce/8 | start/16 | number/16 |
      cnt/8 | data/16 * numb | crc/16 | 
odpověď| adr/8 | fce/8 | start/16 | number/16
      | crc/16 |
| adr | 
 – adresa automatu na sběrnici Modbus  | 
| fce | 
 – funkce, kterou automat vykoná po přijetí rámce  | 
| start | 
 – počáteční adresa dat (výstupu), která budou  | 
| number | 
 – počet wordů pro zápis  | 
| cnt | 
 – počet byte nutných pro přenos požadované skupiny  | 
| data | 
 – stavy zapisovaných registrů  | 
| crc | 
 – zabezpečovací slovo  | 
Spojuje funkci 03 čtení a 06
      zápis.
výzva| a/8 | f/8 | rst/16 | rno/16 | wst/16 |
      wno/16 | wcnt/8 | wdata/cnt*8 |crc/16 |
odpověď| a/8 | f/8 | cnt/8 | data/cnt*8 |
      crc/16 |
| a | 
 – adresa slave  | 
| f | 
 – funkce READ/WRITE HOLDING REGISTERS  | 
| rst | 
 – start čtené oblasti  | 
| rno | 
 – počet registrů čtené oblasti  | 
| wst | 
 – start zapisované oblasti  | 
| wno | 
 – počet registrů zapisované oblasti  | 
| wcnt | 
 – počet byte dat v rámci  | 
| wdata | 
 – data, která mají být zapsána  | 
Pokud Slave automat čemukoliv v dotazu/povelu nerozumí je povinnen
      vrátit výjimku (exception). Výjimka by měla informovat Mastera o
      situaci, ve které se pokusil pracovat buď nedovolenou fukncí pro daný
      Slave nebo s daty mimo platný rozsah pro daný Slave automat.
– odpověď na dotaz nebo na povel s chybným zadáním|
      adr/8 | 0x80+fce /8 | excode/8 | crc/16 |
| adr | 
 – adresa automatu na sběrnici Modbus  | 
| fce | 
 – funkce, která výjimku vyvolala  | 
| excode | 
 – číslo výjimky, specifikuje kde přesně a jaká se stala 
  | 
| crc | 
 – zabezpečovací slovo  | 
