Hoe kunnen we helpen?
Modbus-adressering / Standaard Modbus-gegevensadresstring / Modbus-functiecodes

In een paar woorden
- 0x01 Coils lezen: Lees de status van relais of digitale uitgangen
- 0x02 Discrete ingangen lezen: Lees digitale ingangssignalen zoals drukknoppen
- 0x03 Houdregisters lezen: lees procesparameters of instelpunten die zijn opgeslagen in houdregisters
- 0x04 Ingangsregisters lezen: analoge ingangswaarden lezen, zoals sensorwaarden van een PLC
- 0x05 Enkele spoel schrijven: de status van een enkele digitale uitgang (AAN/UIT) instellen, zoals het activeren van een relais
- 0x0F Meerdere spoelen schrijven: de statussen van meerdere digitale uitgangen (AAN/UIT) instellen in één verzoek
- 0x06 Enkelvoudig vasthoudregister schrijven: een enkele 16-bits waarde naar een vasthoudregister schrijven, zoals het instellen van een parameter of commando
- 0x10 Meerdere vasthoudregisters schrijven: meerdere 16-bits waarden naar opeenvolgende vasthoudregisters schrijven, zoals meerdere instelpunten tegelijk of een string bijwerken
0x, 1x, 3x, 4x en FC01, FC02, FCxx,… Ik ben de weg kwijt!
0x 1x 3x 4x definiëren niet de Modbus-functiecode. Ze geven alleen het type gegevensgebied aan: spoelen, discrete ingangen, holdingregister,…
De functiecode (FCxx) definieert de bewerking die op dat gegevensgebied wordt uitgevoerd.
Algemene logische mapping tussen 0x, 1x,.. en FC01, FC02,..
0x Coils
Lezen met FC01
Schrijven met FC05 of FC15
1x Discrete inputs
Lezen met FC02
3x Inputregisters
Lezen met FC04
4x Holdingregisters
Lezen met FC03
Schrijven met FC06 of FC16
Belangrijk punt: in een Modbus-frame komt nooit 0x 1x 3x of 4x voor. Het frame bevat alleen de functiecode, het startadres en de hoeveelheid.
De voorvoegsels 0x 1x 3x 4x zijn een documentatie- en softwareconventie, geen protocolregel.
Details
Coils = digitale uitgangen die gelijk zijn aan een spoel in een relaisschema.
Het Modbus-gegevenstype is 0.
Het wordt vaak aangeduid als 0x, wat het adresseren gemakkelijker maakt.
Gegevenstype 0x is beschikbaar voor lezen en schrijven.
Voor lezen wordt de functiecode 1 (FC01 en 01h in hexadecimaal) gebruikt.
Om dergelijke gegevens te schrijven, wordt functiecode 5 (FC05 en 05h) gebruikt.
Voor het schrijven van meerdere opeenvolgende gegevens wordt functiecode 15 (0Fh) gebruikt.
Dit gegevenstype wordt op verschillende manieren genoteerd:
%M1, 00001, 000001 (voor de eerste variabele)…
Volgens de interpretatie van de norm moet de notatie 0x0000 (tot 0xFFFF) zijn, in hexadecimaal.
Inputstatus = digitale inputs die gelijk zijn aan een contact in een relaisschema.
Het Modbus-gegevenstype is 1.
Het wordt vaak aangeduid als 1x, wat het adresseren gemakkelijker maakt.
Gegevenstype 1x is alleen beschikbaar voor lezen.
Voor lezen wordt functiecode 2 (FC02 en 02h) gebruikt.
Dit gegevenstype wordt op verschillende manieren genoteerd:
%i1, 10001, 100001..,
De notatie moet 1×0000 zijn (tot 1xFFFF).
Inputregisters = digitale inputs die gelijk zijn aan een register (vandaar de naam), of een niet-binaire waarde (een 16-bits woord).
In die tijd was de keuze niet zoals tegenwoordig…
Het Modbus-gegevenstype is 3.
Het wordt vaak aangeduid als 3x, wat het adresseren vergemakkelijkt.
Datatype 3x is alleen beschikbaar voor lezen.
Voor lezen wordt functiecode 4 (FC04 en 04h) gebruikt.
Dit datatype wordt op verschillende manieren genoteerd:
%IW1, 30001, 300001..,
De notatie moet 3×0000 zijn (tot 3xFFFF).
Holding Registers = digitale uitgangen die gelijk zijn aan een register (vandaar de naam), of een niet-binaire waarde (een 16-bits woord).
Het Modbus-gegevenstype is 4.
Het wordt vaak aangeduid als 4x, wat het adresseren vergemakkelijkt.
Gegevenstype 4x is beschikbaar voor lezen en schrijven.
Voor het lezen wordt functiecode 3 (FC03 en 03h) gebruikt.
Voor het schrijven van gegevens van dit type wordt functiecode 6 (FC06 en 06h) gebruikt.
Voor het schrijven van meerdere opeenvolgende gegevens wordt functiecode 16 (10h) gebruikt.
Dit type gegevens wordt op verschillende manieren genoteerd:
%MW1, 40001, 400001..,
De notatie moet 4×0000 (tot 4xFFFF) zijn.
Er bestaat vaak verwarring tussen de notatie (die virtueel is) en het adres.
Door het adres in hexadecimaal te gebruiken, kunnen de verschillende notaties zoals hierboven beschreven worden vermeden.
Voor kleine toepassingen is er inderdaad geen probleem, aangezien de decimale waarde van het adres niet hoger is dan 9999.
Maar bij grotere databases wordt het een rommeltje
49999 is bijvoorbeeld het 10000ste woord van type 4, wat als het 10001ste woord moet worden gebruikt? Over het algemeen wordt dit genoteerd als 410000 (maar dan verandert u de schaal, wat niet praktisch is), vaak wordt het geschreven als 50000 (maar dit is niet erg logisch, het type is 4, niet 5).
Sommige mensen schrijven het ook als 4×9999, dan 4×10000…
Door in hexadecimaal te schrijven, kun je alle beschikbare adressen gebruiken en is de notatie beter leesbaar.
Het 10000ste woord is 4×2710, het volgende wordt 4×2711… De conversie is eenvoudig met de Windows-rekenmachine of in de PLC zelf.