Modbus – Informatie

Bron: Lammert Bies – Website: lammertbies.nl
Beter en mooier vertalen dan Lammert kan ik ook niet ;-), bezoek zijn website voor meer leuke informatie!


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
Veld Omschrijving
Apparaat adres Adres van de ontvanger
Functie code 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 RTUremote 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 09 en AF 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/ASCIIwordt 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/ASCII Modbus/RTU
Karakters ASCII 09 en A..F Binair 0255
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
Start bit 1 1
Data bits 7 8
Pariteit even/oneven geen even/oneven geen
Stop bits 1 2 1 2

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 0247. De waarden 1247 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 adres Modbus adres Omschrijving
110000* adres – 1 Coils (uitgangen)
1000120000* adres – 10001 Ingangen
4000150000* adres – 40001 Holding 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 1255. 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
Code Description
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

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
Byte Waarde Omschrijving
1 1247 Slave adres
2 1 Functie code
3 0255 Startadres, hoge byte
4 0255 Startadres, lage byte
5 0255 Aantal coils, lage byte
6 0255 Aantal coils, lage byte
7(…8) LRC/CRC Foutcontrole 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
Byte Waarde Omschrijving
1 1247 Slave adres
2 1 Functie code
3 0255 Aantal databytes N
4…N+3 0255 Bitpatroon van de coil waarden
N+4(…N+5) LRC/CRC Foutcontrole 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
Byte Waarde Omschrijving
1 1247 Slave adres
2 2 Functie code
3 0255 Startadres, hoge byte
4 0255 Startadres, lage byte
5 0255 Aantal ingangen, hoge byte
6 0255 Aantal ingangen, lage byte
7(…8) LRC/CRC Foutcontrole 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
Byte Waarde Omschrijving
1 1247 Slave adres
2 2 Functie code
3 0255 Aantal databytes N
4…N+3 0255 Bitpatroon van ingangswaardes
N+4(…N+5) LRC/CRC Foutcontrole 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
Byte Waarde Omschrijving
1 1247 Slave adres
2 3 Functie code
3 0255 Startadres, hoge byte
4 0255 Startadres, lage byte
5 0255 Aantal registers, hoge byte
6 0255 Aantal registers, lage byte
7(…8) LRC/CRC Foutcontrole 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.