Sunteți pe pagina 1din 13

Cap.

3 Descrierea protocolului MODBUS

1. Introducere

Protocolul MODBUS a fost definit in 1979 de producatorul de automate programabile


Modicon. El are o serie de avantaje, care l-au impus pe piata echipamentelor de
automatizare, in prezent circa 40% din totalul comunicatiilor industriale se bazeaza pe
MODBUS. Printre avantaje, enumeram:
a. Este relativ simplu de implementat
b. Nu necesita harware dedicat pe nivelul fizic
c. Dispune de un mecanism sigur de detectie a erorilor
d. Este complet open source – astfel incat este foarte bine documentat
La capitolul dezavantaje, enumeram:
a. Are o structura rigida MASTER-SLAVE a retelei, astfel incat un SLAVE nu poate
niciodata lua initiativa de a transmite un “eveniment” detectat
b. Viteza de comunicatie e limitata la 115200 baud
MODBUS este prezentat in doua variante: MODBUS ASCII si MODBUS RTU. Acestea
sunt in linii mari identice, cu trei diferente esentiale:
a. In MODBUS ASCII, toate caracterele oricarui pachet sunt codate ASCII, spre
deosebire de MODBUS RTU, unde datele sunt transmise binar.
b. In MODBUS ASCII delimitarea pachetelor se face prin introducerea unor caractere
speciale pentru inceputul si sfarsitul pachetului. Inceputul pachetului este marcat de
caracterul ASCII ‘:’ (hex 0x3A), iar sfarsitul pachetelor este marcat de CR+LF
(0x0D,0x0A). In MODBUS RTU, delimitarea pachetelor se face prin pauze de minim
3.5Tc (Tc=timpul de caracter – durata de timp necesara pentru transmiterea unui
caracter la viteza de transmisie aleasa. De exemplu, la viteza de 9600 baud, timpul
de caracter este aproximativ o milisecunda).
c. Detectia erorilor se face diferit in cele doua variante: MODBUS ASCII foloseste o
suma de control relativ simpla, pe 8 biti, denumita LRC (Longitudinal Redundancy
Check), in timp ce MODBUS RTU foloseste o suma de control complexa pe 16 biti,
denumita CRC (Cyclic Redundancy Check).
MODBUS ASCII are avantajul ca poate fi usor “citit” si interpretat si este util pentru
regimul de depanare a comunicatiei, dar are dezavantajul ca pentru fiecare octet binar
transferat sunt necesare doua caractere ASCII, deci viteza globala de comunicatie este
redusa la jumatate. Din acest motiv este rareori folosit in exploatare, dar majoritatea
implementarilor contin ambele versiuni.

Ulterior aparitiei MODBUS, au fost dezvoltate alte variante ale protocolului initial si
anume:
a. MODBUS PLus
b. Modbus II
c. MODBUS TCP
Acestea nu mai sunt open source si sunt mult mai putin raspandite. Diferentele fata de
varianta initiala a MODBUS sunt considerabile, astfel incat sunt considerate protocoale
distincte.
DESCRIEREA PROTOCOLULUI MODBUS

2. Fundamentele MODBUS

2.1. Layer-ul fizic al MODBUS

La nivelul layer-ului fizic, MODBUS se bazeaza pe o structura de retea de tip RS48, cu


configuratia tipica prezentata in figura 1.

MASTER SLAVE 1 SLAVE N

A B GND A B GND
A B GND

120 120
Ohm Ohm

Fig. 1 o Retea RS485 tipica

Terminatoarele de 120Ohms sunt recomandate in cazul folosirii conductorilor twisted


pair cu lungimi de peste 100 metri.

Conform specificatiilor standardului EIA RS485, intr-o astfel de retea pot exista pana la
32 de echipamente conectate la bus, fara folosirea repetoarelor. Totusi, MODBUS
permite adresarea a pana la 247 unitiati SLAVE.

Lungimea maxima a cablurilor de comunicatie pe un bus RS485 este limitata la 1200


metri.

2.2. Layer-ul data link al MODBUS

Acest layer consta intr-o serie de reguli privind accesul la bus, structurarea pachetelor
de date si detectarea erorilor.

2.2.1. Reguli de acces la bus

• Intr-o retea MODBUS exista un singur MASTER.

• Toate secventele de comunicatie sunt initioate de MASTER. In consecinta doua


unitati SLAVE nu pot comunica direct una cu alta.

• Un singur SLAVE poate raspunde la un pachet emis de MASTER

• Toate pachetele corecte trebuie sa primeasca raspuns.. Exista totusi o exceptie de la


aceasta regula, si anume pachetele de tip “broadcast”. Acestea sunt adresate tuturor
unitatilor SLAVE.

Universitatea “Dunarea de Jos” Galati 2


Cursul de Comunicatii de date in sisteme distribuite
DESCRIEREA PROTOCOLULUI MODBUS

2.2.2. Reguli de structurare a pachetelor de date (data frames)

Nota: Descrierea de mai jos se refera la MODBUS RTU. Conversia pachetelor de date
descrise la MODBUS ASCII se rezuma la adaugarea caracterelor de inceput si sfarsit de
pachet, la calcularea CRC ai apoi fiecare octet binar din pachet este convertit la doua
caractere ASCII.

ƒ In MODBUS RTU, delimitarea pachetelor se face prin pastrarea unor intervale de


tacere intre pachete de minim 3.5 Tc inainte si dupa transmisia unui pachet. Daca
dispozitivul MASTER nu primeste raspuns la o interogare intr-un anumit interval de
tip, se declara o eroare de time-out. Intervalul recomandat pentru time-out este intre
20 si 250ms, dar acesta variaza mult de la o implementare la alta. Multe aplicatii soft
care realizeaza functia de MODBUS MASTER lasa la alegerea utilizatorului
intervalul de time-out si plaja de reglare poate merge pana la 30 secunde.

ƒ Toate pachetele de date au structura din figura 2.

SLAVE FUNCTION DATA CRC


ADDRESS CODE FIELD
(one byte) (Up to 251 bytes) (Two bytes)
( one byte)

Fig. 2 Structura generala a pachetelor de date in MODBUS

Campul SLAVE ADDRESS (SLA) are lungimea de un octet, cu valori in plaja [1-247]
interpretyat ca identificat unic al dispozitivului SLAVE caruia i se adreseaza pachetul. Nu
este permisa prezenta in retea a doua unitati SLAVE avand aceeasi adresa.

Toate unitatile SLAVE receptioneaza si interpreteaza pachetele emise de MASTER, dar


numai SLAVE-ul care isi recunoaste adresa in pachetul receptionat va raspunde
interogarii.

Pachetele cu SLA=0 sunt pachete de tip broadcast. Acestea se adreseaza tuturor


unitatilor SLAVE din retea – de exemplu comenzi pentru sincronizarea ceasului de timp
real. Nici un SLAVE nu raspunde la pachete de tip broadcast.

Campul FUNCTION CODE (FC) are lungimea de un octet si identifica operatia care
urmeaza sa fie executata de SLAVE-ul cu SLA-ul specificat.

Semnificatia si lungimea campului DATA depinde de FUNCTION CODE. Lungimea


maxima a acestui camp este limitata la 251 octeti, pentru ca intregul pachet de date nu
poate avea o lungime maxima mai mare de 255 octeti in total.

Campul CRC (Cyclic Redundancy Control) este o suma de control calculata la nivelul
intregului pachet de date in asa fel incat probabilitatea ca un pachet cu eori de date sa
aiba totusi CRC-ul corect sa fie extrem de scazuta. Dispozitivul care emite pachetul
calculeaza CRC-ul si il include in pachet inainte de emisie. La receptie, se recalculeaza
CRC-ul pachetului si se compara cu valoarea inclusa in pachet. Pachetele cu CRC
eronat sunt ignorate in MODBUS. (“silently discarded”)

Universitatea “Dunarea de Jos” Galati 3


Cursul de Comunicatii de date in sisteme distribuite
DESCRIEREA PROTOCOLULUI MODBUS

Reprezentarea datelor in MODBUS

Datorita faptului ca MODBUS a fost initial dezvoltat pentru comunicatia cu PLC-urile


Modicon, reprezentarea datelor este asociata cu resursele tipice ale PLC-urilor si
anume: iesiri digitale (denumite “coils” – relee), intrari digitale (discrete), intrari analogice
(input registers) si iesiri analogice (holding registers).

La nivelul MODBUS, valorile binare asociate cu intrarile si iesirile digitale sunt


transferate in octeti, iar valorile asociate cu marimile analogice sunt codificate binar in
cuvinte de 16 biti si sunt transmise in sistemul “big endian” – cu octetul mai semnificativ
transmis primul. De exemplu, daca se transmite valoarea zecimala 4660 (hex 0x1234)
aceasta se va transmite sub forma a doi octeti 0x12 si 0x34 in aceasta ordine. Daca sunt
necesare numere mai mari decat 65535 (0xFFFF) atunci se vor folosi doua sau mai
multe holding registers pentru a stoca aceste variabile.

Adresarea resurselor

PLC-urile folosesc spatii diferite de adrese pentru fiecare tip de resursa – de exemplu
toate intrarile digitale din sistem sunt numerotate de la 0 la 9998, la fel exista un spatiu
distinct de adrese pentru iesirile digitale (0-9998) si pentru intrarile si iesirile analogice
(input registers si holding registers). Pentru a elimina confuziile provocate de
suprapunerea adreselor din spatii de adrese distincte, PLC-urile folosesc o adresare
absoluta a resurselor, conform tabelului 1.

Tabelul 1. Adresarea resurselor

Tip de date Adrese relative (zecimal) Adrese absolute (zecimal)

Iesiri digitale (coils) 0000-9998 00001-09999

Intrari digitale 0000-9998 10001-19999

Input registers 0000-9998 30001-39999

Holding registers 0000-9998 40001-49999

In MODBUS distinctia intre diversele tipuri de resurse se face prin FUNCTION CODE –
exista functii distincte care se refera la intrarile si iesirile digitale sau la intrarile si iesirile
analogice. Astfel incat adresarea resurselor in pachetele de date se face relativ. Vezi
exemplele de pachete de date din paragrafele urmatoare.

2.2.3. Codurile functiilor in MODBUS

Lista functiilor admise de MODBUS este prezentata in Tabelul 2.

Universitatea “Dunarea de Jos” Galati 4


Cursul de Comunicatii de date in sisteme distribuite
DESCRIEREA PROTOCOLULUI MODBUS

Tabelul 2. Lista codurilor functiilor in MODBUS si semnificatia lor

Function code FC (Hex) Semnificatia

01 Read coils (citeste starea unui grup de iesiri digitale cu


adrese consecutive)

02 Read digital input status (citeste starea unui grup de


intrari digitale cu adrese consecutive)

03 Read holding registers (citeste valoarea stocata de un


grup de registre de iesire cu adrese consecutive)

04 Read input registers (citeste unul sau mai multe registre


de intrare cu adrese consecutive)

05 Force single coil (Modifica valoarea unei singure iesiri


digitale)

06 Preset (write) single holding register – scrie o valoare intr-


un registru de iesire

07 Read exception status (citeste un octet continand un set


predefinit de biti de conditie ai PLC-ului)

08 Loopback test – test de comunicatie

0F Force multiple coils (modifica valoarea unui grup de iesiri


digitale cu adrese consecutive)

10 Preset multiple holding registers – scrie mai multe valori


in registre de iesire cu adrese consecutive

2.2.4 Structura pachetelor de date in cazul diverselor functii in MODBUS


a. Function code=01. Read coils

Structura pachetelor de interogare (emise de MASTER) si de raspuns (emise de


SLAVE) in cazul FC=01 este prezentata in figura 3.
In acest exemplu, MASTER solicita starea curenta a doua iesiri digitale, avand adresele
0x0A si 0x0B. Ambele au valoarea logica 1 in raspunsul SLAVE.
Observam ca in raspunsul SLAVE, byte count se refera la numarul de octeti care contin
datele efective (un octet in exemplul considerat). Octetul care contine starea iesirilor are
in bitul cel mai putin semnificativ starea iesirii cu adresa 0x0A

Universitatea “Dunarea de Jos” Galati 5


Cursul de Comunicatii de date in sisteme distribuite
DESCRIEREA PROTOCOLULUI MODBUS

Fig. 3. Structura pachetelor in cazul FC=01

b. Function code 02 – Read digital input


Structura pachetelor in acest caz este prezentata in figura. 4.

Fig. 4. Structura pachetelor pentru FC=02 – Read digital input

In exemplul considerat se citesc doua intrari, cu adresele relative 0x00 si 0x01. Valoarea
raportata este 0 pentru intrarea cu adresa 0 si 1 pentru intrarea cu adresa 1.

Universitatea “Dunarea de Jos” Galati 6


Cursul de Comunicatii de date in sisteme distribuite
DESCRIEREA PROTOCOLULUI MODBUS

c. Function code 03 – Read holding registers


Structura pachetelor in acest caz este prezentata in figura 5.

Fig. 5. Structura pachetelor de date in cazul FC=0x03 Read Holding Registers

In exemplul considerat se citeste valoarea registrului cu adresa relativa 0002 (absoluta


40003 in zecimal), iar valoarea raportata de slave este hex 0x7FF.

d. Function code 04 – Read Input Registers

Structura pachetelor pentru FC=04 este prezentata in figura 6.

Fig. 6 Structura pachetelor de date pentru FC=04 Read Input Registers

Universitatea “Dunarea de Jos” Galati 7


Cursul de Comunicatii de date in sisteme distribuite
DESCRIEREA PROTOCOLULUI MODBUS

e. Function code = 05 Force single coil


Structura pachetelor este prezentata in figura 7.

Fig. 7 Structura pachetelor in cazul FC=05 Force single coil

f. Function code 06. Write single register

Structura pachetelor in acest caz este data in figura 8.

Fig. 8 Structura pachetelor de date in cazul FC=06 Write single register

Se observa ca in cazul FC=05 si FC=06 pachetele de raspuns sunt identice cu pachetul


emis de MASTER (daca scrierea s-a executat corect).

Universitatea “Dunarea de Jos” Galati 8


Cursul de Comunicatii de date in sisteme distribuite
DESCRIEREA PROTOCOLULUI MODBUS

g. Function code = 07 Read exception status


Cu ajutorul acestei functii se citeste un octet car contine starea unor biti de conditie
specifici echipamentului SLAVE -–de exemplu starea bateriei (1=OK, 0=battery low) sau
pierderea ceasului de timp real etc. Evident, semnificatia datelor citite difera de la un
echipament la altul.
Structura pachetelor e data in figura 9.

Fig. 9 Structura pachetelor in cazul FC=07 Read exception status

h. Function code 08 – Communication diagnostics


Aceasta functie permite testarea comunicatiei cu fiecare SLAVE.

Fig. 10. Structura pachetelor de date in cazul FC=08 Communication diagnostics

In principiu, sunt posibile mai multe sub-functii de diagnostic, dar in practica marea
majoritate a implementarilor se limiteaza la subfunctia cu cod 00, care comanda SLAVE
sa returneze pachetul primit.

i. Functia 0x0F – Force multiple coils


Pachetele au o structura usor diferita in acest caz – vezi figura 11.

Universitatea “Dunarea de Jos” Galati 9


Cursul de Comunicatii de date in sisteme distribuite
DESCRIEREA PROTOCOLULUI MODBUS

Fig. 11 Structura pachetel;or de date in cazul FC=0x0F Force multiple coils

Un exemplu de trafic cu FC=0x0F este prezentat in fig. 12

Fig. 12 Un exemplu de dialog la FC=0x0F

In acest exemplu, se comanda SLAVE cu adresa 0x11 (17) sa activeze un numar de 17


iesiri digitale, incepan cu iesirea cu adresa 0x1D astfel incat valoarea lor sa devina in
urma comenzii (01-38-AC).

j. Function code=0x10 Preset multiple registers

Structura pachetelor in cazul FC=0x10 este prezentata in figure 13:

Fig. 13 Structura pachetelor de date in cazul FC=0x10

In exemplul prezentat, se comanda SLAVE-ului cu adresa 0x11 sa modifice valorile a


doua registre, incepand cu adresa 0x012D (301 in zecimal) la noile valori 0x000A si
0x0102.
Raspunsul SLAVE in acest caz contine doar adresa de inceput a blocului de registre
afectat de comanda si numarul de registre indicat in comanda receptionata.

Universitatea “Dunarea de Jos” Galati 10


Cursul de Comunicatii de date in sisteme distribuite
DESCRIEREA PROTOCOLULUI MODBUS

2.2.5 Tratarea erorilor

Pachetele cu CRC eronat sunt ignorate (silently discarded) si MASTER va detecta o


eroare de tip time-out in lipsa unui raspuns de la SLAVE.

Alte situatii posibile de eroare sau exceptii sunt listate in tabelul 3.

Tabelul 3. Exception codes in MODBUS

Exception code Denumire Descriere

01 Illegal function code Function code


neimplementat sau eronat

02 Illegal data address Adresa resursei indicata de


pachet inexistenta

03 Illegal data value Valoarea specificata a


datelor out of range

04 Failure in associated device

05 Acknowledge SLAVE a recunoscut


comanda si o proceseaza
(lent)

06 Busy. Message rejected SLAVE este ocupat si nu


poate executa comanda

Structura generala a pachetului emis de SLAVE la detectarea unei situatii de eroare sau
exceptie este prezentata in figura 14.

SLAVE FUNCTION DATA FIELD CRC


S -> M ADDRESS CODE
0x80+FC Exception code (one byte) (Two bytes)
( one byte)

Fig. 14. Structura unui pachet de eroare/exceptie

SLAVE modifica codul functiei din pachetul care a generat eroarea, setand bitul cel mai
semnificativ al codului de functie rimit,. Aceasta este echivalent cu a aduna 0x80 la
valoarea initiala a FC.

Campul de date al unui pachet de eroare contine doar un octet, cu codul erorii conform
cu tabelul 3.

Universitatea “Dunarea de Jos” Galati 11


Cursul de Comunicatii de date in sisteme distribuite
DESCRIEREA PROTOCOLULUI MODBUS

Exemple:
a. Invalid/not implemented function code
Query: 01 06 0001 0001 (19CA)
Answer: 01 86 01 (83A0)
Error code 0x01.
b. Attempt to write a read only register
Query: 01 10 0000 0001 02 0100 (A7C0)
Answer: 01 90 02 (CDC1)
Error code 0x02.

c. Data out of range


Query: 01 10 0047 0001 02 0100 (A8B7)
Answer: 01 90 03 (0C01)

Nota:
Codurile de eroare pot varia de la o implementare la alta.

2.2.6 Calculul CRC

Urmatoarea functie C intoarce valoarea CRC-ului calculat pe un numar de caractere


definit de variabila count, plasate in variabila buffer[].

unsigned int crc16(unsigned char buffer[], int count)


{
unsigned int crc;
unsigned int j=0;
char i;

crc = 0xffff;
while (--count >= 0)
{
crc = crc ^ (unsigned int) buffer[j++];;
i = 8;
do
{
if (crc & 0x0001)
crc = (crc >> 1) ^ 0xA001;
else
crc = (crc >> 1);
} while(--i);

return (crc);

Nota importanta
La calculul CRC se iau in considerare toti octetii din buffer, incepand cu SLA si
terminand cu ultimul octet din campul DATA. (se exclude evident campul CRC).

Universitatea “Dunarea de Jos” Galati 12


Cursul de Comunicatii de date in sisteme distribuite
DESCRIEREA PROTOCOLULUI MODBUS

2.2.7 Calculul LRC in cazul pachetelor MODBUS ASCII

Functia urmatoare, in limbaj C, calculeaza suma de control longitudinala (LRC) pentru


un pachet MODBUS ASCII.

unsigned char calc_LRC(int count, unsigned char buffer[])


{
unsigned char ch,lrc;
unsigned char ch1, ch2;
int i;

ch1=0;
lrc=0;
for(i=0;i<count-3;i=i+2) {
ch1=buffer[i];
ch2=buffer[i+1];
ch=asc2bin(ch1,ch2);
lrc=lrc+ch;
}
lrc=~lrc;
lrc=lrc+1;
return(lrc);
}

Nota importanta

LRC-ul se calculeaza pe un buffer care contine datele convertite binar. NU se calculeaza


direct pe bufferul cu date ASCII. In calculul LRC se ignora caracterele de delimitare a
pachetului specifice MODBUS ASCII (‘:’ pentru inceput de pachet CR+LF pentru sfarsit
de pachet.)

Universitatea “Dunarea de Jos” Galati 13


Cursul de Comunicatii de date in sisteme distribuite

S-ar putea să vă placă și