Autor Thema: CRC_GEN und Polynom 0x8408  (Gelesen 8156 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline flowsens

  • Newbie
  • *
  • Beiträge: 3
    • Profil anzeigen
    • E-Mail
CRC_GEN und Polynom 0x8408
« am: 13. Dezember 2015, 12:55:05 »
Hallo zusammen,
ich stehe momentan vor der Aufgabe eine Serielle Kommunikation herzustellen mit einer
Viessmann Heizung. Die Kommunikation steht auch soweit und ich Empfange Regelmäßig
Datenpakete in meiner Steuerung.
Das Problem ist nun dass ich eine CRC16 Checksumme bilden muss wenn ich der Viessmann
ein Telegramm schicken möchte. Dafür soll der CRC_GEN nun verwendet werden. Ich habe Ihn
dafür also von der Step7 libary genommen und auf TIA umgesetzt (Steuerung ist eine IM151).

Zum Anfang wollte ich die Funktionalität des Bausteins Testen indem ich Die Empfangenen Telegramme
über die gesamte länge Überprüfe. Leider bekomme ich immer eine Checksumme ungleich 0x00 heraus.

Danach habe ich Versucht die Checksumme der Empfangenen Telegramme nachzustellen, und diese dann
zu vergleichen. Leider kam auch hier nie eine passende Checksumme heraus.

Ein Telegramm kann wie folgt aussehen:
16#01 16#00 16#B1 16#0A 16#01 16#01 16#01 16#07 16#4E 16#20
Die letzten beiden Bytes sind die CRC

Gruß Florian

Offline peewit

  • Moderator
  • *****
  • Beiträge: 2 378
    • Profil anzeigen
Re: CRC_GEN und Polynom 0x8408
« Antwort #1 am: 13. Dezember 2015, 13:14:56 »
es gibt viele varianten des CRC16

dein telegramm
"0100B10A01010107" (hex)

ergibt folgende crc varianten

CRC-16                   0x4252
CRC-16 (Modbus)   0x4912
CRC-16 (Sick)           0x3091
CRC-CCITT (XModem)   0xBD23
CRC-CCITT (0xFFFF)   0x8C1D
CRC-CCITT (0x1D0F)   0x5C1A
CRC-CCITT (Kermit)   0x4E20
CRC-DNP                   0x0B24
CRC-32                   0x0CAFAE36

dein protokoll verwendet  CRC-CCITT (Kermit)
nun musst du noch herausfinden wie man das berechnet !


beispiel in vb6

Public Function CRCKERMIT(Buffer() As Byte) As Long

Dim i As Long
Dim Temp As Long
Dim CRC As Long
Dim j As Integer
CRC = 0
For i = LBound(Buffer) To UBound(Buffer)
Temp = Buffer(i) * &H100&
CRC = CRC Xor Temp
For j = 0 To 255
If (CRC And &H8404&) Then
CRC = ((CRC * 2) Xor &H1021&) And &HFFFF&
Else
CRC = (CRC * 2) And &HFFFF&
End If
Next j
Next i
CRCKERMIT = CRC And &HFFFF

End Function
« Letzte Änderung: 13. Dezember 2015, 13:19:01 von peewit »

Offline flowsens

  • Newbie
  • *
  • Beiträge: 3
    • Profil anzeigen
    • E-Mail
Re: CRC_GEN und Polynom 0x8408
« Antwort #2 am: 13. Dezember 2015, 17:22:07 »
Hallo peewit,
danke für deine Antwort!

Habe auch zwischenzeitlich herausgefunden dass es CRC-CCITT (Kermit) ist.
Dafür habe ich den Generator auf http://www.lammertbies.nl/comm/info/crc-calculation.html genutzt.

Die Funktion CRC_GEN läuft nun auch. Parameter sind wie folgt:
Polynom: 0x1021
Init: 0x00
REV_IN: True
REV_OUT: True

Danke für die Hilfe!