Leave Your Message
Kategoritë e lajmeve
Lajme të Veçanta

Tutorial i detajuar mbi analizimin e mesazheve të protokollit të komunikimit Modbus

2026-06-24

    I. Përmbledhje e Protokollit Modbus

    Modbus është një protokoll komunikimi serial i zhvilluar nga Modicon (tani Schneider Electric) në vitin 1979 për komunikim midis kontrolluesve logjikë të programueshëm (PLC). Gjatë më shumë se katër dekadave të evolucionit, ai është bërë një nga protokollet standarde të komunikimit de facto në fushën e automatizimit industrial.

    Karakteristikat kryesore:

    • Arkitektura Master/Slave: Një host i vetëm master me skllevër të shumtë, ku masteri inicion kërkesat dhe skllevërit përgjigjen në mënyrë pasive.
    • Protokoll i hapur: Pa tarifa licencimi; çdo prodhues mund ta zbatojë atë pa pagesë.
    • Mënyra të shumëfishta transmetimi: RTU (binare), ASCII (tekst), TCP (Ethernet).
    • Mbështet shtresa të ndryshme fizike: RS485 (më e zakonshmja), RS232, TCP/IP (Ethernet).
    • Model i qartë i të dhënave: Katër lloje objektesh - spirale, hyrje diskrete, regjistra hyrjeje dhe regjistra mbajtës.

    1.1 Krahasimi i tre varianteve të protokollit

    1-1.jpg

    1.2 Kufizimet e Specifikimit të Protokollit

    1-2.jpg

    II. Modeli i të Dhënave dhe Rregullat e Adresës Modbus

    2.1 Katër Lloje të Objekteve Operacionale

    2-1.jpg

    2.2 Përfaqësimi i adresës (Kritik!)

    Prodhues të ndryshëm përdorin skema të ndryshme kodimi për Adresat Modbus, e cila është kurthi më i zakonshëm në zbatimet praktike:

    2-2.jpg

    Kuptimi i prefiksit të adresës (përfaqësimi standard i industrisë):

    • Duke filluar me 0: Adresa e protokollit (heksadecimal), p.sh., 0x0000
    • 4 xxxx: Regjistrat e mirëmbajtjes; për shembull, 40001 tregon adresën e protokollit të regjistrit të mirëmbajtjes 0.
    • 3xxxx: Regjistri i hyrjes; p.sh., 30001 tregon adresën e protokollit të regjistrit të hyrjes 0. ·
    • 0xxxx: Bobina; p.sh., 00001 tregon adresën e protokollit të bobinës 0. ·
    • 1xxxx: Hyrje diskrete; p.sh., 10001 tregon adresën e protokollit të hyrjes diskrete 0.

    2.3 Rregullat e Përpunimit të të Dhënave të Mëdha

    1.1. Numri maksimal i regjistrave të lexuar për operacion: 125 (kodet e funksionit 0x03/0x04)

    2.2. Numri maksimal i spiraleve/hyrjeve diskrete të lexuara për operacion: 2000 (kodet e funksionit 0x01/0x02)

    3.3. Numri maksimal i regjistrave të shkruar për operacion: 123 (kodi i funksionit 0x10)

    4.4. Numri maksimal i spiraleve të shkruara për operacion: 1968 (kodi i funksionit 0x0F)

    5.5. Tejkalimi i këtyre kufijve kërkon lexim/shkrim të bazuar në bllok; sigurohuni që intervalet e votimit të jenë të shkallëzuara për të shmangur konfliktet e autobusëve.

    III. Analizë e detajuar e mesazheve Modbus RTU

    RTU (Njësia e Terminalit në Distancë) është më e përdorura gjerësisht. Protokolli i transmetimit Modbus Në aplikimet industriale, duke përdorur kodim binar për efikasitet të lartë transmetimi dhe pajtueshmëri me ndërfaqet seriale RS485/RS232. Një interval minimal heshtjeje prej 3.5 karakteresh midis kornizave kërkohet për të dalluar kufijtë e kornizave.

    3.1 Struktura e plotë e kornizës së RTU-së

    Një kornizë e plotë e të dhënave të udhëzimeve në një RTU përbëhet nga katër pjesët e mëposhtme:

    3-1.jpg

    3.2 Shembull Mesazhi RTU – Leximi i Regjistrave të Mbajtjes (Kodi i Funksionit 0x03)

    [Mesazh Kërkese] Masteri lexon regjistrat mbajtës të Slave 1 (adresa fillestare 0x0001, duke lexuar 3 regjistra):

    01 03 00 01 00 03 54 0B

    Analiza bajt-për-bajt e mesazhit të kërkesës:

    3-2.jpg

    [Mesazh Përgjigjeje] Stacioni Slave 1 kthen të dhëna nga tre regjistra: 01,03,06,02,2B,00,00,00,64, D5, 87

    Analizimi bajt-për-bajt i mesazhit të përgjigjes:

    3-2-1.jpg

    3.3 Shpjegim i detajuar i kodeve standarde të funksioneve

    3-3.jpg

    3.4 Përshkrim i detajuar i çdo formati mesazhi të kodit të funksionit

    (1) Leximi i Bobinës / Leximi i Hyrjes Diskrete (Kodet e Funksionit 0x01/0x02)

    [Formati i Kornizës së Kërkesës] (8 bajt në total)

    3-4-1.jpg

    [Formati i Kornizës së Përgjigjes]

    3-4-2.jpg

    [Shembull i analizës së pozicionit] Të dhënat e përgjigjes përbëhen nga 3 bajt (mbështjellëset 20–38):

    3-4-3.jpg

    (2)Leximi i Regjistrit të Mbajtjes/Leximi i Regjistrit të Hyrjes (Kodi i Funksionit 0x03/0x04)

    [Formati i Kornizës së Kërkesës] (8 bajt në total)

    3-4-4.jpg

    [Formati i Kornizës së Përgjigjes]

    3-4-5.jpg

    (3) Shkruaj një regjistër të vetëm mbajtës (kodi i funksionit 0x06)

    [Formati i kornizës së kërkesës] (gjithsej 8 bajt)

    3-4-6.jpg

    [Korniza e Përgjigjes] Identike me kornizën e kërkesës, ajo konfirmon shkrimin e suksesshëm.

    (4) Shkruaj regjistra të shumtë mirëmbajtjeje (kodi i funksionit 0x10)

    [Kërko Formatin e Kornizës]

    3-4-7.jpg

    [Formati i Kornizës së Përgjigjes] (8 bajt gjithsej): [Adresa][0x10][Adresa Fillestare (2 bajt)][Numri (2 bajt)][CRC (2 bajt)]

    (5) Shkruani një bobinë të vetme (Kodi i Funksionit: 0x05)

    [Formati i Kornizës së Kërkesës] (8 bajt gjithsej): Mbështeten vetëm dy vlera të vlefshme për shkrim:

    • 0xFF00 – Bobina e vendosur në pozicionin ON (e mbyllur)
    • 0x0000 – Bobina e vendosur në pozicionin OFF (e hapur)

    3-4-8.jpg

    [Korniza e Përgjigjes] Identike me kornizën e kërkesës, ajo konfirmon shkrimin e suksesshëm.

    IV. Analizë e detajuar e mesazheve TCP të Modbus

    Modbus TCP operon mbi protokollin Ethernet TCP/IP, duke përdorur portin 502 si parazgjedhje. Ndryshe nga modaliteti RTU, Modbus TCP përdor një kokë MBAP (Modbus Application Protocol) për të përcaktuar kufijtë e mesazheve dhe nuk kërkon verifikim CRC (në vend të kësaj mbështetet në mekanizmin e integruar të kontrollit të gabimeve të protokollit TCP).

    4.1 Struktura e kokës MBAP (7 bajt, e përfshirë në të gjitha paketat TCP)

    4-1.jpg

    4.2 Shembull i Mesazhit TCP të Modbus

    [Mesazh Kërkese] Duke lexuar regjistrin e mbajtjes së Slave 1 (adresa fillestare 0x0000, duke lexuar 3 vlera):

    00 01 00 00 00 06 01 03 00 00 00 03

    Analiza fushë për fushë e mesazhit të kërkesës:

    4-2.jpg

    [Mesazh Përgjigjeje] Skllavi kthen të dhëna nga tre regjistra:

    00 01 00 00 00 09 01 03 06 02 2B 00 00 00 64

    Analizimi fushë-për-fushë i mesazhit të përgjigjes:

    4-3.jpg

    4.3 Dallimet kryesore midis strukturave të paketave RTU dhe TCP

    4-3-0.jpg

    V. Shpjegim i detajuar i verifikimit CRC-16

    Algoritmi CRC (Kontrolli Ciklik i Redundancës) është mekanizmi i verifikimit të kuadrove të Modbus RTU-ve, i projektuar për të zbuluar gabimet gjatë transmetimit të mesazhit. Polinomi gjenerues i CRC-16 është x¹⁶ + x¹⁵ + x² + 1 (ekuivalent me 0x8005); në praktikë, përdoret polinomi i përmbysur 0xA001.
    5.1 Hapat e llogaritjes së CRC-16

    6.1. Inicializoni regjistrin CRC 16-bitësh në 0xFFFF

    7.2. Kryeni një operacion XOR midis bajtit të parë dhe 8 bitëve më të ulët të regjistrit CRC; ruani rezultatin përsëri në 8 bitët më të ulët të regjistrit CRC.

    8.3. Zhvendosni regjistrin CRC djathtas me 1 bit, duke i mbushur bitet e larta me 0; përcaktoni bitin e zhvendosur jashtë (LSB):

    9.4. Nëse biti i zhvendosur jashtë është 0: Vazhdoni zhvendosjen djathtas vetëm me 1 bit

    10.5. Nëse biti i zhvendosur jashtë është 1: Kryeni një operacion XOR midis regjistrit CRC dhe 0xA001

    11.6. Përsëriteni hapin 3 derisa të përfundojë përpunimi i të 8 bitëve të bajtit aktual.

    12.7. Merrni bajtin tjetër dhe përsëritni hapat 2–6 derisa të jenë përpunuar të gjithë bajtet. 13.8. Pasi të keni përfunduar të gjithë përpunimin e bajteve, ndërroni bajtet e nivelit të lartë dhe të ulët të regjistrit CRC për të marrë shumën përfundimtare të kontrollit.

    14.9. Vendosni shumën përfundimtare të kontrollit në fund të mesazhit, duke vendosur bajtin më të ulët të parin dhe bajtin më të lartë të fundit.

    5.2 Shembull Llogaritjeje CRC-16 (Kodi Python)

    Funksioni i mëposhtëm Python mund të përdoret drejtpërdrejt për të llogaritur shumën e kontrollit CRC-16 për një Modbus RTU:

    def modbus_crc16(të dhëna: bajt) -> bajt:
    """kodi i kontrollit të numërimit të Modbus RTU CRC-16 (Kthen dy bajtet e para me bitin më pak të rëndësishëm të parët)"""
    crc = 0xFFFF
    për bajt në të dhëna:
    crc ^= bajt
    për _ në diapazonin(8):
    nëse crc & 0x0001:
    crc = (crc >> 1) ^ 0xA001
    tjetër:
    krc >>= 1
    # Kthe bajtin e poshtëm së pari, i ndjekur nga bajtin e sipërm
    kthen bajt([crc & 0xFF, (crc >> 8) & 0xFF])
    # jepni shembuj tipikë: numërimi 01 03 00 01 00 03 CRC
    kornizë = bajt([0x01, 0x03, 0x00, 0x01, 0x00, 0x03])
    crc = modbus_crc16(kornizë)
    print(crc.hex()) # eksport:540b(0x54 0x0B)

    5.3 Vendndodhja e CRC Check in the Message

    Duke përdorur mesazhin e kërkesës 01 03 00 01 00 03 54 0B si shembull:

    5-3.jpg

    Marrësi rillogarit vlerën CRC të 6 bajteve të parë dhe e krahason atë me 2 bajtet e fundit të paketës. Nëse ato ndryshojnë, zbulohet një gabim transmetimi dhe nuk kthehet asnjë përgjigje.

    Trajtimi i përjashtimeve dhe detajet e kodit të gabimit

    Kur një stacion vartës nuk mund të ekzekutojë një kërkesë nga stacioni kryesor (p.sh., për shkak të kodeve të funksioneve të pambështetura ose adresës jashtë diapazonit), ai kthen një kornizë përgjigjeje përjashtimi. Kodi i funksionit të përgjigjes së përjashtimit është = kodi origjinal i funksionit + 0x80 (dmth., biti më i lartë është vendosur në 1).

    6.1 Formati i Përgjigjes Jonormale (RTU)

    [Adresa e Skllavit][Kodi i Funksionit | 0x80][Kodi Jonormal][CRC-16]

    6-1.jpg

    6.2 Kuptimi i Kodeve Standarde të Përjashtimit

    6-2.jpg

    6.3 Shembull i Përgjigjes Jonormale

    [Skenari] Stacioni kryesor kërkon të lexojë një regjistër në një adresë të pavlefshme nga stacioni skllav 1, dhe stacioni skllav kthen një përjashtim:

    Kërkesë: 01 03 00 20 00 01 XX XX (regjistri i leximit në adresën 0x0020);

    Përgjigja e përjashtimit: 01 83 02 C0 F1;

    Ndarja bajt për bajt e përgjigjes së përjashtimit:

    6-3.jpg

    VI. Hyrje në Mesazhet ASCII të Modbus

    Modaliteti Modbus ASCII kodon të gjitha bajtet e të dhënave si dy karaktere ASCII (p.sh., 0x0F është koduar si "0F"). Ndërsa është shumë i lexueshëm, ofron efikasitet të ulët transmetimi dhe përdoret kryesisht për qëllime debugging.

    7.1 Struktura e Kornizës ASCII

    Formati i plotë i kornizës ASCII:

    CR LF

    7-1.jpg

    7.2 Algoritmi i Verifikimit LRC

    Hapat për llogaritjen e LRC (Kontrolli i Redundancës Gjatësore):

    15.1. Kryeni përmbledhje binare në të gjitha bajtet e fushës së adresës, kodit të funksionit dhe fushës së të dhënave (duke përjashtuar shënuesit e fillimit dhe mbarimit).

    16.2. Injoroni bitët e mbartur (nëse rezultati tejkalon 255, mbështillni automatikisht dhe mbani vetëm 8 bitët e poshtëm).

    17.3. Llogaritni komplementin e rezultatit të shumëzimit modulo 1 (domethënë, 0xFF − shumë).

    18.4. Rritni komplementin me 1 për të marrë kodin përfundimtar të kontrollit LRC (1 bajt).

    19.5. Kodimizoni kodin e kontrollit LRC si dy karaktere ASCII dhe shtojini ato në fund të mesazhit.

    VIII. Këshilla praktike dhe çështje të zakonshme

    8.1 Probleme me Renditjen e Bajteve (Big-Endian/Micro-endian)

    I/E/Të/Të Standardi Modbus përdor rendin big-endian (me bajtin e rendit më të lartë të parin) për transmetimin e të dhënave 16-bit ose më të gjata. Disa pajisje (p.sh., disa pajisje të bazuara në ARM) përdorin rendin mikro-endian; konvertimi i rendit të bajteve është i nevojshëm për të shmangur gabimet numerike të analizimit.

    8-1.jpg

    8.2 Limiti i Madhësisë së Njësisë së Regjistrimit (PDU ≤ 253 bajt)

    8-2.jpg

    8.3 Rekomandime për Konfigurimin e Skadimit të Komunikimit dhe Ripërpjekjes

    Konfigurimet e rekomanduara:

    • Intervali i sondazhit: Vendoset në 2–3 herë kohën maksimale të përgjigjes së skllavit (zakonisht 100–500 ms) • Kohëzgjatja e skadimit: Diapazoni i rekomanduar prej 1000–3000 ms, i rregullueshëm bazuar në shpejtësinë e përgjigjes së skllavit
    • Përpjekje për riprovim: Limiti i rekomanduar prej 3; aktivizoni një alarm nëse dështoni
    • Sondazh me shumë skllevër: Planifikoni intervale të shpërndara të sondazhit midis skllevërve për të parandaluar konfliktet e autobusit • Kohëzgjatja e bajtit: Në modalitetin RTU, një interval karakteri që tejkalon kohën e 1.5 karaktereve konsiderohet gabim kornize

    8.4 Mjete të Rekomanduara për Debugging

    Shtojca: Tabela e Referencës së Shpejtë të Mesazheve të Zakonshme

    Leximi i spirales (Kodi i Funksionit 0x01)

    [Kërkesë]: Lexohet nga stacioni skllav 1 në adresën fillestare 0 (bobina 1), merren 8 mesazhe të statusit të bobinës: 01 01 00 00 00 08 3D CC

    [Përgjigje]: Tetë statuse bobinash: 0x55 (01010101B);

    Mesazhi: 01 01 01 55 94 36

     

    Shkrimi në një bobinë të vetme (Kodi i Funksionit 0x05)

    [Kërkesë] Vendos bobinën në adresën 0 në ON (vlera e shkrimit 0xFF00):

    Mesazhi: 01 05 00 00 FF 00 8C 3A

    [Kërkesë] Vendos bobinën në adresën 0 në OFF (vlera e shkrimit 0x0000):

    Mesazhi: 01 05 00 00 00 00 CD CA

    [Përgjigje] Identike me kornizën e kërkesës

     

    Shkruaj në një regjistër të vetëm (Kodi i Funksionit 0x06):

    [Kërkesë] Shkruani vlerën 0x1234 për t'u regjistruar në adresën 0.

    Mesazhi: 01 06 00 00 12 34 XX XX (XX është CRC, do të llogaritet).

    [Përgjigje] Identike me kornizën e kërkesës.

     

    Shkrimi në regjistra të shumtë (Kodi i Funksionit 0x10)

    [Kërkesë]: Shkruaj në dy regjistra duke filluar nga adresa 0 me vlera përkatësisht 0x1234 dhe 0xABCD.

    Mesazhi: 01 10 00 00 00 02 04 12 34 AB CD XX XX

    [Përgjigje]: Kthen adresën fillestare dhe numrin e regjistrave të shkruar.

    Mesazhi: 01 10 00 00 00 02 41 C8

     

    Leximi i regjistrave të hyrjes (kodi i funksionit 0x04)

    [Kërkesë]: Lexim nga skllavi 1 në adresën fillestare 0, duke lexuar dy regjistra hyrës

    mesazhe: 01 04 00 00 00 02 71 CB

    [Përgjigje]: Kthen dy vlera të regjistrit hyrës

    mesazhet: 01 04 04 00 64 01 90 XX XX (Vlerat e kthimit: 100 dhe 400)