Modbus RTU, ASCII en TCP met SerialTool
Wat is Modbus
Modbus is een seriële communicatieprotocol 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 bedieningspanelen, 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 supervisiecomputer 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 hardwareondersteuning 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 foutdetectiemechanismen van TCP/IP. In tegenstelling tot seriële Modbus is de TCP/IP-versie connectiegeorië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 besturingsfuncties worden verzonden. Communicatie vindt plaats volgens het client-servermodel. 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 |