Pre

In de wereld van industriële communicatie is MBAP een cruciale bouwsteen voor Modbus/TCP. Deze header zorgt ervoor dat requests en responses correct gekoppeld worden aan elkaar en dat de data op de juiste plek aankomt. In dit artikel duiken we diep in wat MBAP precies is, hoe de structuur eruitziet, hoe je MBAP-header leest en schrijft in praktijk, en welke valkuilen er bestaan. Of je nu een engineer, tester of student bent, met deze gids krijg je een helder beeld van MBAP en de rol die het speelt in moderne automatisering.

MBAP uitpakken: wat is MBAP precies?

MBAP staat voor de Modbus Application Protocol-header. Het is een vaste 7-byte header die onderdeel uitmaakt van de Modbus/TCP-communicatie. In tegenstelling tot Modbus RTU, waarbij de framing afhangt van start- en stopbits en een CRC, gebruikt Modbus/TCP een gestandaardiseerde header zodat pakketten over ethernet correctly kunnen worden aangemaakt en geïnterpreteerd.

Het doel van de MBAP-header is drieledig:

Als je ooit een pakket in Wireshark bekijkt of in een eigen logger gebruikt, herken je de MBAP-header als de eerste 7 bytes van elk Modbus/TCP-bericht. Daarna volgt de PDU (Protocol Data Unit) met het functioneel verzoek of antwoord, zoals Read Holding Registers of Write Coils.

De structuur van de MBAP-header

De MBAP-header is altijd 7 bytes lang en bestaat uit vier velden met de volgende betekenis:

1) Transaction Identifier (2 bytes)

Dit veld koppelt een verzoek aan een antwoord. Het is handig wanneer er meerdere verzoeken tegelijkertijd lopen tussen dezelfde klant en server. In de meeste implementaties loopt de Transaction Identifier op met 1 per aanvraag, en wordt dezelfde waarde teruggegeven in de response.

2) Protocol Identifier (2 bytes)

Voor Modbus/TCP is dit doorgaans 0. Een waarde van 0 geeft aan: Modbus Protocol, zoals bedoeld in de Modbus-standaard. Andere waarden worden zelden gebruikt en betekenen meestal speciale of toekomstgerichte extensies.

3) Length (2 bytes)

Deze lengte geeft aan hoeveel bytes volgen na dit veld — met andere woorden de lengte van de Unit Identifier plus de PDU. Het is belangrijk dat de Length correct is, anders wordt de boodschap verkeerd geïnterpreteerd of gefilterd.

4) Unit Identifier (1 byte)

In sommige netwerken met gateways of bridging devices wordt dit veld gebruikt om de bestemming binnen een netwerktopologie te specificeren. In pure Modbus/TCP-communicatie kan dit veld vaak op 0 blijven, maar in gateway-scenario’s kan het verschillende waarden aannemen.

Samengevat: MBAP-header zorgt voor sequencing, context en framing binnen Modbus/TCP. Het correct interpreteren van deze velden ligt aan de basis van betrouwbare communicatie tussen PLC’s, SCADA-systemen en controllers.

MBAP en Modbus/TCP: hoe werkt het samen met de ADU en PDU?

In Modbus-terminologie zien we twee belangrijke termen: ADU en PDU. De MBAP-header maakt deel uit van de ADU (Application Data Unit). De ADU bestaat uit de MBAP-header gevolgd door de PDU (Protocol Data Unit). De PDU bevat de function code en de data die nodig zijn voor de beoogde actie (bijvoorbeeld uitlezen van registers of schrijven van coils).

Belangrijk om te onthouden:

Door de combinatie van MBAP + PDU kan een robust en schaalbaar Modbus/TCP-systeem worden ontworpen, waarbij meerdere clients tegelijk kunnen communiceren zonder dat de berichten elkaar in de war brengen.

Voorbeelden van een MBAP-header in hex en wat het betekent

Stel, een eenvoudige Modbus/TCP-communicatie waarbij een client 10 en 11 coördineert en een request naar een slave stuurt om 5 registers te lezen. Een mogelijke MBAP-header kan er als volgt uitzien in hex (voorbeeld):

0x00 0x01 0x00 0x00 0x00 0x06 0x01

Uitleg bij dit voorbeeld:

Vervolgens volgt de PDU, waarin de Function Code en data zitten. Bijvoorbeeld 0x03 (Read Holding Registers) gevolgd door de Start Address en het aantal registers. In realistische gevallen ziet een volledige berichtassertie er zo uit:

0x00 0x02 0x00 0x00 0x00 0x07 0x01 0x03 0x00 0x64 0x00 0x02 0xF5

Let op: dit is een vereenvoudigd voorbeeld voor illustratie. In de praktijk kunnen de bytes anders zijn afhankelijk van de exacte operatie en de netwerklatentie.

Hoe lees en schrijf je MBAP in praktijk: praktische tips en voorbeeldcode

Het correct bouwen en parsen van MBAP-header is essentieel bij het ontwikkelen van Modbus/TCP-communicatie. Hieronder staan enkele praktische richtlijnen en voorbeelden in pseudocode die je kunt adaptieren naar jouw favoriete programmeertaal.

Algoritme om MBAP-header te lezen

Stel we ontvangen een Modbus/TCP-bericht. Het eerste wat je moet doen is de eerste 7 bytes uitlezen om de MBAP-header te verkrijgen, daarna de PDU lezen.


// Pseudo-code
bytes mbap = readN(7)
tid = mbap[0:2]       // Transaction Identifier
pid = mbap[2:4]       // Protocol Identifier
length = mbap[4:6]      // Length
unit = mbap[6]          // Unit Identifier

pdu = readN(length - 1) // Aangezien Unit Identifier al gelezen is
processPDU(pdu, tid, unit)

Simpele voorbeeld: MBAP + Read Holding Registers

In pseudo-code laten we een request zien naar het lezen van 2 registers vanaf adres 0x0064 (100).


// MBAP-gegevens voor een request
mbap = {
  tid: 0x0003,
  pid: 0x0000,
  length: 0x0006, // Unit Identifier + PDU (1 + 5)
  unit: 0x01
}
pdu = {
  functionCode: 0x03,
  startAddress: 0x0064,
  quantity: 0x0002
}
send(mbap, pdu)

In deze aanpak kun je eenvoudig parsen en bouwen met jouw taal naar keuze (C/C++, Java, Python, Go). Concrete implementaties bestaan veelal uit simpele struct- of class-achtige representaties van de MBAP-header en de PDU, met vaste functies voor serialization (to bytes) en deserialization (from bytes).

Verschil Modbus RTU vs MBAP-header: waarom MBAP uniek is voor Modbus/TCP

Modbus RTU werkt over seriële lijnen en gebruikt een andere framing en foutdetectie ( CRC ). Daardoor is er nooit een MBAP-header in RTU-omgevingen. MBAP is specifiek ontworpen voor Ethernet-gebaseerde communicatie in Modbus/TCP en biedt:

Dit zijn grote voordelen voor industriële netwerken die betrouwbaarheid, schaalbaarheid en betrouwbaarheid van communicatie eisen. MBAP maakt Modbus/TCP geschikt voor bedrijfskritische toepassingen.

Beveiliging en betrouwbaarheid met MBAP: aandachtspunten

Hoewel MBAP op zichzelf geen beveiligingsfunctie biedt, is het een cruciaal zichtveld bij het ontwerpen van een veilig Modbus/TCP-systeem. Enkele best practices:

Door MBAP-header en de rest van de Modbus/TCP-stack op een consistente manier te behandelen, kun je potentiële beveiligings- en betrouwbaarheidsproblemen vroegtijdig identificeren en mitigeren.

Praktische tips voor ontwerpers: MBAP vragen en antwoorden

Hier zijn een paar veelgestelde vragen die vaak opduiken bij engineers die met MBAP werken:

Veelvoorkomende fouten bij MBAP-implementaties en hoe je ze oplost

MBAP-implementaties zijn vaak de bron van subtiele fouten die leiden tot frustrerende communicatieproblemen. Enkele typische valkuilen:

Een rigoureuze teststrategie met gestuurde MBAP-testcases helpt om deze fouten te voorkomen. Gebruik zowel syntactische tests (byte-niveau) als functionele tests (read/write operaties) om te verifiëren dat de volledige keten correct werkt.

Praktische implementatieoverwegingen voor teams

Wanneer je een Modbus/TCP-stack ontwikkelt of integreert, zijn er een paar concrete overwegingen om rekening mee te houden:

Samenvatting: waarom MBAP essentieel is voor Modbus/TCP

MBAP is de kern van de Modbus/TCP-communicatie. Zonder een correcte MBAP-header kan de rest van de communicatie onmogelijk correct functioneren. Door de Transaction Identifier, Protocol Identifier, Length en Unit Identifier te begrijpen en correct toe te passen, kun je betrouwbare, schaalbare en interoperabele systemen bouwen die op een veilige en efficiënte manier data uitwisselen tussen PLC’s, SCADA-systemen en ander industriële apparatuur.

Kernpunten op een rij

Verder lezen en leren

Wil je nog dieper duiken in MBAP en Modbus/TCP? Experimenteer met pakketanalyse tools zoals Wireshark om echte Modbus/TCP-communicatie te observeren en label de MBAP-headervelden. Maak vervolgens kleine voorbeeldnetwerken met PLCs en simulateurs om de werking van Transaction Identifier en Length secuur te verifiëren. Zo bouw je niet alleen echte technische vaardigheden op, maar creëer je ook vertrouwen in jouw Modbus/TCP-implementaties en de bijbehorende MBAP-headers.