Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

CRC-CCITT checksums

Tiak
2006-12-19
2006-12-20
  • Tiak - 2006-12-19

    Hallo

    Gibt es hier jemand der mir bitte helfen kann, ich suche ein Beispiel wir ich den CRC checksum ausrechen kann im Codesys. Es ist der standart CRC-CCITT

    eks 3f01 hex ist CRC checksum = 058A

    Jesper

     
  • gravieren - 2006-12-19

    Hi Tiak

    CRC 16 bit ?

    CRC 32 bit ?

    Zitat:
    Standard CRC-CCITT

    Welcher, es gibt etliche, die sich CCITT nennen ?

    Was willst du damit Coden ?

     
  • Tiak - 2006-12-19

    gravieren hat geschrieben:
    Hi Tiak
    CRC 16 bit ?
    CRC 32 bit ?
    Welcher, es gibt etliche, die sich CCITT nennen ?
    Was willst du damit Coden ?

    Es ist ein 16 bit CRC-CCITT 0x1021 x16 + x12 + x5 + 1

    Ich muss es ausrechen für ein Kommunikation wo ich den richtige crc code brauche, und das ist nicht ganz so einfach für mich das zu kapieren

    Grube aus Dänemark

     
  • gravieren - 2006-12-19

    Hi Tiak

    Zitat:
    Es ist ein 16 bit CRC-CCITT 0x1021 x16 + x12 + x5 + 1

    O.K !

    Werde mich mal "umhören"

     
  • Tiak - 2006-12-19

    gravieren hat geschrieben:
    Hi Tiak
    O.K !
    Werde mich mal "umhören"

    Hi Gravieren

    Das ist Super danke

     
  • gravieren - 2006-12-19

    Hi Tiak

    Zitat:
    // Update the CRC for transmitted and received data using
    // the CCITT 16bit algorithm (X^16 + X^12 + X^5 + 1).
    unsigned char ser_data;
    static unsigned int crc;
    crc = (unsigned char)(crc >> 8 ) | (crc << 8 );
    crc ^= ser_data;
    crc ^= (unsigned char)(crc & 0xff) >> 4;
    crc ^= (crc << 8 ) << 4;
    crc ^= ((crc & 0xff) << 4) << 1;

    Kannst du damit was anfangen ?

     
  • Tiak - 2006-12-19

    gravieren hat geschrieben:
    Hi Tiak
    Kannst du damit was anfangen ?

    Humm nein leider nicht

     
  • Benjamin - 2006-12-19

    @ gravieren

    Gegenfrage: Kannst du denn etwas mit deinem Code anfangen?

    Ich wage das mal zu bezweifeln!

    Einfach den erstbesten Codeschnipsel aus dem Netz zu saugen und nachzudenken hinzurotzen wird dem guten Mann wohl kaum weiterhelfen.

    @Tiak

    vielleicht hilft dir das weiter.

    FUNCTION berechne_CRC : WORD
    VAR_INPUT
      wEingang : WORD;
    END_VAR
    VAR
      wCRC16 : WORD;
      n : INT;
    END_VAR
    VAR CONSTANT
      c_wGenerator : WORD := 16#1021;    (*   x^16 + x^12 + y^5 + 1 = 16#1021 *)
    END_VAR
    wCRC16 := 16#FFFF;
    wCRC16 := wEingang XOR wCRC16;
    FOR n := 1 TO 8 DO
      IF (wCRC16.0 = TRUE) THEN
        wCRC16 := SHR(wCRC16,1);
        wCRC16 := wCRC16 XOR c_wGenerator;
      ELSE
        wCRC16 := SHR(wCRC16,1);
      END_IF  
    END_FOR
    berechne_CRC := wCRC16;
    

    Gruß

    Benjamin

     
  • gravieren - 2006-12-19

    Hi

    @Benjamin

    Zitat:
    Gegenfrage: Kannst du denn etwas mit deinem Code anfangen?
    Ich wage das mal zu bezweifeln!

    Müßte mal den Komplementärcode ST <--> C suchen.

    Jo, dein Code sieht cooler aus

    @ Tiak

    Ein Feedback wäre schön.

     
  • Tiak - 2006-12-19

    Benjamin hat geschrieben:
    @ gravieren
    Gegenfrage: Kannst du denn etwas mit deinem Code anfangen?
    Ich wage das mal zu bezweifeln!
    Einfach den erstbesten Codeschnipsel aus dem Netz zu saugen und nachzudenken hinzurotzen wird dem guten Mann wohl kaum weiterhelfen.
    @Tiak
    vielleicht hilft dir das weiter.

    FUNCTION berechne_CRC : WORD
    VAR_INPUT
      wEingang : WORD;
    END_VAR
    VAR
      wCRC16 : WORD;
      n : INT;
    END_VAR
    VAR CONSTANT
      c_wGenerator : WORD := 16#1021;    (*   x^16 + x^12 + y^5 + 1 = 16#1021 *)
    END_VAR
    wCRC16 := 16#FFFF;
    wCRC16 := wEingang XOR wCRC16;
    FOR n := 1 TO 8 DO
      IF (wCRC16.0 = TRUE) THEN
        wCRC16 := SHR(wCRC16,1);
        wCRC16 := wCRC16 XOR c_wGenerator;
      ELSE
        wCRC16 := SHR(wCRC16,1);
      END_IF  
    END_FOR
    berechne_CRC := wCRC16;
    

    Gruß
    Benjamin

    Hi Benjamin

    Vielen dank für dein Beispiel das war super und schnell . Ich habe es getestet und da ist ein Problem

    Wen hex 3f01 auf der Eingang kommt 058A das ist IO

    Aber wen ich 3F02 auf der Eingang kommt 1D9B das ist NIO soll 35E9 sein

    und 3F09 auf der Eingang kommt 1AB5 das ist auch NIO soll 079A sein

    Hast du da ein Tipp ich bin eibischen neu in ST

    h**p://www.lammertbies.nl/comm/info/crc-calculation.html?crc=3f10&method=hex

    Gruß Jesper

     
  • Benjamin - 2006-12-20

    Auf dieser Seite bist du ja schon genau richtig.

    Wenn du ein wenig Programmiererfahrung hast und vor allem weißt, was du mit dem CRC eigentlich bewirken willst, wirst du hier deine Lösung finden.

    Die Programmierbeispiele in der zip-Datei sind sehr kompakt und verständlich.

    Komme heute und morgen leider nicht mehr dazu den Code in ST zu übertragen. Davon abgesehen, lässt sich der CRC aber auch in AWL realisieren...nur nicht so einfach.

    Gruß

    Benjamin

    edit:

    mein Code im oberen Beitrag ist nicht ganz richtig, das muss ich leider eingestehen....

    Er ist aber auch nicht so falsch, das man nich damit weiterarbeiten könnte!

     

Log in to post a comment.