LabVIEWForum.de - Serial RS232 IR Diode- Stromzähler Kommunikationsproblem

LabVIEWForum.de

Normale Version: Serial RS232 IR Diode- Stromzähler Kommunikationsproblem
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallöchen,

ich bastel gerade in Labview 2014 an einer Kommunikation über die Serielle Schnittstelle.

Es funktioniert ansich auch gut.

Ich möchte einen Easymeter Stromzähler per D0 Schnittstelle auslesen.

Dieser hat folgendes Datenprotokoll:
/ESY5Q3DA1004 V3.04

1-0:0.0.0*255 - Eigentummsnummer
1-0:1.8.0*255 - Zählerstand mit Rücklaufsperre
1-0:21.7.0*255 - L1 - active Power
1-0:41.7.0*255 - L2 - active Power
1-0:61.7.0*255 - L3 - active Power
1-0:1.7.0*255 - Summe L1-3
1-0:96.5.5*255(80) - Statuswort
0-0:96.1.255*255(1ESY1160006857) - Fabriknummer
!

Das Klappt soweit auch meistens. Allerdings sendet der Stromzähler etwa alle 2 Sekunden ein Signal. Problem ist das ganze stabil über lange Zeit laufen zu lassen. Ich bekomme ab und an Paritätsfehler bzw. Rahmenfehler. Diese versuche ich auch abzufangen, es wird dann immer wieder abgefragt bis er sozusagen "trifft". Und dann weiter alle 2 Sekunden abzufragen. Aber ab und an bekomm ich ich halt Fehler..

Meine Frage ist ob es noch eine eleganteren Weg gibt dauerhaft zu lauschen .. Anbei mein VI

Im Prinzip will ich etwas das prüft ob die Bits passen... naja
Hallo grantiger,

wenn du dauerhaft lesen willst, dann ist es eine schlechte Idee, den Port andauern zu öffnen und zu schließen!
Und eine Schleife fehlt auch in deinem VI, bisher läuft es nur einmal durch!

Die Beispieldaten sehen aus, als wenn es ein definiertes Zeilenende-Zeichen gibt (LF oder CR), warum also nicht dieses nutzen, indem das TermChar entsprechend im SerialPortInit aktiviert wird (und man auf BytesAtPort verzichtet)?
Da hast du natürlich recht mit dem Öffnen und Schließen im Moment ist das ganze ein SUB-VI in einer State Queue Machine.
Daher auch keine Schleife.

Das mit dem TermChar habe ich bisher noch nicht ganz hinbekommen. Ich bekomme damit immer nur die erste Zeile ausgelesen.
Was wohl am default Termchar liegt.

Laut Protokoll endet das ganze mit !CR LF .. habe ich so noch nicht hinbekommen als Termchar zu definieren?
Der Fehler ist normal: Das Gerät sendet ständig, und dein Programm beginngt irgendwann mit dem Lesen. In den meisten Fälle wird das in einer Sendepause sein, und dann hat man Glück. Es kann aber auch aber auch mitten in einem Datensatz oder sogar mitten in einem gesendetem Byte sein. Dann hat man Fehler. Man könnte die vermeiden, indem man erst das Programm einschaltet und dann das Gerät. Besser aber löst man das Problem in der Software, und zwar so:

1.) Das Lesen muß in einer Schleife erfolgen, die Schnittstelle darf nicht ständig neu konfiguriert werden.
2.) Wenn es beim Lesen anfänglich Daten- oder Rahmenfehler gibt, so sind diese Fehler abzufangen und die Daten zu verwerfen.
3.) Wenn das nicht mehr der Fall ist, ist die Datenverbindung "synchronisiert" und die Daten können benutzt werden.

Tip:
Einlesen entweder so:
Zeilenweise einlesen, Abschlußzeichen "Zeilenende" aktivieren. In einer inneren Schleife alle Zeilen eines Datensatzes lesen. Die Letzte Zeile erkennt man am Ausrufezeichen. Man hatte dann ein Zeilen-Array.
Oder so:
Als Abschlußzeichen "!" aktivieren. Dann wird der vollständige Text eines Datensatztes auf einmal gelesen. Man muß dann den Text analysieren, was etwas umständlicher ist als wenn es bereits ein Zeilen-Array wäre.

Hier noch ein Entwurf (ungeprüft) zur Methode 1:
[attachment=55616]
(Falls der Stringvergleich mit "!" nicht funktioniert, dann die Stringfunktion "Nicht ausführbare Zeichen entfernen" noch einfügen.)
Ich würde in den While Schleife Zeichen für Zeichen auslesen und bei der zweiten While Schleife das gelesenen in ein Schieberegister schreiben. Dann sollten Dir keine Daten verloren gehen.
Besten Dank an alle! Luckis Lösung mit noch einfügen der Funktion "Nicht ausführbare Zeichen entfernen" brachte Erfolg!

Bisher habe ich keinen Fehler mehr nach langer Laufzeit feststellen können.

Jetzt muss ich mir nur noch etwas basteln dass es gut in mein gesamtes Programm reinpasst.

Dankeschön!
Referenz-URLs