Modbus RTU, ASCII en TCP met SerialTool

Laatst bijgewerkt op door Oliver Reed

Wat is Modbus

Het Modbus-protocol is een serieel communicatieprotocol dat in 1979 door Modicon® werd ontwikkeld (een bedrijf dat nu deel uitmaakt van de Schneider Electric-groep) om communicatie tussen programmeerbare logische controllers (PLC’s) mogelijk te maken. Het is uitgegroeid tot een de facto-standaard in industriële communicatie en is momenteel een van de meest gebruikte verbindingsprotocollen ter wereld voor industriële elektronische apparaten. Modbus is een royaltyvrij protocol waarvan de specificaties worden gepubliceerd op de website van The Modbus Organization.

Eenvoudig gezegd is het een methode om informatie via seriële lijnen tussen elektronische apparaten over te dragen. Het apparaat dat informatie opvraagt, wordt de Modbus Client genoemd en de apparaten die informatie leveren, worden Modbus Servers genoemd. In een standaard Modbus-netwerk is er één client en zijn er maximaal 247 servers, elk met een uniek serveradres van 1 tot 247. De client kan ook informatie naar de servers schrijven.


Oorspronkelijk bedoeld voor industrieel gebruik, is dit protocol in de loop van de tijd ook in andere sectoren toegepast en uitgegroeid tot een van de meest verspreide protocollen. Zelfs vandaag, ondanks dat het meer dan 40 jaar oud is, is het nog steeds aanwezig in veel apparaten, zoals operatorpanelen, PLC’s, domoticasystemen en zelfs eenvoudige apparaten zoals Arduino.

Modbus RTU- en ASCII-transmissie via serieel

Toen het protocol werd ontwikkeld, was communicatie bedoeld om via een seriële poort te verlopen, en daarom is het in SerialTool geïmplementeerd. Modbus wordt vaak gebruikt om een supervisiecomputer te verbinden met een remote terminal unit (RTU) in SCADA-systemen (Supervisory Control and Data Acquisition). Afhankelijk van het formaat waarmee gegevens worden verzonden, wordt het protocol onderverdeeld in:

  • MODBUS RTU - gegevens worden in hexadecimaal formaat verzonden.
  • MODBUS ASCII - gegevens worden in ASCII-formaat verzonden.

De foutcontrole verschilt in de twee gevallen: in MODBUS RTU wordt een CRC (Cyclic Redundancy Check) gebruikt die aan de commando’s wordt toegevoegd, terwijl in MODBUS ASCII een LRC (Longitudinal Redundancy Check) wordt gebruikt, die eveneens na de commando’s wordt verzonden.

Modbus TCP-transmissie

In 1999 werd “Modbus TCP” ontwikkeld, een standaard voor netwerken die de TCP/IP-protocolsuite gebruiken: in de praktijk is dit een op TCP/IP gebaseerde versie van seriële Modbus RTU, waardoor communicatie via internet-/intranetnetwerken mogelijk wordt. In de afgelopen jaren is de TCP/IP-versie steeds populairder geworden omdat zij Open Source, eenvoudig te implementeren, goedkoop in ontwikkeling en met minimale hardwareondersteuning te gebruiken is.

De foutcontrole verschilt in de twee gevallen: in MODBUS RTU wordt een CRC (Cyclic Redundancy Check) gebruikt die aan de commando’s wordt toegevoegd, terwijl in MODBUS ASCII een LRC (Longitudinal Redundancy Check) wordt gebruikt, die eveneens na de commando’s wordt verzonden.

Het Modbus TCP/IP-protocol gebruikt binaire datacodering en het TCP/IP-foutdetectiemechanisme. In tegenstelling tot seriële Modbus is de TCP/IP-versie verbindingsgericht en laat zij gelijktijdige verbindingen met dezelfde slave of met meerdere apparaten toe. Modbus TCP/IP gebruikt eveneens het master-slave-paradigma; deze communicatie gebruikt bovendien vier soorten berichten.

Modbus bevindt zich op niveau 7 van de ISO/OSI-stack (Application Layer) en definieert berichtopmaak, framing genoemd, en de manier waarop data en besturingsfuncties worden verzonden. Communicatie vindt plaats volgens het client-server-paradigma. Het protocol definieert een Protocol Data Unit (PDU) die niet afhankelijk is van de onderliggende communicatielaag. De Application Data Unit (ADU) voegt extra velden toe voor adressering en foutcontrole.

SerialTool Modbus Client (Master / Polling)

SerialTool is een Modbus RTU-, ASCII- en TCP-client met polling, registerscanning, verkeersbewaking en live grafieken voor het testen en debuggen van industriële apparaten.

Met de Modbus Client kunt u verbinding maken met een Modbus Slave/server-apparaat via Serieel (RTU of ASCII) of Netwerk (TCP over IPv4 of IPv6), gegevens lezen en schrijven met standaard Modbus-functies en een Modbus-apparaat met een eigen mapping maken waarop gepland polling kan worden uitgevoerd.
Binnen het prototype-apparaat kunnen Modbus-structuren (Discrete Output Coils, Discrete Input Contacts, Analog Input Register, Analog Output Holding Register) worden toegevoegd en kan het apparaat worden opgeslagen zodat het later opnieuw geladen kan worden. Het Modbus-prototype-apparaat kan ook naar Tekst-, CSV- of PDF-formaat worden geëxporteerd om het eenvoudig en intuïtief te delen.
Zodra een apparaat met de juiste mapping is gemaakt, kunnen realtime grafieken worden weergegeven met waarden die via gepland polling direct van het Slave-apparaat worden gelezen.
SerialTool biedt daarnaast de mogelijkheid om Modbus-verkeer (Serieel en TCP) te bekijken in een speciaal terminalvenster voor gegenereerd en ontvangen verkeer. De geavanceerde terminal ondersteunt data-export en realtime filtering van inkomende en uitgaande gegevens.
SerialTool biedt ook de mogelijkheid om het externe Slave-apparaat te scannen via de functie Modbus Scanner. Door de juiste filters in te stellen, kunt u proberen het externe apparaat (Modbus Slave) in kaart te brengen, zelfs zonder de momenteel ondersteunde registers te kennen. De functie Modbus Scanner is vooral nuttig wanneer u een apparaat wilt verkennen waarvan de eigenschappen onbekend of slechts gedeeltelijk bekend zijn.

Hieronder ziet u het hoofdscherm van de Modbus-module van SerialTool:

Modbus Client (Master/Polling) Main page

Hoofdscherm van de SerialTool Modbus Client

Het hoofdscherm toont de belangrijkste functies van SerialTool en de Modbus Client (Master).

SerialTool Modbus Client (Master / Polling)

Aan de linkerkant van het scherm kunt u de verbindingsmodus Serieel of TCP kiezen:

Modbus Client Connection

Verbindingsscherm van de Modbus Client

Zoals hierboven aangegeven, wordt het seriële Modbus-protocol in twee typen verdeeld: RTU en ASCII. Om correct met het externe apparaat te communiceren, is het bij een seriële verbinding essentieel te weten welk type Modbus-protocol door het Slave-apparaat wordt ondersteund.

De ModBus TCP-verbinding ondersteunt daarentegen IPv4 en IPv6. Om de Modbus-verbinding via TCP in te stellen, moet het IP-adres van de slave en de externe poort waarmee verbinding moet worden gemaakt, worden opgegeven.

Op het verbindingsscherm zijn twee parameters aanwezig voor de responstijd die het Modbus Slave-apparaat moet geven.
Een algemene responstime-out (Response Timeout), waarna de Client (Master) stopt met wachten op het antwoord van de slave, en een time-out vanaf de laatste byte die van de Slave is ontvangen.

Modbus ENRON/Daniel-emulatie

Onder de verbindingsparameters bevindt zich de ENRON/Daniel-emulatie (vaak simpelweg Enron Modbus of Daniels Modbus genoemd), die verwijst naar een specifieke variant van het standaard Modbus-communicatieprotocol.
Deze werd oorspronkelijk ontwikkeld door Enron Corporation en breed toegepast in de flow computers van Daniel Measurement and Control. In de loop van de tijd werd dit een de-facto-standaard voor elektronische vloeistofmeting (EFM), vooral in de Oil & Gas-sector.

Het inschakelen van ENRON/Daniel-emulatie op een apparaat wijzigt het gedrag van Modbus om de volgende belangrijke kenmerken te ondersteunen:

  • 1. 32-bits gegevensverwerking in één register: Dit is het belangrijkste technische verschil. In Standard Modbus zijn registers 16 bit (2 bytes) en moeten twee registers worden gelezen voor een 32-bits waarde. In Enron Modbus worden 32-bits waarden in één enkel register geplaatst (4 bytes per register).
  • 2. Specifieke adresmapping: Er worden vooraf gedefinieerde bereiken gebruikt voor 32-bits gegevens. De 5000-serie (bijvoorbeeld 45001 - 45999) is voor Long Integers, terwijl de 7000-serie (bijvoorbeeld 47001 - 47999) is voor Floating Points.
  • 3. Historische gegevens en gebeurtenissen: Ondersteunt speciale commando’s voor het ophalen van historische logs en alarmarchieven, in tegenstelling tot standaard Modbus, dat vrijwel uitsluitend voor realtime uitlezing is ontworpen.
  • 4. Geen offset: Het gevraagde adres komt exact overeen met het registernummer, waardoor de klassieke “+1-offset” van standaard Modbus verdwijnt.

Kort samengevat: Deze emulatie is essentieel om communicatiefouten (byte-misalignment) te voorkomen bij koppeling met apparaten die native 32-bits gegevens versturen in de Oil & Gas-sector.


Modbus Client-functies

In het centrale deel van het scherm vindt u de Modbus-functies die door SerialTool worden ondersteund.

Modbus Client-functies

Ondersteunde functies voor Modbus Client-modus

De functies van de ModBus-client kunnen in de volgende tabel worden samengevat.

Functiecode Actie Tabelnaam / Beschrijving
0x01 Lezen Discrete Output Coils
0x02 Lezen Discrete Input Contacts
0x03 Lezen Analog Output Holding Register
0x04 Lezen Analog Input Registers
0x05 Enkelvoudig schrijven Discrete Output Coil
0x06 Enkelvoudig schrijven Analog Output Holding Register
0x07 Lezen Exception Status
0x08 Diagnostiek Diagnostiek (Serial Line only)
0x0B (dec 11) Lezen Comm Event Counter (Serial Line only)
0x0F (dec 15) Meervoudig schrijven Discrete Output Coils
0x10 (dec 16) Meervoudig schrijven Analog Output Holding Registers
0x11 (dec 17) Rapport Server ID (Serial Line only)
0x16 (dec 22) Gemaskeerd schrijven Holding Register
0x17 (dec 23) Meervoudig lezen/schrijven Holding Registers
0x2B / 0x0E (dec 43 / 14) Lezen Device Identification

Modbus-datastructuren

Informatie wordt in het Server-apparaat opgeslagen in vier verschillende tabellen. Twee tabellen slaan discrete aan/uit-waarden op (coils) en twee slaan numerieke waarden op (registers). Coils en registers hebben elk een alleen-lezen-tabel en een lezen/schrijven-tabel. Elke tabel bevat 9999 waarden. Elke coil of contact is 1 bit en heeft een data-adres tussen 0000 en 270E. Elk register is 1 woord = 16 bits = 2 bytes en heeft eveneens een data-adres tussen 0000 en 270E.

Coil-/registernummers Data-adressen Type Tabelnaam
1-9999 0x0000 to 0x270E Lezen/Schrijven Discrete Output Coils
10001-19999 0x0000 to 0x270E Alleen lezen Discrete Input Contacts
30001-39999 0x0000 to 0x270E Alleen lezen Analog Input Register
40001-49999 0x0000 to 0x270E Lezen/Schrijven Analog Output Holding Register

Modbus-apparaat

SerialTool maakt het mogelijk een Modbus Slave-apparaat te maken dat de registermapping van het Slave-apparaat vertegenwoordigt waarmee u verbinding wilt maken. Deze mapping is zeer belangrijk omdat ze het mogelijk maakt om de waarden die aanwezig zijn in het externe slave-apparaat in een lokale tabel weer te geven.

Modbus Client-functies

Modbus Slave functions map

Beschikbare functies voor de Modbus Client

Via de functiebalk kan een eerder gemaakt apparaat worden geladen met de functie "Load Device", het huidige apparaat worden opgeslagen met "Save Device" en kunnen afzonderlijke registers met "Add Item" of meerdere registers met "Add Items" aan de apparaatmapping worden toegevoegd.

Add Multiple Modbus Registers

Modbus-registers toevoegen aan de Modbus-apparaatmapping


Modbus-apparaat Slave Memory Mapping

Geheugengebied van het Modbus Slave-apparaat (Modbus-apparaat)

Zodra de mapping van het Modbus Slave-apparaat is gemaakt, kan SerialTool deze opslaan voor later gebruik of de inhoud exporteren in CSV-, Tekst- of PDF-formaat voor delen en verwerking met derden. De volgende afbeelding toont een voorbeeld van het exporteren van de mapping van een Modbus Slave-apparaat:

Modbus Slave Mapping

Voorbeeld van PDF-export van een Modbus Slave-apparaatmapping

U kunt de PDF downloaden via deze link.

Modbus-polling

Door een Modbus Slave-apparaat te maken, wordt polling mogelijk, dat wil zeggen het gepland uitlezen van bepaalde registers van het slave-apparaat waarmee u verbonden bent.
Hiervoor moet eerst de Slave worden gemaakt en gemapt en moeten het register of de registers waaraan u polling wilt koppelen, worden toegevoegd, zoals in de volgende afbeelding wordt getoond:

Modbus Master to Slave Polling

De afbeelding toont het toevoegen van een element aan polling richting de slave

Zodra één of meer items aan polling zijn toegevoegd, kan de polling van de items die aan de pollinglijst zijn gekoppeld worden gestart.

Modbus Master to Slave Polling Mask

De afbeelding toont de voor polling geselecteerde items

Toegang tot Modbus-functies

De SerialTool Modbus-client (Master/Polling) is ontworpen om functies in drie modi uit te voeren:

Modbus execute function

Uitvoering van Modbus-functies

  • "Execute from Device Table" - Voert de Modbus-functie uit op basis van de apparaatmapping.
  • "Execute Function" - Voert de directe Modbus-functie uit en toont het resultaat in het logvenster.
  • "Send Raw Data" - Verstuurt een directe aanvraag bestaande uit hexadecimale bytes en wacht op het antwoord.

Execute from Device Table

Deze modus voert de geselecteerde Modbus-functie uit door rechtstreeks de lokaal geladen of aangemaakte apparaattabel te gebruiken. De gebruiker kan het type Modbus-referentie selecteren, zoals Coils, Discrete Inputs, Holding Registers of Input Registers, het startadres en het aantal te lezen of te schrijven elementen kiezen en vervolgens met één klik het commando naar de slave sturen.
Het belangrijkste voordeel van deze modus is dat het resultaat onmiddellijk in de apparaatmapping wordt weergegeven en de waarden in de lokale tabel bijwerkt. Op die manier is het mogelijk om een geordende en blijvende weergave van de status van het externe apparaat te hebben, nuttig zowel tijdens het testen als tijdens monitoring- en onderhoudsactiviteiten.
Wanneer het commando een schrijffunctie betreft, maakt SerialTool het eenvoudig om de te verzenden gegevens voor te bereiden door het gegevenstype, weergaveformaat en de inhoud te kiezen die in de geselecteerde registers moet worden geschreven. Daarom is deze modus bijzonder geschikt wanneer u rechtstreeks op de logische structuur van het Modbus-apparaat wilt werken.

Execute Function

De modus Execute Function maakt het mogelijk een Modbus-functie uit te voeren door deze direct te selecteren uit de lijst met beschikbare functiecodes, zoals het lezen van coils, discrete inputs, holding registers, input registers, enkelvoudige of meervoudige schrijfacties en andere functies die door het protocol worden ondersteund.
In dit geval is de bewerking niet beperkt tot alleen weergave in de apparaatmapping, omdat het resultaat in het loggedeelte van de toepassing wordt weergegeven. Deze aanpak is bijzonder nuttig wanneer u snel de inhoud van het ontvangen antwoord wilt controleren, een specifieke Modbus-functie wilt testen of gerichte tests wilt uitvoeren op variabele adressen en aantallen zonder noodzakelijkerwijs de apparaatmapping te wijzigen.
De modus Execute Function is ook zeer handig voor debugging, omdat u onmiddellijk het resultaat van het uitgevoerde commando kunt zien, eventuele fouten die door de slave worden teruggegeven en de informatie die bij aanvraag en antwoord hoort.

Send Raw Data

Deze functie verzendt en ontvangt willekeurige commando’s die in hexadecimaal formaat naar de slave worden gestuurd. Ze laat de gebruiker handmatig de bytevolgorde invoeren die over de actieve verbinding, zoals serieel of TCP/IP, moet worden verzonden, zonder automatische frame-opbouw door de software.
Deze functie is erg nuttig voor geavanceerde tests, reverse engineering, diagnose of validatie van Modbus-apparaten en compatibele protocollen. In de praktijk verzendt de client exact de bytes die door de gebruiker zijn ingevoerd, waardoor volledige controle over de pakketinhoud behouden blijft. Daardoor kunnen aangepaste verzoeken worden gesimuleerd, afwijkende antwoorden worden getest of handmatig voorbereide volledige frames worden verzonden.
Door de optie om op antwoord te wachten in te schakelen, kan SerialTool ook het retourframe van de slave ontvangen en in het verkeerslog weergeven, waardoor een directe vergelijking tussen verzonden en ontvangen gegevens mogelijk wordt.

Modbus Raw Data

Ruwe gegevens verzenden

Modbus Scanner-functie

SerialTool bevat een scanfunctie voor de Modbus-adressen van het aangesloten Slave-apparaat. Met deze functie kan snel een adresbereik van een beginadres tot een eindadres worden verkend, waarbij ook de functiecode die tijdens de scan moet worden gebruikt, wordt opgegeven.
De scanner is bijzonder nuttig wanneer de volledige mapping van het externe apparaat niet precies bekend is of wanneer u wilt nagaan welke adressen geldig zijn en welke betekenisvolle gegevens bevatten. Voor elk opgevraagd adres toont SerialTool in de tabel het gebruikte functietype, het adres, de gelezen waarde en het resultaat van de bewerking.
Deze modus versnelt diagnose- en integratiewerkzaamheden met apparaten van derden aanzienlijk, omdat u er snel mee kunt vaststellen welke delen van het Modbus-geheugen daadwerkelijk door de slave worden gebruikt en de scanresultaten kunt exporteren voor latere analyse of om te delen.

Modbus Slave Scanner

Adrestabel

Grafiek van de Modbus-registers van de Slave

De waarden van de Modbus-registers kunnen in een grafiek worden weergegeven. Met deze functie kunnen één of meer elementen uit de apparaatmapping worden gekoppeld aan een speciaal grafiekvenster, waarin de waarden in de tijd worden uitgezet tijdens polling of updatebewerkingen.
Elk register dat aan de grafiek is gekoppeld, kan met een eigen spoor worden weergegeven, geïdentificeerd door een specifieke kleur en informatie zoals Modbus-referentie, adres, huidige waarde en de naam die aan het element is toegewezen. Zo kunt u gemakkelijk de tijdstrend van analoge variabelen, setpoints, metingen of numerieke registers observeren die tijdens de werking van het apparaat veranderen.
De grafiekfunctie is bijzonder nuttig voor monitoring, testen en dynamische analyse, omdat ze het mogelijk maakt onmiddellijk te zien hoe de gegevens zich in de tijd ontwikkelen zonder beperkt te blijven tot alleen tabellaire uitlezing.

Modbus Client/Slave Chart

Modbus-registergrafiek

Modbus-verkeerslog

Alle verzonden en ontvangen commando’s worden in het Modbus-verkeerslogvenster in bytes weergegeven. Het verkeerslog is een fundamenteel hulpmiddel voor communicatiedebugging, omdat het een gedetailleerde visualisatie geeft van de door de client verzonden gegevens en de van het slave-apparaat ontvangen gegevens, waarbij de bytevolgorden in leesbare vorm worden getoond.
Dankzij dit venster is het mogelijk de werkelijke inhoud van de frames te controleren, na te gaan of de gegenereerde commando’s correct zijn en eventuele timeoutproblemen, afwijkende antwoorden, Modbus-exceptions of onverwachte gegevens te diagnosticeren. Het verkeer kan worden bekeken tijdens normaal gebruik van de client, tijdens automatisch polling of tijdens het verzenden van ruwe gegevens.
Het verkeersvenster biedt bovendien geavanceerde functies zoals het kopiëren van gegevens in ASCII- of hexadecimaal formaat, opslaan in een bestand, zoeken in de inhoud, regelselectie en grafische aanpassingsopties zoals kleuren, lettertypen, spatiëring en weergave-instellingen. Daardoor is het verkeerslog niet alleen een eenvoudige viewer, maar ook een zeer nuttig operationeel hulpmiddel voor ontwikkelaars, technici en integratoren.

Modbus Client/Slave Traffic

Modbus-verkeer