Modbus on avoin viestintäprotokolla, joka perustuu master-slave-arkkitehtuuriin ( englanniksi master - slave ; Modbus-standardissa käytetään termejä client-server ). Sitä käytetään laajalti teollisuudessa elektronisten laitteiden välisen viestinnän järjestämiseen . Voidaan käyttää tiedonsiirtoon sarjaliikennelinjojen RS-485 , RS-422 , RS-232 ja TCP/IP (Modbus TCP) -verkkojen kautta. On myös epästandardeja toteutuksia UDP :tä [1] [2] käyttäen .
Älä sekoita "Modbus" ja "Modbus Plus". Modbus Plus on Schneider Electricin omistama protokolla . Modbus Plusin fyysinen kerros on ainutlaatuinen, samanlainen kuin Ethernet 10BASE-T , puoliduplex yhden kierretyn parin yli , nopeus 2 Mbps. Modbus Plus -siirtoprotokolla on HDLC , jonka kautta Modbus PDU -lähetykselle on määritetty laajennus.
JBUS on Modbus RTU -protokollan osajoukko, jonka osoitusmenetelmässä on pieniä eroja [3] .
Modicon (nyt Schneider Electricin omistama ) on kehittänyt Modbusin käytettäväksi ohjelmoitavissa logiikkaohjaimissa . Protokollaspesifikaatio julkaistiin ensimmäisen kerran vuonna 1979 [4] . Se oli avoin standardi, joka kuvaili viestien muotoa ja kuinka ne välitettiin erilaisten elektronisten laitteiden verkossa.
Aluksi MODICON-ohjaimet käyttivät RS-232 [4] -sarjaliitäntää . Myöhemmin RS-485-liitäntää alettiin käyttää, koska se tarjoaa paremman luotettavuuden, mahdollistaa pidempien tietoliikennelinjojen käytön ja useiden laitteiden yhdistämisen yhdelle linjalle.
Monet elektroniikkalaitteiden valmistajat ovat tukeneet standardia, satoja sitä käyttäviä tuotteita on ilmestynyt markkinoille.
Modbusia kehittää parhaillaan voittoa tavoittelematon Modbus-IDA [5] .
Modbus määrittää 4 datatyyppiä:
Modbus-standardit koostuvat kolmesta osasta:
Standardin tärkeimmät edut ovat avoimuus ja massaluonne. Teollisuus tuottaa nyt (2014) paljon erilaisia ja malleja antureita, toimilaitteita, signaalinkäsittely- ja normalisointimoduuleja jne. Lähes kaikissa teollisissa valvonta- ja ohjausjärjestelmissä on ohjelmistoajurit Modbus-verkkojen kanssa työskentelyyn.
Standardi kehitettiin pohjimmiltaan vuonna 1979 ottaen huomioon sen ajan tarpeet ja laskentaominaisuudet, eikä monia nykyaikaisten teollisuusverkkojen kannalta oleellisia asioita otettu huomioon [6] . Näiden ominaisuuksien puuttuminen johtuu protokollan yksinkertaisuudesta, mikä helpottaa sen tutkimista ja nopeuttaa toteutusta.
Modbus-väylän ohjaimet kommunikoivat isäntä-orja- mallilla , joka perustuu pyynnöstä ja vastauksesta koostuviin tapahtumiin .
Yleensä verkossa on vain yksi isäntä ( vanhan terminologian mukaan eng. client ) laite ja useita orjalaitteita ( vanhan terminologian mukaan eng. server ) laitteita. Isäntä käynnistää tapahtumat (lähettää pyynnöt). Isäntä voi osoittaa pyynnön erikseen mille tahansa orjalle tai aloittaa yleislähetysviestin kaikille orjille. Orjalaite, tunnistanut osoitteensa, vastaa nimenomaan sille osoitettuun pyyntöön. Kun lähetyspyyntö vastaanotetaan, orjalaitteet eivät tuota vastausta.
Modbus-spesifikaatiossa kuvataan pyyntöjen ja vastausten rakenne. Niiden perustana on perusprotokollapaketti, niin kutsuttu PDU ( Protocol Data Unit ). PDU:n rakenne on linkkityypistä riippumaton ja sisältää toimintokoodin ja tietokentän. Toimintokoodi on koodattu yksitavuiseksi kenttään ja se voi ottaa arvoja välillä 1…127. Arvoalue 128…255 on varattu virhekoodeille. Tietokenttä voi olla vaihtelevan pituinen. PDU-paketin koko on rajoitettu 253 tavuun.
toimintokoodi | tiedot |
---|---|
1 tavu | N ≤ 252 (tavu) |
Paketin lähettämiseksi fyysisten viestintälinjojen kautta PDU sijoitetaan toiseen pakettiin, joka sisältää lisäkenttiä. Tämän paketin nimi on ADU ( Application Data Unit ). ADU-muoto riippuu linkin tyypistä. ADU:sta on kolme muunnelmaa, kaksi tiedonsiirtoon asynkronisen rajapinnan kautta ja yksi TCP/IP-verkkojen kautta:
ADU:n yleinen rakenne on seuraava (toteutuksesta riippuen osa kentistä saattaa puuttua):
orjalaitteen (orja) osoite | toimintokoodi | tiedot | virheen havaitsemislohko |
---|
missä
ADU:n enimmäiskoko RS232/RS485-sarjaverkoissa on 256 tavua, TCP-verkoissa 260 tavua.
Modbus TCP ADU näyttää tältä:
tapahtumatunnus | Protokollan tunnus | paketin pituus | orja osoite | toimintokoodi | tiedot |
---|
missä
On huomattava, että Modbus TCP:ssä ei ole virheenhallintakenttää, koska TCP / IP-pino varmistaa tietojen eheyden.
Nykyinen protokollamääritys määrittelee kolme toimintokoodiluokkaa:
Vakiokomennot Niiden kuvauksen on oltava Modbus-IDAn julkaisema ja hyväksyttävä. Tämä luokka sisältää sekä jo määritellyt että tällä hetkellä käyttämättömät koodit. Mukautetut komennot Kaksi koodialuetta (65 - 72 ja 100 - 110), joille käyttäjä voi määrittää mielivaltaisen toiminnon. Ei kuitenkaan voida taata, että jokin muu laite ei käytä samaa koodia eri toiminnon suorittamiseen. varattu Tähän kategoriaan kuuluvat toimintokoodit, jotka eivät ole vakioita, mutta joita käytetään jo eri yritysten valmistamissa laitteissa. Nämä ovat koodit 9, 10, 13, 14, 41, 42, 90, 91, 125, 126 ja 127.Yksi protokollan tyypillisistä käyttötavoista on tietojen lukeminen ja kirjoittaminen ohjainrekistereihin. Protokollaspesifikaatiossa määritellään neljä tietotaulukkoa:
Pöytä | Kohteen tyyppi | Käyttöoikeustyyppi |
---|---|---|
Lippurekisterit ( kelat ) | lainkaan | Lue ja kirjoita |
Erilliset tulot _ | lainkaan | vain lukemista |
Syöttörekisterit _ _ | 16-bittinen sana | vain lukemista |
Omistusrekisterit _ _ | 16-bittinen sana | Lue ja kirjoita |
Kunkin taulukon elementtejä käytetään 16-bittisellä osoitteella, ensimmäinen solu on osoite 0. Jokainen taulukko voi siten sisältää enintään 65536 elementtiä. Määrittely ei määrittele, mitä taulukkoelementtien tulee olla fyysisesti ja missä sisäisissä laiteosoitteissa niiden tulee olla saatavilla. Esimerkiksi päällekkäisten taulukoiden järjestäminen on hyväksyttävää. Tässä tapauksessa ohjeet, jotka toimivat erillisten tietojen ja 16-bittisten rekisterien kanssa, pääsevät itse asiassa samaan dataan.
Tietojen käsittelytapaan liittyy jonkin verran sekaannusta. Modbus kehitettiin alun perin Modicon-ohjaimille. Näissä ohjaimissa käytettiin erityistä numerointia jokaiselle taulukolle. Esimerkiksi ensimmäinen syöttörekisteri oli sijaintinumero 30001 ja ensimmäinen hallintarekisteri oli 40001. Siten Modbus-komennon pitorekisterin osoite 107 oli ohjaimen rekisterinumero 40108. Vaikka tällainen osoitesovitus ei ole enää osa standardia, jotkut ohjelmistopaketit voivat automaattisesti "korjata" käyttäjän syöttämiä osoitteita, esimerkiksi vähentämällä 40001 tallennusrekisterin osoitteesta. Viiteopas vuodelta 1996 https://modbus.org/docs/PI_MBUS_300.pdf , jossa samanlainen osoitus otettiin implisiittisesti käyttöön, merkitty vanhentuneeksi ("vanhentuneeksi" ja "VAIN VAIN VAIN VAIN VAIN SOVELLUKSILLE"), nykyinen protokollamääritys https:// modbus. org/docs/Modbus_Application_Protocol_V1_1b3.pdf käyttää vain absoluuttista osoitusta - 01 (0x01) lukukelat 0x0000 - 0xFFFF, 03 (0x03) Lue säilytysrekisterit 0x0000 - 0xFFFF.
Lukeaksesi arvot yllä olevista tietotaulukoista, käytä funktiokoodeja 1-4 ( heksadesimaaliarvot 0x01-0x04):
Kysely koostuu taulukon ensimmäisen elementin osoitteesta, jonka arvo tulee lukea, ja luettavien elementtien lukumäärästä. Osoite ja datamäärä annetaan 16-bittisinä numeroina, joista kunkin merkitsevin tavu lähetetään ensin.
Pyydetyt tiedot lähetetään vastauksessa. Tietotavujen määrä riippuu pyydettyjen kohteiden määrästä. Ennen dataa lähetetään yksi tavu, jonka arvo on yhtä suuri kuin datatavujen lukumäärä.
Tallennusrekisterien ja syöttörekisterien arvot siirretään alkaen määritetystä osoitteesta, kaksi tavua per rekisteri, kunkin rekisterin korkea tavu siirretään ensin:
tavu 1 | tavu 2 | tavu 3 | tavu 4 | … | tavu N-1 | tavu N |
---|---|---|---|---|---|---|
RA ,1 | RA ,0 | R A+1.1 | R A+1,0 | … | RA +Q-1.1 | RA +Q-1,0 |
Lippujen ja digitaalisten tulojen arvot lähetetään pakatussa muodossa: yksi bitti lippua kohden. Yksi tarkoittaa päällä, nolla tarkoittaa pois päältä. Pyydettyjen lippujen arvot täyttävät ensin ensimmäisen tavun, alkaen vähiten merkitsevästä bitistä, sitten seuraavat tavut, myös vähiten merkitsevästä bitistä merkittävimpiin. Ensimmäisen datatavun vähiten merkitsevä bitti sisältää "osoite"-kentässä määritellyn lipun arvon. Jos lippujen pyydetty määrä ei ole kahdeksan kerrannainen, ylimääräisten bittien arvot täytetään nolilla:
tavu 1 | … | tavu N | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
F A+7 | F A+6 | F A+5 | F A+4 | F A+3 | F A+2 | F A+1 | F A | … | 0 | … | 0 | F A+Q-1 | F A+Q-2 | … |
Komento koostuu elementin osoitteesta (2 tavua) ja asetusarvosta (2 tavua).
Omistusrekisterissä arvo on yksinkertaisesti 16-bittinen sana.
Lippujen kohdalla arvo 0xFF00 tarkoittaa päällä, 0x0000 tarkoittaa pois päältä, muut arvot ovat virheellisiä.
Jos komento onnistuu, orja palauttaa kopion pyynnöstä.
Useiden arvojen tallentaminenKomento koostuu elementin osoitteesta, muutettavien elementtien määrästä, lähetettävien asetusarvojen tavujen määrästä ja itse asetusarvoista. Tiedot pakataan samalla tavalla kuin datan lukukomennot.
Vastaus koostuu aloitusosoitteesta ja muuttuneiden elementtien määrästä.
Rekistereiden vaihtaminenKomento koostuu rekisterin osoitteesta ja kahdesta 16-bittisestä numerosta, joita käytetään maskeina, joita voidaan käyttää yksittäisten rekisterien yksittäisten bittien nollaamiseen tai asettamiseen. Lopputulos määräytyy kaavalla:
Tulos = ( Nykyinen_arvo AND Mask_AND ) TAI ( Mask_OR AND (EI Mask_AND ))
Lukeminen kirjoittamisen kanssaTämä toimintokoodi suorittaa yhden luku- ja yhden kirjoitustoiminnon yhdistelmän yhdessä Modbus-tapahtumassa.
TietojonotToiminto on suunniteltu vastaanottamaan 16-bittisiä sanoja FIFO - jonosta.
Tiedoston käyttöoikeusNäitä toimintoja käytetään pääsyyn 16-bittisiin rekistereihin, jotka on järjestetty mielivaltaisen pituisiksi tietueiksi. Komento määrittää tiedoston numeron, tietueen numeron ja tietueen pituuden 16-bittisillä sanoilla. Yhdellä komennolla voit kirjoittaa tai lukea useita tietueita, ei välttämättä vierekkäisiä.
Lisäksi komento sisältää yksitavuisen koodin, joka ilmaisee tietoviittauksen tyypin. Standardin nykyinen versio määrittelee vain yhden tyypin (kuvattu yllä) koodilla 0x06.
Alla luetellut toiminnot koskevat sarjajohtoisia laitteita (Modbus RTU ja Modbus ASCII).
Toiminto on tarkoitettu tiedon hankkimiseen etälaitteen tilailmaisimista. Funktio palauttaa yhden tavun, jonka jokainen bitti vastaa yhden indikaattorin tilaa.
Nämä toiminnot on suunniteltu testaamaan sarjalinkin toimivuutta.
Toiminto on tarkoitettu tiedon hankkimiseen laitetyypistä ja sen tilasta. Vastauksen muoto riippuu laitteesta.
Toiminto on suunniteltu siirtämään tietoja mielivaltaisissa muodoissa (muiden standardien määrittelemä) isännältä (asiakkaalta) orjalle (palvelimelle) ja päinvastoin.
Lähetettävän tiedon tyyppi määräytyy lisäkoodilla (MEI - Modbus Encapsulated Interface), joka lähetetään toimintonumeron jälkeen. Standardi määrittelee MEI 13:n (0x0D), joka on tarkoitettu CANopen -protokollan kapseloimiseen . MEI 14:tä (0x0E) käytetään laitetietojen hakemiseen, ja MEI:t välillä 0-12 ja 15-255 varataan.
Viestinnän aikana voi tapahtua kahdenlaisia virheitä:
Asynkronisten tietoliikennelinjojen kautta lähetettäessä ensimmäisen tyyppiset virheet havaitaan tarkistamalla vastaanotetun pyynnön yhteensopivuus vakiintuneen ADU-muodon kanssa ja laskemalla tarkistussumma. Lisäksi jokaisen merkin tarkistamiseen voidaan käyttää pariteettibittiä . Jos orja havaitsee tietojen vioittumisen, vastaanotettu pyyntö ohitetaan eikä vastausviestiä luoda. Isäntä voi havaita ei vastausta -virheen.
Modbus TCP ei tarjoa lisätietojen eheyden tarkistuksia. TCP/IP-protokollat tarjoavat vääristymättömän tiedonsiirron.
Toisen tyypin virheistä orjalaite lähettää virhesanoman (jos pyyntö on osoitettu tälle laitteelle; yleislähetyspyyntöihin ei lähetetä vastausta). Osoitus siitä, että vastaus sisältää virheilmoituksen, on funktion numeron asetettu korkea bitti. Toimintonumeroa seuraa virhekoodi ja tarvittaessa muita virhetietoja tavanomaisten tietojen sijaan.
Alla on esimerkki isäntäkomennosta ja orjavastauksista (Modbus RTU:lle).
Pyyntö | |||||||||||
Siirron suunta | orjalaitteen osoite | funktion numero | Osoite | Lippujen määrä | Datatavujen määrä | Data | CRC | ||||
---|---|---|---|---|---|---|---|---|---|---|---|
korkea tavu | matala tavu | korkea tavu | matala tavu | korkea tavu | matala tavu | matala tavu | korkea tavu | ||||
Asiakas → Palvelin | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x01 | 0x72 | 0xCB |
Vastaus | |||||||||||
Siirron suunta | orjalaitteen osoite | funktion numero | Osoite | Lippujen määrä | CRC | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
korkea tavu | matala tavu | korkea tavu | matala tavu | matala tavu | korkea tavu | ||||||
Palvelin→ Asiakas | 0x01 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x24 | 0x09 | |||
Virheviesti | |||||||||||
Siirron suunta | orjalaitteen osoite | funktion numero | virhekoodi | CRC | |||||||
matala tavu | korkea tavu | ||||||||||
Palvelin→ Asiakas | 0x01 | 0x8F | 0x02 | 0xC5 | 0xF1 |
UART | |||||||
---|---|---|---|---|---|---|---|
Fyysiset kerrokset |
| ||||||
Protokollat |
| ||||||
Käyttöalueet | |||||||
Toteutukset |
|