oscat.lib > oscat.lib fuer Step 7
CRC_GEN und Polynom 0x8408
(1/1)
flowsens:
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
peewit:
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
flowsens:
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!
Navigation
[0] Themen-Index
Zur normalen Ansicht wechseln