Modbus

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 17 martie 2020; verificările necesită 44 de modificări .

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] .

Istorie

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ță.

Standard Modbus

Modbus este în prezent dezvoltat de organizația non-profit Modbus-IDA [5] .

Terminologie specifică

Modbus specifică 4 tipuri de date:

Compoziția standardului

Standardele Modbus constau din 3 părți:

Avantajele standardului

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.

Dezavantajele standardului

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.

Introducere

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 Modbus
codul 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.

Categorii de coduri de funcție

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.

Model de date

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.

Funcții standard de protocol Modbus

Acces la date

Citirea datelor

Pentru a citi valorile din tabelele de date enumerate mai sus, utilizați codurile de funcții 1-4 ( valori hexazecimale 0x01-0x04):

  • 1 (0x01)  - citirea valorilor din mai multe registre de steag (Read Coil Status) .
  • 2 (0x02)  - citirea valorilor de la mai multe intrări discrete (Read Discrete Inputs) .
  • 3 (0x03)  - Citirea valorilor din mai multe registre de deținere (Read Holding Registers) .
  • 4 (0x04)  - Citirea valorilor din mai multe registre de intrare (Read Input Registers) .

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
Înregistrarea unei singure valori
  • 5 (0x05)  - scrieți valoarea unui steag (Force Single Coil) .
  • 6 (0x06)  - scrieți valoarea într-un registru de stocare (registru unic presetat) .

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 valori
  • 15 (0x0F)  - Scrieți valori în mai multe registre de steag (Forceți bobine multiple)
  • 16 (0x10)  - scrieți valori în mai multe registre de stocare (registruri multiple presetate)

Comanda 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 registrelor
  • 22 (0x16) - scrierea într-un registru de stocare folosind masca „ȘI” și masca „SAU” (Registrul de scriere a măștii) .

Comanda 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 scrisul
  • 23 (0x17)  - citire/scriere mai multe registre ( Citire/scriere mai multe registre )

Acest 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 date
  • 24 (0x18) - citirea datelor din coadă (Read FIFO Queue)

Funcția este concepută pentru a primi cuvinte pe 16 biți dintr-o coadă FIFO (primul intrat, primul-ieșit ).

Acces la fișiere
  • 20 (0x14) - citire dintr-un fișier (Read File Record)
  • 21 (0x15) - scrieți într-un fișier (Scrieți înregistrarea fișierului)

Aceste 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.

Diagnosticare

Funcțiile enumerate mai jos sunt pentru dispozitive pe linii seriale (Modbus RTU și Modbus ASCII).

  • 7 (0x07) - citiți semnalele de stare (Read Exception Status)

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.

  • 8 (0x08) - diagnosticare (Diagnostic)
  • 11 (0x0B) - citirea contorului de evenimente (Get Com Event Counter)
  • 12 (0x0C) - citirea jurnalului de evenimente (Get Com Event Log)

Aceste funcții sunt concepute pentru a testa funcționalitatea conexiunii seriale.

  • 17 (0x11) - citiți informații despre dispozitiv (ID server de raportare)

Funcția este destinată obținerii de informații despre tipul dispozitivului și starea acestuia. Formatul răspunsului depinde de dispozitiv.

Altele

  • 43 (0x2B) - Transport de interfață încapsulată

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.

Gestionarea erorilor

În timpul comunicării pot apărea două tipuri de erori:

  • erori asociate cu distorsiuni în transmiterea datelor;
  • erori logice (cererea acceptată fără distorsiuni, dar nu poate fi executată)

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.

Coduri de eroare standard

  • 01 - Codul funcției primit nu a putut fi procesat.
  • 02 - Adresa de date specificată în cerere nu este disponibilă.
  • 03 - Valoarea conținută în câmpul de date de solicitare este o valoare nevalidă.
  • 04 - A apărut o eroare irecuperabilă în timp ce slave a încercat să efectueze acțiunea solicitată.
  • 05 - Dispozitivul slave a primit cererea și o procesează, dar durează mult. Acest răspuns împiedică masterul să genereze o eroare de timeout.
  • 06 - Dispozitivul slave este ocupat cu procesarea comenzii. Stăpânul ar trebui să repete mesajul mai târziu, când sclavul este liber.
  • 07 - Dispozitivul slave nu poate executa funcția de program specificată în cerere. Acest cod este returnat pentru o solicitare de program nereușită folosind numerele de funcție 13 sau 14. Masterul trebuie să solicite informații de diagnosticare sau eroare de la slave.
  • 08 - Dispozitivul slave a întâmpinat o eroare de paritate în timpul citirii memoriei extinse. Comandantul poate repeta cererea mai târziu, dar de obicei în astfel de cazuri este necesară repararea echipamentului.

Exemple

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

Note

  1. Protocolul Modbus în profunzime. Arhivat pe 29 iunie 2017 la Wayback Machine National Instruments
  2. Specificația Modbus UDP. Arhivat pe 7 iulie 2017 la Biblioteca Modbus Java Wayback Machine
  3. PROMOTIC - Comunicare prin protocol Modbus . Preluat la 7 iulie 2015. Arhivat din original la 8 iulie 2015.
  4. 1 2 Tutorial interfață Modbus . Consultat la 23 martie 2009. Arhivat din original pe 3 martie 2011.
  5. Despre Modbus-IDA . Consultat la 23 martie 2009. Arhivat din original pe 3 martie 2016.
  6. Charles Palmer, Sujeet Shenoi (ed) Critical Infrastructure Protection III: Third IFIP WG 11. 10 International Conference, Hanover, New Hampshire, SUA, 23-25 ​​martie 2009, Revised Selected Papers Springer, 2009 ISBN 3-642-04797- 1 , pagina 87
  7. 1 2 3 4 Dezvoltarea aplicațiilor cu Modbus . Preluat la 7 iulie 2015. Arhivat din original la 8 iulie 2015.

Literatură

Link -uri