In deze les

Wat deze les behandelt

  • Drie tests die laten zien op welke laag de verbinding sneuvelt
  • Poort 502, de richting, en waarom uitgaand meestal genoeg is
  • Hoeveel verbindingen een apparaat aankan, en het eigen VLAN

Lees eerst: Poort 502, de MBAP header en de unit id

Op Modbus TCP is je installatie pas klaar als het netwerk meewerkt, en daar komen de meeste storingen vandaan: een firewall die poort 502 stil laat vallen, een apparaat in het verkeerde subnet, of een omvormer die maar een verbinding tegelijk aankan. Na deze les sluit je die lagen een voor een uit voordat je aan de Modbus-instellingen begint, en weet je wat je netwerk moet toestaan.

Kan je client het apparaat uberhaupt bereiken?

Dat test je met drie commando's die elk precies een laag afstrepen, en pas het derde raakt Modbus. Neem een omvormer op 192.168.1.50:

ping 192.168.1.50
nc -vz 192.168.1.50 502
mbpoll -m tcp -a 1 -t 4 -r 1 -c 2 -1 192.168.1.50

Op Windows PowerShell vervang je de tweede regel door Test-NetConnection 192.168.1.50 -Port 502. Wat elke test je oplevert:

TestWat slagen bewijstWat falen betekent
pingIP-adres, subnetmasker, VLAN en kabel kloppenzoek in het netwerk, Modbus komt nog niet in beeld
nc -vzer luistert iets op poort 502firewall, afwijkende poort, of de Modbus-server staat uit
mbpollhet apparaat antwoordt echt op Modbusunit id, registeradres of function code

De regel eronder is simpel: elke geslaagde test haalt een hele laag van je verdachtenlijst af, en dat kost je twee commando's in plaats van een middag. Hoe je die lagen bij een gateway inregelt staat in de handleiding voor het installeren van een Modbus TCP gateway; het transport zelf staat als naslag in de uitleg over Modbus TCP. Wat er in het frame gebeurt, behandelt de les over de MBAP header en de unit id.

Welke poort, en in welke richting

Poort 502 is de bij IANA geregistreerde Modbus TCP-poort, en de standaard verplicht een apparaat daar standaard op te luisteren. Sterker nog: ook als er een tweede poort geconfigureerd is, moet 502 daarnaast beschikbaar blijven. Fabrikanten houden zich daar niet altijd aan, en dat is precies waarom een poorttest sneller antwoord geeft dan de datasheet.

MerkModbus TCPModbus RTULet opSMA502afhankelijk van hetmodelHet SunSpec-profiel vereist unit id 126SolarEdge (SetApp)1502ja, SunSpecNiet 502, en Modbus TCP staat standaarduitSolarEdge (LCD)502ja, SunSpecZelfde omvormerfamilie, anderedefaultpoortFronius Symo GEN24instelbaarjaKies eerst tussen het int- en hetfloat-registerprofielNIBE S-serie502F-serie via MODBUS 40Accepteert alleen bron-IP's uit 10/8,172.16/12 en 192.168/16
Poort 502 is de standaard, niet de garantie. Een gateway die vast op 502 staat vindt een SolarEdge met SetApp nooit.

De richting is de tweede helft van het verhaal. De client kiest zelf een bronpoort boven 1024 en verbindt naar poort 502 op het apparaat. Zet een gateway de verbinding naar een cloudplatform op, dan is die gateway de initiatiefnemer en is een uitgaande regel genoeg, want een stateful firewall laat het antwoord op een bestaande sessie automatisch door. Wil een laptop uit een ander VLAN bij het apparaat, dan is dat een nieuwe inkomende sessie en moet die expliciet toegestaan worden.

Vast IP-adres of DHCP?

Een Modbus-client kent geen namen: je typt een IP-adres in en dat adres moet er morgen nog zijn. Een DHCP-lease die verloopt is daarmee een storingsmelding met vertraging. Een DHCP-reservering is de praktische middenweg: het apparaat blijft in het beheer van je DHCP-server, maar krijgt altijd hetzelfde adres. Een vast adres buiten de DHCP-pool werkt ook, mits je het documenteert.

Het subnet is geen vrije keuze. Een NIBE S-serie accepteert alleen verbindingen uit 10.0.0.0/8, 172.16.0.0/12 en 192.168.0.0/16, en weigert dus alles wat daarbuiten valt, ook via een VPN met carrier-grade NAT. Die eis staat in de handleiding, niet in het protocol.

Hoeveel verbindingen kan het apparaat aan?

Minder dan je denkt, en het staat in de datasheet. De standaard laat het aantal expliciet vrij, dus elke fabrikant zet zijn eigen grens in de firmware:

ApparaatMax. gelijktijdige Modbus TCP-verbindingen
SolarEdge omvormer1
Schneider ION 8600 en ION 88004
Schneider ION 8650 en ION90008
Schneider ION 7550, ION 7650 en PM800032

Wat de standaard wel voorschrijft, is het gedrag bij een volle pool: de oudste ongebruikte verbinding wordt gesloten. Hoe dat bij een enkele-verbindingsomvormer uitpakt, staat uitgewerkt in het artikel over het uitlezen van een SolarEdge. Je gebouwbeheersysteem, je energiemonitoring, je domoticaserver en je laptop met een testtool zijn samen al vier clients. Vuistregel: vaak 4 tot 8, soms 32, soms maar 1, dus kijk het op.

Wat er gebeurt als je te vaak of te snel vraagt

Dan krijg je exception 06 terug, of helemaal geen verbinding meer. Exception 06 (Server Busy) stuurt een server als zijn transactiepool vol zit; die pool telt volgens de standaard 1 tot 16 gelijktijdig openstaande verzoeken, afhankelijk van het apparaat.

Daarnaast leggen fabrikanten hun eigen tempo op. SMA schrijft minstens 10 seconden tussen twee datatransfers voor en maximaal 5 parameters tegelijk per omvormer. De NIBE S-serie staat 100 registers per seconde toe en 20 registers per query. Wil je 60 registers uit zo'n warmtepomp lezen, dan is elke 2 seconden pollen 30 registers per seconde: ruim binnen de limiet, met ruimte voor een retry.

Die 60 registers zijn door de querylimiet trouwens drie verzoeken en geen enkele. Boven een fabrikantlimiet pollen geeft geen nette foutmelding maar wisselvallige antwoorden, en dat lijkt sprekend op een netwerkprobleem. Reken je pollinterval uit voordat je in de switch gaat kijken. De les over pollen en busbelasting rekent dat helemaal voor.

Waarom veldapparatuur in een eigen VLAN hoort

Omdat kaal Modbus TCP geen authenticatie en geen encryptie kent: wie bij het netwerksegment kan, kan lezen en schrijven. De beveiliging zit dus in de zone-indeling eromheen, niet in het protocol.

IT en cloudPlatform of dashboardTLSGateway-zoneGateway of pollende clientSegmentatieVeld OT (RS485 en Modbus TCP)Omvormers, meters,warmtepompenOmvormers, meters,warmtepompenOmvormers, meters,warmtepompen
Modbus kent geen authenticatie. Een eigen VLAN maakt van 'iedereen op het netwerk' een korte, controleerbare lijst.

Een tweede reden is praktisch: veldapparatuur draait op een kleine netwerkstack en heeft geen boodschap aan broadcast- en discoveryverkeer van kantoorapparatuur. Een apart VLAN houdt dat weg. NIBE is er in de eigen documentatie duidelijk over dat Modbus TCP over het open internet sterk wordt afgeraden. Hoe je zo'n zone verder dichtzet, met poort 802 en TLS, staat in de les over Modbus beveiligen.

De verbinding openhouden of steeds opnieuw opbouwen?

Openhouden. De standaard is expliciet: de verbinding blijft open zolang je communiceert, en de client sluit hem, niet de server. Een nieuwe TCP-verbinding per poll kost tijd en vult de socketteller van het apparaat.

Client (gateway ofplatform)Server (apparaatop poort 502)TCP 502TCP connect naar192.168.1.50:502Transactie 100 01Transactie 200 02Transactie 300 03Stille periode, geenverzoekenClient sluit de verbindingnetjesIdle timeout: de serversluit zelfGelijktijdigeverbindingen123456781 tot 32, zie de datasheetvan het apparaat
Een Modbus TCP-verbinding is een sessie, geen losse berichten. Wie hem openhoudt en nooit sluit, vult de socketteller van het apparaat en sluit de volgende client buiten.

Twee dingen zitten dat in de weg. Idle timeouts: de TCP-server van een SolarEdge sluit de sessie na twee minuten zonder verzoek, dus wie elke vijf minuten pollt bouwt elke keer opnieuw op. En half-open verbindingen: herstart je client, dan probeert die vaak dezelfde bronpoort, en dan loopt de nieuwe verbinding tot 75 seconden aan te kijken tegen de connection-establishment timeout van de TCP-stack. Een andere bronpoort na een herstart lost dat op.

Veelgemaakte fouten

Bij de Modbus-instellingen beginnen terwijl de ping al faalt. Je verandert unit id's en registeradressen terwijl het apparaat niet eens op IP-niveau bereikbaar is. Begin bij de ping en de poorttest, dan weet je binnen twee commando's of het aan het netwerk ligt.

Vergeten dat de Modbus-server op het apparaat aan moet. Bij veel omvormers en meters staat Modbus TCP standaard uit, ook bij SolarEdge. Je krijgt dan connection refused op een adres dat prima pingt. Zet hem aan in het menu, in de app of met een DIP-schakelaar, en controleer meteen op welke poort hij daarna luistert.

Meerdere systemen tegelijk op hetzelfde apparaat laten pollen. Bij een apparaat dat maar een verbinding aankan, verdringen een monitoringplatform en een laptop elkaar om de beurt. Het symptoom is een verbinding die willekeurig wegvalt, zonder foutmelding. Inventariseer wie er allemaal pollt, ook de integrator van vorig jaar.

Sneller pollen dan de fabrikant toestaat. SMA vraagt minstens 10 seconden tussen datatransfers, de NIBE S-serie maximaal 100 registers per seconde. Wie daaroverheen gaat krijgt wisselvallige antwoorden en gaat vervolgens in het netwerk zoeken.

Aan de slag

Je sluit laag voor laag uit en noteert daarna wat je gevonden hebt. Vervang 192.168.1.50 door het adres van je eigen apparaat.

  1. 1

    Ping het apparaat

    Draai ping 192.168.1.50. Geen antwoord betekent IP-adres, subnetmasker, VLAN of kabel. Modbus komt nog niet in beeld.

  2. 2

    Test de poort

    Draai nc -vz 192.168.1.50 502 op Linux of macOS, of Test-NetConnection 192.168.1.50 -Port 502 in PowerShell. Werkt dat niet terwijl de ping wel lukt, probeer dan ook 1502.

  3. 3

    Zet de Modbus-server aan

    Lukt de poorttest nog steeds niet, kijk dan in het apparaat zelf. Bij veel omvormers en meters is Modbus TCP een instelling of een schakelaar die je eerst moet omzetten.

  4. 4

    Lees pas nu een register

    Draai mbpoll -m tcp -a 1 -t 4 -r 1 -c 2 -1 192.168.1.50. Mbpoll is gratis te gebruiken, ook zakelijk. Krijg je hier een fout, dan zit het in unit id, adres of function code, niet in het netwerk.

  5. 5

    Open een tweede sessie

    Start hetzelfde commando nog een keer in een tweede terminal, terwijl de eerste loopt. Zo meet je zelf of het apparaat twee clients accepteert of er een uit gooit.

  6. 6

    Noteer wat je gevonden hebt

    Zet IP-adres, poort, unit id, het pollinterval en het aantal toegestane verbindingen in je projectdossier. De volgende monteur hoeft dan niet opnieuw te testen.

Zonder hardware. Draai de pymodbus-simulator (gratis te gebruiken, ook zakelijk) op 127.0.0.1:5020 en doe stap 1, 2, 4 en 5 daartegen, met 5020 in plaats van 502. De simulator accepteert meerdere verbindingen, dus stap 5 laat vooral zien hoe je de test doet. Echte apparaten hebben juist wel een limiet.

Je bent klaar als je drie geslaagde tests op drie lagen hebt en een genoteerd maximum aan verbindingen.

Samenvatting

  • Test in de volgorde ping, poort, Modbus: elke geslaagde test streept een hele laag weg en dat scheelt uren zoeken.
  • Poort 502 is de geregistreerde Modbus TCP-poort en moet volgens de standaard altijd beschikbaar blijven, maar een SolarEdge met SetApp luistert standaard op 1502.
  • Een uitgaande firewallregel volstaat als de gateway zelf de verbinding opzet; een client die van buiten binnenkomt heeft een expliciete inkomende regel nodig.
  • Het aantal gelijktijdige verbindingen verschilt per apparaat, van 1 bij SolarEdge tot 32 bij een Schneider PM8000, en bij een volle pool sluit de server de oudste ongebruikte verbinding zonder melding.
  • Houd de TCP-verbinding open en laat de client hem sluiten, maar reken op idle timeouts zoals de twee minuten van SolarEdge.

Controleer jezelf

Vier vragen over deze les. Je krijgt bij elk antwoord uitleg.

Vraag 1 van 4
De ping naar je omvormer werkt, maar `nc -vz 192.168.1.50 502` geeft geen verbinding. Waar zoek je?
Een SolarEdge-omvormer staat al verbonden met je monitoringplatform. Je opent er een tweede Modbus TCP-sessie mee vanaf je laptop. Wat verwacht je?
Waarom is een uitgaande firewallregel meestal genoeg voor cloudmonitoring, terwijl een client in een ander VLAN wel een inkomende regel nodig heeft?
De NIBE S-serie staat maximaal 100 registers per seconde toe. Je wilt 60 registers uitlezen. Welk pollinterval is verdedigbaar?

Loopt het vast op een project?

Beschrijf wat je ziet en waar het misgaat. We kijken mee en zeggen wat we zouden doen.

Verder lezen in de kennisbank