Modbus Master-Slave
Modbus is een van de meest gebruikte communicatieprotocollen. Het is erg eenvoudig, snel en veilig. Bij gebruik met een seriële poort wordt het Modbus RTU genoemd, en bij gebruik met Ethernet Modbus TCP/IP. Recent is ook Modbus UDP populair geworden. In het verleden bestond er ook Modbus ASCII, maar dat wordt niet meer veel gebruikt.
Klik hier voor de Modbus Master-code voor Fulmatic 7 PLC's.
Modbus-tabellen
Allereerst moeten we de structuur van de Modbus-tabel begrijpen. Het Modbus-protocol heeft vier tabellen. Twee van deze tabellen zijn analoog (16-bits) en de andere twee zijn bitgebaseerd. Elke tabel bevat 65536 variabelen. Met andere woorden, de Analog Holding-tabel bevat 65536 woorden en de Discrete Output Coil-tabel bevat 65536 bits.
| Adresbereik | Lezen en schrijven | Tabelnaam | Tip |
| 0-65535 | Lezen en schrijven | Discrete uitgangsspoelen | 1 Bit |
| 0-65535 | Alleen-lezen | Discrete ingangscontacten | 1 Bit |
| 0-65535 | Alleen-lezen | Analoge ingangsregisters | 16 bit |
| 0-65535 | Lezen en schrijven | Analoge holdingregisters | 16 Bit |
Hoewel de tabel er in feite als volgt uitziet, wordt het meest voorkomende gebruik weergegeven in de onderstaande tabel. In de bovenstaande tabel moeten gebruikers de tabelnaam en het variabele adres voor een waarde specificeren. Bijvoorbeeld: "Analog Holding 500. word". In de onderstaande tabel specificeren de adressen ook tot welke tabel de variabele behoort. Bijvoorbeeld: voor het adres "Analog Holding 500. word" volstaat het om "40501" te schrijven. Omdat het adresveld Analog Holding is, is het startadres 40001 + woordadres 500 = 40501. Als het "Analog Input 500. word" zou zijn, zou het 30501 zijn.
| Adresbereik | Lezen en schrijven | Tabelnaam | Tip |
| 1-9999 | Lezen en schrijven | Discrete uitgangsspoelen | 1 Bit |
| 10001-19999 | Alleen-lezen | Discrete ingangscontacten | 1 Bit |
| 30001-39999 | Alleen-lezen | Analoge ingangsregisters | 16 Bit |
| 40001-49999 | Lezen en schrijven | Analoge holdingregisters | 16 Bit |
De tweede methode kan nog steeds een groot aantal datavelden adresseren, ook al beperkt deze de toegang tot sommige adressen. Er is ook een derde methode. Deze methode maakt het mogelijk om alle datavelden met één enkel getal weer te geven. Deze methode wordt 6-cijferige Modbus-adressering genoemd. Het adresbereik bestaat uit 6 cijfers.
| Adresbereik | Lezen en schrijven | Tabelnaam | Tip |
| 1-65536 | Lezen en schrijven | Discrete uitgangsspoelen | 1 Bit |
| 100001-165536 | Alleen-lezen | Discrete ingangscontacten | 1 Bit |
| 300001-365536 | Alleen-lezen | Analoge ingangsregisters | 16 Bit |
| 400001-465536 | Lezen en schrijven | Analoge holdingregisters | 16 Bit |
Opmerking: WinTr SCADA-programma, Focus HMI Dit programma, en vele vergelijkbare programma's, ondersteunen zowel 5- als 6-cijferige adressering. Het gelijktijdig ondersteunen van beide adresseerstijlen levert een probleem op. Bij 6-cijferige adressering conflicteren de discrete uitgangsspoelen (1-65536) met de adressen bij 5-cijferige adressering. Daarom is bij 6-cijferige adressering... Discrete uitgangsspoelen Hiervoor moet een nul aan het begin worden geplaatst.
We hebben drie verschillende tabelstructuren gezien. De eerste tabel is de daadwerkelijke tabel; de andere twee zijn slechts twee verschillende methoden om er toegang toe te krijgen. Fabrikanten van Modbus-apparaten kunnen deze adresstabel op een van de drie volgende manieren aanleveren. U zult dan adresconversies van tabel naar tabel moeten uitvoeren. Of u kunt ervoor kiezen om dit niet te leren en constant anderen om hulp te vragen. Ik heb de onderstaande tabel opgesteld om deze conversies te illustreren.
| Eerste adresmelding | Melding tweede adres | Derde adresmelding |
| Analoge Holding 0 | 40001 | 400001 |
| Analoge Holding 1000 | 41001 | 401001 |
| Analoge ingang 100 | 30101 | 300101 |
| Discrete invoer 10 | 10011 | 100011 |
Modbus-query's
Om gegevens uit de hierboven beschreven tabellen te lezen of te schrijven, stuurt het masterapparaat een query. Het slaveapparaat beantwoordt deze query. Zolang de communicatie voortduurt, stuurt de master queries en beantwoordt de slave deze. Om Modbus-queries en -reacties te begrijpen, raad ik de website https://www.simplymodbus.ca/FC03.htm aan, die ik zelf regelmatig gebruik . Alle communicatie is gerelateerd aan de waarden van de verzonden en ontvangen bytes. Ik zal de uitleg hieronder voortzetten aan de hand van een voorbeeld van een Modbus-query.
Voorbeeld Modbus-query:
Hieronder ziet u de query die is gemaakt om 3 woorden aan gegevens te lezen, beginnend bij Holding Register 107, van een apparaat met stationadres 17.
11: Stationsadres (11 hex = 17 dec)
03: Functiecode 3 (Leescode voor Holding Registers)
006B: Eerste leesadres (006B hex = 107 dec of 40001 + 107 = 40108)
0003: Aantal te lezen woorden (03 hex = 3 dec)
7687: CRC16 (cyclische redundantiecontrole)
Zoals in de bovenstaande query te zien is, kunnen we een bepaald aantal keren van een specifiek adres lezen. Functiecode 3 werd gebruikt voor de leesbewerking. Dit is voor het veld Holding Register. Als we van het veld Input Register zouden willen lezen, zou functiecode 4 nodig zijn. Deze query, verzonden via de seriële poort, wordt ontvangen door alle ontvangers op de lijn. Echter, alleen het apparaat met stationadres 17 zal reageren. Voordat het reageert, controleert station 17 de CRC-informatie, die in ons voorbeeld 7687 is. Het slave-apparaat weet dat de laatste twee bytes van alle ontvangen bytes de CRC zijn. Het berekent de bytes die niet de CRC zijn met behulp van de CRC-formule. Het vergelijkt de berekende CRC met de ontvangen CRC. Als deze hetzelfde zijn, begrijpt het dat de query foutloos is ontvangen, en als het stationadres ook hetzelfde is, zal het zeker reageren. Het geeft echter niet altijd het juiste antwoord. Als bijvoorbeeld een adresbereik wordt opgevraagd dat het niet heeft, zal het een foutmelding verzenden. Je kunt de foutmeldingen bekijken via deze link: https://www.simplymodbus.ca/exceptions.htm
Als alles volgens plan verloopt, zal het antwoord als volgt zijn:
11: Stationsadres (11 hex = 17 dec)
03: Functiecode 3 (Leescode voor Holding Registers)
06: Aantal gelezen bytes (3 registers x 2 bytes = 6 bytes)
AE41: Waarde uitlezen, adres 40108
5652: De gelezen waarde is adres 40109
4340: De gelezen waarde is adres 40110
49AD: CRC16 (cyclische redundantiecontrole)
Het masterapparaat voert, na ontvangst van bovenstaand antwoord, verschillende controles uit. Deze omvatten het controleren van het stationadres, de CRC-waarde en het aantal gelezen bytes. Op basis van deze controles wordt het antwoord geaccepteerd of afgewezen.
Andere informatie
- Bij seriële poortcommunicatie worden gegevens niet altijd correct verzonden. Deze vervorming is vooral merkbaar bij veel harmonischen, lange kabels of meerdere apparaten. CRC (Correctional Correlation) is het enige bewijs dat de gegevens correct zijn gelezen.
- Na de CRC-controle wordt het stationadres gecontroleerd. Zelfs als er meerdere apparaten met hetzelfde adres zijn, is communicatie hiermee niet mogelijk. Elk apparaat moet een uniek adres hebben. Aan apparaten kunnen adressen tussen 0 en 255 worden toegewezen. Veel producten uit het Verre Oosten werken niet, zelfs niet als 0 als adres is toegewezen.
- Het maximale aantal 16-bits registers dat in één query kan worden uitgelezen, is 127. Dit komt doordat het maximale aantal te lezen bytes 254 is. In discrete vorm is het maximum 255 x 8 = 2040 bits.
- Analoge tabellen zijn niet altijd 16-bits; ze kunnen ook 32-bits of 64-bits zijn. Alle communicatie verloopt via bytes. Master en Slave combineren deze echter intern. Zo kunnen 40001 en 40002 worden beschouwd als een 32-bits variabele. In dit geval speelt de parameter "woordvolgorde" een rol. Sommige apparaten gebruiken het eerste woord als de grootste waarde, terwijl andere het tweede woord als de grootste waarde gebruiken. De 32-bits waarde zou dan (40001 x 65536) + 40002 (eerste woord als grootste waarde) of 40001 + (40002 x 65536) = tweede woord als grootste waarde zijn.
- De master stuurt een verzoek naar het slave-apparaat en wacht op een antwoord. Als er geen antwoord wordt ontvangen, moet de master het verzoek opnieuw versturen of doorgaan naar het volgende verzoek. Deze wachttijd wordt de time-out genoemd.
- Wanneer de master een antwoord op zijn query ontvangt, stuurt hij niet direct de volgende query. Hij moet even wachten. Als hij niet wacht, worden het antwoord van het slave-apparaat en de nieuwe query van de master gecombineerd en mogelijk niet geaccepteerd door de slave-apparaten. Deze wachttijd wordt een vertraging genoemd.
- Modbus RTU- en TCP/IP-query's zijn verschillend. Bij TCP/IP worden 6 bytes vóór de query toegevoegd en wordt de afsluitende CRC weggelaten. Zie hier voor meer informatie. https://www.simplymodbus.ca/TCP.htm
- Voor het gebruik van andere Modbus-functiecodes https://www.simplymodbus.ca/FC01.htm Bezoek alstublieft.

Bir yorum