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 |