Modbus RTU, ASCII en TCP met SerialTool

Wat is Modbus

Modbus is een seriële communicatie­protocol dat in 1979 werd ontwikkeld door Modicon® (nu onderdeel van Schneider Electric) om zijn PLC’s (programmable logic controllers) te verbinden. Het is uitgegroeid tot een de facto standaard in industriële communicatie en is een van de meest gebruikte protocollen ter wereld voor verbinding tussen industriële elektronische apparaten. Modbus is een royaltyvrij protocol waarvan de specificaties te vinden zijn op de website van The Modbus Organization.

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


Oorspronkelijk ontworpen voor industrieel gebruik, is dit protocol in de loop der tijd in veel andere sectoren overgenomen en uitgegroeid tot een van de meest verspreide protocollen. Ook nu, meer dan 40 jaar later, wordt het nog steeds gebruikt in tal van apparaten zoals bedienings­panelen, PLC’s, domoticasystemen en zelfs in eenvoudige platforms zoals Arduino.

Modbus RTU en ASCII-transmissie via serieel

Communicatie via dit protocol was oorspronkelijk bedoeld om via een seriële poort te verlopen, daarom is het geïmplementeerd in SerialTool. Modbus wordt vaak gebruikt om een supervisie­computer te verbinden met een remote terminal unit (RTU) in SCADA-systemen (Supervisory Control and Data Acquisition). Afhankelijk van het formaat waarin de data worden verzonden, wordt het protocol onderverdeeld in:

  • MODBUS RTU – data worden in hexadecimaal formaat verzonden.
  • MODBUS ASCII – data worden in ASCII-formaat verzonden.

De foutcontrole verschilt in beide gevallen: bij MODBUS RTU wordt een Cyclic Redundancy Check (CRC) gebruikt en na de commando’s meegestuurd, terwijl bij MODBUS ASCII een Longitudinal Redundancy Check (LRC) na de commando’s wordt verzonden.

Modbus TCP-transmissie

In 1999 werd “Modbus TCP” ontwikkeld, een standaard voor netwerken die de TCP/IP-protocolstack gebruiken. Het is in wezen een versie van Modbus RTU over TCP/IP, waarmee communicatie via internet- of intranetnetwerken mogelijk wordt. De TCP/IP-versie wordt steeds vaker gebruikt omdat zij open source is, eenvoudig te implementeren, lage ontwikkelingskosten heeft en minimale hardware­ondersteuning vereist.

De foutcontrole verschilt in beide gevallen: bij MODBUS RTU wordt een Cyclic Redundancy Check (CRC) gebruikt en na de commando’s meegestuurd, terwijl bij MODBUS ASCII een Longitudinal Redundancy Check (LRC) na de commando’s wordt verzonden.

Het Modbus TCP/IP-protocol gebruikt binaire codering van data en de foutdetectie­mechanismen van TCP/IP. In tegenstelling tot seriële Modbus is de TCP/IP-versie connectie­georiënteerd en maakt deze gelijktijdige transacties mogelijk op dezelfde slave of op meerdere apparaten. Modbus TCP/IP gebruikt eveneens het master-slave (client-server) paradigma en maakt gebruik van vier typen berichten.

Modbus bevindt zich op laag 7 in de ISO/OSI-stack (Applicatielaag) en definieert de opmaak van berichten (framing) en de wijze waarop data en besturings­functies worden verzonden. Communicatie vindt plaats volgens het client-server­model. Het protocol definieert een Protocol Data Unit (PDU) die onafhankelijk is van de onderliggende communicatielaag. De Application Data Unit (ADU) voegt extra velden toe voor adressering en foutcontrole.

SerialTool Modbus Client

SerialTool ondersteunt RTU-, ASCII- en Modbus TCP-transmissiemodi om maximale professionele flexibiliteit als Modbus Client te bieden.
SerialTool biedt ook de mogelijkheid om Raw-commando’s te versturen, zodat elke ontwikkelaar zijn specifieke behoeften kan afdekken.

Scherm met log van verzonden commando’s

Scherm met verzonden low-level commando’s


Modbus-functies

Hieronder staan de functies die SerialTool implementeert voor het Modbus-protocol.

Functiecode Actie Tabelnaam
0x01 Read Discrete Output Coils
0x02 Read Discrete Input Contacts
0x03 Read Analog Output Holding Register
0x04 Read Analog Input Registers
0x05 Write Single Discrete Output Coil
0x06 Write Single Analog Output Holding Register
0x0F (dec 15) Write Multiple Discrete Output Coils
0x10 (dec 16) Write Multiple Analog Output Holding Registers

Modbus-gegevensstructuren

Informatie wordt in het Server-apparaat in vier verschillende tabellen opgeslagen. Twee tabellen bevatten discrete aan/uit-waarden (coils) en twee tabellen bevatten numerieke waarden (registers). Zowel voor coils als registers bestaat er een read-only en een read/write-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 word = 16 bits = 2 bytes en heeft eveneens een data-adres tussen 0000 en 270E.

Coil-/registernummers Data-adressen Type Tabelnaam
1-9999 0x0000 t/m 0x270E Read/Write Discrete Output Coils
10001-19999 0x0000 t/m 0x270E Read Only Discrete Input Contacts
30001-39999 0x0000 t/m 0x270E Read Only Analog Input Register
40001-49999 0x0000 t/m 0x270E Read/Write Analog Output Holding Register