Leave Your Message

Detalyadong Tutorial sa Pagsusuri ng mga Mensahe ng Modbus Communication Protocol

2026-06-24

    I. Pangkalahatang-ideya ng Modbus Protocol

    Modbus ay isang serial communication protocol na binuo ng Modicon (ngayon ay Schneider Electric) noong 1979 para sa komunikasyon sa pagitan ng mga programmable logic controller (PLC). Sa mahigit apat na dekada ng ebolusyon, ito ay naging isa sa mga de facto standard na protocol ng komunikasyon sa larangan ng industrial automation.

    Mga Pangunahing Tampok:

    • Arkitektura ng Master/Slave: Isang master host na may maraming slave, kung saan ang master ang nagsisimula ng mga kahilingan at ang mga slave ay pasibong tumutugon.
    • Bukas na protokol: Walang bayad sa paglilisensya; maaaring ipatupad ito nang libre ng sinumang tagagawa.
    • Maramihang mga mode ng transmisyon: RTU (binary), ASCII (teksto), TCP (Ethernet).
    • Sinusuportahan ang iba't ibang pisikal na layer: RS485 (pinakakaraniwan), RS232, TCP/IP (Ethernet).
    • Modelo ng malinaw na datos: Apat na uri ng bagay – mga coil, mga discrete input, mga input register, at mga hold register.

    1.1 Paghahambing ng Tatlong Baryante ng Protokol

    1-1.jpg

    1.2 Mga Limitasyon sa Espesipikasyon ng Protokol

    1-2.jpg

    II.Modelo ng Datos ng Modbus at Mga Panuntunan sa Address

    2.1 Apat na Uri ng mga Bagay na Operasyonal

    2-1.jpg

    2.2 Representasyon ng Address (Kritikal!)

    Ang iba't ibang tagagawa ay gumagamit ng iba't ibang mga pamamaraan ng pag-encode para sa Mga address ng Modbus, na siyang pinakakaraniwang patibong sa mga praktikal na implementasyon:

    2-2.jpg

    Kahulugan ng unlapi ng address (representasyon ayon sa pamantayan ng industriya):

    • Simula sa 0: Address ng protocol (hexadecimal), hal., 0x0000
    • 4 xxxx: Panatilihin ang mga rehistro; halimbawa, ang 40001 ay nagpapahiwatig ng protocol address ng maintain register na 0.
    • 3xxxx: Rehistro ng input; hal., ang 30001 ay nagpapahiwatig ng protocol address ng input register na 0. ·
    • 0xxxx: Coil; hal., ang 00001 ay nagpapahiwatig ng protocol address ng coil 0. ·
    • 1xxxx: Discrete input; hal., ang 10001 ay nagpapahiwatig ng protocol address ng discrete input na 0.

    2.3 Mga Panuntunan sa Pagproseso ng Malaking Datos

    1.1. Pinakamataas na bilang ng mga rehistrong nababasa bawat operasyon: 125 (mga function code na 0x03/0x04)

    2.2. Pinakamataas na bilang ng mga coil/discrete input na nababasa bawat operasyon: 2000 (mga function code na 0x01/0x02)

    3.3. Pinakamataas na bilang ng mga rehistrong pinagsusulatan bawat operasyon: 123 (function code 0x10)

    4.4. Pinakamataas na bilang ng mga coil na naisulat sa bawat operasyon: 1968 (function code 0x0F)

    5.5. Ang paglampas sa mga limitasyong ito ay nangangailangan ng pagbasa/pagsulat batay sa bloke; tiyakin ang staggered polling intervals upang maiwasan ang mga conflict sa bus

    III. Detalyadong Pagsusuri ng mga Mensahe ng Modbus RTU

    Ang RTU (Remote Terminal Unit) ang pinakamalawak na ginagamit Protokol ng transmisyon ng Modbus sa mga aplikasyong pang-industriya, gumagamit ng binary encoding para sa mataas na kahusayan sa transmisyon at pagiging tugma sa mga serial interface ng RS485/RS232. Kinakailangan ang minimum na silent interval na 3.5 character time sa pagitan ng mga frame upang makilala ang mga hangganan ng frame.

    3.1 Kumpletong Istruktura ng Balangkas ng RTU

    Ang isang kumpletong instruction data frame sa isang RTU ay binubuo ng sumusunod na apat na bahagi:

    3-1.jpg

    3.2 Halimbawa ng Mensahe ng RTU – Pagbasa ng mga Holding Register (Function Code 0x03)

    [Humiling ng Mensahe] Binabasa ng master ang mga holding register ng Slave 1 (panimulang address na 0x0001, nagbabasa ng 3 register):

    01 03 00 01 00 03 54 0B

    Pagsusuri ng byte-by-byte ng mensahe ng kahilingan:

    3-2.jpg

    [Mensahe ng Tugon] Ang Slave Station 1 ay nagbabalik ng datos mula sa tatlong rehistro: 01,03,06,02,2B,00,00,00,64, D5, 87

    Pag-parse ng byte-by-byte ng mensahe ng tugon:

    3-2-1.jpg

    3.3 Detalyadong Paliwanag ng mga Standard Function Code

    3-3.jpg

    3.4 Detalyadong Paglalarawan ng Bawat Format ng Mensahe ng Function Code

    (1) Basahin ang Coil / Basahin ang Discrete Input (Mga Function Code 0x01/0x02)

    [Humiling ng Format ng Frame] (8 byte sa kabuuan)

    3-4-1.jpg

    [Format ng Balangkas ng Tugon]

    3-4-2.jpg

    [Halimbawa ng pagsusuri ng posisyon] Ang datos ng tugon ay binubuo ng 3 byte (mga coil 20–38):

    3-4-3.jpg

    (2)Basahin ang Rehistro ng Hawak/Basahin ang Rehistro ng Input (Kodigo ng Tungkulin 0x03/0x04)

    [Humiling ng Format ng Frame] (8 byte sa kabuuan)

    3-4-4.jpg

    [Format ng Balangkas ng Tugon]

    3-4-5.jpg

    (3)Sumulat ng isang single hold register (function code na 0x06)

    [Humiling ng format ng frame] (kabuuang 8 bytes)

    3-4-6.jpg

    [Response Frame] Kapareho ng request frame, kinukumpirma nito ang matagumpay na pagsusulat.

    (4)Sumulat ng maramihang maintenance registers (function code 0x10)

    [Humiling ng Format ng Frame]

    3-4-7.jpg

    [Format ng Response Frame] (8 byte sa kabuuan): [Address][0x10][Simulang Address (2 byte)][Numero (2 byte)][CRC (2 byte)]

    (5)Sumulat ng isang single coil (Function Code: 0x05)

    [Humiling ng Format ng Frame] (8 byte sa kabuuan): Dalawang wastong halaga lamang ang sinusuportahan para sa pagsusulat:

    • 0xFF00 – Nakatakda ang coil sa ON (sarado)
    • 0x0000 – Nakatakda ang coil sa OFF (bukas)

    3-4-8.jpg

    [Response Frame] Kapareho ng request frame, kinukumpirma nito ang matagumpay na pagsusulat.

    IV. Detalyadong Pagsusuri ng mga Mensahe ng Modbus TCP

    Ang Modbus TCP ay gumagana sa pamamagitan ng Ethernet TCP/IP protocol, gamit ang port 502 bilang default. Hindi tulad ng RTU mode, ang Modbus TCP ay gumagamit ng MBAP (Modbus Application Protocol) header upang tukuyin ang mga hangganan ng mensahe at hindi nangangailangan ng pag-verify ng CRC (sa halip ay umaasa sa built-in na mekanismo ng pagsusuri ng error ng TCP protocol).

    4.1 Istruktura ng header ng MBAP (7 bytes, kasama sa lahat ng TCP packet)

    4-1.jpg

    4.2 Halimbawa ng Mensahe ng Modbus TCP

    [Mensahe ng Kahilingan] Binabasa ang hold register ng Slave 1 (panimulang address na 0x0000, nagbabasa ng 3 halaga):

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

    Pagsusuri sa bawat larangan ng mensahe ng kahilingan:

    4-2.jpg

    [Mensahe ng Tugon] Ang alipin ay nagbabalik ng datos mula sa tatlong rehistro:

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

    Pag-parse ng mensahe ng tugon sa bawat patlang:

    4-3.jpg

    4.3 Mga Pangunahing Pagkakaiba sa Pagitan ng mga Istruktura ng RTU at TCP Packet

    4-3-0.jpg

    V. Detalyadong Paliwanag ng Beripikasyon ng CRC-16

    Ang Algorithm na CRC (Cyclic Redundancy Check) ay ang mekanismo ng pag-verify ng frame ng mga Modbus RTU, na idinisenyo upang matukoy ang mga error habang nagpapadala ng mensahe. Ang polynomial na bumubuo ng CRC-16 ay x¹⁶ + x¹⁵ + x² + 1 (katumbas ng 0x8005); sa pagsasagawa, ang inverted polynomial na 0xA001 ang ginagamit.
    5.1 Mga Hakbang sa Pagkalkula ng CRC-16

    6.1. I-initialize ang 16-bit CRC register sa 0xFFFF

    7.2. Magsagawa ng operasyong XOR sa pagitan ng unang byte at ng mababang 8 bits ng CRC register; ibalik ang resulta sa mababang 8 bits ng CRC register

    8.3. Ilipat pakanan ang CRC register ng 1 bit, pinupunan ang mga high bit ng 0; tukuyin ang shifted-out bit (LSB):

    9.4. Kung ang shifted-out bit ay 0: Ipagpatuloy ang paglipat pakanan ng 1 bit lamang

    10.5. Kung ang shifted-out bit ay 1: Magsagawa ng XOR operation sa pagitan ng CRC register at 0xA001

    11.6. Ulitin ang hakbang 3 hanggang sa makumpleto ang pagproseso ng lahat ng 8 bits ng kasalukuyang byte

    12.7. Kunin ang susunod na byte at ulitin ang mga hakbang 2–6 hanggang sa maproseso ang lahat ng byte. 13.8. Pagkatapos makumpleto ang lahat ng pagproseso ng byte, palitan ang high at low bytes ng CRC register upang makuha ang pangwakas na checksum.

    14.9. Idagdag ang pangwakas na checksum sa dulo ng mensahe, kung saan ang low byte ang mauuna at ang high byte ang huli

    5.2 Halimbawa ng Pagkalkula ng CRC-16 (Python Code)

    Ang sumusunod na Python function ay maaaring direktang gamitin upang kalkulahin ang CRC-16 checksum para sa isang Modbus RTU:

    def modbus_crc16(data: bytes) -> bytes:
    """bilangin ang Modbus RTU CRC-16 check code(Ibalik muna ang unang dalawang byte na may least significant bit)"""
    crc = 0xFFFF
    para sa byte sa datos:
    crc ^= byte
    para sa _ sa saklaw(8):
    kung crc at 0x0001:
    crc = (crc >> 1) ^ 0xA001
    iba pa:
    crc >>= 1
    # Ibalik muna ang low byte, kasunod ang high byte
    ibalik ang mga byte([crc & 0xFF, (crc >> 8) & 0xFF])
    # magbigay ng mga tipikal na halimbawa:bilangin ang 01 03 00 01 00 03 CRC
    frame = byte([0x01, 0x03, 0x00, 0x01, 0x00, 0x03])
    crc = modbus_crc16(frame)
    print(crc.hex()) # export:540b(0x54 0x0B)

    5.3 Lokasyon ng CRC Suriin ang Mensahe

    Gamit ang mensahe ng kahilingan na 01 03 00 01 00 03 54 0B bilang halimbawa:

    5-3.jpg

    Muling kinakalkula ng receiver ang halaga ng CRC ng unang 6 na byte at inihahambing ito sa huling 2 byte ng packet. Kung magkaiba ang mga ito, matutukoy ang isang error sa transmisyon at walang tugon na ibabalik.

    Ⅵ. Mga Detalye ng Paghawak ng Eksepsiyon at Error Code

    Kapag ang isang slave station ay hindi makapagsagawa ng isang request mula sa master station (hal., dahil sa mga hindi sinusuportahang function code o address na wala sa saklaw), nagbabalik ito ng exception response frame. Ang exception response function code ay = original function code + 0x80 (ibig sabihin, ang pinakamataas na bit ay nakatakda sa 1).

    6.1 Abnormal na Format ng Tugon (RTU)

    [Address ng Alipin][Kodigo ng Tungkulin | 0x80][Hindi Karaniwang Kodigo][CRC-16]

    6-1.jpg

    6.2 Kahulugan ng mga Standard Exception Code

    6-2.jpg

    6.3 Halimbawa ng Abnormal na Tugon

    [Senaryo] Hinihiling ng master station na basahin ang isang register sa isang invalid na address mula sa slave station 1, at ang slave station ay nagbabalik ng isang exception:

    Kahilingan: 01 03 00 20 00 01 XX XX (rehistro ng pagbasa sa adres na 0x0020);

    Tugon sa eksepsiyon: 01 83 02 C0 F1;

    Pagsusuri ng byte-by-byte ng tugon ng exception:

    6-3.jpg

    VI. Panimula sa mga Mensahe ng Modbus ASCII

    Ang Modbus ASCII mode ay nagko-code ng lahat ng data bytes bilang dalawang ASCII character (hal., ang 0x0F ay naka-encode bilang "0F"). Bagama't madaling basahin, nag-aalok ito ng mababang kahusayan sa pagpapadala at pangunahing ginagamit para sa mga layunin ng pag-debug.

    7.1 Istruktura ng Balangkas ng ASCII

    Kumpletong format ng frame na ASCII:

    CR LF

    7-1.jpg

    7.2Algoritmo ng Pag-verify ng LRC

    Mga hakbang para sa pagkalkula ng LRC (Longitudinal Redundancy Check):

    15.1. Magsagawa ng binary summation sa lahat ng byte ng address field, function code, at data field (hindi kasama ang mga start at end marker).

    16.2. Balewalain ang mga carry bits (kung ang resulta ay lumampas sa 255, awtomatikong ibalot at panatilihin lamang ang mas mababang 8 bits).

    17.3. Kwentahin ang komplemento ng resulta ng pagbubuod na modulo 1 (ibig sabihin, 0xFF − kabuuan).

    18.4. Dagdagan ang complement ng 1 upang makuha ang pangwakas na LRC check code (1 byte).

    19.5. I-encode ang LRC check code bilang dalawang ASCII character at idagdag ang mga ito sa dulo ng mensahe.

    VIII. Mga Praktikal na Tip at Karaniwang Isyu

    Mga Isyu sa 8.1 Byte Order (Big-Endian/Micro-endian)

    Ang Pamantayan ng Modbus Gumagamit ng big-endian order (kung saan ang high-order byte ang inuuna) para sa pagpapadala ng 16-bit o mas mahabang data. Ang ilang device (hal., ilang ARM-based device) ay gumagamit ng micro-endian order; kinakailangan ang byte order conversion upang maiwasan ang mga numerical parsing error.

    8-1.jpg

    8.2 Limitasyon sa Sukat ng Yunit ng Pagpaparehistro (PDU ≤ 253 bytes)

    8-2.jpg

    8.3 Mga Rekomendasyon sa Pag-configure ng Timeout ng Komunikasyon at Pagsubok Muli

    Mga inirerekomendang configuration:

    • Agwat ng pagtatanong: Itinakda sa 2–3 beses ng pinakamataas na oras ng pagtugon ng alipin (karaniwang 100–500 ms) • Tagal ng oras ng pag-urong: Inirerekomendang saklaw na 1000–3000 ms, maaaring isaayos batay sa bilis ng pagtugon ng alipin
    • Subukan muli: Inirerekomendang limitasyon na 3; mag-trigger ng alarma kung nabigo
    • Pagsusuri ng maraming alipin: Mag-iskedyul ng mga staggered na interval ng pagsusuri sa mga alipin upang maiwasan ang mga conflict sa bus • Timeout ng byte: Sa RTU mode, ang interval ng karakter na lumalagpas sa 1.5 oras ng karakter ay itinuturing na isang frame error

    8.4 Mga Inirerekomendang Kagamitan sa Pag-alis ng mga Bug

    Apendiks: Talahanayan ng Mabilisang Sanggunian ng Karaniwang Mensahe

    Basahin ang coil (Function Code 0x01)

    [Kahilingan]: Magbasa mula sa slave station 1 sa panimulang address na 0 (coil 1), kumuha ng 8 mensahe ng katayuan ng coil: 01 01 00 00 00 08 3D CC

    [Tugon]: Walong katayuan ng coil: 0x55 (01010101B);

    Mensahe: 01 01 01 55 94 36

     

    Sumulat sa isang single coil (Function Code 0x05)

    [Hiling] Itakda ang coil sa address na 0 patungong ON (isulat ang halaga na 0xFF00):

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

    [Hiling] Itakda ang coil sa address na 0 patungong OFF (isulat ang halaga na 0x0000):

    Mensahe: 01 05 00 00 00 00 CD CA

    [Tugon] Kapareho ng frame ng kahilingan

     

    Sumulat sa isang rehistro (Function Code 0x06):

    [Kahilingan] Isulat ang halagang 0x1234 upang magparehistro sa address na 0.

    Mensahe: 01 06 00 00 12 34 XX XX (Ang XX ay CRC, kakalkulahin pa).

    [Tugon] Kapareho ng balangkas ng kahilingan.

     

    Sumulat sa maraming rehistro (Function Code 0x10)

    [Kahilingan]: Sumulat sa dalawang rehistro simula sa address na 0 na may mga halagang 0x1234 at 0xABCD ayon sa pagkakabanggit.

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

    [Tugon]: Ibalik ang panimulang address at bilang ng mga nakasulat na rehistro.

    Mensahe: 01 10 00 00 00 02 41 C8

     

    Basahin ang mga rehistro ng input (function code 0x04)

    [Kahilingan]: Magbasa mula sa alipin 1 sa panimulang address na 0, binabasa ang dalawang input register

    mga mensahe: 01 04 00 00 00 02 71 CB

    [Tugon]: Ibalik ang dalawang halaga ng input register

    mga mensahe: 01 04 04 00 64 01 90 XX XX (Mga halagang ibinalik: 100 at 400)