Modbus interface tutorial
- Geschiedenis van de Modbus interface
- Modbus bericht structuur
- Modbus seriële transmissie modes
- Modbus adressering
- Modbus functie codes
Geschiedenis van het Modbus protocol
Sommige communicatiestandaarden ontstaan uit het niets. Niet omdat ze worden gepromoot door een grote groep van verkopers of een standaardisatie organisatie. Deze standaarden—zoals de Modbus interface—ontstaan omdat ze goed zijn en eenvoudig te implementeren waardoor ze worden overgenomen door vele fabrikanten. Hierdoor is Modbus de eerste breed gaccepteerde veldbus standaard geworden.
Modbus heeft haar wortels in de late zeventiger jaren van de vorige eeuw. Het is 1979, wanneer PLC fabrikant Modicon—nu een merknaam van Schneider Electric’s Telemecanique—de Modbus communicatie interface publiceerde voor een multidrop netwerk gebasseerd op een master/client architectuur. Communicatie tussen de Modbus nodes werd uitgevoerd met behulp van berichten. Het was een open standaard die de berichten structuur beschreef. De fysieke layer van de Modbus interface was vrij te kiezen. De originele Modbus interface werkte op RS-232, maar de meeste latere Modbus implementaties gebruikten RS-485 omdat het langere afstanden, hogere snelheden en de mogelijkheid van een echt multi-drop network toeliet. In een korte tijd implementeerden honderden fabrikanten het Modbus berichten systeem in hun apparatuur en Modbus werd de de facto standaard voor industriële communicatie netwerken.
De goede eigenschap van de Modbus standaard is de flexibiliteit, maar op hetzelde moment een eenvoudige implementatie ervan. Niet alleen intelligente apparatuur zoals microcontrollers, PLC’s en dergelijke zijn in staat via Modbus te communiceren, ook veel intelligente sensoren zijn uitgevoerd met een Modbus interface om hun data naar host systemen te verzenden. Waar Modbus in het begin voornamelijk werd gebruik op bedrade seriële communicatie leidingen zijn er ook uitbreidingen op de standaard voor draadloze communicatie en TCP/IP netwerken.
Modbus berichtstructuur
De Modbus communicatie interface is gebouwd rond berichten. Het formaat van deze Modbus berichten is onafhankelijk van het type fysieke interface dat wordt gebruikt. Op eenvoudige ouderwetse RS232 worden dezelfde berichten gebruikt als op Modbus/TCP over ethernet. Dit geeft de Modbus interface definitie een zeer lange levensduur. Hetzelfde protocol kan worden gebruikt ongeacht het type van de verbinding. Hierdoor geeft Modbus de mogelijkheid om eenvoudig de hardware structuur van een netwerk te upgraden, zonder de noodzaak van grootschalige wijzigingen in de software. Een apparaat kan ook communiceren met meerdere Modbus knooppunten op hetzelfde moment, zelfs als zij verbonden zijn via verschillende soorten interfaces, zonder de noodzaak om een ander protocol voor elk van de verschillende verbindingen te gebruiken.
Op eenvoudige interfaces zoals RS485 of RS232 worden de Modbus berichten in plat formaat over het netwerk gestuurd. In dit geval is het netwerk geheel ter beschikking voor Modbus. Wanneer een veelzijdiger netwerk systeem wordt gebruikt zoals TCP/IP over ethernet worden de Modbus berichten ingebed in pakketten van het formaat dat noodzakelijk is voor de fysische interface. In dat geval kan Modbus met andere vormen van communicatie tegelijkertijd op de zelfde fysische interface aanwezig zijn. Hoewel de basis Modbus bericht structuur een peer-to-peer vorm is, is Modbus in staat op zowel op point-to-point, als op multidrop netwerken te functioneren.
Elk Modbus bericht heeft dezelfde structuur. Vier basiselementen zijn aanwezig in elk bericht. De volgorde van deze elementen is hetzelfde voor alle berichten waardoor het eenvoudig is om de inhoud van een Modbus bericht te ontleden. Een conversatie wordt altijd gestart door een master in het Modbus netwerk. Een Modbus master verzendt een bericht en—afhankelijk van de inhoud van het bericht—een slave onderneemt actie en beantwoordt het. Er kunnen meerdere masters in een Modbus netwerk zijn. De Adressering in de berichtkop wordt gebruikt om te definieren welk apparaat moet reageren op een melding. Alle andere knooppunten in het Modbus netwerk negeren het bericht als het adresveld niet overeenkomt met hun eigen adres.
Veld | Beschrijving |
---|---|
Apparaat adres | Adres van de ontvanger |
Functiecode | Code die het bericht type definiëert |
Data | Data blok met additionele informatie |
Foutcontrole | Numerieke waarde om communicatiefouten te detecteren |
Modbus seriële transmissie modes: Modbus/ASCII en Modbus/RTU
Seriële Modbus verbindingen kunnen twee basis transmissie modes gebruiken, ASCII of RTU, remote terminal unit. De transmissie mode in seriële communicatie definiëert de wijze waarop de Modbus berichten zijn gecodeerd. Met Modbus/ASCII zijn de berichten in een leesbaar ASCII formaat. Het Modbus/RTU formaat gebruikt binaire codering wat het bericht onleesbaar maakt als de communicatie gemonitored wordt, maar verkleint de afmetingen van elk bericht waardoor er meer datauitwisseling kan plaatsvinden in dezelfde tijdspanne. Alle knooppunten op een Modbus netwerk segment moeten dezelfde seriële transmissie mode gebruiken. Een apparaat dat geconfigureerd is om Modbus/ASCII te gebruiken kan geen Modbus/RTU berichten verwerken en vice versa.
Als Modbus/ASCII gebruikt wordt, worden alle berichten gecodeerd in hexadecimale waarden die gerepresenteerd worden met leesbare ASCII karakters. Alleen de karakters 0…9 en A…F worden gebruikt voor de codering. Voor elk informatiebyte zijn twee communicatiebytes noodzakelijk, omdat elk communicatiebyte slechts 4 bits can definiëren in het hexadecimale systeem. Met Modbus/RTU wordt de data uitgewisseld in binair formaat, waarbij elk informatiebyte is gecodeerd in één communicatiebyte.
Modbus berichten op seriële verbindingen worden niet zondermeer verzonden. Ze worden verpakt in een frame om de ontvanger een eenvoudige manier te geven om het begin en einde van een bericht te detecteren. Wanneer Modbus/ASCII wordt gebruikt, dan worden karakters toegepast om het begin en einde van een frame aan te geven. De dubbele punt ‘:‘ wordt gebruikt om het begin van een bericht te markeren en elk bericht wordt beëindigd met een CR/LF combinatie. Modbus/RTU aan de andere kant gebruikt stilteperioden op de communicatieleiding voor de framing. Elk bericht moet worden vooraf gegaan door een stilteperiode met een minimale lengte van 3,5 karakters. Als een ontvanger een gat ontdekt binnen een frame van tenminste 1,5 karakters, dan neemt het aan dat er een nieuw bericht komt en de ontvangstbuffer wordt geleegd. Het belangrijkste voordeel van Modbus/ASCII is, dat het gaten tussen de afzonderlijke bytes van een bericht toestaat van maximaal 1 seconde. Met Modbus/RTU is het noodzakelijk om elk bericht als een conitinue bitstroom te verzenden.
Modbus/ASCII | Modbus/RTU | |
---|---|---|
Karakters | ASCII 0…9 en A..F | Binair 0…255 |
Foutcontrole | LRC Longitudinal Redundancy Check | CRC Cyclic Redundancy Check |
Frame start | karakter ‘:‘ | 3.5 karakters stilte |
Frame eind | karakters CR/LF | 3.5 karakters stilte |
Gaten in bericht | 1 sec | 1.5 maal karakterlengte |
Startbit | 1 | 1 |
Databits | 7 | 8 |
Pariteit | even, oneven, geen | even, oneven, geen |
Stopbits | 1 (even/odd) 2 (no parity) | 1 (even/odd) 2 (no parity) |
Modbus adressering
De eerste informatie in elk Modbus bericht is het adres van de ontvanger. Deze parameter bevat één byte informatie. In Modbus/ASCII wordt dit gecodeerd met twee hexadecimale karakters, in Modbus/RTU wordt één byte gebruikt. Toegestane adressen liggen in de range 0…247. De waarden 1…247 worden toegewezen aan individuele slaaf stations en 0 wordt gebruikt als een broadcast adres. Berichten die naar dat laatste adres worden gestuurd worden door alle slaven ontvangen. Een slaaf beantwoordt altijd een Modbus bericht. In zo’n antwoord bericht wordt hetzelfde adres gebruikt dat de master in zijn verzoek heeft toegepast. Op die manier kan de master zien dat de slaaf antwoord op het verzoek.
Intern in een Modbus apparaat zijn de holding registers, ingangen en uitgangen genummerd van 1 tot en met 10000. Men zou verwachten dat dezelfde adressen ook worden gebruikt in de Modbus berichten om een verzameling waarden te zetten of uit te lezen. Helaas is dat niet het geval. In de Modbus berichten worden adressen gebruikt met een waarde tussen 0 en 9999. Wanneer je bijvoorbeeld de waarde van uitgang (coil) 18 wilt lezen, dan moet de waarde 17 worden opgegeven in het Modbus bericht. Nog verwarrender is, dat voor ingangen en holding registers een offset moet worden afgetrokken van het apparaat adres om het goede adres te verkrijgen dat in de Modbus bericht structuur moet worden geplaatst. Dit leidt veelvuldig tot vergissingen en er moet op gelet worden bij het ontwerpen van applicaties met Modbus. De volgende tabel laat de adres bereiken zien van coils, ingangen en holding registers en de wijze waarop et adres in het Modbus bericht moet worden berekend wanneer het actuele adres van het gegeven in het apparaat bekend is.
Apparaat adres | Modbus adres | Beschrijving |
---|---|---|
1…10000* | adres – 1 | Coils (uitgangen) |
10001…20000* | adres – 10001 | Ingangen |
40001…50000* | adres – 40001 | Holding registers |
Apparaat en modus adresgebied
Modbus functie codes
De tweede parameter in elk Modbus bericht is de functiecode. Dit definiëert het bericht type en het type actie dat van de slaaf verwacht wordt. De parameter bevat één byte aan informatie. In Modbus/ASCII is dit gecodeerd met twee hexadecimale karakters, in Modbus/RTU wordt één byte gebruikt. Toegestane functie codes liggen in het bereik 1…255. Niet alle Modbus apparaten herkennen dezelfde serie van functiecodes. De meest gebruikte codes worden hier beschreven.
Normaliter, wanneer een Modbus slave een verzoek beantwoordt gebruikte het dezelfde functiecode als in het verzoek. Echter, wanneer een fout is gedetecteerd, wordt het hoogste bit van de functiecode aangezet. Op die manier kan de master succesvolle en mislukte antwoorden eenvoudig onderscheiden.
Code | Beschrijving |
---|---|
01 | Lees coil status |
02 | Lees ingang status |
03 | Lees holding registers |
04 | Lees input registers |
05 | Forceer enkele coil |
06 | Preset enkel register |
07 | Lees uitzonderingsstatus |
15 | Forceer meerdere coils |
16 | Preset meerdere registers |
17 | Rapporteer slave ID |
- Function 01: Lees coil status
-
In Modbus taal is een coil een discrete uitgangswaarde. Modbus functie 01 kan worden gebruikt om de status van een dergelijke uitgang in te lezen. Het is slechts mogelijk om één apparaat tegelijkertijd uit te vragen. Broadcast adressering wordt niet ondersteund door deze Modbus functie. De functie kan worden gebruikt om de status van meerdere uitgangen tegelijkertijd op te vragen. Dit wordt gedaan door een uitgangsrange te definiëren in het dataveld van het bericht.
Byte Waarde Beschrijving 1 1…247 Slave adres 2 1 Functiecode 3 0…255 Startadres, hoge byte 4 0…255 Startadres, lage byte 5 0…255 Aantal coils, hoge byte 6 0…255 Aantal coils, lage byte 7(+8) LRC/CRC Foutcontrole waarde Functie 01 verzoek structuur Een slave die een Modbus verzoek bericht ontvangt met functie 01 zal de nodige uitgangswaarden verzamelen en een antwoord bericht construeren. De lengte van dat bericht is afhankelijk van het aantal waarden dat moet worden teruggegeven. In het algemeen, wanneer N waarden worden opgevraagd zijn ((N+7) mod 8) bytes noodzakelijk om deze waarden op te slaan. Het werkelijke aantal databytes in het datablok wordt geplaatst in het eerste byte van het dataveld. Daardoor kan de algemene structuur van een andwoord op Modbus functie 01 worden geschreven als:
Byte Waarde Beschrijving 1 1…247 Slave adres 2 1 Functiecode 3 0…255 Aantal databytes N 4…N+3 0…255 Bit patroon van de coil waarden N+4(…N+5) LRC/CRC Foutcontrole waarde Functie 01 antwoord structuur - Function 02: Lees input status
-
Het lezen van ingangswaardes met Modbus wordt op dezelfde manier gedaan als het lezen van de status van coils. Het enige verschil is, dat voor ingangen Modbus functie 02 wordt gebruikt. Broadcast adresmode wordt niet ondersteund. Er kunnen slechts de ingangen van één apparaat tegelijkertijd worden opgevraagd. Net als met coils moeten het adres van de eerste ingang en het aantal te lezen ingangen worden geplaatst in het dataveld van het verzoekbericht. Ingangen op apparaten starten met de nummering bij 10001. Deze adreswaarde is equivalent met adres 0 in het Modbus bericht.
Byte Waarde Beschrijving 1 1…247 Slave adres 2 2 Functiecode 3 0…255 Startadres, hoge byte 4 0…255 Startadres, lage byte 5 0…255 Aantal inputs, hoge byte 6 0…255 Aantal inputs, lage byte 7(+8) LRC/CRC Foutcontrole waarde Functie 02 verzoek structuur Nadat een verzoekboodschap met Modbus functie 02 ontvangen is, plaatst de slave de opgevraagde ingangswaarden in een berichtstructuur en zendt dit bericht terug naar de Modbus master. De lengte van dit bericht hangt af van het aantal teruggeleverde ingangswaarden. Hierdoor kan de lengte van een uitgangsbericht variabel zijn. Het aantal databytes in het dataveld dat de ingangswaarden bevat wordt doorgegeven als het eerste byte in het dataveld. Elk Modbus antwoordbericht heeft de volgende algemene structuur.
Byte Waarde Beschrijving 1 1…247 Slave adres 2 2 Functiecode 3 0…255 Aantal databytes N 4…N+3 0…255 Bitpatroon van ingangswaardes N+4(…N+5) LRC/CRC Foutcontrole waarde Functie 02 antwoord structuur - Function 03: Lees holding registers
-
Interne waarden in een Modbus apparaat worden opgeslagen in holding registers. Deze registers zijn twee bytes groot en kunnen voor velerlei doeleinden gebruikt worden. Sommige registers bevatten configuratie parameters, terwijl anderen worden gebruikt om meetwaarden zoals temperaturen en dergelijke terug te zenden naar een host. Registers in een Modbus compatibel apparaat beginnen te tellen bij 40001. Ze worden geadresseerd in de Modbus berichten structuur met adressen die beginnen bij 0. Modbus functie 03 wordt gebruikt om de waarde van één of meer holding registers op te vragen van een apparaat. Slechts één slave apparaat kan worden geadresseerd in een verzoekbericht. Broadcast verzoeken worden door functie 03 niet ondersteund.
Byte Waarde Beschrijving 1 1…247 Slave adres 2 3 Functiecode 3 0…255 Startadres, hoge byte 4 0…255 Startadres, lage byte 5 0…255 Aantal registers, hoge byte 6 0…255 Aantal registers, lage byte 7(+8) LRC/CRC Foutcontrole waarde Functie 03 verzoek structuur Nadat het verzoek verwerkt is, retourneert de Modbus slaaf de 16 bit waarden van de opgevraagde holding registers. Door de lengte van de holding registers is elk register gecodeerd in twee bytes in het antwoord bericht. Het eerste byte bevat het hoge byte van het register, en het tweede byte het lage byte. Het Modbus antwoord bericht start met het adres van de slaaf en de functiecode 03. De volgende byte is het aantal data bytes dat volgen. Deze waarde is twee maal het aantal geretourneerde registers. Een foutcontrole waarde is toegevoegd voor de host om te controleren of mogelijk een communicatiefout is opgetreden.
– | De Modbus technische resources op de Modbus-IDA website zijn een goed startpunt voor wie de laatste informatie nodig heeft over implementatie en gebruik van de Modbus interface. Modbus-IDA is de huidige drijvende kracht achter het promoten en implementeren van het Modbus protocol. | Modbus-IDA |
When the going gets tough, everybody leaves.
LYNCH'S LAW
|