RS485 / Modbus RTU

De Eziwan Gateway beschikt over een ingebouwde RS485/RS232-poort op het aansluitblok. Via deze interface kunt u gegevens van uw sensoren, PLC’s en meters via het Modbus RTU-protocol verzamelen — en deze naar de cloud verzenden zonder dat daarvoor een aparte gateway nodig is.


Fysieke verbinding

Bedrading van het RS485-aansluitblok

Pinnen van het aansluitblok

PinSignaalBeschrijving
ARS485+Positieve differentiële lijn
BRS485−Negatieve differentiële lijn
GNDAardeGemeenschappelijke referentie
Controle polariteit A/B

Een omkering van A en B leidt tot communicatiefouten, maar veroorzaakt geen schade aan de apparatuur. Als er geen apparaat reageert, test dan door A en B om te wisselen.

Afsluitweerstanden

Op een RS485-bus met meerdere slaves:

  • 120 Ω op het eerste en het laatste apparaat van de bus
  • De Eziwan Gateway beschikt over een interne jumper om de afsluiting in te schakelen (hardwarehandleiding)
  • Bij de tussenliggende apparaten: afsluiting uitgeschakeld

Modbus-polling configureren

Via het Eziwan-dashboard

Instellingen → Configuratie → RS485 / Modbus

Grafische interface: voeg elke slave en elk register toe, en stel het polling-interval en het doel-MQTT-topic in.

Via de API / YAML

# Configuration RS485 + Modbus RTU
rs485:
enabled: true
baud_rate: 9600 # 1200, 2400, 4800, 9600, 19200, 38400, 115200
parity: none # none, even, odd
data_bits: 8 # 7 ou 8
stop_bits: 1 # 1 ou 2
polling_interval_sec: 10 # Algemeen polling-interval (seconden)

modbus:
slaves:
- slave_id: 1
name: "Compteur énergie Schneider PM2200"
timeout_ms: 1000
retries: 3
registers:
- address: "0x0048"
type: holding # holding, input, coil, discrete_input
format: float32_abcd
tag: active_power
unit: kW
scale: 1.0
mqtt_topic: "site/usine-01/energie/puissance_active"

- address: "0x004A"
type: holding
format: float32_abcd
tag: reactive_power
unit: kVAr
scale: 1.0
mqtt_topic: "site/usine-01/energie/puissance_reactive"

- address: "0x0156"
type: holding
format: float32_abcd
tag: energy_total_kwh
unit: kWh
scale: 1.0
mqtt_topic: "site/usine-01/energie/index_kwh"

- slave_id: 2
name: "Capteur température / humidité"
timeout_ms: 500
registers:
- address: "0x0001"
type: input
format: int16
tag: temperature
unit: "°C"
scale: 0.1 # Valeur brute 245 → 24,5°C
mqtt_topic: "site/usine-01/environnement/temperature"

- address: "0x0002"
type: input
format: uint16
tag: humidity
unit: "%RH"
scale: 0.1
mqtt_topic: "site/usine-01/environnement/humidite"

- slave_id: 3
name: "Automate Schneider TM3 — Station de pompage"
polling_interval_sec: 30 # Het algemene interval overschrijven
registers:
- address: "0x0000"
type: holding
format: uint16
tag: pump_status
unit: ""
# 0=uit, 1=aan, 2=storing
mqtt_topic: "site/pompe-01/etat/pompe"

- address: "0x0001"
type: holding
format: int16
tag: pressure_bar
unit: bar
scale: 0.01
mqtt_topic: "site/pompe-01/mesures/pression"

- address: "0x0002"
type: holding
format: uint16
tag: flow_m3h
unit: "m³/h"
scale: 0.1
mqtt_topic: "site/pompe-01/mesures/debit"

Ondersteunde registerformaten

FormaatBeschrijvingRegisters
int1616-bits getal met teken1
uint1616-bits geheel getal zonder teken1
int32_abcd32-bits geheel getal met teken, big-endian2
int32_cdab32-bits geheel getal met teken, little-endian2
uint32_abcd32-bits geheel getal zonder teken, big-endian2
float32_abcdIEEE 754-drijvende komma, big-endian2
float32_cdabIEEE 754-drijvende-kommagetal, little-endian (Schneider)2
float32_badcIEEE 754-drijvende-kommagetal, mid-big-endian2
coilModbus-spoel (1 bit)1 spoel
bitEén bit uit een uint16-register halen1
Endianness

Als de uitgelezen waarden onlogisch lijken (bijv.: 1234 wordt uitgelezen als 12340000), probeer dan float32_cdab in plaats van float32_abcd. De conventie verschilt per fabrikant.


MQTT-publicatie

De Modbus-gegevens worden automatisch gepubliceerd op de Eziwan MQTT-broker:

Opbouw van het onderwerp

eziwan/{device_id}/modbus/{slave_id}/{tag_name}

Voorbeeld:

eziwan/d_a1b2c3d4/modbus/1/active_power

JSON-payload

{
"value": 42.7,
"unit": "kW",
"timestamp": "2025-06-15T14:23:45.123Z",
"slave_id": 1,
"register": "0x0048",
"quality": "good"
}

Het veld "quality" kan de volgende waarden aannemen:

  • "good" — uitlezing geslaagd
  • "timeout" — slave heeft niet gereageerd
  • "error" — Modbus-fout (code opgenomen in "error_code")

Abonneren via uw systeem

# Abonnement op alle tags van een website
mosquitto_sub -h mqtt.eziwan.com -p 8883 \
--cert client.crt --key client.key --cafile ca.crt \
-t "eziwan/d_a1b2c3d4/modbus/#"

# Abonnement op een specifieke tag
mosquitto_sub -h mqtt.eziwan.com -p 8883 \
--cert client.crt --key client.key --cafile ca.crt \
-t "eziwan/d_a1b2c3d4/modbus/1/active_power"

Geteste apparatuur

FabrikantModelProtocolOpmerkingen
Schneider ElectricPM2100, PM2200Modbus RTUEnergiemeter — float32
Schneider ElectricTM3, TM2Modbus RTUPLC — spoelen + holdings
SiemensSENTRON PAC 3200Modbus RTUEnergiemeter
Carlo GavazziEM24, EM340Modbus RTUDriefasige/eenfasige meter
ABBB23, B24Modbus RTUEnergiemeter
Wago750-xxxModbus RTUI/O-buskoppeling
Phoenix ContactILB ETH 2TXModbus TCPVia TCP-bridge
HagerECR380DModbus RTUEnergiemeter
EastronSDM630Modbus RTUDriefasige meter
GenericAlle Modbus RTUModbus RTUSlave-ID 1–247

Probleemoplossing

Communicatietest vanuit Eziwan

Dashboard → Apparaat → Tools → Modbus-test

Voer de slave-ID, het type en het registeradres in → Eziwan verstuurt een leesverzoek en geeft het ruwe antwoord in realtime weer. Ideaal voor het stellen van een diagnose zonder fysieke toegang tot de locatie.

Modbus-foutcodes

CodeBetekenisOplossing
TIMEOUTSlave reageert nietControleer bedrading, baudrate, slave-ID, afsluiting
01Functie wordt niet ondersteundGebruik holding in plaats van input (of omgekeerd)
02Ongeldig registeradresControleer het register in de documentatie van het apparaat
03Ongeldige gegevenswaardeWaarde buiten het toegestane bereik
04Interne fout slaveRaadpleeg het logboek van het apparaat

Checklist voor de bekabeling

Als geen enkele slave reageert:

  • Controleer de polariteit A/B (probeer deze om te draaien)
  • Controleer de baudrate (9600 is de meest gangbare)
  • Controleer of de slave-ID’s op de bus uniek zijn
  • Schakel de 120 Ω-afsluiting in op het eerste en laatste apparaat
  • Test met slechts één slave (isoleren van het probleem)
  • Meet de spanningsverschil A−B: moet > 200 mV zijn in stand-by

Referentie-spanningsverschil

Bus in ruststand (geen overbrenging):
V(A−B) > +200 mV → polarisation correcte

Pendant transmission :
V(A−B) > +1.5V → signal dominant (1 logique)
V(A−B) < −1.5V → signal récessif (0 logique)

Modbus TCP

Heeft u apparatuur die via Modbus TCP (via een Ethernet-netwerk) werkt? Eziwan ondersteunt ook de Modbus TCP → MQTT-bridge. Zie de Modbus TCP-documentatie →

Ondersteuning

Veelgestelde vragen

Hoeveel apparaten kunnen op één RS-485-bus worden aangesloten?

32 slaves per segment zonder repeater, over een maximale lengte van ongeveer 1 200 m bij 9 600 baud. Bij grotere afstanden moet u het systeem in meerdere bussen opdelen of repeaters toevoegen.

Is de afsluitweerstand onmisbaar?

Bij lange of snelle bussen wel: 120 Ω aan beide uiteinden voorkomt reflecties die de frames verstoren. Bij een korte bus (enkele meters, 9 600 baud) valt het ontbreken ervan vaak niet op — tot de dag dat het signaal niet meer doorkomt.

Welke polling-snelheid moet je kiezen?

Pas de frequentie aan de dynamiek van het proces aan: elke 10 tot 60 s voor energie- of niveaumetingen, 1 tot 5 s voor machinebewaking. Een te agressieve polling op een trage bus leidt tot een reeks time-outs.

Hoe combineer je apparatuur met verschillende snelheden?

De seriële instellingen mogen niet verschillen op dezelfde bus: alle slaves moeten dezelfde baudrate, pariteit en stopbits hebben. Zo niet, verdeel ze dan over de verschillende RS-485-poorten van de gateway.

Gerelateerde bronnen