Modbus este un protocol de comunicare deschis bazat pe arhitectura master-slave ( în engleză master - slave ; termenii client-server sunt folosiți în standardul Modbus ). Este utilizat pe scară largă în industrie pentru a organiza comunicarea între dispozitive electronice . Poate fi utilizat pentru transmisia de date prin linii de comunicație seriale RS-485 , RS-422 , RS-232 și rețele TCP/IP (Modbus TCP). Există, de asemenea, implementări non-standard folosind UDP [1] [2] .
Nu confundați „Modbus” și „Modbus Plus”. Modbus Plus este un protocol proprietar deținut de Schneider Electric . Stratul fizic al Modbus Plus este unic, similar cu Ethernet 10BASE-T , semi-duplex peste o pereche torsadată , viteză de 2 Mbps. Protocolul de transport Modbus Plus este HDLC , peste care este specificată o extensie pentru transmisia Modbus PDU.
JBUS este un subset al protocolului Modbus RTU cu ușoare diferențe în metoda de adresare [3] .
Modbus a fost dezvoltat de Modicon (acum deținut de Schneider Electric ) pentru a fi utilizat în controlerele lor logice programabile . Specificația protocolului a fost publicată pentru prima dată în 1979 [4] . Era un standard deschis care descria formatul mesajelor și modul în care acestea erau transmise printr-o rețea de diferite dispozitive electronice.
Inițial, controlerele MODICON foloseau interfața serială RS-232 [4] . Ulterior, a început să fie utilizată interfața RS-485, deoarece oferă o fiabilitate mai mare, vă permite să utilizați linii de comunicație mai lungi și să conectați mai multe dispozitive la o singură linie.
Mulți producători de echipamente electronice au susținut standardul, sute de produse care îl folosesc au apărut pe piață.
Modbus este în prezent dezvoltat de organizația non-profit Modbus-IDA [5] .
Modbus specifică 4 tipuri de date:
Standardele Modbus constau din 3 părți:
Principalele avantaje ale standardului sunt deschiderea și caracterul de masă. Industria acum (2014) produce o mulțime de tipuri și modele de senzori, actuatoare, module de procesare și normalizare a semnalului etc. Aproape toate sistemele industriale de monitorizare și control au drivere software pentru lucrul cu rețelele Modbus.
Standardul a fost dezvoltat practic în 1979, ținând cont de nevoile și capacitățile de calcul ale acelui timp, iar multe aspecte relevante pentru rețelele industriale moderne nu au fost luate în considerare [6] . Absența acestor caracteristici este o consecință a simplității protocolului, care facilitează studiul acestuia și accelerează implementarea.
Controlerele de pe magistrala Modbus comunică folosind un model master-slave bazat pe tranzacții constând dintr-o cerere și un răspuns.
De obicei, în rețea există un singur dispozitiv master ( client ing. , conform vechiului master de terminologie ) și mai multe dispozitive slave ( server ing. , conform vechiului slave de terminologie ). Maestrul inițiază tranzacții (transmite cereri). Master-ul poate adresa cererea individual oricărui slave sau poate iniția un mesaj difuzat către toți slave. Dispozitivul slave, după ce și-a recunoscut adresa, răspunde la o solicitare adresată în mod specific acestuia. Când se primește o cerere de difuzare, un răspuns nu este generat de dispozitivele slave.
Specificația Modbus descrie structura cererilor și răspunsurilor. Baza lor este un pachet de protocol elementar, așa-numitul PDU ( Protocol Data Unit ). Structura PDU-ului este independentă de tipul de legătură și include un cod de funcție și un câmp de date. Codul funcției este codificat ca un câmp de un octet și poate lua valori în intervalul 1...127. Intervalul de valori 128…255 este rezervat codurilor de eroare. Câmpul de date poate fi de lungime variabilă. Dimensiunea pachetului PDU este limitată la 253 de octeți.
PDU Modbuscodul funcției | date |
---|---|
1 octet | N ≤ 252 (octet) |
Pentru a transmite un pachet prin linii de comunicație fizică , PDU-ul este plasat într-un alt pachet care conține câmpuri suplimentare. Acest pachet se numește ADU ( Application Data Unit ). Formatul ADU depinde de tipul de legătură. Există trei variante ale ADU, două pentru transmiterea datelor printr- o interfață asincronă și una prin rețele TCP/IP:
Structura generală a unui ADU este următoarea (în funcție de implementare, unele câmpuri pot lipsi):
adresa dispozitivului slave (slave). | codul funcției | date | bloc de detectare a erorilor |
---|
Unde
Dimensiunea maximă ADU pentru rețelele seriale RS232/RS485 este de 256 de octeți, pentru rețelele TCP este de 260 de octeți.
Pentru Modbus TCP ADU arată astfel:
ID-ul de tranzacție | ID protocol | lungimea pachetului | adresa sclavului | codul funcției | date |
---|
Unde
Trebuie remarcat faptul că nu există un câmp de control al erorilor în Modbus TCP, deoarece integritatea datelor este asigurată de stiva TCP/IP.
Specificația actuală a protocolului definește trei categorii de coduri de funcție:
Comenzi standard Descrierea acestora trebuie publicată și aprobată de Modbus-IDA. Această categorie include atât coduri deja definite, cât și coduri neutilizate în prezent. Comenzi personalizate Două game de coduri (65 la 72 și 100 la 110) cărora utilizatorul le poate atribui o funcție arbitrară. Cu toate acestea, nu este garantat că un alt dispozitiv nu va folosi același cod pentru a îndeplini o funcție diferită. rezervat Această categorie include coduri de funcție care nu sunt standard, dar sunt deja utilizate în dispozitivele fabricate de diverse companii. Acestea sunt codurile 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 și 127.Una dintre utilizările tipice ale protocolului este citirea și scrierea datelor în registrele controlerului. Specificația protocolului definește patru tabele de date:
Masa | Categorie de obiect | Tip de acces |
---|---|---|
Registre steag ( bobine ) | un pic | Citeste si scrie |
Intrări discrete _ | un pic | doar lectură |
Registre de intrare _ | cuvânt de 16 biți | doar lectură |
Deține registre _ | cuvânt de 16 biți | Citeste si scrie |
Elementele din fiecare tabel sunt accesate folosind o adresă de 16 biți, prima celulă este adresa 0. Astfel, fiecare tabel poate conține până la 65536 de elemente. Specificația nu definește ce elemente ar trebui să fie fizic și la ce adrese de dispozitive interne ar trebui să fie disponibile. De exemplu, este acceptabil să se organizeze tabele suprapuse. În acest caz, instrucțiunile care funcționează cu date discrete și cu registre de 16 biți vor accesa de fapt aceleași date.
O anumită confuzie este asociată cu modul în care sunt abordate datele. Modbus a fost dezvoltat inițial pentru controlerele Modicon. În aceste controlere, a fost folosită o numerotare specială pentru fiecare dintre tabele. De exemplu, primul registru de intrare a fost numărul de locație 30001, iar primul registru de păstrare a fost 40001. Astfel, adresa registrului de păstrare 107 în comanda Modbus a fost registrul numărul 40108 al controlerului. Deși o astfel de potrivire a adreselor nu mai face parte din standard, unele pachete software pot „corecta” automat adresele introduse de utilizator, de exemplu scăzând 40001 din adresa registrului de stocare. Manual de referință din 1996 https://modbus.org/docs/PI_MBUS_300.pdf , unde s-a adoptat implicit o adresare similară, marcată ca învechită („învechită” și „NUMAI PENTRU APLICAȚII MOȘTENITE”), specificația protocolului actual https:// modbus. org/docs/Modbus_Application_Protocol_V1_1b3.pdf utilizează numai adresarea absolută - 01 (0x01) Read Coils 0x0000 la 0xFFFF, 03 (0x03) Read Holding Registers 0x0000 la 0xFFFF.
Pentru a citi valorile din tabelele de date enumerate mai sus, utilizați codurile de funcții 1-4 ( valori hexazecimale 0x01-0x04):
Interogarea constă din adresa primului element al tabelului a cărui valoare urmează să fie citită și numărul de elemente de citit. Adresa și cantitatea de date sunt date ca numere de 16 biți, cel mai semnificativ octet al fiecăruia este transmis primul.
Datele solicitate sunt trimise în răspuns. Numărul de octeți de date depinde de numărul de elemente solicitate. Înainte de date, se transmite un octet, a cărui valoare este egală cu numărul de octeți de date.
Valorile registrelor de stocare și ale registrelor de intrare sunt transferate începând de la adresa specificată, doi octeți per registru, mai întâi se transferă octetul înalt al fiecărui registru:
octet 1 | octetul 2 | octetul 3 | octetul 4 | … | octetul N-1 | octetul N |
---|---|---|---|---|---|---|
R A,1 | R A,0 | RA +1,1 | RA +1,0 | … | RA +Q-1,1 | RA +Q-1,0 |
Valorile steagurilor și intrărilor digitale sunt transmise sub formă de pachete: un bit per flag. Unul înseamnă pornit, zero înseamnă oprit. Valorile steagurilor solicitate umplu mai întâi primul octet, începând cu bitul cel mai puțin semnificativ, apoi următorii octeți, tot de la bitul cel mai puțin semnificativ la cei mai semnificativi. Bitul cel mai puțin semnificativ al primului octet de date conține valoarea flag-ului specificat în câmpul „adresă”. Dacă numărul de steaguri solicitat nu este un multiplu de opt, atunci valorile biților suplimentari sunt umplute cu zerouri:
octet 1 | … | octetul N | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
F A+7 | F A+6 | F A+5 | F A+4 | F A+3 | F A+2 | F A+1 | F A | … | 0 | … | 0 | F A+Q-1 | F A+Q-2 | … |
Comanda constă din adresa elementului (2 octeți) și valoarea setată (2 octeți).
Pentru un registru de reținere, valoarea este pur și simplu un cuvânt de 16 biți.
Pentru steaguri, valoarea 0xFF00 înseamnă pornit, 0x0000 înseamnă oprit, alte valori sunt invalide.
Dacă comanda are succes, slave returnează o copie a cererii.
Înregistrarea mai multor valoriComanda constă din adresa elementului, numărul de elemente de modificat, numărul de octeți de valori setate care trebuie transmise și valorile setate însele. Datele sunt împachetate în același mod ca în comenzile de citire a datelor.
Răspunsul constă din adresa de pornire și numărul de elemente modificate.
Schimbarea registrelorComanda constă din adresa unui registru și două numere de 16 biți care sunt folosite ca măști care pot fi folosite pentru a reseta individual sau a seta biți individuali în registru. Rezultatul final este determinat de formula:
Rezultat = ( Valoarea_actuală ȘI Masca_ȘI ) SAU ( Mască_SAU ȘI (NU Mască_ȘI ))
Citirea cu scrisulAcest cod de funcție realizează o combinație de o operație de citire și o operație de scriere într-o tranzacție Modbus.
Cozi de dateFuncția este concepută pentru a primi cuvinte pe 16 biți dintr-o coadă FIFO (primul intrat, primul-ieșit ).
Acces la fișiereAceste funcții sunt folosite pentru a accesa registre de 16 biți organizate în fișiere de înregistrări de lungime arbitrară. Comanda specifică numărul fișierului, numărul înregistrării și lungimea înregistrării în cuvinte de 16 biți. Cu o singură comandă, puteți scrie sau citi mai multe înregistrări, nu neapărat adiacente.
În plus, comanda conține un cod de un octet pentru a indica tipul de referință de date. Versiunea actuală a standardului definește un singur tip (descris mai sus) cu codul 0x06.
Funcțiile enumerate mai jos sunt pentru dispozitive pe linii seriale (Modbus RTU și Modbus ASCII).
Funcția este destinată obținerii de informații despre indicatorii de stare de pe un dispozitiv la distanță. Funcția returnează un octet, fiecare bit corespunde stării unui indicator.
Aceste funcții sunt concepute pentru a testa funcționalitatea conexiunii seriale.
Funcția este destinată obținerii de informații despre tipul dispozitivului și starea acestuia. Formatul răspunsului depinde de dispozitiv.
Funcția este concepută pentru a transfera date în formate arbitrare (definite de alte standarde) de la master (client) la slave (server) și invers.
Tipul datelor transmise este determinat de un cod suplimentar (MEI - Modbus Encapsulated Interface) transmis după numărul funcției. Standardul definește MEI 13 (0x0D), destinat să încapsuleze protocolul CANopen . MEI 14 (0x0E) este folosit pentru a obține informații despre dispozitiv, iar MEI din intervalele 0-12 și 15-255 sunt rezervate.
În timpul comunicării pot apărea două tipuri de erori:
La transmiterea prin linii de comunicație asincrone, erorile de primul tip sunt detectate prin verificarea conformității cererii primite cu formatul ADU stabilit și calculul sumei de control. În plus, un bit de paritate poate fi folosit pentru a verifica fiecare caracter . Dacă slave detectează coruperea datelor, cererea primită este ignorată și nu este generat niciun mesaj de răspuns. Gazda poate detecta o eroare fără răspuns.
Modbus TCP nu oferă verificări suplimentare ale integrității datelor. Transmisia de date fără distorsiuni este asigurată de protocoalele TCP/IP.
În cazul erorilor de al doilea tip, dispozitivul slave trimite un mesaj de eroare (dacă cererea este adresată acestui dispozitiv; nu se trimite niciun răspuns la cererile de difuzare). O indicație că răspunsul conține un mesaj de eroare este bitul setat înalt al numărului funcției. Numărul funcției este urmat de codul de eroare și, dacă este necesar, de date de eroare suplimentare în locul datelor obișnuite.
Mai jos este un exemplu de comandă master și răspunsuri slave (pentru Modbus RTU).
Cerere | |||||||||||
Direcția de transfer | adresa dispozitivului slave | numărul funcției | Abordare | Numărul de steaguri | Numărul de octeți de date | Date | CRC | ||||
---|---|---|---|---|---|---|---|---|---|---|---|
octet mare | octet mic | octet mare | octet mic | octet mare | octet mic | octet mic | octet mare | ||||
Client→Server | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x01 | 0x72 | 0xCB |
Răspuns | |||||||||||
Direcția de transfer | adresa dispozitivului slave | numărul funcției | Abordare | Numărul de steaguri | CRC | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
octet mare | octet mic | octet mare | octet mic | octet mic | octet mare | ||||||
Server→Client | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x24 | 0x09 | |||
Mesaj de eroare | |||||||||||
Direcția de transfer | adresa dispozitivului slave | numărul funcției | cod de eroare | CRC | |||||||
octet mic | octet mare | ||||||||||
Server→Client | 0x01 | 0x8F | 0x02 | 0xC5 | 0xF1 |
UART | |||||||
---|---|---|---|---|---|---|---|
Straturi fizice |
| ||||||
Protocoale |
| ||||||
Domenii de utilizare | |||||||
Implementări |
|