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-aansluitingRS-485-signaalAanbevolen kabelkleur
A (of D+)Differentiële plusWit of rood
B (of D-)Differentiële minBlauw of zwart
GNDReferentie-aardeGroen of grijs

RS-485-communicatie-instellingen

De instellingen moeten op de gateway en op alle slaves hetzelfde zijn:

ParameterGangbare waardenStandaardwaarde Eziwan
Snelheid (baudrate)1200, 2400, 4800, 9600, 19200, 38400, 57600, 1152009600
PariteitN (geen), E (even), O (oneven)N
Databits7, 88
Stopbits1, 21
Pauze tussen berichten3,5 tekentijden (Modbus-standaard)Auto

Meest gangbare standaardconfiguratie: 9600 8N1 (9600 baud, 8 databits, geen pariteit, 1 stopbit)

Maximale afstand en aantal slaves

BaudrateMaximale afstandMax. aantal slaves (elektrisch)
9.600 bps1.200 m32 (unit loads)
19 200 bps800 m32
57 600 bps200 m32
115 200 bps50 m32

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.

ParameterWaarde
TCP-poort502 (standaard), soms 503 of een andere waarde, afhankelijk van de fabrikant
Unit-IDAdres van de slave (1 tot 247), of 255 voor directe toegang
Aanbevolen time-out500 ms tot 2000 ms, afhankelijk van het netwerk
TCP Keep-aliveAanbevolen voor langdurige verbindingen

Netwerkconfiguratie

De Eziwan-gateway moet via het ethernetnetwerk verbinding kunnen maken met de Modbus TCP-controller. Controleer het volgende:

  1. De gateway en de PLC bevinden zich in hetzelfde subnet (of er staat een router tussen)
  2. Er is geen firewall die TCP-poort 502 tussen de gateway en de PLC blokkeert
  3. 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:

TypeModbus-codeAdressenMastertoegangGrootteBeschrijving
Coils0x (1x)00001–09999Lezen/Schrijven1 bitDigitale uitgangen (relais, spoelen)
Discrete Inputs1x (2x)10001–19999Alleen lezen1 bitDigitale ingangen (digitale sensoren)
Input Registers3x30001–39999Alleen lezen16 bitsMeetwaarden (analoge sensoren)
Houdregisters4x40001–49999Lezen/schrijven16 bitsParameters 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

FunctiecodeNaamDoelregisters
FC01Read CoilsCoils (0x)
FC02Discrete ingangen lezenDiscrete ingangen (1x)
FC03Tussenregisters lezenTussenregisters (4x)
FC04Ingangsregisters lezenIngangsregisters (3x)
FC05Enkele spoel schrijvenSpoel (0x)
FC06Schrijf enkele registerTussenregisters (4x)
FC15Schrijf meerdere spoelenSpoelen (0x)
FC16Schrijf meerdere registersTussenregisters (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-typeBeschrijvingGrootte (registers)Voorbeeldwaarde
uint1616-bits geheel getal zonder teken10 tot 65535
int1616-bits geheel getal met teken1-32768 tot 32767
uint32_ab32-bits geheel getal, big-endian20 tot 4 294 967 295
uint32_ba32-bits geheel getal, little-endian2
float32_abcdIEEE 754-drijvende komma, ABCD223,456
float32_cdabIEEE 754-drijvende komma, CDAB (Schneider)2
float32_badcIEEE 754-drijvende komma, BADC2
float64_abcdefghDubbele precisie4
boolBooleaans (Coil of Discrete Input)1true/false

Foutopsporing in Modbus

Modbus Poll-tool (Windows)

Modbus Poll is de standaardtool voor het testen en opsporen van fouten in Modbus-verbindingen:

  1. Downloaden via modbustools.com
  2. Gratis proefversie (30 dagen)
  3. Configuratie: Connection → Connect → Modbus TCP (IP + poort 502) of Serial (COM + baudrate)
  4. 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:

OorzaakDiagnoseOplossing
Verkeerde slave-IDControleer de slave-ID’s 1 tot en met 10 handmatigRaadpleeg de documentatie van de apparatuur
Onjuiste baudrateTest achtereenvolgens 9600, 19200 en 57600
A/B-bedrading omgekeerdMeet spanning A-B: +1,5 V tot 5 V = correctDraai de draden A en B om
Afsluitweerstand ontbreektMeet R tussen A en B bij uitgeschakelde spanning: ~60 Ω bij 2 weerstandenVoeg een weerstand van 120 Ω toe aan het einde van de bus
Kabel te langBereken totale lengteVerlaag de baudrate of voeg een repeater toe
RS-485-voeding ontbreektMeet de voedingsspanning van de slaveControleer 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:

  1. Koppel alle slaves van de bus los, behalve één
  2. Scan de bus met Modbus Poll om de ID van deze slave te vinden
  3. Wijzig de ID bij een conflict (via de configuratie-interface van het apparaat)
  4. 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