Anwendung von CRC_GEN und CRC_CHECK

Begonnen von linglingqi, 28. Dezember 2010, 19:31:06

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

linglingqi

Guten Tag.

Die Dokumentation zu CRC_GEN und CRC_CHECK läßt einige Fragen bei mir offen.
Theoretisch sollte ein mit CRC_GEN zu einem Datenblock erzeugter CRC Code (Restwert der Polynomdivision) wenn er an den Datenblock angehängt wird eine erfolgreiche Prüfung durch CRC_CHECK nach sich ziehen bzw. wenn erneut durch CRC_GEN bearbeitet einen CRC Code gleich Null (0) erzeugen.

Das kann ich in meinen Testprogrammen nicht nachvollziehen!

In nachfolgendem Beispiel kopiere ich den erzeugten CRC Code (crc0) in unterschielicher Reihenfolge an das Ende der ursprünglichen Datenblocks da ich nicht sicher bin ob MSB oder LSB zuerst kommen sollte.
Ich würde erwarten das entweder crc1 oder crc2 gleich Null bzw. ok1 oder ok2 TRUE wird. Keines von Beidem ist erfolgreich.
Was ist hier nicht korrekt? Wie sind die CRC Funktionen anzuwenden?
Ich verwende CoDeSys 3.2.9.22 und OSCAT 3.20

Den CRC Code möchte ich benutzen um zu prüfen ob die Daten die ich aus einem RFID Datenträger lese korrekt geschriebenen wurden oder z.B. das Schreiben unterbrochen wurde weil der Datenträger den Erfassungsbereich zu schnell verlassen hat oder sonst ein Grund vorliegt aus dem ich den gelesenen Daten nicht vertrauen sollte.

Würde mich freuen schnell Hilfe zu erhalten.


VAR
data1 : ARRAY[1..14] OF BYTE;
data2 : ARRAY[1..14] OF BYTE;
crc0 : DWORD;
crc1 : DWORD;
crc2 : DWORD;
count : INT;
src : POINTER TO BYTE;
ok1 : BOOL;
ok2 : BOOL;
END_VAR

FOR count := 1 TO 10 BY 1 DO
data1[count] := INT_TO_BYTE(count);
data2[count] := data1[count];
END_FOR
FOR count := 11 TO 14 BY 1 DO
data1[count] := 0;
data2[count] := data1[count];
END_FOR
crc0 := CRC_GEN(pt:=ADR(data1), size:=SIZEOF(data1)-4,
Polynom_L:=16#4C11DB7, Polynom_32:=1,
init:=16#FFFFFFFF, XOR_out:=16#FFFFFFFF,
rev_in:=1, rev_out:=1);
src := ADR(crc0) + 0;
data1[11] := src^;
data2[14] := src^;
src := ADR(crc0) + 1;
data1[12] := src^;
data2[13] := src^;
src := ADR(crc0) + 2;
data1[13] := src^;
data2[12] := src^;
src := ADR(crc0) + 3;
data1[14] := src^;
data2[11] := src^;
crc1 := CRC_GEN(pt:=ADR(data1), size:=SIZEOF(data1),
Polynom_L:=16#4C11DB7, Polynom_32:=1,
init:=16#00000000, XOR_out:=16#00000000,
rev_in:=0, rev_out:=0);
crc2 := CRC_GEN(pt:=ADR(data2), size:=SIZEOF(data2),
Polynom_L:=16#4C11DB7, Polynom_32:=1,
init:=16#00000000, XOR_out:=16#00000000,
rev_in:=0, rev_out:=0);
ok1 := CRC_CHECK(pt:=ADR(data1), size:=SIZEOF(data1), Polynom_L:=16#4C11DB7, Polynom_32:=1);
ok2 := CRC_CHECK(pt:=ADR(data2), size:=SIZEOF(data2), Polynom_L:=16#4C11DB7, Polynom_32:=1);


hugo

bei den meisten CRC's lässt sich die nachricht incl. prüfsumme durch den crc_gen senden und es soll null rauskommen, genauso arbeitet auch der crc_check.
allerdings ist das nicht für alle gebräuchlichen CRC's so, immer wenn XOR am ausgang oder init werte oder gar bit drehen im spiel ist geht das nicht immer.

da unser crc_gen nicht optimal war werden wir min der nächsten release einen neuen baustein haben der auch alle optionen des CRC unterstützen wird.
den crc_check werden wir löschen, das gleiche kann ja auch mittels des crc_gen gemacht werden.