Ítarleg kennsla um greiningu á skilaboðum í Modbus samskiptareglum
I. Yfirlit yfir Modbus samskiptareglur
Modbus er raðsamskiptareglur sem Modicon (nú Schneider Electric) þróaði árið 1979 fyrir samskipti milli forritanlegra rökstýringa (PLC). Í meira en fjórum áratugum þróunar hefur það orðið ein af raunverulegum stöðluðum samskiptareglum á sviði iðnaðarsjálfvirkni.
Helstu eiginleikar:
- Master/Slave arkitektúr: Einn aðalhýsill með mörgum þrælum, þar sem aðalhýsillinn sendir beiðnir og þrælarnir svara óvirkt.
- Opin samskiptareglur: Engin leyfisgjöld; allir framleiðendur geta innleitt þær án endurgjalds.
- Margfeldi sendingarstillingar: RTU (tvíundarkóði), ASCII (texti), TCP (Ethernet).
- Styður ýmis efnisleg lög: RS485 (algengasta), RS232, TCP/IP (Ethernet).
- Skýrt gagnalíkan: Fjórar gerðir hluta – spólur, stakir inntak, inntaksskrár og haldskrár.
1.1 Samanburður á þremur afbrigðum samskiptareglna

1.2 Takmarkanir á forskrift samskiptareglna

II. Modbus gagnalíkan og heimilisfangsreglur
2.1 Fjórar gerðir af rekstrarhlutum

2.2 Heimilisfang (Mikilvægt!)
Mismunandi framleiðendur nota mismunandi kóðunarkerfi fyrir Modbus-vistföng, sem er algengasta gildran í hagnýtum útfærslum:

Merking forskeytis heimilisfangs (samkvæmt iðnaðarstaðli):
- Byrjar á 0: Samskiptareglur (sextándakerfi), t.d. 0x0000
- 4 xxxx: Viðhalda skrám; til dæmis, 40001 gefur til kynna samskiptaregluvistfang viðhaldsskrárinnar 0.
- 3xxxx: Inntaksskrá; t.d. 30001 gefur til kynna samskiptareglur inntaksskráar 0. ·
- 0xxxx: Spóla; t.d. 00001 gefur til kynna samskiptastað spólu 0. ·
- 1xxxx: Stakur inntak; t.d. 10001 gefur til kynna samskiptareglur fyrir stakan inntak 0.
2.3 Reglur um vinnslu stórra gagna
1.1. Hámarksfjöldi skráa sem lesnir eru í hverri aðgerð: 125 (virkniskóðar 0x03/0x04)
2.2. Hámarksfjöldi spóla/sérstakra inntaka sem lesin eru í hverri aðgerð: 2000 (virkniskóðar 0x01/0x02)
3.3. Hámarksfjöldi skráa sem skrifað er í í hverri aðgerð: 123 (virkniskóði 0x10)
4.4. Hámarksfjöldi spóla sem skrifað er í í hverri aðgerð: 1968 (virkniskóði 0x0F)
5.5. Að fara yfir þessi mörk krefst blokkabundinnar lesturs/skrifunar; tryggið að mismunandi könnunartímabil séu mismunandi til að forðast árekstur í rútunni.
III. Ítarleg greining á Modbus RTU skilaboðum
RTU (Remote Terminal Unit) er mest notaða tækið. Modbus flutningssamskiptareglur Í iðnaðarforritum, með því að nota tvíundakóðun fyrir mikla flutningsnýtingu og samhæfni við RS485/RS232 raðtengi. Lágmarks hljóðlátt bil upp á 3,5 stafi milli ramma er krafist til að greina á milli rammamörka.
3.1 Heildargrindarbygging RTU
Heill leiðbeiningargagnarammi í RTU samanstendur af eftirfarandi fjórum hlutum:

3.2 Dæmi um RTU skilaboð – Lesa geymsluskrár (virkniskóði 0x03)
[Beiðni um skilaboð] Skiptistýringin les geymsluskrár þræls 1 (upphafsvistfang 0x0001, les 3 skrár):
01 03 00 01 00 03 54 0B
Bæti-fyrir-bæti greining á beiðniskilaboðunum:

[Svarskilaboð] Þjónustustöð 1 skilar gögnum úr þremur skrám: 01,03,06,02,2B,00,00,00,64, D5, 87
Bæti-fyrir-bæti greining á svarskilaboðunum:

3.3 Ítarleg útskýring á stöðluðum virknikóðum

3.4 Ítarleg lýsing á hverju skilaboðasniði fyrir virknikóða
(1) Lesa spólu / Lesa stakan inntak (virkniskóðar 0x01/0x02)
[Beiðni um rammaform] (8 bæti samtals)

[Snið svarramma]

[Dæmi um staðsetningargreiningu] Svargögnin samanstanda af 3 bætum (spólum 20–38):

(2) Lesa geymsluskrá/lesa inntaksskrá (virkniskóði 0x03/0x04)
[Beiðni um rammaform] (8 bæti samtals)

[Snið svarramma]

(3) Skrifaðu eina haldskrá (virkniskóði 0x06)
[Snið beiðniramma] (samtals 8 bæti)

[Svarrammi] Eins og beiðniramminn staðfestir hann að skrif hafi tekist.
(4) Skrifa margar viðhaldsskrár (virkniskóði 0x10)
[Beiðni um rammasnið]

[Snið svarramma] (8 bæti samtals): [Veffang][0x10][Upphafsfang (2 bæti)][Númer (2 bæti)][CRC (2 bæti)]
(5) Skrifaðu eina spólu (virkniskóði: 0x05)
[Snið beiðniramma] (8 bæti samtals): Aðeins tvö gild gildi eru studd til skrifunar:
- 0xFF00 – Spóla stillt á ON (lokuð)
- 0x0000 – Spólan er stillt á SLÖKKT (opin)

[Svarrammi] Eins og beiðniramminn staðfestir hann að skrif hafi tekist.
IV. Ítarleg greining á Modbus TCP skilaboðum
Modbus TCP virkar yfir Ethernet TCP/IP samskiptareglurnar og notar sjálfgefið tengi 502. Ólíkt RTU stillingu notar Modbus TCP MBAP (Modbus Application Protocol) haus til að skilgreina skilaboðamörk og krefst ekki CRC staðfestingar (í staðinn treystir það á innbyggða villuleitarkerfi TCP samskiptareglnanna).
4.1 MBAP hausbygging (7 bæti, innifalin í öllum TCP-pökkum)

4.2 Dæmi um Modbus TCP skilaboð
[Beiðni um skilaboð] Les biðskrá Slave 1 (upphafsvistfang 0x0000, les 3 gildi):
00 01 00 00 00 06 01 03 00 00 00 03
Greining á beiðniskilaboðunum, reit fyrir reit:

[Svarskilaboð] Þrællinn skilar gögnum úr þremur skrám:
00 01 00 00 00 09 01 03 06 02 2B 00 00 00 64
Reit-fyrir-reit greining á svarskilaboðunum:

4.3 Helstu munur á RTU og TCP pakkabyggingum

V. Ítarleg útskýring á CRC-16 staðfestingu
Reikniritið CRC (Cyclic Redundancy Check) er rammastaðfestingarkerfi Modbus RTU, hannað til að greina villur við skilaboðasendingu. Margliðan sem myndar CRC-16 er x¹⁶ + x¹⁵ + x² + 1 (jafngildir 0x8005); í reynd er notað öfug margliða 0xA001.
5.1 Útreikningsskref CRC-16
6.1. Frumstilla 16-bita CRC skrána í 0xFFFF
7.2. Framkvæma XOR aðgerð á milli fyrsta bætisins og neðri 8 bita CRC skrárinnar; vista niðurstöðuna aftur í neðri 8 bita CRC skrárinnar.
8.3. Færið CRC-skrána til hægri um 1 bita, fyllið háu bitana með 0; ákvarðið útfærðan bitann (LSB):
9.4. Ef útfærði bitinn er 0: Haltu áfram að færa til hægri um aðeins 1 bita
10.5. Ef útfærsla bitans er 1: Framkvæmið XOR aðgerð milli CRC skrárinnar og 0xA001
11.6. Endurtakið skref 3 þar til vinnslu allra 8 bitanna í núverandi bæti er lokið.
12.7. Taktu næsta bæti og endurtaktu skref 2–6 þar til öll bæti hafa verið unnin. 13.8. Eftir að öllum bætavinnslu er lokið skal skipta um háa og lága bæti CRC-skrárinnar til að fá lokaprófunarsummu.
14.9. Bætið lokaprófunarsummunni við aftan á skilaboðunum, með lægsta bætinu fyrst og háa bætinu síðast.
5.2 Dæmi um CRC-16 útreikning (Python kóði)
Eftirfarandi Python fall er hægt að nota beint til að reikna CRC-16 eftirlitssummu fyrir Modbus RTU:
def modbus_crc16(gögn: bæti) -> bæti:
"telja Modbus RTU CRC-16 athugakóða (skila fyrstu tveimur bætunum með minnsta marktæka bitann fyrst)"""
crc = 0xFFFF
fyrir bæti í gögnum:
crc ^= bæti
fyrir _ innan bilsins (8):
ef crc & 0x0001:
crc = (crc >> 1) ^ 0xA001
annað:
crc >>= 1
# Skila fyrst lága bætinu, síðan háa bætinu
skila bæti ([crc & 0xFF, (crc >> 8) & 0xFF])
# Gefðu dæmigerð dæmi: teljari 01 03 00 01 00 03 CRC
rammi = bæti([0x01, 0x03, 0x00, 0x01, 0x00, 0x03])
crc = modbus_crc16(rammi)
prenta(crc.hex()) # útflutningur: 540b (0x54 0x0B)
5.3 Staðsetning CRC-skráningar í skilaboðunum
Með því að nota beiðniskilaboðin 01 03 00 01 00 03 54 0B sem dæmi:

Móttakandinn endurreikni CRC gildi fyrstu 6 bætanna og ber það saman við síðustu 2 bæti pakkans. Ef þau eru ólík greinist sendingarvilla og ekkert svar er skilað.
Ⅵ. Meðhöndlun undantekninga og upplýsingar um villukóða
Þegar undirstöð getur ekki framkvæmt beiðni frá aðalstöðinni (t.d. vegna óstuddra virknikóða eða vistfangs utan sviðs), skilar hún undantekningarsvarramma. Undantekningarsvarsfallskóðinn er = upprunalegur virknikóði + 0x80 (þ.e. hæsti bitinn er stilltur á 1).
6.1 Óeðlilegt svarssnið (RTU)
[Þjónustufang][Virknikóði | 0x80][Óeðlilegur kóði][CRC-16]

6.2 Merking staðlaðra undantekningarkóða

6.3 Dæmi um óeðlilega svörun
[Aðstæður] Aðalstöðin biður um að lesa skrá á ógilt vistfang frá undirstöð 1 og undirstöðin skilar undantekningu:
Beiðni: 01 03 00 20 00 01 XX XX (les skrá á vistfanginu 0x0020);
Undantekningasvar: 01 83 02 C0 F1;
Sundurliðun á undantekningarsvarinu, bæti fyrir bæti:

VI. Inngangur að Modbus ASCII skilaboðum
Modbus ASCII stillingin kóðar öll gagnabæti sem tvö ASCII stafi (t.d. er 0x0F kóðað sem "0F"). Þótt hún sé mjög læsileg býður hún upp á litla flutningsnýtni og er aðallega notuð til villuleitar.
7.1 ASCII rammauppbygging
Heill ASCII rammasnið:

7.2 LRC staðfestingarreiknirit
Skref til að reikna út LRC (lengdarafritunarprófun):
15.1. Framkvæmið tvíundasummu á öllum bætum í vistfangsreitnum, fallkóðanum og gagnareitnum (að undanskildum upphafs- og endamerkjum).
16.2. Hunsa flutningsbita (ef niðurstaðan fer yfir 255, vefjast sjálfkrafa utan um og halda aðeins neðri 8 bitunum eftir).
17.3. Reiknið út viðbót summuniðurstöðunnar modulo 1 (þ.e. 0xFF − summa).
18.4. Aukið viðbótina um 1 til að fá loka LRC-prófunarkóðann (1 bæti).
19.5. Kóðaðu LRC-prófunarkóðann sem tvo ASCII-tákn og bættu þeim við aftan á skilaboðunum.
VIII. Hagnýt ráð og algeng vandamál
8.1 Vandamál með bætiröð (Big-Endian/Micro-endian)
Hinn Modbus staðall notar big-endian röð (þar sem bætið af hærri röð kemur fyrst) til að senda 16 bita eða lengri gögn. Sum tæki (t.d. ákveðin ARM-byggð tæki) nota micro-endian röð; umbreyting á bætaröð er nauðsynleg til að forðast tölulegar greiningarvillur.

8.2 Stærðartakmörk skráningareiningar (PDU ≤ 253 bæti)

8.3 Tillögur um tímamörk samskipta og endurtekningarstillingar
Ráðlagðar stillingar:
- Könnunarbil: Stillt á 2–3 sinnum hámarkssvarstíma þrælsins (venjulega 100–500 ms) • Tímamörk: Ráðlagt bil er 1000–3000 ms, stillanlegt út frá svarshraða þrælsins
- Endurteknar tilraunir: Ráðlagður hámarksfjöldi er 3; viðvörun gefin ef mistekst
- Fjölþrælakönnun: Skipuleggðu mismunandi könnunartímabil milli þræla til að koma í veg fyrir strætóárekstra • Bætitími: Í RTU-ham er stafabil sem er lengra en 1,5 stafir talið rammavilla
8.4 Ráðlögð verkfæri til að fjarlægja villur
Viðauki: Tafla yfir algeng skilaboð
Lesa spólu (virkniskóði 0x01)
[Beiðni]: Lesið frá undirstöð 1 á upphafsfangi 0 (spóla 1), fáið 8 stöðuskilaboð um spóluna: 01 01 00 00 00 08 3D CC
[Svar]: Átta spólustöður: 0x55 (01010101B);
Skilaboð: 01 01 01 55 94 36
Skrifa á eina spólu (virkniskóði 0x05)
[Beiðni] Stilla spólu á heimilisfangi 0 á ON (skrifgildi 0xFF00):
Skilaboð: 01 05 00 00 FF 00 8C 3A
[Beiðni] Stilla spólu á heimilisfangi 0 á SLÖKKT (skrifgildi 0x0000):
Skilaboð: 01 05 00 00 00 00 CD CA
[Svar] Eins og beiðniramminn
Skrifa í eina skrá (virkniskóði 0x06):
[Beiðni] Skrifaðu gildið 0x1234 til að skrá á vistfang 0.
Skilaboð: 01 06 00 00 12 34 XX XX (XX er CRC, á eftir að reikna út).
[Svar] Eins og beiðniramminn.
Skrifa í margar skrár (virkniskóði 0x10)
[Beiðni]: Skrifa í tvær skrár sem byrja á vistfangi 0 með gildunum 0x1234 og 0xABCD, talið í sömu röð.
Skilaboð: 01 10 00 00 00 02 04 12 34 AB CD XX XX
[Svar]: Skila upphafsvistfangi og fjölda skrifaðra skráa.
Skilaboð: 01 10 00 00 00 02 41 C8
Lesa inntaksskrár (virkniskóði 0x04)
[Beiðni]: Lesið frá þræli 1 á upphafsfangi 0, lesið tvö inntaksskrár
skilaboð: 01 04 00 00 00 02 71 CB
[Svar]: Skila tveimur inntaksgildum
skilaboð: 01 04 04 00 64 01 90 XX XX (Skilagildi: 100 og 400)










