Documente Academic
Documente Profesional
Documente Cultură
1. Introducere
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
A B GND A B GND
A B GND
120 120
Ohm Ohm
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.
Acest layer consta intr-o serie de reguli privind accesul la bus, structurarea pachetelor
de date si detectarea erorilor.
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.
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.
Campul FUNCTION CODE (FC) are lungimea de un octet si identifica operatia care
urmeaza sa fie executata de SLAVE-ul cu SLA-ul specificat.
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”)
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.
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.
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.
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.
Structura generala a pachetului emis de SLAVE la detectarea unei situatii de eroare sau
exceptie este prezentata in figura 14.
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.
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.
Nota:
Codurile de eroare pot varia de la o implementare la alta.
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).
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