RS-232 specificaties
RS-422 informatie
RS-485 informatie
De seriŽle UART
RS-232 kabels
PLC kabels
I2C interface
Software download

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 berichten structuur

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.

Modbus berichtstructuur
VeldOmschrijving
Apparaat adresAdres van de ontvanger
Functie codeCode die het bericht type definiŽert
DataData blok met additionele informatie
FoutcontroleNumerieke 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.

Eigenschappen van Modbus/ASCII en Modbus/RTU
 Modbus/ASCIIModbus/RTU
KaraktersASCII 0...9 en A..FBinair 0...255
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
Start bit11
Data bits78
Pariteiteven/onevengeeneven/onevengeen
Stop bits1212

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. Een slaaf beantwoordt altijd een Modbus adres. 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 en Modbus adres bereiken
Apparaat adresModbus adresOmschrijving
1...10000*adres - 1Coils (uitgangen)
10001...20000*adres - 10001Ingangen
40001...50000*adres - 40001Holding registers
* Maximale waarde is apparaat afhankelijk

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.

Algemene Modbus functie codes
CodeDescription
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

Functie 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. It 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.

Functie 01 verzoek structuur
ByteWaardeOmschrijving
11...247Slave adres
21Functie code
30...255Startadres, hoge byte
40...255Startadres, lage byte
50...255Aantal coils, lage byte
60...255Aantal coils, lage byte
7(...8)LRC/CRCFoutcontrole waarde

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:

Functie 01 antwoord structuur
ByteWaardeOmschrijving
11...247Slave adres
21Functie code
30...255Aantal databytes N
4...N+30...255Bitpatroon van de coil waarden
N+4(...N+5)LRC/CRCFoutcontrole waarde

Functie 02: Lees ingangsstatus

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.

Functie 02 verzoek structuur
ByteWaardeOmschrijving
11...247Slave adres
22Functie code
30...255Startadres, hoge byte
40...255Startadres, lage byte
50...255Aantal ingangen, hoge byte
60...255Aantal ingangen, lage byte
7(...8)LRC/CRCFoutcontrole waarde

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.

Functie 02 antwoord structuur
ByteWaardeOmschrijving
11...247Slave adres
22Functie code
30...255Aantal databytes N
4...N+30...255Bitpatroon van ingangswaardes
N+4(...N+5)LRC/CRCFoutcontrole waarde

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

Functie 03 verzoek structuur
ByteWaardeOmschrijving
11...247Slave adres
23Functie code
30...255Startadres, hoge byte
40...255Startadres, lage byte
50...255Aantal registers, hoge byte
60...255Aantal registers, lage byte
7(...8)LRC/CRCFoutcontrole waarde

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 byre. 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 maak het aantal geretourneerde registers. Een foutcontrole waarde is toegevoegd voor de host om te controleren of mogelijk een communicatiefout is opgetreden.

Literatuur
-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

The man who can smile when things go wrong
has thought of someone he can blame it on.
JONES' LAW
   Lammert Bies     Interfacing     Sitemap     Forum 
 EN   NL