EasyMeter auslesen

    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!

    • EasyMeter auslesen

      Moin,

      so ein EasyMeter sendet ja alle zwei Sekunden über die D0 Schnittstelle Daten aus, was dann so ähnlich aussieht wie in der angehängten Datei.
      Diese Daten lese ich per Hardware UART in ein Byte-Array ein und schneide die für mich interessanten Nutzdaten per String-Overlay zusammen.
      Um das Ende der jeweiligen Strings für die Ausgabe zu erkennen, muss ich gewisse Bytes im Array eine Null zuweisen. Außerdem ersetzte ich
      die Punkte der einzelnen Werte in ein Komma. Das Ganze funktioniert soweit, nur finde ich das zusammenfrickeln der Ausgabe (Zeilen 33 bis 43)
      nicht so elegant.

      Hat jemand einen anderen Ansatz?

      Hier der Code

      Quellcode

      1. $regfile = "m32def.dat"
      2. $crystal = 8000000
      3. $hwstack = 100
      4. $swstack = 100
      5. $framesize = 100
      6. ' Hardware Uart für das auslesen des EasyMeter
      7. Config Com1 = 9600 , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 7 , Clockpol = 0
      8. On Urxc Urxc_isr
      9. Enable Urxc
      10. Dim Uartchar As Byte
      11. Dim Start_empfang As Byte
      12. Dim Uartstring_index As Byte
      13. Dim Uartstring(210) As Byte
      14. Dim Zaehlernummer As String * 13 At Uartstring(39) Overlay
      15. Dim Zaehlerstand As String * 12 At Uartstring(69) Overlay
      16. Dim Leistung_l1 As String * 9 At Uartstring(109) Overlay
      17. Dim Leistung_l2 As String * 9 At Uartstring(140) Overlay
      18. Dim Leistung_l3 As String * 9 At Uartstring(171) Overlay
      19. Dim Leistung_ges As String * 9 At Uartstring(201) Overlay
      20. ' Software Uart für die Seriale Ausgabe
      21. Open "comd.6:19200,8,n,1" For Output As #1 'TxD-Pin
      22. Dim Ausgabe_flag As Byte
      23. Enable Interrupts
      24. Do
      25. If Ausgabe_flag = 1 Then
      26. Uartstring(52) = 0 ' Null-Byte um String zu trennen (Zählernummer)
      27. Uartstring(80) = 0 ' Null-Byte um String zu trennen (Zählerstand)
      28. Uartstring(77) = 44 ' Punkt durch Komma ersetzten (Zählerstand)
      29. Uartstring(118) = 0 ' Null-Byte um String zu trennen (Leistung L1)
      30. Uartstring(115) = 44 ' Punkt durch Komma ersetzten (Leistung L1)
      31. Uartstring(149) = 0 ' Null-Byte um String zu trennen (Leistung L2)
      32. Uartstring(146) = 44 ' Punkt durch Komma ersetzten (Leistung L2)
      33. Uartstring(180) = 0 ' Null-Byte um String zu trennen (Leistung L3)
      34. Uartstring(177) = 44 ' Punkt durch Komma ersetzten (Leistung L3)
      35. Uartstring(210) = 0 ' Null-Byte um String zu trennen (Leistung ges)
      36. Uartstring(207) = 44 ' Punkt durch Komma ersetzten (Leistung ges)
      37. Print #1 , "Zaehler-Nr: " + Zaehlernummer
      38. Print #1 , "Zaehlerstand: " + Zaehlerstand
      39. Print #1 , "Leistung L1: " + Leistung_l1
      40. Print #1 , "Leistung L2: " + Leistung_l2
      41. Print #1 , "Leistung L3: " + Leistung_l3
      42. Print #1 , "Leistung ges.:" + Leistung_ges
      43. Ausgabe_flag = 0
      44. End If
      45. Loop
      46. End
      47. Urxc_isr:
      48. If Udr = 47 Then Start_empfang = 1 ' Start => ASCII-zeichen "/" enpfangen
      49. If Start_empfang = 1 Then
      50. Incr Uartstring_index
      51. Uartstring(uartstring_index) = Udr
      52. If Uartstring_index = 210 Then
      53. Start_empfang = 0
      54. Uartstring_index = 0
      55. Ausgabe_flag = 1
      56. End If
      57. End If
      58. Return
      Alles anzeigen
      Dateien
      • Elster.JPG

        (49,32 kB, 38 mal heruntergeladen, zuletzt: )
    • Gruetze schrieb:

      Hat jemand einen anderen Ansatz?
      nur einen string und den mit var = MID(var1 ,st [, l] ) in einzelne zerlegen
      avrhelp.mcselec.com/mid.htm
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Die Daten die ich auslesen möchte, sind die die in der angehängten Datei rot eingerahmt sind.

      Das sind der Reihe nach folgende:

      • Zählernummer
      • Zählerstand
      • Leistung L1
      • Leistung L2
      • Leistung L3
      • Leistung ges (L1+L2+L3)
      Die Ausgabe sieht dann so aus

      Zaehler-Nr: 1313003397
      Zaehlerstand: 00013021,96
      Leistung L1: 000267,20
      Leistung L2: 000225,53
      Leistung L3: 000000,00
      Leistung ges.: 000492,73


      Die MID und die ganzen String-Anweisungen fressen viel Speicher. Ich muss mir das mit dem Overlay nochmal genauer ansehen.


      Aber danke euch für die Tips!
    • Du könntest auch in deiner isr gleich die Daten auf die einzelnen strings verteilen. Mit while zaehler>38 and zaehler<52: hier die Daten an den string der Zählernummer anhängen :incr zaehler:wend
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • @Gruetze

      Hi,

      ich habe folgendes Dokument gefunden zu dem Protokoll:
      Pdf

      Das Datenpaket endet mit einem CrLf (Carriage Linefeed).

      Du kannst also den String einfach per Input einlesen.

      Der Input schließt allerdings nach dem Cr ab. Das verbleibende Lf musste manuell dann noch löschen.

      Dann haste den Datensatz in ner Variable z.B. Buffer (String)

      Mit den Overlay-Strings auf den Buffer zugreifen ist nicht verkehrt. Da die Zahlenwerte allerdings mit einer Klammer zu ')' enden.
      kannst du den ReplaceChars-Befehl verwenden, um die Klammern mit Asc(0) zu ersetzen.

      Dann einfach mit Convertierung auslesen.
      Also Wert = Val(Zählerstand) etc.

      Das ganze sieht dann etwa so aus:

      Quellcode

      1. $Regfile = "m32def.dat"
      2. $Crystal = 8000000
      3. Config Com1 = 9600 , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 7 , Clockpol = 0
      4. ' Vorschlag
      5. dim dummy as Byte
      6. Dim Wert as Single
      7. Dim Buffer as String * 255 ' gegebenenfalls Buffer anpassen
      8. Dim strZaehlerNr as String * 6 At Buffer + 6 Overlay
      9. Dim strZaehlerstand as String * 13 At Buffer + 10 Overlay
      10. ' Hauptschleife
      11. Do
      12. ' Input beendet das Einlesen, wenn es auf ein CR trifft
      13. Input Buffer ' Datensatz einlesen bis CR
      14. Inputbin dummy ' CR einlesen
      15. ReplaceChars Buffer , ")" , 0 ' Klammer ')' durch Ascii 0 ersetzen
      16. ' jetzt Werte auslesen
      17. Wert = val(strZaehlerNr)
      18. Loop
      Alles anzeigen
      Du musst halt Buffergröße und die Offsets ind Längen der OberlayStrings anpassen.
      Im Simulator sieht das aber gut aus.
    • @Pluto25kannst du deinen Code einmal zeigen?

      Insperiert von Mitch, fange ich das Ende der Nutzdaten [ ) oder * ] in der isr ab und setze das Null-Byte.
      Außerdem wird der Zählerstand auf zwei Stellen hinter dem Komma begrenzt.
      Ist allerdings 26 Byte größer als mein erster Code. Ich möchte die Daten später mit AVR-DOS auf SD-Karte
      speichern, deswegen der Geiz mit den Bytes.

      Quellcode

      1. $regfile = "m32def.dat"
      2. $crystal = 8000000
      3. $hwstack = 100
      4. $swstack = 100
      5. $framesize = 100
      6. ' Hardware Uart für das auslesen des EasyMeter
      7. Config Com1 = 9600 , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 7 , Clockpol = 0
      8. On Urxc Urxc_isr
      9. Enable Urxc
      10. Dim Uartchar As Byte
      11. Dim Start_empfang As Byte
      12. Dim Uartstring_index As Byte
      13. Dim Uartstring(196) As Byte
      14. Dim Zaehlernummer As String * 13 At Uartstring(25) Overlay
      15. Dim Zaehlerstand As String * 12 At Uartstring(55) Overlay
      16. Dim Leistung_l1 As String * 9 At Uartstring(95) Overlay
      17. Dim Leistung_l2 As String * 9 At Uartstring(126) Overlay
      18. Dim Leistung_l3 As String * 9 At Uartstring(157) Overlay
      19. Dim Leistung_ges As String * 9 At Uartstring(187) Overlay
      20. ' Software Uart für die Seriale Ausgabe
      21. Open "comd.6:19200,8,n,1" For Output As #1 'TxD-Pin
      22. Dim Ausgabe_flag As Byte
      23. Enable Interrupts
      24. Do
      25. If Ausgabe_flag = 1 Then
      26. Print #1 , "Zaehler-Nr: " + Zaehlernummer
      27. Print #1 , "Zaehlerstand: " + Zaehlerstand
      28. Print #1 , "Leistung L1: " + Leistung_l1
      29. Print #1 , "Leistung L2: " + Leistung_l2
      30. Print #1 , "Leistung L3: " + Leistung_l3
      31. Print #1 , "Leistung ges.:" + Leistung_ges
      32. Ausgabe_flag = 0
      33. End If
      34. Loop
      35. End
      36. Urxc_isr:
      37. Uartchar = Udr
      38. If Uartchar = 86 Then Start_empfang = 1 ' Start => ASCII-zeichen "V" enpfangen
      39. If Start_empfang = 1 Then
      40. Incr Uartstring_index
      41. If Uartchar = 41 Or Uartchar = 42 Then Uartchar = 0 ' ) oder * empfangen => NULL-Byte speichern
      42. If Uartchar = 46 Then Uartchar = 44 ' . empfangen => , speichern
      43. If Uartstring_index = 65 Then Uartchar = 0 ' Zählerstand auf 2 Stellen hinter dem Komma begrenzen
      44. Uartstring(uartstring_index) = Uartchar
      45. If Uartstring_index = 196 Then
      46. Start_empfang = 0
      47. Uartstring_index = 0
      48. Ausgabe_flag = 1
      49. End If
      50. End If
      51. Return
      Alles anzeigen
    • djmsc schrieb:

      Da muss das ECHO = xx noch dahinter
      Und wenn ich kein Echo brauchen kann? a_67_e210de67 Ob Echo=0 richtig wäre? Jedenfalls macht es dann keine Fehlermeldung.

      Gruetze schrieb:

      Insperiert von Mitch,
      von tscheoatsch?
      Ich hatte Mitchs Ansatz mal den gewünschlten Daten angepaßt :

      Quellcode

      1. $Regfile = "m32def.dat"
      2. $crystal = 8000000
      3. $hwstack = 100
      4. $swstack = 100
      5. $framesize = 100
      6. Config Com1 = 9600 , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 7 , Clockpol = 0
      7. ' Vorschlag
      8. 'Config Input = Crlf , Echo = Noecho
      9. Dim Dummy As Byte
      10. 'Dim Wert As Single
      11. Dim Buffer As String * 255 ' gegebenenfalls Buffer anpassen
      12. 'Dim Strzaehlernr As String * 13 At Buffer + 39 Overlay
      13. 'Dim Strzaehlerstand As String * 12 At Buffer + 69 Overlay
      14. Dim Zaehlernummer As String * 13 At Buffer + 39 Overlay
      15. Dim Zaehlerstand As String * 12 At Buffer + 69 Overlay
      16. Dim Leistung_l1 As String * 9 At Buffer + 109 Overlay
      17. Dim Leistung_l2 As String * 9 At Buffer + 140 Overlay
      18. Dim Leistung_l3 As String * 9 At Buffer + 171 Overlay
      19. Dim Leistung_ges As String * 9 At Buffer + 201 Overlay ' Hauptschleife
      20. Open "comd.6:19200,8,n,1" For Output As #1
      21. Do
      22. ' Input beendet das Einlesen, wenn es auf ein CR trifft
      23. Input Buffer ' Datensatz einlesen bis CR
      24. Inputbin dummy ' CR einlesen
      25. ReplaceChars Buffer , ")" , 0 ' Klammer ')' durch Ascii 0 ersetzen
      26. ' jetzt Werte auslesen
      27. ' Wert = Val(strzaehlernr)
      28. Print #1 , "Zaehler-Nr: ";
      29. Print #1 , Zaehlernummer
      30. Print #1 , "Zaehlerstand: ";
      31. Print #1 , Zaehlerstand
      32. Print #1 , "Leistung L1: " ;
      33. Print #1 , Leistung_l1
      34. Print #1 , "Leistung L2: " ;
      35. Print #1 , Leistung_l2
      36. Print #1 , "Leistung L3: " ;
      37. Print #1 , Leistung_l3
      38. Print #1 , "Leistung ges.:";
      39. Print #1 , Leistung_ges
      40. Loop
      Alles anzeigen
    • Config Input = Crlf , Noecho ergibt:
      Error : 103 Line : 8 = expected [NOECHO] , in File : d:\Eigene Dateien\Bascom\Tests\EasyMeter_5.baa


      Oder so?
      Config Input = Crlf , Echo=Cr und dann im Programm das vorher gesetzte Echo abschalten?
      input Buffer , noecho
      scheint zu funktionieren und ist noch zwei byte kleiner

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