CRC16 Checksum für eHz berechnen

Allgemein über Datenlogger, Kommunikation, DFÜ

Moderator: Mod-Team

 

0.00 (0 Bewertungen) | Zum Bewerten bitte anmelden

CRC16 Checksum für eHz berechnen

Beitragvon mkbv » 15.11.2011, 21:10

Hallo,
ich versuche, die im Push Betrieb gesendeten Daten eines EMH eHz in einen Microcontroller einzulesen. Das klappt auch wunderbar. Jedoch sind bislang alle Versuche, die CRC16 Prüfsumme zu verifizieren, fehlgeschlagen. Weder der übliche CRC16-CCITT Algorithmus, noch der, in der SML Spezifikation referenzierte Algorithmus nach DIN 62056-46 liefert die an den Datenstrom angehängte Prüfsumme. Es klappt weder mit den Daten des eHz noch mit diversen Beispielen, die ich Internet gefunden habe.

Hier eine kurze Beispielnachricht als Test:
u8 Beispiel[] = {0x76,0x02,0x03,0x62,0x00,0x62,0x00,0x72,0x63,0x02,0x00,0x71,0x01,0x63,0x09,0x6F};
Hier mein Aufruf der CRC Berechnung:
CS = crc16( &Beispiel[0] , sizeof(Beispiel_u8)-2);

Bei diesem Beispiel sollte CS gleich 096F sein. Je nach Algorithmus kommt aber C3B4 oder 9CB8 heraus.

Wer kann helfen.

Danke und Grüße
Manfred
mkbv
Neu hier
Neu hier
 
- Threadstarter -
 
Beiträge: 2
Registriert: 15.11.2011, 19:39
PV-Anlage [kWp]: 5
Info: Betreiber

Re: CRC16 Checksum für eHz berechnen

Beitragvon uweklatt » 15.11.2011, 22:49

Hallo Manfred,

schau doch mal in den Quellcode des libsml Projektes.

Was ich noch in einer Doku gefunden habe:
Checksumme (Prüfsumme) der SML_Message nach CCITT-CRC16 (DIN EN 62056-46)
- Algorithmus: CCITT-CRC16, x16 + x12 + x5 + 1, 0x1021 / 0x8408 / 0x8810.
- Diese Checksummeberechnung beginnt mit dem ersten Byte zu ‘SML_Message’ und endet mit dem letzten
Byte zu ‚messageBody‘. Damit sind die Bytes der Elemente ‚crc16‘ und ‚null‘ von der Prüfsummenberechnung
ausgeschlossen.

Checksumme über die ganze Nachricht nach CCITT-CRC16 (DIN EN 62056-46)
- Algorithmus: CCITT-CRC16, x16 + x12 + x5 + 1, 0x1021 / 0x8408 / 0x8810.
- Die Checksummeberechnung beginnt mit dem ersten Byte der Nachricht und endet mit dem 3. letzten Byte
der gesamten Nachricht (letztes und 2. letztes Byte = Checksumme).


Tschau
Uwe
Kochrezepte ohne Ende... Uwe's Kochbuch - Sun-Watch Logger
SB3300TL-HC + 21 x Kyocera KD180 (3,78KWp), 45°/160°/97xxx
Benutzeravatar
uweklatt
Forumsinventar
Forumsinventar
 
Beiträge: 1045
Registriert: 28.02.2008, 23:09
Wohnort: 97xxx
PV-Anlage [kWp]: 3,78
Info: Betreiber

Re: CRC16 Checksum für eHz berechnen

Beitragvon solarfan10 » 15.11.2011, 23:41

Hallo Manfred,

ich erinnere mich, dass bei den CRC-Algorithmen auch noch Startwerte eine Rolle gespielt haben. Vielleicht hast Du da einen falschen gewählt? 0 und 0xffff waren z.B. recht häufig zu finden.

Da der crc16 algorithmus schwer im debugger zu überprüfen ist (nur das fertige Endresultat), liegt gerne auch ein versteckter Fehler in der Implementierung vor. Magst Du den crc-16 code nicht einfach mal posten?

Viele Grüße
Michael
Jeder fängt mal klein an.
Benutzeravatar
solarfan10
Fleißiges Mitglied
Fleißiges Mitglied
 
Beiträge: 375
Registriert: 22.10.2011, 12:48
PV-Anlage [kWp]: 16,56
Info: Betreiber

Re: CRC16 Checksum für eHz berechnen

Beitragvon mkbv » 16.11.2011, 21:10

Hallo Uwe, Michael,

vielen Dank für Euere Tips.
Die Spezifikation von SML V1.03 liegt mir vor, ebenso die Beschreibung von iTrona. Auch die Norm habe ich.
Den einen Checksum Algorithmus habe ich aus der Norm kopiert, er ist identisch mit dem aus 'libSML'. Startwert jeweils 0xFFFF.
Den zweiten Algorithmus habe ich aus dem offenen Projekt 'smllib' kopiert. Er ist identisch mit meinem sonst verwendeten Verfahren und liefert bei bekannten Strings auch die richtigen Werte.
Ich versuche noch, die beiden vorliegenden Projekte zu verstehen. 'libSML' kann ich auf dem Papier kaum nachvollziehen. 'smllib' sieht für mich verständlicher aus, vielleicht bekomme ich das sogar auf meinem R8C zum laufen.
Interessant ist, dass zwei verschiedene Algorithmen für die gleichen Daten verwendet werden.

Ich bleibe dran.
Für weitere sachdienliche Hinweise bin ich dankbar.

Grüße
Manfred
mkbv
Neu hier
Neu hier
 
- Threadstarter -
 
Beiträge: 2
Registriert: 15.11.2011, 19:39
PV-Anlage [kWp]: 5
Info: Betreiber

Ich brauche auch Hilfe

Beitragvon LittleTechnican » 21.12.2011, 10:19

Hallo Manfred,
ich bin neu im Forum hier. Ich verweifele auch an der Aufgabe, die Checksumme auszurechnen. Bei verschiedenen Algorithmen kommt immer was anderes heraus, aber nie das, wass der Energiezähler als Checksumme am SML Telegramm ausspuckt.

Hast Du das Problem gelöst und kannst Du eine Lösung hier posten? Welcher Algorithmus? Über welche Bytes wird tatsächlich die Checksumme berechnet?
DANKE für die Hilfe,

Henning
LittleTechnican
Neu hier
Neu hier
 
Beiträge: 1
Registriert: 21.12.2011, 10:11
Info: Interessent

Re: CRC16 Checksum für eHz berechnen

Beitragvon tfv » 05.05.2012, 23:59

Nachdem ich mich grade mit demselben Problem rumschlage, hier mein Stand

Der Code für die Berechnung in smllib schaut so aus:
Code: Alles auswählen
uint16_t crc16_ccitt(const unsigned char* data, uint32_t length) {
   uint16_t crc;
   uint32_t c;
   uint8_t i;

   uint8_t byte;
   uint8_t crcbit;
   uint8_t databit;

   crc = 0xFFFF;
   for (c = 0; c < length; c++) {
      byte = data[c];
      for (i = 0; i < 8; i++) {
         crcbit = (crc & 0x8000) ? 1 : 0;
         databit = (byte & 0x80) ? 1 : 0;
         crc = (uint16_t)(crc << 1);
         byte = (uint8_t)(byte << 1);
         if (crcbit != databit) {
            crc = crc ^ 0x1021;
         }
      }
   }

   return crc;
}


Das ist der Aufruf:
Code: Alles auswählen
crc16 = crc16_ccitt(smlBinary+offsetPrev, (*offset)-offsetPrev);


Jetzt müsste man nur noch die Variablen an einem Beispiel verstehen, z.B. auf dieser Seite:

http://wiki.volkszaehler.org/software/sml?s[]=ehz

Wo ist das erste und letzte Byte in dem Beispiel (Sorry, mit leider kein c++ freak)?
____
http://wiki.freesol.de - Ein freier Datenlogger für 30 EUR
Benutzeravatar
tfv
Forumsinventar
Forumsinventar
 
Beiträge: 774
Registriert: 11.04.2010, 08:27
PV-Anlage [kWp]: 114
Info: Betreiber

Re: CRC16 Checksum für eHz berechnen

Beitragvon tfv » 07.05.2012, 22:17

Ich hab mich mal an einer Portierung nach Visual Basic probiert, allerdings klappt das noch nicht:

Code: Alles auswählen
Dim Hexfile(1000) As Byte
 
Private Function CRC_Berechnen(ByVal StartPos As Integer, ByVal EndPos As Integer) As Integer
        Dim crc As UShort
        Dim c As Integer
        Dim i As Byte
        Dim byt As Byte
        Dim crcbit As Byte
        Dim databit As Byte

        crc = &HFFFF
        For c = StartPos To EndPos
            byt = Hexfile(c)
            For i = 0 To 7
                If (crc And &H8000) Then
                    crcbit = 1
                Else
                    crcbit = 0
                End If

                If (byt And &H80) Then
                    databit = 1
                Else
                    databit = 0
                End If
                crc = crc << 1
                byt = byt << 1

                If crcbit <> databit Then
                    crc = crc Xor &H1021
                End If
            Next
        Next
        Return crc

    End Function

    Private Sub Button10_Click(sender As System.Object, e As System.EventArgs) Handles Button10.Click
        Hexfile(0) = &H76
        Hexfile(1) = &H2
        Hexfile(2) = &H3
        Hexfile(3) = &H0
        Hexfile(4) = &H62
        Hexfile(5) = &H0
        Hexfile(6) = &H72
        Hexfile(7) = &H63
        Hexfile(8) = &H2
        Hexfile(9) = &H0
        Hexfile(10) = &H71
        Hexfile(11) = &H1
        Hexfile(12) = &H63
        Hexfile(13) = &H9
        Hexfile(14) = &H6F

        Label26.Text = CRC_Berechnen(0, 12).ToString
    End Sub
____
http://wiki.freesol.de - Ein freier Datenlogger für 30 EUR
Benutzeravatar
tfv
Forumsinventar
Forumsinventar
 
Beiträge: 774
Registriert: 11.04.2010, 08:27
PV-Anlage [kWp]: 114
Info: Betreiber

Re: CRC16 Checksum für eHz berechnen

Beitragvon tfv » 08.05.2012, 21:40

Hier noch einige Infos, die ich gefunden habe:
http://www.neuhaus.de/Support/ZDUE-MUC/ ... _2_500.pdf

Die CRC-Berechnung im SML-Protokoll wurde von eHZ-Herstellern unterschiedlich
implementiert („klassisch“, wie um SyM²-Projekt oder gedreht). Der MUC prüft nun auf beide
Varianten und akzeptiert die Nachricht, wenn eine Berechnung korrekt ist.



____
und dann noch http://www.mikrocontroller.net/topic/246407 in dem Anhang (PDF File mit Zählerspek)
Checksumme (Prüfsumme) der SML_Message nach CCITT-CRC16 (DIN EN 62056-46)
o Algorithmus: CCITT-CRC16, x16 + x12 + x5 + 1, 0x1021 / 0x8408 / 0x8810.
o Diese Checksummeberechnung beginnt mit dem ersten Byte zu ‘SML_Message’ und endet mit dem letzten
Byte zu ‚messageBody‘. Damit sind die Bytes der Elemente ‚crc16‘ und ‚null‘ von der Prüfsummenberechnung
ausgeschlossen.
- Checksumme über die ganze Nachricht nach CCITT-CRC16 (DIN EN 62056-46)
o Algorithmus: CCITT-CRC16, x16 + x12 + x5 + 1, 0x1021 / 0x8408 / 0x8810.
o Die Checksummeberechnung beginnt mit dem ersten Byte der Nachricht und endet mit dem 3. letzten Byte
der gesamten Nachricht (letztes und 2. letztes Byte = Checksumme).


Allerdings sagen die Beschriftungen im Anhang wieder etwas anderes.

________
Mir ist inzwischen zumindest klar, dass alle 3 Sekunden eine SML-GesamtNachricht gesendet wird, die wiederum aus mehreren SML-teilnachrichten besteht. Die Teilnachrichten und die gesamtnachricht haben jeweils eigene prüfsummen. Die Prüfsumme der Gesamtnachricht steht in den letzten zwei Bytes der Gesamtnachricht.

Ich lese den Absatz oben so, als würde die Prüfsumme über die Gesamtnachricht ab Byte 0 bis zum einschließlich drittletzten Byte berechnet. Leider kommt bei mir da was falsches raus. Habe die SML-Nachricht mal beigefügt, die beiden letzten Bytes mit der Prüfsumme sind 5C 13, das obige Basic Programm liefert 91 9C.

_____
Hier gibts ein Tool zum Gegenprüfen sowie Rechenbeispiele:
http://www.lammertbies.nl/comm/info/crc ... ation.html

Mit Hilfe des Tools und des dortigen Bispielstrings 123456789 habe ich meine Visual Basic Programm nochmals getestet, es kommt das richtige Ergebnis raus (CRC-CCITT (0xFFFF) 0x29B1) , also stimmt meine Visual Basic Routine, nur die Orte für Berechnungsstart und Ende offensichtlich nicht.

_____
Hier gibts ein Supportforum zur Prüfsummenberechnung
http://www.lammertbies.nl/forum/viewforum.php?f=11
Um diese Datei oder Foto laden zu können, musst Du im Forum eingeloggt/registriert sein
____
http://wiki.freesol.de - Ein freier Datenlogger für 30 EUR
Benutzeravatar
tfv
Forumsinventar
Forumsinventar
 
Beiträge: 774
Registriert: 11.04.2010, 08:27
PV-Anlage [kWp]: 114
Info: Betreiber

Re: CRC16 Checksum für eHz berechnen

Beitragvon tfv » 08.05.2012, 22:57

Hier gibts auch noch eine Library und ein Exe-File, das CRC-Berechnung eines Files erlaubt:

http://www.lammertbies.nl/download/lib_crc.zip

Wenn ich die SML-Nachricht w4.log um die letzten beiden Bytes kürze und in das Tool stecke, kommt dasselbe wie in meinem Basic Programm raus, aber leider nicht die diem File angehängte Prüfsumme.
____
http://wiki.freesol.de - Ein freier Datenlogger für 30 EUR
Benutzeravatar
tfv
Forumsinventar
Forumsinventar
 
Beiträge: 774
Registriert: 11.04.2010, 08:27
PV-Anlage [kWp]: 114
Info: Betreiber

Re: CRC16 Checksum für eHz berechnen

Beitragvon tfv » 20.05.2012, 22:52

Glaube jetzt, dass man einen x.25 Algorithmus braucht und habe dazu auch einen Code, der auf einem beispiel funktioniert, allerdings auf keinem SML-Beispiel :-(

Mache hier weiter
freesol-f113/sml-pruefsummenberechnung-ich-verzweifle-an-crc-t78798.html#p716050

Thomas
____
http://wiki.freesol.de - Ein freier Datenlogger für 30 EUR
Benutzeravatar
tfv
Forumsinventar
Forumsinventar
 
Beiträge: 774
Registriert: 11.04.2010, 08:27
PV-Anlage [kWp]: 114
Info: Betreiber


Zurück zu Datenlogger



Ähnliche Beiträge


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste