I. Inleiding
1.1 Toepassingsgebied
MODBUS is een berichtenprotocol op laag 7 van het OSI-model dat client/server-communicatie biedt tussen apparaten die zijn aangesloten op verschillende soorten bussen of netwerken.
Sinds MODBUS in 1979 werd geïntroduceerd als de de facto standaard voor industriële seriële verbindingen, hebben duizenden automatiseringsapparaten met elkaar kunnen communiceren. Momenteel wordt de eenvoudige en elegante MODBUS-structuur nog steeds ondersteund. Internetorganisaties bieden toegang tot MODBUS via de gereserveerde systeempoort 502 op de TCP/IP-stack.
MODBUS is een request/response protocol en levert diensten die worden gespecificeerd door functiecodes. MODBUS-functiecodes zijn elementen van de MODBUS request/response PDU. Het doel van dit document is het beschrijven van de functiecodes die worden gebruikt binnen het MODBUS-transactieverwerkingskader. 1.2 Normatieve referentiedocumenten 1. RFC791, Internet Protocol, sep81 DARPA 2. MODBUS Protocol Reference Guide Rev J, MODICON, juni 1996, doc#PI_MBUS_300 MODBUS is een berichtenprotocol voor toepassingslagen dat wordt gebruikt voor client/server-communicatie tussen apparaten die via verschillende soorten bussen of netwerken met elkaar zijn verbonden. Momenteel wordt MODBUS geïmplementeerd met behulp van: TCP/IP over Ethernet. Asynchrone seriële transmissie via verschillende media (bekabeld: EIA/TIA-232-E, EIA-422, EIA/TIA-485-A; glasvezel, draadloos, enz.) MODBUS PLUS, een high-speed token passing netwerk.
1.2 Normatieve referentiedocumenten
1. RFC791, Internet Protocol, sep81 DARPA
2. MODBUS Protocol Reference Guide Rev J, MODICON, juni 1996, doc#PI_MBUS_300 MODBUS is een toepassingslaag berichtenprotocol dat wordt gebruikt voor client/server-communicatie tussen apparaten die via verschillende soorten bussen of netwerken zijn aangesloten.
Momenteel wordt MODBUS geïmplementeerd via: TCP/IP over Ethernet.
Asynchrone seriële transmissie via verschillende media (bekabeld: EIA/TIA-232-E, EIA-422, EIA/TIA-485-A; glasvezel, draadloos, enz.) MODBUS PLUS, een high-speed token passing netwerk.

2 Afkortingen
ADU Toepassingsgegevensunit
HDLC Geavanceerde Datalinkbesturing
HMI mens-machine-interface
IETF Internet Engineering Working Group I/O Input/Output Device IP Internet Protocol
MAC media toegangscontrole
MB MODBUS-protocol
MBAP MODBUS-protocol
PDU protocol data unit
PLC programmeerbare logische besturing
TCP Overdracht Controle Protocol
3 Samenvatting achtergrond
Het MODBUS-protocol maakt eenvoudige communicatie mogelijk binnen verschillende netwerkarchitecturen.

Elk apparaat (PLC, HMI, bedieningspaneel, driver, motion control, ingangs-/uitgangsapparaat) kan het MODBUS-protocol gebruiken om bediening op afstand te starten.
Dezelfde communicatie is mogelijk via MODBUS over seriële verbindingen en Ethernet TCP/IP-netwerken.
Sommige gateways maken communicatie tussen verschillende bussen of netwerken mogelijk via het MODBUS-protocol.
4 Algemene beschrijving
4.1 Protocolbeschrijving
Het MODBUS-protocol definieert een eenvoudige protocoldata-eenheid (PDU) die onafhankelijk is van de onderliggende communicatielaag.op een specifieke bus of netwerk
De MODBUS-protocolmapping kan enkele extra velden toevoegen aan de Application Data Unit (ADU).

Een client die een MODBUS-transactie initieert, maakt een MODBUS-toepassingsdata-eenheid aan. Functiecodes geven aan de server aan welke bewerking wordt uitgevoerd.
Het MODBUS-protocol stelt een clientgeïnitieerd verzoekformaat vast.
Gebruik één byte om het functiecodeveld van de MODBUS-data-eenheid te coderen. Het geldige codewoordbereik is decimaal 1-255 (128-255 zijn gereserveerd voor uitzonderingsreacties). Wanneer een bericht van de client naar het serverapparaat wordt verzonden, vertelt het functiecodeveld de server welke bewerking moet worden uitgevoerd.
Voeg subfunctiecodes toe aan sommige functiecodes om meerdere bewerkingen te definiëren.
Het gegevensveld van het bericht dat van de client naar het serverapparaat wordt verzonden, bevat aanvullende informatie en de server gebruikt deze informatie om de bewerking uit te voeren die door de functiecode wordt gedefinieerd. Dit veld bevat ook discrete item- en registeradressen, het aantal verwerkte items en het werkelijke aantal databytes in het veld.
In bepaalde verzoeken kan het gegevensveld onbestaand zijn (0 lengte), in welk geval de server geen extra informatie nodig heeft. Functiecodes beschrijven alleen bewerkingen.
Als er geen fouten met betrekking tot de aangevraagde MODBUS-functionaliteit zijn opgetreden in een correct ontvangen MODBUS ADU, bevat het veld met antwoordgegevens van server naar client de verzoekgegevens. Als er een fout optreedt met betrekking tot het aanvragen van MODBUS-functionaliteit, bevat het veld een uitzonderingscode die de servertoepassing kan gebruiken om de volgende uit te voeren bewerking te bepalen.
Een client kan bijvoorbeeld de aan/uit-status van een set discrete uitgangen of ingangen lezen, of een client kan de gegevensinhoud van een set registers lezen/schrijven.
Wanneer de server de client antwoordt, gebruikt hij het functiecodeveld om aan te geven of het een normaal (foutloos) antwoord is of dat er iets fout is gegaan (een uitzonderingsantwoord genoemd). Bij een normaal antwoord antwoordt de server alleen op de oorspronkelijke functiecode.

Voor een uitzonderingsantwoord stuurt de server een code terug die gelijk is aan de oorspronkelijke functiecode en stelt de meest significante bit van de oorspronkelijke functiecode in op logica 1.

Commentaar: Timeouts moeten worden beheerd om expliciet te wachten op een antwoord dat misschien niet komt.
De lengtebeperking van de eerste MODBUS-implementatie op de seriële verbinding beperkt de MODBUS PDU-grootte (maximale RS485ADU=256 bytes).
Voor communicatie via een seriële verbinding is de MODBUS PDU dus 256 - serveradres (1 byte) - CRC (2 bytes) = 253 bytes.
daarbij:
RS232 / RS485 ADU = 253 bytes Serveradres (1 byte) CRC (2 bytes) = 256 bytes.
TCP MODBUS ADU = 249 bytes MBAP (7 bytes) = 256 bytes.
Het MODBUS-protocol definieert drie soorten PDU's. Deze zijn:
MODBUS verzoek PDU, mb_req_pdu
MODBUS antwoord PDU, mb_rsp_pdu
MODBUS uitzonderingsantwoord PDU, mb_excep_rsp_pdu
Definieer mb_req_pdu als: mb_req_pdu = {functie_code, request_data}, waarbij
function_code - [1 byte] MODBUS-functiecode
request_data - [n bytes], dit veld is gerelateerd aan de functiecode en bevat meestal informatie zoals variabele verwijzingen, variabelen, gegevensoffsets, subfunctiecodes, enz.
Definieer mb_rsp_pdu als:
mb_rsp_pdu = {functie_code, antwoord_gegevens}, waarbij
function_code - [1 byte] MODBUS-functiecode
response_data - [n bytes], dit veld is gerelateerd aan de functiecode en bevat gewoonlijk informatie zoals variabele verwijzingen, variabelen, data-offsets, subfunctiecodes, enz.
Definieer mb_excep_rsp_pdu als:
mb_excep_rsp_pdu = {functie_code, verzoek_gegevens}, waarbij
function_code - [1 byte] MODBUS functiecode 0x80
exception_code - [1 byte], MODBUS uitzonderingscodes worden gedefinieerd in de onderstaande tabel.
4.2 Gegevenscodering
MODBUS gebruikt een ‘big-endian’ weergave van adressen en data-items. Dit betekent dat wanneer er meerdere bytes worden verzonden, de meest significante bit het eerst wordt verzonden. Bijvoorbeeld: register size value
16 - Bit 0x1234 De eerste verzonden byte is 0x12 en vervolgens 0x34
Opmerking: Zie [1] voor meer gedetailleerde informatie.
4.3 MODBUS-gegevensmodel
MODBUS is gebaseerd op een reeks gegevensmodellen op tabellen met verschillende kenmerken. De vier basisvormen zijn:
| basisvorm | Type object | toegangstype | inhoud |
| Discrete ingang | enkele bit | alleen lezen | Het I/O-systeem levert dit type gegevens |
| Spoel | enkele bit | Lezen en schrijven | Wijzig dit type gegevens via de applicatie |
| invoerregister | 16-bits woord | alleen lezen | Het I/O-systeem levert dit type gegevens |
| bedrijfsregister | 16-bits woord | Lezen en schrijven | Wijzig dit type gegevens via de applicatie |
Het onderscheid tussen invoer en uitvoer en tussen gegevensitems met een bitadres en gegevensitems met een woordadres impliceert geen enkele toepassingshandeling. Als dit de meest natuurlijke verklaring is voor de kern van het verdachte object, dan is dit onderscheid perfect aanvaardbaar en gangbaar, zodat alle vier de tabellen geacht worden elkaar te dekken.
Voor elk item in de basistabel staat het protocol toe dat 65536 gegevensitems afzonderlijk worden geselecteerd en lees- en schrijfbewerkingen op die items zijn ontworpen om meerdere opeenvolgende gegevensitems te omvatten tot aan de specificatielimiet voor de gegevensgrootte, wat consistent is met de gerelateerde functiecode voor transactieverwerking.
Uiteraard moeten alle gegevens die via MODBUS worden verwerkt, in het applicatiegeheugen van het apparaat worden geplaatst. Het fysieke adres van het geheugen moet echter niet worden verward met de datareferentie. De vereiste is simpelweg dat de datareferentie gekoppeld is aan een fysiek adres.
Het MODBUS logisch referentienummer dat wordt gebruikt in de MODBUS functiecode is een unsigned integer index beginnend bij 0.
Voorbeelden van implementatie van MODBUS-modellen
De volgende voorbeelden tonen twee manieren om gegevens in het apparaat te structureren. Er kunnen andere structuren zijn, die niet allemaal in dit document worden beschreven. Elk apparaat heeft zijn eigen gegevensstructuur gebaseerd op de toepassing.
Voorbeeld 1: Apparaat met 4 onafhankelijke blokken
Het volgende voorbeeld toont de gegevensstructuur in een apparaat dat digitale en analoge grootheden, ingangen en uitgangen bevat. Aangezien de gegevens in verschillende blokken niet aan elkaar gerelateerd zijn, is elk blok onafhankelijk van elkaar. Elk blok is toegankelijk volgens verschillende MODBUS-functiecodes.

Voorbeeld 2: Apparaat met slechts 1 blok
In dit voorbeeld heeft het apparaat slechts 1 gegevensblok. Het is mogelijk om dezelfde gegevens te verkrijgen via verschillende MODBUS-functiecodes, of via 16-bits toegang of 1 toegangsbit.

4.4 Definitie van MODBUS-transactieverwerking
Het volgende toestandsdiagram beschrijft de algemene verwerking van MODBUS-transacties aan de serverzijde.

Nadat de server de aanvraag heeft verwerkt, stelt hij een MODBUS-antwoord op met behulp van de juiste MODBUS-servertransactie.
Afhankelijk van de verwerkingsresultaten kunnen twee soorten reacties worden vastgesteld:
Een positieve MODBUS respons:
● Functiecode antwoord = functiecode verzoek
Een MODBUS uitzonderingsrespons (zie paragraaf 6.14)
Wordt gebruikt om de klant informatie te geven over fouten die tijdens de verwerking zijn ontdekt;
● Functiecode antwoord = functiecode verzoek 0x80;
Geef een uitzonderingscode om de oorzaak van de fout aan te geven.
5 Functiecode-indeling
Er zijn drie soorten MODBUS-functiecodes. Deze zijn:
● Is een goed gedefinieerde functiecode,
Gegarandeerd uniek,
De MODBUS-organisatie kan worden gewijzigd,
Openbaar bewezen,
Conformiteitstesten beschikbaar hebben,
Zoals aangetoond in de MB IETF RFC,
Bevat gedefinieerde openbare toegewezen functiecodes en niet-toegewezen gereserveerde functiecodes voor toekomstig gebruik.
Door gebruiker gedefinieerde functiecode
Er zijn twee definitiebereiken van door de gebruiker gedefinieerde functiecodes, namelijk 65 tot 72 en decimaal 100 tot 110.
De gebruiker kan een functiecode selecteren en implementeren zonder goedkeuring van de MODBUS-organisatie.
Er is geen garantie dat de geselecteerde functiecode uniek gebruikt wordt.
Als de gebruiker de functie opnieuw als publieke functiecode wil instellen, moet de gebruiker een RFC initiëren om de wijziging in de publieke categorie in te voeren en een nieuwe publieke functiecode toe te wijzen.
Functiecode reserveren
Functiecodes die door sommige bedrijven worden gebruikt voor traditionele producten en die ongeldig zijn voor openbaar gebruik.

5.1 Definitie van openbare functiecodes

6 Functiecode beschrijving
6.1 01 (0x01) spoel lezen
Gebruik deze functiecode in een extern apparaat om de continue status van de spoel van 1 tot 2000 te lezen. De request PDU geeft het startadres, het eerste opgegeven spoeladres en het spoelnummer. Het aanspreken van de spoel begint bij nul. Dus het aanspreken van spoelen 1-16 is 0-15.
De spoel in het antwoordbericht is verdeeld in één spoel volgens elke bit van het gegevensveld. De aangegeven status is 1= AAN en 0= UIT. Het LSB (minst significante bit) van de eerste databyte bevat de uitgang die in de ondervraging wordt geadresseerd. De andere spoelen volgen deze volgorde, tot aan het hoge einde van deze byte, en van laag naar hoog in volgende bytes.
Als het aantal teruggezonden uitgangen geen veelvoud van acht is, worden de resterende bits in de laatste gegevensbyte (tot aan het einde van de byte aan de hoge orde) opgevuld met nullen. Het veld aantal bytes specificeert het volledige aantal bytes aan gegevens.
PDU aanvragen
| functiecode | 1 byte | 0x01 |
| oorspronkelijk adres | 2 bytes | 0x0000 tot 0xFFFF |
| Aantal spoelen | 2 bytes | 1 tot 2000 (0x7D0) |
Antwoord PDU
| functiecode | 1 byte | 0x01 |
| Aantal bytes | 1 byte | N* |
| Spoelstatus | N bytes | n=N of N 1 |
*N=Afvoerhoeveelheid/8, als de rest niet gelijk is aan 0, dan N = N 1
fout
| functiecode | 1 byte | Functiecode +0x80 |
| Uitzonderingscode | 1 byte | 01 of 02 of 03 of 04 |
Dit is een voorbeeld van een verzoek om discrete uitgangen 20-38 te lezen:
| vraag | antwoord |
| domeinnaam | (hexadecimaal) | domeinnaam | (hexadecimaal) |
| Functie | 01 | Functie | 01 |
| Startadres Hi | 00 | Aantal bytes | 03 |
| Startadres Lo | 13 | Uitgangsstatus 27-20 | CD |
| UitvoervolumeHi | 00 | Uitgangsstatus 35-28 | 6B |
| Uitvoervolume Lo | 13 | Uitgangsstatus 38-36 | 05 |
Stel de status van uitgang 27-20 voor als de hexadecimale bytewaarde CD, of 1100 1101 in binair. Uitgang 27 is de MSB van deze byte en uitgang 20 is de LSB.
Gewoonlijk worden de bits binnen een byte weergegeven met de MSB aan de linkerkant en de LSB aan de rechterkant. De uitvoer van de eerste byte is 27 tot 20 van links naar rechts. De uitgang van de volgende byte is 35 tot 28 van links naar rechts. Wanneer bits serieel worden verzonden, van LSB naar MSB: 20 . . . 27, 28 . . . 35, enzovoort.
In de laatste databyte wordt uitgangsstatus 38-36 voorgesteld als een hexadecimale bytewaarde van 05, of 0000 0101 in binair. Uitgang 38 is de zesde bitpositie van links en uitgang 36 is de LSB van deze byte. Vul de vijf resterende hoge-ordebits met nullen.
Opmerking: Vul de vijf overgebleven bits (tot aan de bit met de hoge orde) met nullen.