Zählerauslesen - Datenmüll?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Update.

      Es funktioniert. Komme an alle Daten ran.

      Habe mir zum Testen vorhin noch ein kleines Programm in der Arduino IDE geschrieben. Erst ist es mir gar nicht aufgefallen aber dann hab ich mich doch am Kopf gekratzt.
      Meine Aktuelle Leistung besteht ja aus 8 Byte. Jetzt dachte ich bin ganz schlau und hab die per bitshift in eine variable packen wollen. Die Ausgabe ist Müll aber der Compiler hat nicht gemotzt. Hat einer ne Idee wie der Compiler versucht 64 Bit in eine Variable zu packen? Oder streicht er einfach die ersten oder die letzen 32 weg?

      Ne Lösung such ich übrigens auch noch wie ich ne Zahl welche aus 8 Byte besteht zusammen bekomm.
    • darasol schrieb:

      Hat einer ne Idee wie der Compiler versucht 64 Bit in eine Variable zu packen?
      Du meinst wie die im Speicher liegen?

      Es ist immer das gleiche Schema. Low-Byte High-Byte (vom Low-Word), dann low-Byte High-Byte vom High-Word.

      Vielleicht versteht man es besser so:
      Nimm eine Zahl und stelle die dir als Hexzahl vor. Jetzt wird von rechts nach links Byte für Byte im Speicher mit aufsteigender Adresse abgelegt.

      &h8877665544332211

      Die 11 liegt an der untersten Adresse, die 88 an der Adresse ganz oben (Offset 7).


      darasol schrieb:

      Ne Lösung such ich übrigens auch noch wie ich ne Zahl welche aus 8 Byte besteht zusammen bekomm.
      Wenn die Bytes einzeln kommen &h88, &h77 usw. dann kannst du das Per Overlay-ByteArray in einen Long (8 Byte) oder andere geeignete Variable mit 8 Byte schreiben.

      Dim Wert as Long
      Dim WertArray(8) as Byte at Wert Overlay

      Die &h88 schreibst du dann in WertArray(7), die &h77 in WertArray(7) usw und zuletzt die &h11 in WertArray(0).
      Dann ist der Wert in dem Long mit Wert verfügbar.

      Möglicherweise wird bei die aber der Vorkommateil und der Nachkommateil getrennt in DWord oder so übertragen. Das ist Format-Abhängig.

      Hast du dir den Link in Post 16 mal angeschaut?
    • Mitch64 schrieb:

      kannst du das Per Overlay-ByteArray in einen Long (8 Byte) oder andere geeignete Variable mit 8 Byte schreiben.
      Long hat 4Byte eine Double hätte 8.
      Da mit dem Overlay erspart viel Arbeit. z.B.
      Dim inarr(32) as Byte
      Dim inkanal as Byte at inarr+4 Overlay
      Dim instand as double at inarr+15 Overlay
      Dim indezi as Byte at inarr+23 Overlay
      ...
      if inkanal=$38 then L2stand = instand
    • Ja den Link hatte ich angeschaut. Wie ich es sehe habe ich aber keine klare Trennung sondern eine ganze Zahl am stück ohne Komma.

      Eben darum ging es mir. 4Byte sind eigentlich das Größte was ich speichern kann. Ich hatte double versucht aber ich meine mal irgendwo gelesen, dass double bei den "kleinen" Atmega auch nur 4 Byte hat?

      Ich werde das mit dem Overlay mal testen.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von darasol ()

    • darasol schrieb:

      dass double bei den "kleinen" Atmega auch nur 4 Byte hat?
      :D
      Da hat der keine Wahl. Die größe gibt Bascom vor. Selbst im Tiny13 wären sie 8Byte, da passen dann gerade 7Stück rein :/
      Wie genau wird der Wert denn übertragen? Eine Teilung durch 255 halte ich für unwahrscheinlich.
      Hier spricht ein Gerät im Wattstunden im Dword(Long) Format. Watt Sekunden wären auch denkbar.
      Für 4Byte würde ich sie in Watt Stunden zurück rechen, die reichen dann für 4Millionen Kwh mit 3 Kommastellen
    • Ja das mit der Teilung die mal angesprochen wurde kam zustände da jeder Wert mit 01 abgeschlossen wird. Sprich wenn ich das weglasse brauch ich auch keine Teilung durch 255.

      Beispiel Zählerstand: 00 00 00 78 53 09 5E 4C

      Ich könnte aber rein theoretisch 3 Byte einsparen. bleiben aber noch 5 übrig. Immer noch 1 zu viel für int.

      Das ist quasi der Zählerstand als eine Zahl. von rechts gezählt 8 stellen sind nach dem Komma und dann kommen die Zahlen vor dem Komma.
    • Hallo @darasol
      Ich habe mir deine Logs nochmal angeschaut. Es müsste ein SML-Protokoll sein. Alles deutet darauf hin.
      Allerdings müssten dach den Kennungen (odis) Werte kommen, die mit $FF getrennt sind.

      77 07 01 00 10 07 00 7F 01 01 62 1B 52 7E 55 00 00 6A 2E 01
      77 07 01 00 24 07 00 7F 01 01 62 1B 52 7E 55 00 00 1E 09 01
      77 07 01 00 38 07 00 7F 01 01 62 1B 52 7E 55 00 00 12 7D 01
      77 07 01 00 4C 07 00 7F 01 01 62 1B 52 7E 55 00 00 39 28 01

      Da steht bei dir immer 7F. Das kommt, weil 7 Datenbits lt. Datenblatt des Herstellers übertragen werden, bzw. du das eingestellt hast.
      Versuche mal ein Log mit 9600 Baud 8, even, 1 und poste das mal.
      Ich vermute das ist der Grund, warum man die Zahlen nicht zusammen bekommt. Bzw. sie keinen Sinn ergeben.

      Und am besten noch die Angabe dazu, welcher Wert denn da übertragen werden müsste. Vielleicht ein Foto vom Zähler.
      (private Daten unkenntlich machen, es geht um die Anzeigen der Zähler).
    • Hallo Mitch,

      nein alles gut. Die Werte werden richtig übermittelt.

      77 07 01 00 10 07 00 7F 01 01 62 1B 52 7E 55 00 00 6A 2E 01 <--- Leistung alle 3 Phasen in Summe
      77 07 01 00 24 07 00 7F 01 01 62 1B 52 7E 55 00 00 1E 09 01 <---- Leistung L1
      77 07 01 00 38 07 00 7F 01 01 62 1B 52 7E 55 00 00 12 7D 01 <---- Leistung L2
      77 07 01 00 4C 07 00 7F 01 01 62 1B 52 7E 55 00 00 39 28 01 <------ Leistung L3

      Funktioniert auch Prima mit dem Auslesen und Speichern. Sind in dem Fall ja auch nur 4 Byte Groß.
      Beispiel Leistung L1 ----> 00 00 6A 2E

      Das Problem war nur beim Zählerstand. Der kommt auch richtig an, nur hängt es bei der Weiterverarbeitung meiner Meinung nach.
      Beispiel aktueller Zählerstand ----> 00 00 00 78 53 09 5E 4C (8 Byte Groß)
      00 00 00 78 53 09 5E 4C = 516789198412 = 5167,89198412 kWh

      Also ich MUSS die ganzen 8 Byte nehmen. Kann da nix wegkürzen. Werde das mit dem double aber mal versuchen.
    • Ja das Double ist echt blöd. Man kann zwar die 8 Byte speichern aber nicht damit rechnen da es eine Fließkommavariable ist.
      Zum umrechnen wäre sie vielleicht brauchbar?

      Quellcode

      1. Dim Zdw As Dword : Zdw = $785309
      2. Dim Zdoub As Double
      3. Do
      4. nop
      5. Zdoub = Zdw
      6. Zdoub = Zdoub * 0.65536
      7. Zdw = Zdoub
      8. Loop
      Damit wäre ein 4 Byte großer Zählerstand in Wattstunden vorhanden.
    • Pluto25 schrieb:

      Dim Zdw As Dword : Zdw = $785309
      Dim Zdoub As Double

      Do
      nop
      Zdoub = Zdw
      Zdoub = Zdoub * 0.65536
      Zdw = Zdoub
      Loop
      Wie kommst du denn auf diesen Umrechnungsfaktor 0,65536?

      Eine Fließkommazahl wird im Speicher anders abgelegt als Integer-Werte. Je nach Variablentyp (Single oder Double) werden unterschiedlich viele Bits für Mantisse und Exponent verwendet. Siehe Wikipedia.
      Deshalb kann ich mir nicht vorstellen, dass man einen Double-Wert durch Multiplizieren mit einem Faktor in ein DWord wandeln kann.

      Und warum soll das mit dem Overlay nicht gehen?

      Ein Double wird in 8 Byte (ein Single in 4 Byte) gespeichert. Will man ein Double übertragen, würden also 8 Hexwerte übertragen. Fügt man die im Empfänger wieder zusammen, hat man seinen Double wieder.
    • Mitch64 schrieb:

      Deshalb kann ich mir nicht vorstellen, dass man einen Double-Wert durch Multiplizieren mit einem Faktor in ein DWord wandeln kann.
      Glaub ich auch. Bedenkt man wie viel Arbeit Bascom damit hat würde ich es erst gar nicht versuchen. :D
      Der Richtige Wert ist eine 8 Byte Binärzahl. Genutzt werden davon nur 4. Das höchste und drei niedrigen entfallen.
      Die Multiplikation nur um den Dezimalfehler auszugleichen.