{"id":2129,"date":"2021-04-27T20:34:24","date_gmt":"2021-04-27T18:34:24","guid":{"rendered":"https:\/\/www.lammertbies.nl\/comm\/info\/modbus-interface-tutorial"},"modified":"2021-05-03T02:20:22","modified_gmt":"2021-05-03T00:20:22","slug":"modbus","status":"publish","type":"page","link":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/modbus","title":{"rendered":"Modbus interface tutorial"},"content":{"rendered":"\n<ul class=\"wp-block-list\"><li><a href=\"#hist\">Geschiedenis van de Modbus interface<\/a><\/li><li><a href=\"#mess\">Modbus bericht structuur<\/a><\/li><li><a href=\"#tran\">Modbus seri\u00eble transmissie modes<\/a><\/li><li><a href=\"#addr\">Modbus adressering<\/a><\/li><li><a href=\"#func\">Modbus functie codes<\/a><\/li><\/ul>\n\n<h2 class=\"wp-block-heading\" id=\"hist\">Geschiedenis van het Modbus protocol<\/h2>\n\n<p>Sommige communicatiestandaarden ontstaan uit het niets. Niet omdat ze worden gepromoot door een grote groep van verkopers of een standaardisatie organisatie. Deze standaarden\u2014zoals de Modbus interface\u2014ontstaan 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.<\/p>\n\n<p>Modbus heeft haar wortels in de late zeventiger jaren van de vorige eeuw. Het is 1979, wanneer PLC fabrikant Modicon\u2014nu een merknaam van Schneider Electric\u2019s Telemecanique\u2014de 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 <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/rs-232-specs\">RS-232<\/a>, maar de meeste latere Modbus implementaties gebruikten <a>RS-485<\/a> 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\u00eble communicatie netwerken.<\/p>\n\n<p>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&#8217;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\u00eble communicatie leidingen zijn er ook uitbreidingen op de standaard voor draadloze communicatie en TCP\/IP netwerken.<\/p>\n\n<h2 class=\"wp-block-heading\" id=\"mess\">Modbus berichtstructuur<\/h2>\n\n<p>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.<\/p>\n\n<p>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.<\/p>\n\n<p>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\u2014afhankelijk van de inhoud van het bericht\u2014een 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.<\/p>\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th>Veld<\/th><th>Beschrijving<\/th><\/tr><\/thead><tbody><tr><td><strong>Apparaat adres<\/strong><\/td><td>Adres van de ontvanger<\/td><\/tr><tr><td><strong>Functiecode<\/strong><\/td><td>Code die het bericht type defini\u00ebert<\/td><\/tr><tr><td><strong>Data<\/strong><\/td><td>Data blok met additionele informatie<\/td><\/tr><tr><td><strong>Foutcontrole<\/strong><\/td><td>Numerieke waarde om communicatiefouten te detecteren<\/td><\/tr><\/tbody><\/table><figcaption>Modbus berichtstructuur<\/figcaption><\/figure>\n\n<h2 class=\"wp-block-heading\" id=\"tran\">Modbus seri\u00eble transmissie modes: Modbus\/ASCII en Modbus\/RTU<\/h2>\n\n<p>Seri\u00eble Modbus verbindingen kunnen twee basis transmissie modes gebruiken, ASCII of RTU, remote terminal unit. De transmissie mode in seri\u00eble communicatie defini\u00ebert de wijze waarop de Modbus berichten zijn gecodeerd. Met Modbus\/ASCII zijn de berichten in een leesbaar <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/ascii-characters\">ASCII<\/a> 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\u00eble transmissie mode gebruiken. Een apparaat dat geconfigureerd is om Modbus\/ASCII te gebruiken kan geen Modbus\/RTU berichten verwerken en vice versa.<\/p>\n\n<p>Als Modbus\/ASCII gebruikt wordt, worden alle berichten gecodeerd in hexadecimale waarden die gerepresenteerd worden met leesbare ASCII karakters. Alleen de karakters 0&#8230;9 en A&#8230;F worden gebruikt voor de codering. Voor elk informatiebyte zijn twee communicatiebytes noodzakelijk, omdat elk communicatiebyte slechts 4 bits can defini\u00ebren in het hexadecimale systeem. Met Modbus\/RTU wordt de data uitgewisseld in binair formaat, waarbij elk informatiebyte is gecodeerd in \u00e9\u00e9n communicatiebyte.<\/p>\n\n<p>Modbus berichten op seri\u00eble 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 \u2018:\u2018 wordt gebruikt om het begin van een bericht te markeren en elk bericht wordt be\u00ebindigd met een <a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/ascii-characters#carr\">CR<\/a>\/<a href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/ascii-characters#line\">LF<\/a> 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.<\/p>\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th><\/th><th>Modbus\/ASCII<\/th><th>Modbus\/RTU<\/th><\/tr><\/thead><tbody><tr><td>Karakters<\/td><td>ASCII <strong>0<\/strong>\u2026<strong>9<\/strong> en <strong>A<\/strong>..<strong>F<\/strong><\/td><td>Binair <strong>0<\/strong>\u2026<strong>255<\/strong><\/td><\/tr><tr><td>Foutcontrole<\/td><td><strong>LRC<\/strong> Longitudinal Redundancy Check<\/td><td><strong>CRC<\/strong> Cyclic Redundancy Check<\/td><\/tr><tr><td>Frame start<\/td><td>karakter &#8216;<strong>:<\/strong>&#8216;<\/td><td>3.5 karakters stilte<\/td><\/tr><tr><td>Frame eind<\/td><td>karakters <strong>CR<\/strong>\/<strong>LF<\/strong><\/td><td>3.5 karakters stilte<\/td><\/tr><tr><td>Gaten in bericht<\/td><td>1 sec<\/td><td>1.5 maal karakterlengte<\/td><\/tr><tr><td>Startbit<\/td><td><strong>1<\/strong><\/td><td><strong>1<\/strong><\/td><\/tr><tr><td>Databits<\/td><td><strong>7<\/strong><\/td><td><strong>8<\/strong><\/td><\/tr><tr><td>Pariteit<\/td><td>even, oneven, geen<\/td><td>even, oneven, geen<\/td><\/tr><tr><td>Stopbits<\/td><td><strong>1<\/strong> (<em>even\/odd<\/em>) <strong>2<\/strong> (<em>no parity<\/em>)<\/td><td><strong>1<\/strong> (<em>even\/odd<\/em>) <strong>2<\/strong> (<em>no parity<\/em>)<\/td><\/tr><\/tbody><\/table><figcaption>Eigenschappen van Modbus\/ASCII en Modbus\/RTU<\/figcaption><\/figure>\n\n<h2 class=\"wp-block-heading\" id=\"addr\">Modbus adressering<\/h2>\n\n<p>De eerste informatie in elk Modbus bericht is het adres van de ontvanger. Deze parameter bevat \u00e9\u00e9n byte informatie. In Modbus\/ASCII wordt dit gecodeerd met twee hexadecimale karakters, in Modbus\/RTU wordt \u00e9\u00e9n byte gebruikt. Toegestane adressen liggen in de range 0\u2026247. De waarden 1\u2026247 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\u2019n 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.<\/p>\n\n<p>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.<\/p>\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th class=\"has-text-align-right\" data-align=\"right\">Apparaat adres<\/th><th>Modbus adres<\/th><th>Beschrijving<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-right\" data-align=\"right\"><strong>1<\/strong>\u2026<strong>10000<\/strong><sup>*<\/sup><\/td><td>adres &#8211; 1<\/td><td>Coils (uitgangen)<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\"><strong>10001<\/strong>\u2026<strong>20000<\/strong><sup>*<\/sup><\/td><td>adres &#8211; 10001<\/td><td>Ingangen<\/td><\/tr><tr><td class=\"has-text-align-right\" data-align=\"right\"><strong>40001<\/strong>\u2026<strong>50000<\/strong><sup>*<\/sup><\/td><td>adres &#8211; 40001<\/td><td>Holding registers<\/td><\/tr><\/tbody><\/table><figcaption>* Maximale waarde is apparaat afhankelijk<br\/>Apparaat en modus adresgebied<\/figcaption><\/figure>\n\n<h2 class=\"wp-block-heading\" id=\"func\">Modbus functie codes<\/h2>\n\n<p>De tweede parameter in elk Modbus bericht is de functiecode. Dit defini\u00ebert het bericht type en het type actie dat van de slaaf verwacht wordt. De parameter bevat \u00e9\u00e9n byte aan informatie. In Modbus\/ASCII is dit gecodeerd met twee hexadecimale karakters, in Modbus\/RTU wordt \u00e9\u00e9n byte gebruikt. Toegestane functie codes liggen in het bereik 1\u2026255. Niet alle Modbus apparaten herkennen dezelfde serie van functiecodes. De meest gebruikte codes worden hier beschreven.<\/p>\n\n<p>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.<\/p>\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th>Code<\/th><th>Beschrijving<\/th><\/tr><\/thead><tbody><tr><td>01<\/td><td>Lees coil status<\/td><\/tr><tr><td>02<\/td><td>Lees ingang status<\/td><\/tr><tr><td>03<\/td><td>Lees holding registers<\/td><\/tr><tr><td>04<\/td><td>Lees input registers<\/td><\/tr><tr><td>05<\/td><td>Forceer enkele coil<\/td><\/tr><tr><td>06<\/td><td>Preset enkel register<\/td><\/tr><tr><td>07<\/td><td>Lees uitzonderingsstatus<\/td><\/tr><tr><td>15<\/td><td>Forceer meerdere coils<\/td><\/tr><tr><td>16<\/td><td>Preset meerdere registers<\/td><\/tr><tr><td>17<\/td><td>Rapporteer slave ID<\/td><\/tr><\/tbody><\/table><figcaption>Algemene Modbus functie codes<\/figcaption><\/figure>\n\n<dl class=\"wp-block-simple-definition-list-blocks-list\">\n<dt class=\"wp-block-simple-definition-list-blocks-term\">Function 01: Lees coil status<\/dt>\n\n\n\n<dd class=\"wp-block-simple-definition-list-blocks-details-html\">\n<p>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 \u00e9\u00e9n 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\u00ebren in het dataveld van het bericht.<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Byte<\/th><th>Waarde<\/th><th>Beschrijving<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td><strong>1<\/strong>\u2026<strong>247<\/strong><\/td><td>Slave adres<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td><strong>1<\/strong><\/td><td>Functiecode<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Startadres, hoge byte<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">4<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Startadres, lage byte<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">5<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Aantal coils, hoge byte<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">6<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Aantal coils, lage byte<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">7(+8)<\/td><td><strong>LRC<\/strong>\/<strong>CRC<\/strong><\/td><td>Foutcontrole waarde<\/td><\/tr><\/tbody><\/table><figcaption>Functie 01 verzoek structuur<\/figcaption><\/figure>\n\n\n\n<p>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:<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Byte<\/th><th>Waarde<\/th><th>Beschrijving<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td><strong>1<\/strong>\u2026<strong>247<\/strong><\/td><td>Slave adres<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td><strong>1<\/strong><\/td><td>Functiecode<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Aantal databytes <strong>N<\/strong><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">4\u2026<strong>N<\/strong>+3<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Bit patroon van de coil waarden<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>N<\/strong>+4(\u2026<strong>N<\/strong>+5)<\/td><td><strong>LRC<\/strong>\/<strong>CRC<\/strong><\/td><td>Foutcontrole waarde<\/td><\/tr><\/tbody><\/table><figcaption>Functie 01 antwoord structuur<\/figcaption><\/figure>\n<\/dd>\n\n\n\n<dt class=\"wp-block-simple-definition-list-blocks-term\">Function 02: Lees input status<\/dt>\n\n\n\n<dd class=\"wp-block-simple-definition-list-blocks-details-html\">\n<p>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 <b>02<\/b> wordt gebruikt. Broadcast adresmode wordt niet ondersteund. Er kunnen slechts de ingangen van \u00e9\u00e9n 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 <b>10001<\/b>. Deze adreswaarde is equivalent met adres <b>0<\/b> in het Modbus bericht.<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Byte<\/th><th>Waarde<\/th><th>Beschrijving<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td><strong>1<\/strong>\u2026<strong>247<\/strong><\/td><td>Slave adres<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td><strong>2<\/strong><\/td><td>Functiecode<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Startadres, hoge byte<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">4<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Startadres, lage byte<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">5<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Aantal inputs, hoge byte<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">6<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Aantal inputs, lage byte<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">7(+8)<\/td><td><strong>LRC<\/strong>\/<strong>CRC<\/strong><\/td><td>Foutcontrole waarde<\/td><\/tr><\/tbody><\/table><figcaption>Functie 02 verzoek structuur<\/figcaption><\/figure>\n\n\n\n<p>Nadat een verzoekboodschap met Modbus functie <b>02<\/b> 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.<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Byte<\/th><th>Waarde<\/th><th>Beschrijving<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td><strong>1<\/strong>\u2026<strong>247<\/strong><\/td><td>Slave adres<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td><strong>2<\/strong><\/td><td>Functiecode<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Aantal databytes <strong>N<\/strong><\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">4\u2026<strong>N<\/strong>+3<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Bitpatroon van ingangswaardes<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\"><strong>N<\/strong>+4(\u2026<strong>N<\/strong>+5)<\/td><td><strong>LRC<\/strong>\/<strong>CRC<\/strong><\/td><td>Foutcontrole waarde<\/td><\/tr><\/tbody><\/table><figcaption>Functie 02 antwoord structuur<\/figcaption><\/figure>\n<\/dd>\n\n\n\n<dt class=\"wp-block-simple-definition-list-blocks-term\">Function 03: Lees holding registers<\/dt>\n\n\n\n<dd class=\"wp-block-simple-definition-list-blocks-details-html\">\n<p>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 <b>40001<\/b>. Ze worden geadresseerd in de Modbus berichten structuur met adressen die beginnen bij <b>0<\/b>. Modbus functie <b>03<\/b> wordt gebruikt om de waarde van \u00e9\u00e9n of meer holding registers op te vragen van een apparaat. Slechts \u00e9\u00e9n slave apparaat kan worden geadresseerd in een verzoekbericht. Broadcast verzoeken worden door functie <b>03<\/b> niet ondersteund.<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter is-style-stripes\"><table><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Byte<\/th><th>Waarde<\/th><th>Beschrijving<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td><strong>1<\/strong>\u2026<strong>247<\/strong><\/td><td>Slave adres<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td><strong>3<\/strong><\/td><td>Functiecode<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Startadres, hoge byte<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">4<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Startadres, lage byte<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">5<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Aantal registers, hoge byte<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">6<\/td><td><strong>0<\/strong>\u2026<strong>255<\/strong><\/td><td>Aantal registers, lage byte<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">7(+8)<\/td><td><strong>LRC<\/strong>\/<strong>CRC<\/strong><\/td><td>Foutcontrole waarde<\/td><\/tr><\/tbody><\/table><figcaption>Functie 03 verzoek structuur<\/figcaption><\/figure>\n\n\n\n<p>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 <b>03<\/b>. 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.<\/p>\n<\/dd>\n<\/dl>\n\n<figure class=\"wp-block-table literature is-style-stripes\"><table><tbody><tr><td><i>&#8211;<\/i><\/td><td>De <a href=\"http:\/\/www.modbus.org\/tech.php\">Modbus technische resources<\/a> 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.<\/td><td><a href=\"http:\/\/www.modbus.org\"><i>Modbus-IDA<\/i><\/a><\/td><\/tr><\/tbody><\/table><figcaption>Literatuur<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Geschiedenis van de Modbus interface Modbus bericht structuur Modbus seri\u00eble 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\u2014zoals de Modbus interface\u2014ontstaan omdat ze goed zijn en eenvoudig te [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":2000,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2129","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Modbus protocol, specificaties en tutorial - Lammert Bies<\/title>\n<meta name=\"description\" content=\"De modbus interface. Tutorial van de modbus specificatie en het gebruik ervan. ASCII en RTU communication worden behandeld.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/modbus\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Modbus protocol, specificaties en tutorial - Lammert Bies\" \/>\n<meta property=\"og:description\" content=\"De modbus interface. Tutorial van de modbus specificatie en het gebruik ervan. ASCII en RTU communication worden behandeld.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/modbus\" \/>\n<meta property=\"og:site_name\" content=\"Lammert Bies\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/lammertbies\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-03T00:20:22+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@lammertbies\" \/>\n<meta name=\"twitter:label1\" content=\"Geschatte leestijd\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\\\/info\\\/modbus\",\"url\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\\\/info\\\/modbus\",\"name\":\"Modbus protocol, specificaties en tutorial - Lammert Bies\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl#website\"},\"datePublished\":\"2021-04-27T18:34:24+00:00\",\"dateModified\":\"2021-05-03T00:20:22+00:00\",\"description\":\"De modbus interface. Tutorial van de modbus specificatie en het gebruik ervan. ASCII en RTU communication worden behandeld.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\\\/info\\\/modbus#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\\\/info\\\/modbus\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\\\/info\\\/modbus#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorials over computer interfacing\",\"item\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Communicatie en interfacing informatie\",\"item\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\\\/comm\\\/info\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Modbus interface tutorial\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl#website\",\"url\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl\",\"name\":\"Lammert Bies\",\"description\":\"Computer Interfacing\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl#\\\/schema\\\/person\\\/5a6c15bc687da8d8d5ef7407fc62c7ba\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/nl#\\\/schema\\\/person\\\/5a6c15bc687da8d8d5ef7407fc62c7ba\",\"name\":\"Lammert Bies\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/lammie.jpg\",\"url\":\"https:\\\/\\\/www.lammertbies.nl\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/lammie.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lammertbies.nl\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/lammie.jpg\",\"width\":537,\"height\":541,\"caption\":\"Lammert Bies\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lammertbies.nl\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/lammie.jpg\"},\"description\":\"is a dad, husband and polyglot. He is developing embedded systems since the eighties. Used machine learning before it had a name. Specializes in interconnecting computers, robots and humans. Was a Google Mapmaker Advocate and speaker on several international Google conferences from 2011 until the plug was pulled on Mapmaker in 2017. Currently spreading artificial intelligence to the wildest locations in production environments. He never stops learning.\",\"sameAs\":[\"https:\\\/\\\/www.lammertbies.nl\",\"https:\\\/\\\/www.facebook.com\\\/lammertbies\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/lammertbies\\\/\",\"https:\\\/\\\/x.com\\\/lammertbies\",\"https:\\\/\\\/bughunter.withgoogle.com\\\/profile\\\/1aaf547a-f30a-4145-b7f7-32259a48fa50\",\"https:\\\/\\\/github.com\\\/lammertb\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Modbus protocol, specificaties en tutorial - Lammert Bies","description":"De modbus interface. Tutorial van de modbus specificatie en het gebruik ervan. ASCII en RTU communication worden behandeld.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/modbus","og_locale":"nl_NL","og_type":"article","og_title":"Modbus protocol, specificaties en tutorial - Lammert Bies","og_description":"De modbus interface. Tutorial van de modbus specificatie en het gebruik ervan. ASCII en RTU communication worden behandeld.","og_url":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/modbus","og_site_name":"Lammert Bies","article_publisher":"https:\/\/www.facebook.com\/lammertbies","article_modified_time":"2021-05-03T00:20:22+00:00","twitter_card":"summary_large_image","twitter_site":"@lammertbies","twitter_misc":{"Geschatte leestijd":"11 minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/modbus","url":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/modbus","name":"Modbus protocol, specificaties en tutorial - Lammert Bies","isPartOf":{"@id":"https:\/\/www.lammertbies.nl\/nl#website"},"datePublished":"2021-04-27T18:34:24+00:00","dateModified":"2021-05-03T00:20:22+00:00","description":"De modbus interface. Tutorial van de modbus specificatie en het gebruik ervan. ASCII en RTU communication worden behandeld.","breadcrumb":{"@id":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/modbus#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lammertbies.nl\/nl\/comm\/info\/modbus"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lammertbies.nl\/nl\/comm\/info\/modbus#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lammertbies.nl\/nl"},{"@type":"ListItem","position":2,"name":"Tutorials over computer interfacing","item":"https:\/\/www.lammertbies.nl\/nl\/comm"},{"@type":"ListItem","position":3,"name":"Communicatie en interfacing informatie","item":"https:\/\/www.lammertbies.nl\/nl\/comm\/info"},{"@type":"ListItem","position":4,"name":"Modbus interface tutorial"}]},{"@type":"WebSite","@id":"https:\/\/www.lammertbies.nl\/nl#website","url":"https:\/\/www.lammertbies.nl\/nl","name":"Lammert Bies","description":"Computer Interfacing","publisher":{"@id":"https:\/\/www.lammertbies.nl\/nl#\/schema\/person\/5a6c15bc687da8d8d5ef7407fc62c7ba"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lammertbies.nl\/nl?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lammertbies.nl\/nl#\/schema\/person\/5a6c15bc687da8d8d5ef7407fc62c7ba","name":"Lammert Bies","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/www.lammertbies.nl\/wp-content\/uploads\/2021\/04\/lammie.jpg","url":"https:\/\/www.lammertbies.nl\/wp-content\/uploads\/2021\/04\/lammie.jpg","contentUrl":"https:\/\/www.lammertbies.nl\/wp-content\/uploads\/2021\/04\/lammie.jpg","width":537,"height":541,"caption":"Lammert Bies"},"logo":{"@id":"https:\/\/www.lammertbies.nl\/wp-content\/uploads\/2021\/04\/lammie.jpg"},"description":"is a dad, husband and polyglot. He is developing embedded systems since the eighties. Used machine learning before it had a name. Specializes in interconnecting computers, robots and humans. Was a Google Mapmaker Advocate and speaker on several international Google conferences from 2011 until the plug was pulled on Mapmaker in 2017. Currently spreading artificial intelligence to the wildest locations in production environments. He never stops learning.","sameAs":["https:\/\/www.lammertbies.nl","https:\/\/www.facebook.com\/lammertbies","https:\/\/www.linkedin.com\/in\/lammertbies\/","https:\/\/x.com\/lammertbies","https:\/\/bughunter.withgoogle.com\/profile\/1aaf547a-f30a-4145-b7f7-32259a48fa50","https:\/\/github.com\/lammertb"]}]}},"_links":{"self":[{"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/pages\/2129","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/comments?post=2129"}],"version-history":[{"count":0,"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/pages\/2129\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/pages\/2000"}],"wp:attachment":[{"href":"https:\/\/www.lammertbies.nl\/nl\/wp-json\/wp\/v2\/media?parent=2129"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}