PLCBytes
Nástroje pro Modbus

Kalkulačka Modbus CRC-16

Vložte bajty rámce Modbus RTU a dostanete CRC v pořadí, v jakém jde na linku. Pokud rámec už CRC obsahuje, kalkulačka ho zkontroluje.

Bajty

Příklad

S CRC na konci i bez něj. Funguje 11 03 00 6B 00 03, 1103006B0003 i 0x11,0x03.

Výsledek

CRC-16/MODBUS
Bajty CRC, jak se posílají (nižší první)
Rámec s CRC
LRC (Modbus ASCII)
Rámec Modbus ASCII

Běží celé ve vašem prohlížeči. Nic z toho, co zadáte, se neodesílá na server.

CRC-16/MODBUS v kódu

Počáteční hodnota 0xFFFF, polynom 0xA001 (zrcadlený 0x8005), bez závěrečného XOR. Nižší bajt se posílá první.

uint16_t modbus_crc16(const uint8_t *buf, size_t len)
{
uint16_t crc = 0xFFFF;
for (size_t i = 0; i < len; i++) {
crc ^= buf[i];
for (int bit = 0; bit < 8; bit++)
crc = (crc & 1) ? (crc >> 1) ^ 0xA001 : crc >> 1;
}
return crc; /* send crc & 0xFF first, then crc >> 8 */
}
def modbus_crc16(data: bytes) -> bytes:
crc = 0xFFFF
for b in data:
crc ^= b
for _ in range(8):
crc = (crc >> 1) ^ 0xA001 if crc & 1 else crc >> 1
return crc.to_bytes(2, "little")  # low byte first, ready to append

Jak funguje Modbus CRC

Každý rámec Modbus RTU končí 16bitovým CRC spočítaným ze všech bajtů před ním: adresy zařízení, funkčního kódu a dat. Příjemce spočítá stejnou hodnotu, a pokud nesedí, rámec bez odpovědi zahodí. CRC se posílá nižším bajtem napřed, tedy opačně než hodnoty registrů. Proto se CRC 0x8776 rámce 11 03 00 6B 00 03 objeví na lince jako 76 87.

Modbus TCP žádné CRC nemá, data kontroluje už samo spojení TCP. Modbus ASCII místo něj používá jednodušší 8bitové LRC, které tu najdete také.

Časté chyby

Otázky z praxe

Proč se Modbus CRC posílá nižším bajtem napřed?

CRC se počítá zrcadleným algoritmem, který posouvá bity doprava, a specifikace výsledek posílá nižším bajtem napřed. Data registrů jdou vyšším bajtem napřed, takže CRC je v rámci jediná výjimka. Rámec s prohozenými bajty CRC zařízení ignoruje.

Jaké je CRC pro 01 03 00 00 00 01?

84 0A, takže celý požadavek na čtení jednoho holding registru na adrese 0 ze zařízení 1 je 01 03 00 00 00 01 84 0A. Pro deset registrů (01 03 00 00 00 0A) je to C5 CD.

Používá Modbus TCP CRC?

Ne. Rámce Modbus TCP začínají 7bajtovou hlavičkou MBAP a CRC nenesou, protože data chrání už TCP. CRC je jen v Modbus RTU, včetně RTU over TCP, kde se sériový rámec tuneluje beze změny.

Jakou variantu CRC-16 Modbus používá?

CRC-16/MODBUS: polynom 0x8005 ve zrcadleném tvaru (0xA001), počáteční hodnota 0xFFFF, zrcadlený vstup i výstup, bez závěrečného XOR. Jiné varianty CRC-16, například CCITT nebo XMODEM, dávají jiné výsledky a nefungují.

Jaký je rozdíl mezi CRC a LRC?

Modbus RTU používá 16bitové CRC z binárního rámce. Modbus ASCII posílá rámec jako hex text mezi dvojtečkou a CR LF a chrání ho 8bitovým LRC: dvojkovým doplňkem součtu všech bajtů. LRC je mnohem slabší, ale snadno se počítá.

Související nástroje