Home     Interfacing     Software     About     Sitemap   
 EN   NL   
Quick links

Modbus interface tutorial

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.

VeldBeschrijving
Apparaat adresAdres van de ontvanger
FunctiecodeCode die het bericht type definiëert
DataData blok met additionele informatie
FoutcontroleNumerieke waarde om communicatiefouten te detecteren
Modbus berichtstructuur

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/ASCIIModbus/RTU
KaraktersASCII 09 en A..FBinair 0255
FoutcontroleLRC Longitudinal Redundancy CheckCRC Cyclic Redundancy Check
Frame startkarakter ‘:3.5 karakters stilte
Frame eindkarakters CR/LF3.5 karakters stilte
Gaten in bericht1 sec1.5 maal karakterlengte
Startbit11
Databits78
Pariteiteven, oneven, geeneven, oneven, geen
Stopbits1 (even/odd) 2 (no parity)1 (even/odd) 2 (no parity)
Eigenschappen van Modbus/ASCII en Modbus/RTU

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 adresModbus adresBeschrijving
110000*adres – 1Coils (uitgangen)
1000120000*adres – 10001Ingangen
4000150000*adres – 40001Holding registers
* Maximale waarde is apparaat afhankelijk
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.

CodeBeschrijving
01Lees coil status
02Lees ingang status
03Lees holding registers
04Lees input registers
05Forceer enkele coil
06Preset enkel register
07Lees uitzonderingsstatus
15Forceer meerdere coils
16Preset meerdere registers
17Rapporteer slave ID
Algemene Modbus functie codes
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.

ByteWaardeBeschrijving
11247Slave adres
21Functiecode
30255Startadres, hoge byte
40255Startadres, lage byte
50255Aantal coils, hoge byte
60255Aantal coils, lage byte
7(+8)LRC/CRCFoutcontrole 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:

ByteWaardeBeschrijving
11247Slave adres
21Functiecode
30255Aantal databytes N
4…N+30255Bit patroon van de coil waarden
N+4(…N+5)LRC/CRCFoutcontrole 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.

ByteWaardeBeschrijving
11247Slave adres
22Functiecode
30255Startadres, hoge byte
40255Startadres, lage byte
50255Aantal inputs, hoge byte
60255Aantal inputs, lage byte
7(+8)LRC/CRCFoutcontrole 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.

ByteWaardeBeschrijving
11247Slave adres
22Functiecode
30255Aantal databytes N
4…N+30255Bitpatroon van ingangswaardes
N+4(…N+5)LRC/CRCFoutcontrole 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.

ByteWaardeBeschrijving
11247Slave adres
23Functiecode
30255Startadres, hoge byte
40255Startadres, lage byte
50255Aantal registers, hoge byte
60255Aantal registers, lage byte
7(+8)LRC/CRCFoutcontrole 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
Literatuur
Tragedy is when I cut my finger. Comedy is when you walk into an open sewer and die.
MEL BROOKS
  mei. 2021
   Copyright © 1997-2021 Lammert Bies, All rights reserved