Volledige Modbus-handleiding
Inleiding
Modbus is het meest gebruikte industriële communicatieprotocol ter wereld. Het werd in 1979 ontwikkeld en wordt gebruikt in miljoenen PLC’s, frequentieregelaars, regelaars, meters en industriële sensoren. Eziwan ondersteunt standaard Modbus RTU (via RS-485) en Modbus TCP (via Ethernet).
Modbus RTU via RS-485
RS-485-bekabeling: complete handleiding
RS-485 is een differentiële interface met twee draden (A en B). Het spanningsverschil tussen A en B codeert het signaal, waardoor het uitstekend bestand is tegen elektromagnetische storingen in industriële omgevingen.
⚠️ Lijnconfiguratie (A↔A, B↔B, gemeenschappelijke GND). Afsluitweerstanden van 120 Ω alleen aan beide uiteinden van de bus — al geïntegreerd aan de Eziwan-zijde, te plaatsen op de laatste slave. Nooit een weerstand in het midden van de lijn.
Aansluitingsoverzicht Eziwan RS-485-aansluitklemmen:
| Eziwan-aansluiting | RS-485-signaal | Aanbevolen kabelkleur |
|---|---|---|
| A (of D+) | Differentiële plus | Wit of rood |
| B (of D-) | Differentiële min | Blauw of zwart |
| GND | Referentie-aarde | Groen of grijs |
RS-485-communicatie-instellingen
De instellingen moeten op de gateway en op alle slaves hetzelfde zijn:
| Parameter | Gangbare waarden | Standaardwaarde Eziwan |
|---|---|---|
| Snelheid (baudrate) | 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 | 9600 |
| Pariteit | N (geen), E (even), O (oneven) | N |
| Databits | 7, 8 | 8 |
| Stopbits | 1, 2 | 1 |
| Pauze tussen berichten | 3,5 tekentijden (Modbus-standaard) | Auto |
Meest gangbare standaardconfiguratie: 9600 8N1 (9600 baud, 8 databits, geen pariteit, 1 stopbit)
Maximale afstand en aantal slaves
| Baudrate | Maximale afstand | Max. aantal slaves (elektrisch) |
|---|---|---|
| 9.600 bps | 1.200 m | 32 (unit loads) |
| 19 200 bps | 800 m | 32 |
| 57 600 bps | 200 m | 32 |
| 115 200 bps | 50 m | 32 |
Gebruik een RS-485-repeater als het aantal slaves groter is dan 32 of de afstand meer dan 1 200 m bedraagt.
Modbus TCP
Ethernet-verbinding
Modbus TCP verpakt het Modbus-protocol in TCP/IP-frames. De verbinding verloopt rechtstreeks via een RJ45-ethernetverbinding.
| Parameter | Waarde |
|---|---|
| TCP-poort | 502 (standaard), soms 503 of een andere waarde, afhankelijk van de fabrikant |
| Unit-ID | Adres van de slave (1 tot 247), of 255 voor directe toegang |
| Aanbevolen time-out | 500 ms tot 2000 ms, afhankelijk van het netwerk |
| TCP Keep-alive | Aanbevolen voor langdurige verbindingen |
Netwerkconfiguratie
De Eziwan-gateway moet via het ethernetnetwerk verbinding kunnen maken met de Modbus TCP-controller. Controleer het volgende:
- De gateway en de PLC bevinden zich in hetzelfde subnet (of er staat een router tussen)
- Er is geen firewall die TCP-poort 502 tussen de gateway en de PLC blokkeert
- De Modbus TCP-PLC is geconfigureerd om verbindingen te accepteren (PUT/GET ingeschakeld op Siemens)
De vier soorten Modbus-registers
De Modbus-specificatie definieert vier afzonderlijke gegevensruimten:
| Type | Modbus-code | Adressen | Mastertoegang | Grootte | Beschrijving |
|---|---|---|---|---|---|
| Coils | 0x (1x) | 00001–09999 | Lezen/Schrijven | 1 bit | Digitale uitgangen (relais, spoelen) |
| Discrete Inputs | 1x (2x) | 10001–19999 | Alleen lezen | 1 bit | Digitale ingangen (digitale sensoren) |
| Input Registers | 3x | 30001–39999 | Alleen lezen | 16 bits | Meetwaarden (analoge sensoren) |
| Houdregisters | 4x | 40001–49999 | Lezen/schrijven | 16 bits | Parameters en instelwaarden |
Belangrijke opmerking: Modbus-adressen beginnen bij 1 in de „functionele” notatie (40001 tot 49999), maar Modbus-functies gebruiken 0-gebaseerde adressen (het FC03-verzoek voor register 40001 gebruikt het adres 0x0000). Eziwan ondersteunt beide notaties.
Standaard Modbus-functies
| Functiecode | Naam | Doelregisters |
|---|---|---|
| FC01 | Read Coils | Coils (0x) |
| FC02 | Discrete ingangen lezen | Discrete ingangen (1x) |
| FC03 | Tussenregisters lezen | Tussenregisters (4x) |
| FC04 | Ingangsregisters lezen | Ingangsregisters (3x) |
| FC05 | Enkele spoel schrijven | Spoel (0x) |
| FC06 | Schrijf enkele register | Tussenregisters (4x) |
| FC15 | Schrijf meerdere spoelen | Spoelen (0x) |
| FC16 | Schrijf meerdere registers | Tussenregisters (4x) |
De mapping configureren in Eziwan
JSON-configuratie-interface
De Modbus-mapping bepaalt hoe de registers van de PLC worden verzameld en gepubliceerd:
{
"device": {
"name": "Compresseur_Atlas_GA75",
"description": "Compresseur d'air atelier principal",
"protocol": "modbus_rtu",
"connection": {
"port": "/dev/ttyS0",
"baudrate": 9600,
"parity": "N",
"databits": 8,
"stopbits": 1,
"slave_id": 1
}
},
"polling": {
"interval_ms": 5000,
"timeout_ms": 500,
"retry_count": 3,
"retry_delay_ms": 200
},
"registers": [
{
"name": "Pression_Service",
"address": "3x0001",
"count": 1,
"type": "uint16",
"scale_factor": 0.1,
"unit": "bar",
"description": "Pression de service sortie compresseur",
"alarm_low": 6.0,
"alarm_high": 12.0,
"publish_on_change": true
},
{
"name": "Temperature_Huile",
"address": "3x0002",
"count": 1,
"type": "uint16",
"scale_factor": 0.1,
"unit": "°C",
"alarm_high": 95.0
},
{
"name": "Heures_Fonctionnement",
"address": "4x0010",
"count": 2,
"type": "uint32_ab",
"unit": "h",
"description": "Compteur d'heures moteur"
},
{
"name": "Debit_Air",
"address": "3x0005",
"count": 2,
"type": "float32_abcd",
"unit": "m³/h"
},
{
"name": "Alarme_Active",
"address": "1x0001",
"count": 1,
"type": "bool",
"description": "Au moins une alarme active"
},
{
"name": "Code_Alarme",
"address": "4x0020",
"count": 1,
"type": "uint16",
"description": "Code alarme (voir tableau constructeur)"
}
]
}
Volledig voorbeeld: 10 temperatuurregisters, 5 statusregisters
Hier volgt een typisch schema voor een productielijn met 10 temperatuurpunten en 5 machinestatussen:
{
"registers": [
{ "name": "Temp_Zone1", "address": "4x0001", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone2", "address": "4x0003", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone3", "address": "4x0005", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone4", "address": "4x0007", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone5", "address": "4x0009", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone6", "address": "4x0011", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone7", "address": "4x0013", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone8", "address": "4x0015", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone9", "address": "4x0017", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone10", "address": "4x0019", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Etat_EnMarche", "address": "1x0001", "count": 1, "type": "bool" },
{ "name": "Etat_EnChauffe", "address": "1x0002", "count": 1, "type": "bool" },
{ "name": "Etat_Production", "address": "1x0003", "count": 1, "type": "bool" },
{ "name": "Etat_Defaut", "address": "1x0004", "count": 1, "type": "bool" },
{ "name": "Etat_ArretUrgence", "address": "1x0005", "count": 1, "type": "bool" }
]
}
Door Eziwan ondersteunde gegevenstypen
| JSON-type | Beschrijving | Grootte (registers) | Voorbeeldwaarde |
|---|---|---|---|
uint16 | 16-bits geheel getal zonder teken | 1 | 0 tot 65535 |
int16 | 16-bits geheel getal met teken | 1 | -32768 tot 32767 |
uint32_ab | 32-bits geheel getal, big-endian | 2 | 0 tot 4 294 967 295 |
uint32_ba | 32-bits geheel getal, little-endian | 2 | — |
float32_abcd | IEEE 754-drijvende komma, ABCD | 2 | 23,456 |
float32_cdab | IEEE 754-drijvende komma, CDAB (Schneider) | 2 | — |
float32_badc | IEEE 754-drijvende komma, BADC | 2 | — |
float64_abcdefgh | Dubbele precisie | 4 | — |
bool | Booleaans (Coil of Discrete Input) | 1 | true/false |
Foutopsporing in Modbus
Modbus Poll-tool (Windows)
Modbus Poll is de standaardtool voor het testen en opsporen van fouten in Modbus-verbindingen:
- Downloaden via modbustools.com
- Gratis proefversie (30 dagen)
- Configuratie: Connection → Connect → Modbus TCP (IP + poort 502) of Serial (COM + baudrate)
- De te lezen registers instellen: Setup → Read/Write Definition
Modbus Poll - Configuratie voor uitlezen
─────────────────────────────────────
Slave ID: 1
Function: 03 Read Holding Registers
Address: 0 (= registre 40001)
Quantity: 10
Scan Rate: 1000 ms
Eziwan-logbestanden voor het opsporen van fouten in Modbus
In het Eziwan-portaal → Gateway → Logs → Modbus:
2026-06-04 14:32:00.123 [[INFO] Modbus RTU: verzoek FC03 slave=1 addr=0 count=10
2026-06-04 14:32:00.145 [[INFO] Modbus RTU: antwoord ontvangen in 22 ms, 10 registers
2026-06-04 14:32:00.145 [DATA] Reg[0001]=0x4529 (23.4°C FLOAT32), Reg[0003]=0x42C6 (99.2 rpm)
2026-06-04 14:32:01.123 [[WARN] Modbus RTU: time-out na 500 ms, slave=2 (poging 1/3)
2026-06-04 14:32:01.623 [[WARN] Modbus RTU: time-out na 500 ms, slave=2 (poging 2/3)
2026-06-04 14:32:02.123 [[ERROR] Modbus RTU: slave 2 niet bereikbaar na 3 pogingen
Schakel het DEBUG-logniveau in om de ruwe hexadecimale frames te verkrijgen:
2026-06-04 14:32:00.100 [DEBUG] TX: 01 03 00 00 00 0A C5 CD
│ │ ├──────┤ ├──────┤ └── CRC16
│ │ addr=0 count=10
│ FC03
slave=1
2026-06-04 14:32:00.122 [DEBUG] RX: 01 03 14 45 29 ... (20 octets + 2 CRC)
Problemen oplossen
Probleem 1: Time-out Modbus RTU
Symptomen: timeout-meldingen, geen reactie van de slave.
Oorzaken en oplossingen:
| Oorzaak | Diagnose | Oplossing |
|---|---|---|
| Verkeerde slave-ID | Controleer de slave-ID’s 1 tot en met 10 handmatig | Raadpleeg de documentatie van de apparatuur |
| Onjuiste baudrate | — | Test achtereenvolgens 9600, 19200 en 57600 |
| A/B-bedrading omgekeerd | Meet spanning A-B: +1,5 V tot 5 V = correct | Draai de draden A en B om |
| Afsluitweerstand ontbreekt | Meet R tussen A en B bij uitgeschakelde spanning: ~60 Ω bij 2 weerstanden | Voeg een weerstand van 120 Ω toe aan het einde van de bus |
| Kabel te lang | Bereken totale lengte | Verlaag de baudrate of voeg een repeater toe |
| RS-485-voeding ontbreekt | Meet de voedingsspanning van de slave | Controleer 24 VDC slave |
Probleem 2: CRC-fouten
Symptomen: CRC error in de Eziwan-logbestanden, onjuiste gegevens.
Oorzaken:
- Elektromagnetische storingen op de RS-485-kabel (leg de kabel uit de buurt van stroomkabels)
- Niet-afgeschermde kabel (gebruik een afgeschermde kabel, waarbij de afscherming alleen aan de gateway-zijde op aarde is aangesloten)
- Slechte kabelkwaliteit (gebruik een kabel die geschikt is voor RS-485, impedantie 120 Ω)
- Te hoge overdrachtssnelheid voor de kabellengte (verlaag de baudrate)
Probleem 3: Conflict met slave-ID
Symptomen: een slave reageert in plaats van een andere, gegevens raken door elkaar.
Oorzaak: twee slaves hebben hetzelfde slave-ID op dezelfde RS-485-bus.
Oplossing:
- Koppel alle slaves van de bus los, behalve één
- Scan de bus met Modbus Poll om de ID van deze slave te vinden
- Wijzig de ID bij een conflict (via de configuratie-interface van het apparaat)
- Sluit de slaves één voor één weer aan
Probleem 4: Onleesbaar register (uitzonderingscode 02)
Symptoom: Illegal Data Address (Exception Code 02).
Oorzaak: het opgevraagde adres bestaat niet in de PLC of is niet toegankelijk via Modbus.
Oplossingen:
- Raadpleeg de documentatie van de fabrikant voor de ondersteunde adressen
- Sommige apparaten stellen slechts een beperkt bereik van registers beschikbaar
- Controleer bij Siemens of het geheugengebied zich daadwerkelijk in het datablok bevindt dat via PUT/GET beschikbaar wordt gesteld
Checklist voor snelle diagnose
□ 24 VDC-voedingsspanning aanwezig op de voedingsklemmen van Eziwan
□ De RS-485-LED van Eziwan knippert tijdens het verzenden (TX)
□ A/B-bedrading: A = positief, B = negatief (niet omgekeerd)
□ Alleen weerstanden van 120 Ω aan beide uiteinden van de bus
□ Juiste slave-ID (controleer dit op het scherm van het apparaat of in de documentatie)
□ Dezelfde baudrate op de gateway en het apparaat
□ De pariteit moet op de gateway en het apparaat identiek zijn (N, E of O)
□ Juiste IP-adres en poort 502 voor Modbus TCP
□ PUT/GET ingeschakeld op S7-1500/1200 indien nodig
□ Er is geen firewall die poort 502 op het lokale OT-netwerk blokkeert
Veelgestelde vragen
Modbus RTU of Modbus TCP: welke moet je kiezen?
RTU als uw apparatuur op een seriële RS-485-bus is aangesloten (sensoren, meters, oudere PLC’s); TCP als de apparatuur al via Ethernet is aangesloten. De Eziwan-gateway ondersteunt beide protocollen tegelijk en fungeert als brug tussen RTU en TCP.
Welke Modbus-functies worden gebruikt voor de bewaking?
Voornamelijk FC03 (uitlezen van holdingregisters) en FC04 (invoerregisters) voor het verzamelen van gegevens; FC06/FC16 voor het instellen van instelwaarden. De uitzonderingscodes (02 ongeldig adres, 0B doel niet bereikbaar) bieden houvast bij het oplossen van storingen.
Hoe lees je een 32-bits waarde of een drijvende-kommagetal?
Op twee opeenvolgende registers, waarbij de woordvolgorde (big/little endian, word swap) in de mapping van de gateway moet worden gespecificeerd. Eén en hetzelfde apparaat kan verschillende conventies hanteren: raadpleeg de documentatie van de fabrikant register voor register.
Kan Modbus via het internet worden verzonden?
Nooit onversleuteld: het protocol kent geen authenticatie of versleuteling. De gateway beperkt het Modbus-verkeer tot het lokale netwerk en stuurt de gegevens via een versleutelde VPN-tunnel naar de cloud.
Gerelateerde bronnen
- Modbus naar de cloud — de oplossing voor gegevensverzameling
- Modbus RTU naar de cloud — het geval van seriële bussen
- Modbus TCP naar de cloud — het geval van Ethernet-netwerken
- Modbus RTU versus TCP — de gedetailleerde vergelijking
- RS485 / Modbus RTU — bekabeling en polling in detail