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říkladS 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
- Prohozené bajty CRC. Vyšší bajt poslaný napřed je nejčastější chyba vlastních ovladačů. Zařízení mlčí. Kalkulačka vás upozorní, když má rámec správné CRC ve špatném pořadí.
- CRC ze špatných bajtů. CRC pokrývá vše od adresy zařízení po poslední datový bajt, nic víc a nic míň. U bran Modbus TCP do něj hlavička MBAP nepatří.
- Text místo bajtů. CRC se počítá z binárních bajtů, ne ze znaků „0“, „1“, „0“, „3“. Hex text z logu je nutné nejdřív převést, což kalkulačka udělá za vás.
- Správné CRC nestačí. Pokud zařízení pořád neodpovídá, zkontrolujte rychlost, paritu, stop bity, adresu zařízení a zakončení sběrnice.
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
- Dekodér registrůFloat32, Int32, UInt16 i bity ve všech pořadích bajtů a funkce Najít moji hodnotu.
- Převod adres40001 ↔ offset 0, zápis 4x/3x/0x/1x, 5- i 6místné adresy.
- Kódování hodnotyHodnotu jako 230.5 převede na registry pro všechna pořadí bajtů.