Modbus er en åben kommunikationsprotokol baseret på master-slave-arkitekturen ( engelsk master - slave ; begreberne klient-server bruges i Modbus-standarden ). Det er meget brugt i industrien til at organisere kommunikation mellem elektroniske enheder . Kan bruges til datatransmission via serielle kommunikationslinjer RS-485 , RS-422 , RS-232 og TCP/IP (Modbus TCP) netværk. Der er også ikke-standard implementeringer, der bruger UDP [1] [2] .
Forveksle ikke "Modbus" og "Modbus Plus". Modbus Plus er en proprietær protokol ejet af Schneider Electric . Det fysiske lag af Modbus Plus er unikt, svarende til Ethernet 10BASE-T , halv dupleks over et parsnoet , hastighed 2 Mbps. Modbus Plus-transportprotokollen er HDLC , over hvilken en udvidelse til Modbus PDU-transmission er specificeret.
JBUS er en delmængde af Modbus RTU-protokollen med små forskelle i adresseringsmetoden [3] .
Modbus blev udviklet af Modicon (nu ejet af Schneider Electric ) til brug i deres programmerbare logiske controllere . Protokolspecifikationen blev først offentliggjort i 1979 [4] . Det var en åben standard, der beskrev formatet af beskeder, og hvordan de blev transmitteret over et netværk af forskellige elektroniske enheder.
Til at begynde med brugte MODICON-controllere det serielle RS-232 [4] -interface . Senere begyndte RS-485-grænsefladen at blive brugt, da den giver højere pålidelighed, giver dig mulighed for at bruge længere kommunikationslinjer og forbinde flere enheder til en linje.
Mange producenter af elektronisk udstyr har understøttet standarden, hundredvis af produkter, der bruger den, er dukket op på markedet.
Modbus udvikles i øjeblikket af non-profit organisationen Modbus-IDA [5] .
Modbus specificerer 4 typer data:
Modbus-standarderne består af 3 dele:
De vigtigste fordele ved standarden er åbenhed og massekarakter. Industrien producerer nu (2014) en masse typer og modeller af sensorer, aktuatorer, signalbehandlings- og normaliseringsmoduler osv. Næsten alle industrielle overvågnings- og kontrolsystemer har softwaredrivere til at arbejde med Modbus-netværk.
Standarden blev dybest set udviklet i 1979 under hensyntagen til datidens behov og computeregenskaber, og mange problemstillinger, der er relevante for moderne industrielle netværk, blev ikke taget i betragtning [6] . Fraværet af disse funktioner er en konsekvens af protokollens enkelhed, som letter dens undersøgelse og fremskynder implementeringen.
Controllere på Modbus-bussen kommunikerer ved hjælp af en master-slave- model baseret på transaktioner bestående af en anmodning og et svar.
Normalt er der kun én master ( eng. client , ifølge den gamle terminology master ) enhed i netværket, og flere slaves ( eng. server , ifølge den gamle terminology slave ) enheder. Masteren igangsætter transaktioner (transmitterer anmodninger). Masteren kan adressere anmodningen individuelt til enhver slave eller starte en broadcast-meddelelse til alle slaver. Slaveanordningen, der har genkendt sin adresse, reagerer på en anmodning, der er rettet specifikt til den. Når en udsendelsesanmodning modtages, genereres der ikke et svar af slaveenheder.
Modbus-specifikationen beskriver strukturen af anmodninger og svar. Deres grundlag er en elementær protokolpakke, den såkaldte PDU ( Protocol Data Unit ). Strukturen af PDU'en er uafhængig af linktypen og inkluderer en funktionskode og et datafelt. Funktionskoden er kodet som et én-byte felt og kan tage værdier i området 1…127. Værdiområdet 128…255 er reserveret til fejlkoder. Datafeltet kan være af variabel længde. PDU-pakkestørrelsen er begrænset til 253 bytes.
funktionskode | data |
---|---|
1 byte | N ≤ 252 (byte) |
For at sende en pakke over fysiske kommunikationslinjer placeres PDU'en i en anden pakke, der indeholder yderligere felter. Denne pakke kaldes ADU ( Application Data Unit ). ADU-formatet afhænger af linktypen. Der er tre varianter af ADU, to til datatransmission over en asynkron grænseflade og en over TCP/IP-netværk:
Den generelle struktur for en ADU er som følger (afhængigt af implementeringen kan nogle af felterne mangle):
adresse på slave (slave) enhed | funktionskode | data | fejldetekteringsblok |
---|
hvor
Den maksimale ADU-størrelse for RS232/RS485 serielle netværk er 256 bytes, for TCP-netværk er den 260 bytes.
For Modbus TCP ADU ser sådan ud:
Transaktions ID | Protokol ID | pakke længde | slave adresse | funktionskode | data |
---|
hvor
Det skal bemærkes, at der ikke er noget fejlkontrolfelt i Modbus TCP, da dataintegriteten sikres af TCP/IP-stakken.
Den aktuelle protokolspecifikation definerer tre kategorier af funktionskoder:
Standard kommandoer Deres beskrivelse skal offentliggøres og godkendes af Modbus-IDA. Denne kategori omfatter både allerede definerede og aktuelt ubrugte koder. Brugerdefinerede kommandoer To rækker af koder (65 til 72 og 100 til 110), som brugeren kan tildele en vilkårlig funktion. Det er dog ikke garanteret, at en anden enhed ikke vil bruge den samme kode til at udføre en anden funktion. reserveret Denne kategori omfatter funktionskoder, der ikke er standard, men som allerede bruges i enheder fremstillet af forskellige virksomheder. Det er koderne 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 og 127.En af de typiske anvendelser af protokollen er at læse og skrive data til controller-registre. Protokolspecifikationen definerer fire datatabeller:
Bord | Varetype | Adgangstype |
---|---|---|
Flagregistre ( Coils ) | en smule | Læs og skriv |
Diskrete indgange _ | en smule | kun læsning |
Input registre _ | 16 bit ord | kun læsning |
Beholdningsregistre _ _ | 16 bit ord | Læs og skriv |
Elementerne i hver tabel tilgås ved hjælp af en 16-bit adresse, den første celle er adresse 0. Hver tabel kan således indeholde op til 65536 elementer. Specifikationen definerer ikke, hvad tabelelementerne fysisk skal være, og på hvilke interne enhedsadresser de skal være tilgængelige. For eksempel er det acceptabelt at organisere overlappende tabeller. I dette tilfælde vil instruktioner, der arbejder med diskrete data og med 16-bit registre, faktisk få adgang til de samme data.
Der er en vis forvirring forbundet med den måde, data behandles på. Modbus blev oprindeligt udviklet til Modicon controllere. I disse controllere blev der brugt en speciel nummerering for hver af tabellerne. For eksempel var det første indgangsregister lokationsnummer 30001, og det første holderegister var 40001. Holderegisteradresse 107 i Modbus-kommandoen var således registernummer 40108 på controlleren. Selvom en sådan adressematchning ikke længere er en del af standarden, kan nogle softwarepakker automatisk "rette" adresser indtastet af brugeren, for eksempel ved at trække 40001 fra lagerregisteradressen. Referencemanual fra 1996 https://modbus.org/docs/PI_MBUS_300.pdf , hvor lignende adressering implicit blev vedtaget, markeret som forældet ("forældet" og "KUN FOR LEGACY APPLICATIONS"), nuværende protokolspecifikation https:// modbus. org/docs/Modbus_Application_Protocol_V1_1b3.pdf bruger kun absolut adressering - 01 (0x01) Læs spoler 0x0000 til 0xFFFF, 03 (0x03) Læs holdregistre 0x0000 til 0xFFFF.
For at læse værdier fra datatabellerne ovenfor, brug funktionskoder 1-4 ( hexadecimale værdier 0x01-0x04):
Forespørgslen består af adressen på det første element i tabellen, hvis værdi skal læses, og antallet af elementer, der skal læses. Adressen og mængden af data er angivet som 16-bit tal, den mest signifikante byte af hver sendes først.
De ønskede data sendes i svaret. Antallet af databytes afhænger af antallet af anmodede elementer. Før dataene transmitteres en byte, hvis værdi er lig med antallet af bytes data.
Værdierne af lagerregistrene og inputregistrene overføres fra den angivne adresse, to bytes pr. register, den høje byte af hvert register overføres først:
byte 1 | byte 2 | byte 3 | byte 4 | … | byte N-1 | byte N |
---|---|---|---|---|---|---|
RA ,1 | RA ,0 | RA +1,1 | RA +1,0 | … | RA +Q-1.1 | RA +Q-1,0 |
Værdierne af flag og digitale input transmitteres i pakket form: en bit pr. flag. Én betyder tændt, nul betyder slukket. Værdierne af de anmodede flag fylder først den første byte, startende med den mindst signifikante bit, derefter de næste bytes, også fra den mindst signifikante bit til de mest signifikante. Den mindst signifikante bit af den første databyte indeholder værdien af flaget angivet i "adresse"-feltet. Hvis det anmodede antal flag ikke er et multiplum af otte, er værdierne af de ekstra bits fyldt med nuller:
byte 1 | … | byte 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 | … |
Kommandoen består af elementadressen (2 bytes) og den indstillede værdi (2 bytes).
For et holderegister er værdien blot et 16-bit ord.
For flag betyder værdien 0xFF00 tændt, 0x0000 betyder slukket, andre værdier er ugyldige.
Hvis kommandoen lykkes, returnerer slaven en kopi af anmodningen.
Optagelse af flere værdierKommandoen består af adressen på elementet, antallet af elementer, der skal ændres, antallet af bytes af indstillede værdier, der skal transmitteres, og de indstillede værdier selv. Dataene pakkes på samme måde som i datalæsekommandoer.
Svaret består af startadressen og antallet af ændrede elementer.
Ændring af registreKommandoen består af adressen på et register og to 16-bit numre, der bruges som masker, der kan bruges til individuelt at nulstille eller indstille individuelle bits i registeret. Det endelige resultat bestemmes af formlen:
Resultat = ( Current_value AND Mask_AND ) OR ( Mask_OR AND (IKKE Mask_AND ))
Læsning med skrivningDenne funktionskode udfører en kombination af én læseoperation og én skriveoperation i én Modbus-transaktion.
DatakøerFunktionen er designet til at modtage 16-bit ord fra en først-ind-først-ud- kø ( FIFO ).
FiladgangDisse funktioner bruges til at få adgang til 16-bit registre organiseret i filer af vilkårlig længde. Kommandoen angiver filnummer, postnummer og postlængde i 16-bit ord. Med en enkelt kommando kan du skrive eller læse flere poster, ikke nødvendigvis tilstødende.
Derudover indeholder kommandoen en en-byte kode til at angive typen af datareference. Den aktuelle version af standarden definerer kun én type (beskrevet ovenfor) med kode 0x06.
Funktionerne nedenfor er til enheder på serielle linjer (Modbus RTU og Modbus ASCII).
Funktionen er beregnet til at få information om statusindikatorer på en ekstern enhed. Funktionen returnerer en byte, hvoraf hver bit svarer til tilstanden af en indikator.
Disse funktioner er designet til at teste funktionaliteten af det serielle link.
Funktionen er beregnet til at indhente information om enhedstypen og dens tilstand. Formatet på svaret afhænger af enheden.
Funktionen er designet til at overføre data i vilkårlige formater (defineret af andre standarder) fra master (klient) til slave (server) og omvendt.
Typen af transmitterede data bestemmes af en ekstra kode (MEI - Modbus Encapsulated Interface), der transmitteres efter funktionsnummeret. Standarden definerer MEI 13 (0x0D), beregnet til at indkapsle CANopen -protokollen . MEI 14 (0x0E) bruges til at få enhedsoplysninger, og MEI'er i intervallerne 0-12 og 15-255 er reserveret.
Der kan opstå to typer fejl under kommunikation:
Ved transmission over asynkrone kommunikationslinjer detekteres fejl af den første type ved at kontrollere, om den modtagne anmodning er i overensstemmelse med det etablerede ADU-format og beregne kontrolsummen. Derudover kan en paritetsbit bruges til at kontrollere hvert tegn . Hvis slaven registrerer datakorruption, ignoreres den modtagne anmodning, og der genereres ingen svarmeddelelse. Værten kan registrere en fejl uden svar.
Modbus TCP giver ikke yderligere dataintegritetstjek. Forvrængningsfri datatransmission leveres af TCP/IP-protokoller.
Ved fejl af den anden type sender slaveenheden en fejlmeddelelse (hvis anmodningen er adresseret til denne enhed; der sendes intet svar på udsendelsesanmodninger). En indikation af, at svaret indeholder en fejlmeddelelse, er den indstillede høje bit af funktionsnummeret. Funktionsnummeret efterfølges af fejlkoden og om nødvendigt yderligere fejldata i stedet for de sædvanlige data.
Nedenfor er et eksempel på en masterkommando og slavesvar (til Modbus RTU).
Anmodning | |||||||||||
Overførselsretning | slave enheds adresse | funktionsnummer | Adresse | Antal flag | Antal databytes | Data | CRC | ||||
---|---|---|---|---|---|---|---|---|---|---|---|
høj byte | lav byte | høj byte | lav byte | høj byte | lav byte | lav byte | høj byte | ||||
Klient→Server | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x01 | 0x72 | 0xCB |
Svar | |||||||||||
Overførselsretning | slave enheds adresse | funktionsnummer | Adresse | Antal flag | CRC | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
høj byte | lav byte | høj byte | lav byte | lav byte | høj byte | ||||||
Server→ Klient | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x24 | 0x09 | |||
Fejl besked | |||||||||||
Overførselsretning | slave enheds adresse | funktionsnummer | Fejlkode | CRC | |||||||
lav byte | høj byte | ||||||||||
Server→ Klient | 0x01 | 0x8F | 0x02 | 0xC5 | 0xF1 |
UART | |||||||
---|---|---|---|---|---|---|---|
Fysiske lag |
| ||||||
Protokoller |
| ||||||
Anvendelsesområder | |||||||
Implementeringer |
|