Arduino - Modbus
In deze tutorial gaan we leren:
- Wat is Modbus?
- Waarom heeft u Modbus nodig?
- Welke alternatieven zijn er voor Modbus?
- Hoe Modbus werkt
- Modbus RTU/ASCII en Modbus TCP
- Hoe de Arduino Modbus bibliotheek te gebruiken
Wat is Modbus?
Modbus is een protocol dat gebruikt wordt voor communicatie tussen apparaat en apparaat, apparaat en software/app, en apparaten met een HMI. Het wordt veel toegepast in industriële omgevingen om apparaten te besturen en te monitoren.
In eenvoudige woorden is Modbus een taal die een apparaat gebruikt om te communiceren met andere apparaten, software/apps en HMI-apparaten.
Deze tutorial gaat over Arduino, dus Arduino staat voor het apparaat. Met Modbus kunnen we:
- Twee Arduino’s met elkaar laten communiceren om output/input te besturen of te monitoren
- Arduino laten communiceren met software op een pc of app op een smartphone
- Arduino laten communiceren met een HMI-apparaat
Bijvoorbeeld, Arduino #1 met 4 schakelaars bestuurt Arduino #2 met 4 lampjes over een lange afstand.
Waarom heeft u Modbus nodig?
Zijn er alternatieven voor Modbus? Zo ja, wanneer gebruikt u Modbus? En wanneer gebruikt u die alternatieven?
Om deze vragen te beantwoorden, bekijken we een voorbeeld: Een schakelaar verbonden met Arduino #1 bestuurt een LED verbonden met Arduino #2 over een lange afstand.

De eenvoudigste alternatieve manier zonder Modbus is om zelf een simpel protocol te definiëren:
- Arduino #1:
- Wanneer de schakelaar op AAN wordt gezet, stuurt Arduino #1 een byte (commando) met waarde 1 naar Arduino #2.
- Wanneer de schakelaar op UIT wordt gezet, stuurt Arduino #1 een byte (commando) met waarde 0 naar Arduino #2.
- Arduino #2:
- Als de ontvangen byte 1 is, gaat de LED aan
- Als de ontvangen byte 0 is, gaat de LED uit
- Arduino #1 wil weten of Arduino #2 het commando succesvol heeft uitgevoerd
- Arduino #1 wil de status van de LED op Arduino #2 controleren
- Arduino #1 met meerdere schakelaars wil meerdere LED’s op Arduino #2 bedienen
- Arduino #1 wil een schakelaar gebruiken om een LED op Arduino #2 te bedienen en Arduino #2 wil ook op zijn beurt een schakelaar gebruiken om een LED op Arduino #1 te bedienen
- En meer gebruikssituaties
- Moeten we de commando’s niet zelf definiëren, Modbus definieert ze al voor alle gevallen. We hoeven ze alleen te implementeren.
- Kan ons apparaat zonder samenwerking werken met andere apparaten/software die Modbus ondersteunen.
Dit protocol is zelf gedefinieerd, geen standaardprotocol. U moet meer regels definiëren als:
Het is niet eenvoudig om alle commando’s zelf te definiëren. Het probleem wordt complexer als u bovenstaande functies combineert. Bovendien kunt u niet garanderen dat er geen fouten ontstaan.
Een ander probleem bij zelf het protocol definiëren is dat als u wilt dat uw Arduino samenwerkt met een andere Arduino die een protocol van een ander gebruikt, dit vrijwel onmogelijk is zonder samenwerking en het delen van het zelfgedefinieerde protocol.
Dit zijn de redenen waarom het Modbus protocol nodig is. Als we Modbus gebruiken:
Als u Modbus gebruikt voor Arduino, kunt u ook veel gratis software/apps gebruiken om uw Arduino te besturen en te monitoren.
Wanneer wel en niet Modbus gebruiken
Het Modbus protocol is niet eenvoudig voor beginners om te begrijpen en toe te passen, ook al bestaat er een Modbus bibliotheek. Het is daarom prima om een eenvoudig zelfgedefinieerd protocol te gebruiken, zoals hierboven beschreven, als:
- Het systeem simpel is, bijvoorbeeld enkele schakelaars op Arduino #1 die enkele LED’s op Arduino #2 bedienen
- Arduino niet hoeft samen te werken met apparaten/software van andere ontwikkelaars
U gebruikt Modbus wanneer:
- Het systeem complex is
- Het systeem een hoge betrouwbaarheid vereist
- Arduino moet samenwerken met apparaten/software van andere ontwikkelaars
※ Notiz:
Er zijn nog andere standaard en niet-standaard protocollen als alternatieven voor Modbus. Die vallen buiten het bereik van deze tutorial.
Hoe Modbus protocol werkt
Zoals eerder beschreven kan een Arduino communiceren met software/apps, HMI-apparaten of een andere Arduino via het Modbus protocol. Deze tutorial gebruikt communicatie tussen twee Arduino’s als voorbeeld, de rest werkt hetzelfde.
Concepten
Er zijn enkele belangrijke concepten in Modbus:
- Master en Slave
- Request en Response
- Function Code (FC) en Address
Het Modbus protocol werkt volgens het Master-Slave model. Van twee Arduino’s moet er één functioneren als Master en de ander als Slave.
Master stuurt een request, en de Slave stuurt een response.

Een request van de Master bevat in principe:
- Function Code (FC): 1 byte, het commando dat de Slave vertelt wat hij moet doen. Bijvoorbeeld: de status lezen van een digitale input, digitale output of analoge input pin, of een digitale output pin aansturen.
- Address: 2 bytes, gebruikt om een pin te identificeren. Elke digitale input pin, digitale output pin, en analoge input pin krijgt een adres.
- Data (bijvoorbeeld stuurwaarde)
Wanneer de Slave het request ontvangt, voert hij de actie uit en stuurt een response terug met het resultaat of de gevraagde informatie.
Function Code
De Function Code is vastgelegd in de Modbus standaard. Er zijn veel verschillende Function Codes. Hier enkele basisvoorbeelden:
- FC 01 (Read Coils): command voor het lezen van de status van één of meerdere digitale output pins
- FC 05 (Write Single Coil): command voor het besturen (schrijven) van de status van één of meerdere digitale output pins
- FC 02 (Read Discrete Inputs): command voor het lezen van de status van één of meerdere digitale input pins
"FC 01" betekent dat de waarde van de Function Code 0x01 is.
Er zijn meer Function Codes. Om nieuwkomers niet te overladen, behandelt deze tutorial alleen de essentiële Function Codes.
Bij het gebruiken van de Arduino Modbus bibliotheek moet u:
- Bepalen welke Function Code u wilt gebruiken
- Adressen toewijzen aan elke Arduino pin die u gebruikt
De gedetailleerde instructie voor de Modbus bibliotheek volgt in een volgende tutorial. Volg onze Facebook pagina om op de hoogte te blijven van nieuwe tutorials.
Arduino Master kan de status van zijn digitale input pin lezen en daarmee de digitale output status van Arduino Slave besturen, en andersom.
Bijvoorbeeld:
- Arduino Master is aangesloten op LED #M, SCHAKELAAR #M
- Arduino Slave is aangesloten op LED #S, SCHAKELAAR #S
- Laten we SCHAKELAAR #M gebruiken om LED #S te besturen, en SCHAKELAAR #S om LED #M te besturen

Oplossing:
- Master leest de status van SCHAKELAAR #M → stuurt een request naar Slave om LED #S te besturen volgens de status van SCHAKELAAR #M → Slave bestuurt LED #S en stuurt een response
- Master stuurt een request naar Slave om de status van SCHAKELAAR #S te lezen → Slave reageert met de status van SCHAKELAAR #S → Master bestuurt LED #M volgens de status van SCHAKELAAR #S
※ Notiz:
- In bovenstaande gebruiken we de termen "digitale input pin", "digitale output pin" om het makkelijker te maken voor beginners. In werkelijkheid staat "digitale input pin" voor elke status van een apparaat die alleen gelezen wordt, en "digitale output pin" voor elke status van een apparaat die gelezen en geschreven kan worden.
- Modbus kan meerdere Masters en meerdere Slaves ondersteunen.
- Modbus kan gebruikt worden voor digitaal input/output én analoog input/output.
Modbus RTU/ASCII en Modbus TCP
Er zijn drie populaire soorten Modbus: Modbus RTU, Modbus ASCII en Modbus TCP. De werking is hetzelfde zoals hierboven beschreven. Elk type is aangepast voor een specifieke netwerkomgeving: Serieel of TCP.
- Systeemdiagram

- Protocol stack

Verschillen tussen Modbus RTU/ASCII en Modbus TCP
| Modbus RTU/ASCII | Modbus TCP |
|---|---|
| Over serial (RS-232/RS-422/RS-485) | Over TCP |
| Support single transaction(*) | Support multiple transactions(**) |
- (*): Modbus RTU/ASCII ondersteunt slechts één transactie tegelijk. Dit betekent dat wanneer een Master een Modbus request verzendt, hij moet wachten op een Modbus response of timeout voordat hij een nieuwe request verstuurt.
- (): Modbus TCP ondersteunt meerdere transacties tegelijkertijd. Dit betekent dat wanneer een Master een Modbus request verzendt, hij niet hoeft te wachten op een Modbus response. Hij kan meerdere requests achter elkaar versturen. Om een response aan een request te koppelen, heeft Modbus TCP een extra veld genaamd "Transaction ID". De request en de bijbehorende response hebben dezelfde Transaction ID.
Hoe de Arduino Modbus bibliotheek te gebruiken
Dankzij de Modbus bibliotheek is het gebruik van Modbus met Arduino vereenvoudigd.
We zullen een tutorial maken over hoe u de Modbus bibliotheek gebruikt. Volg onze Facebook pagina om op de hoogte te blijven van nieuwe tutorials.