Allgemein über Datenlogger, Kommunikation, DFÜ
Moderator: Mod-Team
von 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

-
- - Threadstarter -
-
- Beiträge: 2
- Registriert: 15.11.2011, 19:39
- PV-Anlage [kWp]: 5
- Info: Betreiber
von 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
-

uweklatt
- Forumsinventar

-
- Beiträge: 1045
- Registriert: 28.02.2008, 23:09
- Wohnort: 97xxx
- PV-Anlage [kWp]: 3,78
- Info: Betreiber
von 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.
-

solarfan10
- Fleißiges Mitglied

-
- Beiträge: 375
- Registriert: 22.10.2011, 12:48
- PV-Anlage [kWp]: 16,56
- Info: Betreiber
von 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

-
- - Threadstarter -
-
- Beiträge: 2
- Registriert: 15.11.2011, 19:39
- PV-Anlage [kWp]: 5
- Info: Betreiber
von 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

-
- Beiträge: 1
- Registriert: 21.12.2011, 10:11
- Info: Interessent
von 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)?
-

tfv
- Forumsinventar

-
- Beiträge: 774
- Registriert: 11.04.2010, 08:27
- PV-Anlage [kWp]: 114
- Info: Betreiber
von 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
-

tfv
- Forumsinventar

-
- Beiträge: 774
- Registriert: 11.04.2010, 08:27
- PV-Anlage [kWp]: 114
- Info: Betreiber
von tfv » 08.05.2012, 21:40
Hier noch einige Infos, die ich gefunden habe: http://www.neuhaus.de/Support/ZDUE-MUC/ ... _2_500.pdfDie 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.htmlMit 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
-

tfv
- Forumsinventar

-
- Beiträge: 774
- Registriert: 11.04.2010, 08:27
- PV-Anlage [kWp]: 114
- Info: Betreiber
von 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.zipWenn 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.
-

tfv
- 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
|