Modbus RTU, ASCII en TCP met SerialTool
Laatst bijgewerkt op door Oliver ReedWat 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:
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:
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.
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
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.
Modbus-registers toevoegen aan de Modbus-apparaatmapping
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:
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:
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.
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:
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.
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.
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-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-verkeer