Modbus är ett öppet kommunikationsprotokoll baserat på master-slave-arkitekturen ( engelska master -slave ; termerna klient-server används i Modbus-standarden ). Det används ofta inom industrin för att organisera kommunikation mellan elektroniska enheter . Kan användas för dataöverföring via seriella kommunikationslinjer RS-485 , RS-422 , RS-232 och TCP/IP (Modbus TCP) nätverk. Det finns också icke-standardiserade implementeringar som använder UDP [1] [2] .
Blanda inte ihop "Modbus" och "Modbus Plus". Modbus Plus är ett proprietärt protokoll som ägs av Schneider Electric . Det fysiska lagret av Modbus Plus är unikt, liknande Ethernet 10BASE-T , halv duplex över ett tvinnat par , hastighet 2 Mbps. Modbus Plus-transportprotokollet är HDLC , över vilket en förlängning för Modbus PDU-överföring är specificerad.
JBUS är en delmängd av Modbus RTU-protokollet med små skillnader i adresseringsmetoden [3] .
Modbus utvecklades av Modicon (nu ägs av Schneider Electric ) för användning i deras programmerbara logiska styrenheter . Protokollspecifikationen publicerades första gången 1979 [4] . Det var en öppen standard som beskrev formatet på meddelanden och hur de överfördes över ett nätverk av olika elektroniska enheter.
Till en början använde MODICON-styrenheter det seriella gränssnittet RS-232 [4] . Senare började RS-485-gränssnittet användas, eftersom det ger högre tillförlitlighet, gör att du kan använda längre kommunikationslinjer och ansluta flera enheter till en linje.
Många tillverkare av elektronisk utrustning har stött standarden, hundratals produkter som använder den har dykt upp på marknaden.
Modbus utvecklas för närvarande av den ideella organisationen Modbus-IDA [5] .
Modbus specificerar 4 typer av data:
Modbus-standarderna består av 3 delar:
De främsta fördelarna med standarden är öppenhet och masskaraktär. Industrin producerar nu (2014) en mängd olika typer och modeller av sensorer, ställdon, signalbehandlings- och normaliseringsmoduler etc. Nästan alla industriella övervaknings- och styrsystem har mjukvarudrivrutiner för att arbeta med Modbus-nätverk.
Standarden utvecklades i grunden 1979, med hänsyn till dåtidens behov och beräkningskapacitet, och många frågor som är relevanta för moderna industriella nätverk togs inte i beaktande [6] . Frånvaron av dessa funktioner är en konsekvens av protokollets enkelhet, vilket underlättar dess studier och påskyndar implementeringen.
Styrenheter på Modbus-bussen kommunicerar med en master-slav- modell baserad på transaktioner som består av en begäran och ett svar.
Vanligtvis finns det bara en master ( eng. client , enligt den gamla terminology master )-enheten i nätverket och flera slavenheter ( eng. server , enligt den gamla terminology - slaven ). Mastern initierar transaktioner (sänder förfrågningar). Mastern kan adressera begäran individuellt till vilken slav som helst, eller initiera ett broadcastmeddelande till alla slavar. Slavanordningen, efter att ha känt igen sin adress, svarar på en begäran riktad specifikt till den. När en sändningsbegäran tas emot genereras inget svar av slavenheter.
Modbus-specifikationen beskriver strukturen för förfrågningar och svar. Deras grund är ett elementärt protokollpaket, den så kallade PDU ( Protocol Data Unit ). Strukturen hos PDU:n är oberoende av länktypen och inkluderar en funktionskod och ett datafält. Funktionskoden är kodad som ett enbyte-fält och kan ta värden inom intervallet 1...127. Värdeområdet 128…255 är reserverat för felkoder. Datafältet kan vara av variabel längd. PDU-paketstorleken är begränsad till 253 byte.
funktionskod | data |
---|---|
1 byte | N ≤ 252 (byte) |
För att sända ett paket över fysiska kommunikationslinjer placeras PDU:n i ett annat paket som innehåller ytterligare fält. Detta paket kallas ADU ( Application Data Unit ). ADU-formatet beror på länktypen. Det finns tre varianter av ADU, två för dataöverföring över ett asynkront gränssnitt och en över TCP/IP-nätverk:
Den allmänna strukturen för en ADU är som följer (beroende på implementeringen kan några av fälten saknas):
adressen till slavenheten (slaven). | funktionskod | data | feldetekteringsblock |
---|
var
Den maximala ADU-storleken för seriella RS232/RS485-nätverk är 256 byte, för TCP-nätverk är den 260 byte.
För Modbus TCP ADU ser ut så här:
Transaktions ID | Protokoll-ID | paketets längd | slavadress | funktionskod | data |
---|
var
Det bör noteras att det inte finns något felkontrollfält i Modbus TCP, eftersom dataintegriteten säkerställs av TCP/IP-stacken.
Den nuvarande protokollspecifikationen definierar tre kategorier av funktionskoder:
Standardkommandon Deras beskrivning måste publiceras och godkännas av Modbus-IDA. Denna kategori inkluderar både redan definierade och för närvarande oanvända koder. Anpassade kommandon Två koder (65 till 72 och 100 till 110) som användaren kan tilldela en godtycklig funktion. Det är dock inte garanterat att någon annan enhet inte kommer att använda samma kod för att utföra en annan funktion. reserverad Denna kategori innehåller funktionskoder som inte är standard, men som redan används i enheter tillverkade av olika företag. Dessa är koderna 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 och 127.En av de typiska användningsområdena för protokollet är att läsa och skriva data till styrenhetsregister. Protokollspecifikationen definierar fyra datatabeller:
Tabell | Objekttyp | Åtkomsttyp |
---|---|---|
Flaggregister ( Coils ) | en bit | Läsa och skriva |
Diskreta ingångar _ | en bit | bara läsning |
Inmatningsregister _ _ | 16 bitars ord | bara läsning |
Innehavsregister _ _ | 16 bitars ord | Läsa och skriva |
Elementen i varje tabell nås med hjälp av en 16-bitars adress, den första cellen är adress 0. Varje tabell kan alltså innehålla upp till 65536 element. Specifikationen definierar inte vad tabellelementen ska vara fysiskt och på vilka interna enhetsadresser de ska vara tillgängliga. Det är till exempel acceptabelt att organisera överlappande tabeller. I det här fallet kommer instruktioner som fungerar med diskreta data och med 16-bitars register faktiskt att komma åt samma data.
Viss förvirring är förknippad med hur data hanteras. Modbus utvecklades ursprungligen för Modicon-kontroller. I dessa kontroller användes en speciell numrering för var och en av tabellerna. Till exempel var det första ingångsregistret platsnummer 30001, och det första lagringsregistret var 40001. Således var lagringsregisteradress 107 i Modbus-kommandot registernummer 40108 för styrenheten. Även om sådan adressmatchning inte längre är en del av standarden, kan vissa mjukvarupaket automatiskt "korrigera" adresser som användaren matat in, till exempel genom att subtrahera 40001 från lagringsregisteradressen. Referensmanual från 1996 https://modbus.org/docs/PI_MBUS_300.pdf , där liknande adressering implicit antogs, markerad som föråldrad ("föråldrad" och "ENDAST FÖR LEGACY APPLICATIONS"), aktuell protokollspecifikation https:// modbus. org/docs/Modbus_Application_Protocol_V1_1b3.pdf använder endast absolut adressering - 01 (0x01) Lässpolar 0x0000 till 0xFFFF, 03 (0x03) Läs lagringsregister 0x0000 till 0xFFFF.
För att läsa värden från datatabellerna ovan, använd funktionskoderna 1-4 ( hexadecimala värden 0x01-0x04):
Frågan består av adressen till det första elementet i tabellen vars värde ska läsas och antalet element som ska läsas. Adressen och mängden data anges som 16-bitars nummer, den mest signifikanta byten av varje sänds först.
De begärda uppgifterna skickas i svaret. Antalet byte med data beror på antalet begärda objekt. Innan datan sänds en byte, vars värde är lika med antalet byte med data.
Värdena för lagringsregistren och ingångsregistren överförs från den angivna adressen, två byte per register, den höga byten för varje register överförs först:
byte 1 | byte 2 | byte 3 | byte 4 | … | byte N-1 | byte N |
---|---|---|---|---|---|---|
RA ,1 | RA ,0 | RA +1,1 | R A+1,0 | … | R A+Q-1.1 | R A+Q-1,0 |
Värdena för flaggor och digitala ingångar sänds i packad form: en bit per flagga. En betyder på, noll betyder av. Värdena för de begärda flaggorna fyller först den första byten, börjar med den minst signifikanta biten, sedan nästa byte, också från den minst signifikanta biten till de mest signifikanta. Den minst signifikanta biten av den första databyten innehåller värdet på flaggan som anges i "adress"-fältet. Om det begärda antalet flaggor inte är en multipel av åtta, fylls värdena för de extra bitarna med nollor:
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 | … |
Kommandot består av elementadressen (2 byte) och det inställda värdet (2 byte).
För ett lagringsregister är värdet helt enkelt ett 16-bitars ord.
För flaggor betyder värdet 0xFF00 på, 0x0000 betyder av, andra värden är ogiltiga.
Om kommandot lyckas returnerar slaven en kopia av begäran.
Spela in flera värdenKommandot består av adressen till elementet, antalet element som ska ändras, antalet byte av inställda värden som ska överföras och själva inställda värden. Data packas på samma sätt som i dataläskommandon.
Svaret består av startadressen och antalet ändrade element.
Ändra registerKommandot består av adressen till ett register och två 16-bitars nummer som används som masker som kan användas för att individuellt återställa eller ställa in enskilda bitar i registret. Det slutliga resultatet bestäms av formeln:
Resultat = ( Current_value AND Mask_AND ) OR ( Mask_OR AND (NOT Mask_AND ))
Läsa med att skrivaDenna funktionskod utför en kombination av en läsoperation och en skrivoperation i en Modbus-transaktion.
DataköerFunktionen är utformad för att ta emot 16-bitars ord från en först-in-först-ut-kö ( FIFO ).
FilåtkomstDessa funktioner används för att komma åt 16-bitars register organiserade i filer med godtycklig längd. Kommandot anger filnummer, postnummer och postlängd i 16-bitars ord. Med ett enda kommando kan du skriva eller läsa flera poster, inte nödvändigtvis intilliggande.
Dessutom innehåller kommandot en kod på en byte för att indikera typen av datareferens. Den nuvarande versionen av standarden definierar endast en typ (beskriven ovan) med koden 0x06.
Funktionerna nedan är för enheter på seriella linjer (Modbus RTU och Modbus ASCII).
Funktionen är avsedd för att få information om statusindikatorer på en fjärrenhet. Funktionen returnerar en byte, vars bit motsvarar tillståndet för en indikator.
Dessa funktioner är utformade för att testa den seriella länkens funktionalitet.
Funktionen är avsedd för att få information om enhetstyp och dess tillstånd. Formatet på svaret beror på enheten.
Funktionen är utformad för att överföra data i godtyckliga format (definierade av andra standarder) från mastern (klienten) till slaven (servern) och vice versa.
Typen av data som överförs bestäms av en extra kod (MEI - Modbus Encapsulated Interface) som överförs efter funktionsnumret. Standarden definierar MEI 13 (0x0D), avsedd att kapsla in CANopen- protokollet . MEI 14 (0x0E) används för att få enhetsinformation och MEI i intervallen 0-12 och 15-255 är reserverade.
Två typer av fel kan uppstå under kommunikation:
Vid sändning över asynkrona kommunikationslinjer detekteras fel av den första typen genom att kontrollera överensstämmelsen av den mottagna begäran med det etablerade ADU-formatet och beräkna kontrollsumman. Dessutom kan en paritetsbit användas för att kontrollera varje tecken . Om slaven upptäcker datakorruption ignoreras den mottagna begäran och inget svarsmeddelande genereras. Värden kan upptäcka ett fel utan svar.
Modbus TCP tillhandahåller inga ytterligare kontroller av dataintegritet. Distorsionsfri dataöverföring tillhandahålls av TCP/IP-protokoll.
Vid fel av den andra typen skickar slavenheten ett felmeddelande (om begäran är adresserad till denna enhet; inget svar skickas på sändningsförfrågningar). En indikation på att svaret innehåller ett felmeddelande är den inställda höga biten för funktionsnumret. Funktionsnumret följs av felkoden och vid behov ytterligare feldata istället för de vanliga uppgifterna.
Nedan finns ett exempel på ett masterkommando och slavsvar (för Modbus RTU).
Begäran | |||||||||||
Överför riktning | slavenhetsadress | funktionsnummer | Adress | Antal flaggor | Antal databyte | Data | CRC | ||||
---|---|---|---|---|---|---|---|---|---|---|---|
hög byte | låg byte | hög byte | låg byte | hög byte | låg byte | låg byte | hög byte | ||||
Klient→Server | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x01 | 0x72 | 0xCB |
Svar | |||||||||||
Överför riktning | slavenhetsadress | funktionsnummer | Adress | Antal flaggor | CRC | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
hög byte | låg byte | hög byte | låg byte | låg byte | hög byte | ||||||
Server→Klient | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x24 | 0x09 | |||
Felmeddelande | |||||||||||
Överför riktning | slavenhetsadress | funktionsnummer | felkod | CRC | |||||||
låg byte | hög byte | ||||||||||
Server→Klient | 0x01 | 0x8F | 0x02 | 0xC5 | 0xF1 |
UART | |||||||
---|---|---|---|---|---|---|---|
Fysiska lager |
| ||||||
Protokoll |
| ||||||
Användningsområden | |||||||
Genomföranden |
|