Modbus-CRC16-Rechner
Gib die Bytes eines Modbus-RTU-Telegramms ein — Adresse, Function-Code und Daten. Du bekommst die CRC16 und die zwei Bytes genau so, wie sie auf der Leitung stehen. Fügst du ein komplettes Telegramm ein, bestätigt der Rechner, wenn seine CRC bereits stimmt.
Leerzeichen, Kommas und 0x-Präfixe sind erlaubt: 01 03 00 00 00 02 oder 0x01,0x03,… oder 010300000002.
- CRC16
- –
- Auf der Leitung
- –
- Ganzes Telegramm
- –
Läuft vollständig in deinem Browser — nichts, was du eingibst, wird übertragen.
So wird die Modbus-CRC berechnet
Modbus RTU nutzt CRC-16/MODBUS: Polynom 0x8005 (reflektiert 0xA001), Startwert 0xFFFF, kein abschließendes XOR. Sie läuft über jedes Byte des Telegramms von der Adresse bis zum letzten Datenbyte.
- Das Register mit 0xFFFF beginnen.
- Das nächste Telegramm-Byte per XOR in das Low-Byte des Registers einrechnen.
- Achtmal: das Register um ein Bit nach rechts schieben; war das herausgeschobene Bit 1, das Register mit 0xA001 verXORen.
- Nach dem letzten Byte das Ergebnis Low-Byte zuerst senden: CRC 0x0BC4 steht auf der Leitung als C4 0B.
Dasselbe in C
Diese bitweise Fassung steckt in den meisten Firmwares. Eine Variante mit Tabelle ist schneller und liefert dasselbe Ergebnis.
uint16_t modbus_crc16(const uint8_t *data, size_t len) { uint16_t crc = 0xFFFF; for (size_t i = 0; i < len; i++) { crc ^= data[i]; for (int b = 0; b < 8; b++) crc = (crc & 1) ? (crc >> 1) ^ 0xA001 : crc >> 1; } return crc; /* low byte first on the wire */ }
Häufige Fragen
Warum kommt meine CRC mit vertauschten Bytes heraus?
Weil Modbus die CRC mit dem Low-Byte zuerst sendet — anders als die 16-Bit-Register in den Daten, die Big-Endian sind. Eine CRC von 0x0BC4 steht auf der Leitung als C4 0B. Genau daran scheitern viele selbstgeschriebene Prüfungen.
Nutzen Modbus ASCII oder Modbus TCP diese CRC?
Nein. Modbus ASCII sichert seine Telegramme mit einer LRC (der negierten Bytesumme), und Modbus TCP hat gar keine eigene Prüfsumme — das übernimmt TCP. Die CRC16 gehört nur zu Modbus RTU.
Warum ist die CRC über ein komplettes Telegramm 0x0000?
Hängt man die CRC mit dem Low-Byte zuerst an, endet das Register bei null. So prüft man ein empfangenes Telegramm schnell: CRC über alle Bytes einschließlich der CRC rechnen — kommt 0x0000 heraus, ist es unversehrt.
Jedes Telegramm von Hand prüfen?
Trace hört auf der RS485-Leitung mit, trennt Modbus-RTU-Telegramme an der Sendepause und prüft jede CRC live — fehlerhafte Telegramme werden markiert, nicht verworfen.