Jump to content
Anzeige:
nächste DASYLab Schulungstermine bei measX
DASYLab und Python 17.10. + 18.10.2017 Mönchengladbach
DASYLab und Python 14.11. + 15.11.2017 Ludwigsburg
Kaschi

RS232 Daten Empfangen und Datentyp wandeln

Empfohlene Beiträge

Hallo,

Ich bin neu hier im Forum und bedanke mich nochmal für die Aufnahme.

Zu meinem Problem: Ich nutze Dasylab 13 um Daten aus einem Analysator über RS232 auszulesen. Dafür verwende ich den COM-Eingang mit dem im Anhang befindlichen Einstellungen. Das Gerät gibt mir einen String zurück, wo der eigentliche Floatwert mit drin enthalten ist. Dieser sieht folgendermaßen aus:

An dem Gerät gesendeter Befehlstring: #2,1,S;

Im RS232-Monitor zurückgegebener String: #2,1,S42.5; (Laut beschreibung des Analysators soll der zurückgegebene Wert im Ascii-Format vorliegen)

Ich möchte nun jedoch nur den Wert #2,1,S42.5; an ein Digitalinstrument angezeigt bekommen. Dazu habe ich mir überlegt, folgende Syntax unter Messdaten-Format einzugeben: 6XF1X --> Im RS232-Monitor wird nun jedes mal wenn ich auf den Knopf senden drücke die Fließkommazahl rot dargestellt. (Also alle anderen zeichen werden ignoriert) #2,1,S42.5; (siehe Anhang).

Ich nehme an, dass durch den Befehl im Messdatenformat der richtige Datentyp von Dasylab erkannt wird. In diesem Fall aus dem String ein Float, da das F im Befehl 6XF1X eine Fließkommazahl erkennt. (Ich hoffe meine Annahme ist richtig). Leider bekomme ich an mein Digitalinstrument immer nur den Wert 0,00 angezeigt. Ich möchte mir diesen Floatwert zudem sekündlich in eine Asciidatei schreiben.

Ich habe den Befehlsstring #2,1,S; unter Messdaten-Anforderung in Dasylab eingetragen und sende diesen jede Sekunde zu dem Gerät.

Meine Schnittstellenkonfiguration ist: COM1/9600 Baud/8 Datenbits/Stoppbits:1/Parität:keine/Handsshake:Ohne(R0/D0)/Eingangspuffer 4K --> Unter diesen Einstellungen bekomme ich ja auch Daten vom RS232-Monitor zurück. Scheint also alles OK zu sein. Der Statusbalken (rot/grün) im Modul COM reagiert auch sekündlich. Ich vermute das der Datentyp der falsche ist. Gibt es eine Möglichkeit ggf. den Datentyp von z.B. String auf Float zu konvertieren?

Kann mir jemand bei diesem Problem helfen?

Danke und Gruß Kaschi

post-6161-0-65755200-1445002844_thumb.pn

post-6161-0-27581300-1445002845_thumb.pn

post-6161-0-81581700-1445002845_thumb.pn

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo

Mit den Buchstaben im Format String sagst du dem seriellen Modul, wie die Daten aussehen, die auf der seriellen Schnittstelle ankommen. Mit "A" legts du fest, das die Daten im Ascii Format ankommen, also lesbarer Text... Diese werden dann ausgewertet und intern in eine Fließkommazahl umgewandelt. Auf den Leitungen in Dasylab sind immer Fließkommazahlen unterwegs.

Viele Grüße aus Mönchengladbach

Stephan Gerhards

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo,

Alles klar. Danke noch für die Antwort.

Noch eine Frage: Beim starten von Dasylab überprüft Dasylab ja die COM-Schnittstellen. Ist es möglich, wenn keine serielle Schnittstelle vorhanden ist, die Fehlermeldung zu unterbinden? Ich nutze eine Com-Schnittstelle über USB. (Also USB auf RS232). Ich habe folgendes "Problem". Ich nutze sowohl einen analogen Eingang (Goldammer-Messkarte) und zusätzlich eine serielle Schnittstelle. Wenn ich jedoch nur mal Änderungen im Schaltbild vornehmen möchte ohne das die serielle Schnittstelle am PC über USB angeschlossen ist, kommt logischerweise eine Fehlermeldung das die serielle Schnittstelle nicht erkannt werden konnte. Gibt es dort eine Möglichkeit diese Fehlermeldung zu unterbinden?

Gruß Kaschi

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo!

Im Menüpunkt Optionen können Sie einstellen, dass die Warnungen nicht als Messagebox angezeigt werden, sondern in die Textkonsole (Ansicht: InfoBlock+Konsole) umgeleitet werden.

Das Laden des Schaltbilds wird aber dennoch verzögert, weil die im Schaltbild befindlichen RS232-Module trotzdem vergeblich versuchen, das Gerät über die serielle Schnittstelle anzusprechen.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo,

Super. Gefunden und funktioniert. Das war es was ich gesucht habe. Ich muss sagen, ein super Forum! Man bekommt immer schnell Antworten. Ich hoffe ich kann dem einen oder anderen irgendwann auch mal weiterhelfen. ;-)

Danke und Gruß

Kaschi

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo nochmal,

Wie es scheint habe ich mich zu früh gefreut. Nochmal zu meiner Frage am Anfang zurück. Ich habe in Dasylab 13 den Befehlsstring aus meiner ersten Frage gesendet. Jedoch habe ich damals als Messdatenformat nicht 6XA1X sondern 6X4A1X eingegeben. Mit letzterem funktioniert alles auch einwandfrei und ich bekomme die entsprechende Fließkommazahl zurückgegeben und wird auch angezeigt. Ich habe nun in der Dasylabhilfe gesehen, dass man den Befehl 6XA1X verwenden kann, um einen entsprechenden Wert (in meinem Falle eine Fließkommazahl) von unbestimmter Länge auszulesen. (Also wenn die Länge des auszulesenden Wertes vorher nicht bekannt ist. Das ist bei mir gerde der Fall. Leider tritt bei Dasylab immer ein Fehler auf, dass das Messdatenformat falsch sei! In der Hilfe ist es so aber eindeutig beschrieben. Immer wenn ich Werte vor dem A setze, also z.B 6X1A1X oder 6X2A1X, funktioniert alles. Lasse ich das A allein stehen erscheint der Fehler und der Monitor erkennt das meine Fließkommawerte nicht mehr. Ich befürchte es ist ein Bug in Dasylab 13. Kann das sein?

Ich würde mich über eine Antwort freuen.

Grüße Kaschi

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo!

Wenn das a alleine steht, dann muss ein Terminator-Zeichen angegeben werden, damit DASYLab weiss, bei welchem Zeichen es aufhören soll zu lesen. Wenn vor dem a eine Zahl steht, dann braucht man keinen Terminator, weil die Anzahl direkt angegeben ist.

Zum Beispiel folgende Antwort vom Gerät:

Antwort 1 -- Volt:8.0;Ampere:0.5;

Antwort 2 -- Volt:8.123;Ampere:0.123456;

...

Antwort n... usw

Wenn man nun nur den Stromwert haben möchte: 16x a \x2c

16x --> überspring alles bis zum Doppelpunkt vor der 0.5.

a --> alle ASCII-Zeichen, die nun folgen, versuchen in eine Zahl umzuwandeln

\x2c --> alle Zeichen? Nein, wenn ein Semikolon (Hex-Code 2c) gefunden wird, aufhören!

Was hier nicht funktionieren würde, ist die Angabe einer Zahl vor dem a, weil bei Antwort 1 der Ampere-Wert 3 Zeichen lang ist, in der folgenden Antwort aber 8 Zeichen.

Es gibt auch Geräte, die senden immer eine Antwort identischer Länge, z.B.:

(Leerzeichen sind durch Punkte angedeutet.)

Antwort 1 -- ....Volt.....8.0..Ampere.....0.5

Antwort 2 -- ....Volt...8.123..Ampere0.123456

Hier könnte man versuchen, mit einer Zahl vor dem a zu arbeiten, da die Länge der Texte, die Zahlen darstellen sollen, nicht variiert.

24x8a

24x --> überspring alles bis vor das ersten Leerzeichen nach "Ampere".

8a --> wandelt die nächsten 8 Zeichen um

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo nochmal..

Ich habe mal wieder ein kleines Problem. Folgendes..

Ich habe inzwischen mehrere Befehle in das COM-Modul von Dasylab eingegeben. Der erste (wie bereits aus meinen vorherigen Beiträgen) ist geblieben. #2,1,S; --> Mit dem Messdatenformat 6xa\x3b bekomme ich auch die Float-Werte zurückgegeben. z.B. #2,1,S30,0;

Jetzt habe ich zwei weitere Kanäle eingefügt. Die Messdatenanforderung unterscheidet sich nicht wesentlich. Nr. 2 ist: #2,2,S; und Nr. 3 ist: #2,3,S; (Ich lese mit dieser Messdatenanforderung lediglich andere Profile aus meinem Gerät aus wo andere Werte enthalten sind). Ich verwende dazu dasselbe Messdaten-Format wie oben. Also 6xa\x3b und lasse sie mir jeweils an einem Digitalinstrument anzeigen. Funktioniert auch soweit.

Leider habe ich nun festgestellt, dass wenn ich die Messung zwischendurch am externen Messgerät stoppe und danach wieder aktiviere, dass Dasylab dann die Werte verschiebt. D.h.

Ich möchte Wert Nr. 1 auch am Digitalinstrument 1 angezeigt bekommen, Nr. 2 an Digitalinstrument 2, und Nr. 3 auch am Digitalinstrument 3. Nach dem Neustart stehen nun (manchmal) Die Werte aus Nr. 1 am Digitalinstrument 2, Nr. 2 am Instrument 1 usw. Nach einem weiteren start bleibt es manchmal so, oder sie werden wieder in der richtigen Reihenfolge dargestellt. Dasylab bleibt dabei permanent im Run-Modus. Also Messung ist nicht gestoppt.

Gibt es eine Möglichkeit, diesen Fehler zu unterbinden? Also das die Reihenfolge immer richtig eingehalten wird? Ich dachte evtl. daran, dass man das Messdatenformat anpasst. Also das man nach einer fixen String-Reihe sucht und nicht zu Anfang die Werte mit X überspringt. Bestände die Möglichkeit nach #2,1,S bzw. #2,2,S oder #2,3,S zu suchen danach alles was vorher Stand zu löschen?

Ich habe das Gefühl, dass sich in Dasylab irgendwo in einem Puffer noch Werte befinden, die nach dem Start des externen Gerätes noch irgendwie dazwischen mogeln bzw. das Dasylab nach dem starten des Geräts mit Kanal 2 oder 3 weiter macht und nicht mit Kanal 1 als Ausgangspunkt. Leider habe ich für das externe Gerät auch keinen Reset-Befehl zur Verfügung um einen eindeutigen Zustand herzustellen.

Ich würde mich über eine Antwort freuen.

Grüß Kaschi

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo,

Problem hat sich erledigt. Es hatte nichts mit den Datenanforderungen zu tun, sondern mit der Datenausgabe. Ich musste lediglich die Datenausgabe auf "Messwerte von allen Kanälen ausgeben" ändern und die "Anforderung wiederholen" sowie die "Verbindung wiederherstellen" in den Optionen des RS232-Moduls auf Nein setzen. Jetzt scheint es zu funktionieren. Ich nehme an, dass die RS232 Verbindung zu langsam ist und durch die erneute Anforderung der Daten irgendetwas unsynchron lief.

Aber noch ein kleines Problem mit dem Messdaten-Format habe ich dennoch. Ich möchte mir gerne die Uhrzeit von meinem Gerät bei jeder Anfrage ausgeben lassen. Dieses erreiche ich mit der Anforderung #7,RT; Der zurückgegebene Wert kommt dann im folgenden Format: #7,RT,hh,mm,ss,DD,MM,YYYY; also als Beispiel: #7,RT,20,45,10,22,12,2015: Ich möchte mir jetzt jedoch nur die Uhrzeit ohne Datum anzeigen lassen. Leider bekomme ich das entsprechende Messdatenformat nicht so hin gebastelt, dass es mir in einem Digitalinstrument oder in einer Textbox angezeigt wird. Hat da jemand eine Idee?

Gruß Kaschi

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo,

Ich habe ein kleines merkwürdiges Problem mit RS232 Daten. Seit ein paar Monaten nutze ich eine kabelgebundene Strecke mit einer TTY-Wandlung um einen Analysator auf große Distanz auszulesen. Das hat auch immer einwandfrei funktioniert. Nun habe ich anstatt eines TTY eine Funkstrecke verwendet. (Auch über RS232). Die Datenanforderung aus Dasylab heraus ist alles gleich geblieben da sich das Endgerät ja nicht geändert hat. RX/TX-Signale etc. ist eins zu eins ersetzt wurden. Wenn ich nun über den Dasylab-Monitor die Anforderungs-Strings manuell sende, bekomme ich auch wie gewohnt die Daten die ich auslesen möchte richtig und aktualisiert angezeigt ( z.B. #2,1,S30,0;), wie ich es schon über das kabelgebundene System kannte. Leider werden mir jetzt merkwürdigerweise die Werte nicht mehr in meiner Benutzeroberfläche angezeigt wie z.b. in einem Digitalinstrument. Ich verstehe jetzt aber ehrlich gesagt nicht wieso das nicht mehr funktioniert? Ich habe bereits in Dasylab auch die Datenanforderung auf "wiederholen" gesetzt und "erneut verbinden" versucht. Das hilft aber alles nichts. Die Befehle werden nur gesendet/empfangen wenn ich den Monitor benutze.

Kann mir da jemand zufällig weiterhelfen, sodass ich die Werte auch wieder auf meiner Benutzeroberfläche sehen kann?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo,

die Daten, die Sie als Antwort erhalten, werden im Monitor "einfach" nur angezeigt, bei der Analyse aber muss die Antwort perfekt zu den Formatstrings passen. Möglicherweise wird bei der neuen Verbindung ein oder mehrere Symbole zusätzlich (oder weniger) gesendet. D.h. hier sollten Sie in einem Testschaltbild die ankommende Nachricht, deren Daten Sie aus dem RS232-Modul ausgeben, noch einmal Zeichen für Zeichen kontrollieren.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo,

Danke für die schnelle Antwort. Es hat sich vermutlich tatsächlich ein Fehler in einer der Formatstrings eingeschlichen. (warum auch immer). Ich habe jedoch nun ein Problem die richtigen terminatoren dafür festzulegen.

Ich gebe folgende Datenanforderung heraus. #2,1,L95;

Im Monitor bekomme ich als Rückgabewert nun folgendes angezeigt: #2,1,L(95)36.1,L(95)36.1,L(95)36.1

Aus ihrer Antwort vom 24.11.2015 habe ich folgendes Messdatenformat abgeleitet: 10xa\x2c --> Überspringe bzw. lösche mir die ersten 10 Werte --> erkenne mir die nachfolgenden Werte als ASCII --> Aufhalten wenn Komma erkannt (Hexadezimal 2c) 

Was mich jetzt irretiert ist, dass das Komma wie oben dargestellt noch mit "rot" erkannt wird. Eigentlich hätte ich erwartet, dass ich nun nur die 36,1 zurückgegeben bekomme. Warum ist das so?

Drücke ich erneut auf die Datenanforderung, kommt folgendes heraus: 2. #2,1,L(95)36.1,L(95)36.1,L(95)36.1#2,1,L(95)35.1,L(95)35.1,L(95)35.1

Ich möchte jedoch immer nur pro Anforderung die erste Fließkommazahl zurückgegeben bekommen. Also folgendes:

#2,1,L(95)36.1,L(95)36.1,L(95)36.1#2,1,L(95)35.1,L(95)35.1,L(95)35.1

Was mache ich da falsch? Normalerweise müsste mir mein Messdatenformat doch die Werte ,L(95)36.1,L(95)36.1 nach der ersten Anforderung nicht mehr mit berücksichtigen.. Eigenartig ist auch, dass mir der Wert bei der ersten Anforderung (also 36,1) trotz des dargestellten Kommas trotzdem im Digitalinstrument als Wert angezeigt wird?!

Es wäre nett wenn man mir hier nochmal weiterhelfen könnte.

Gruß Kaschi

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo!

Das Problem wird sein, dass das Gerät gar kein Abschlusszeichen für eine Nachricht sendet.

Probieren Sie bitte einmal aus, im Formatstring nach der Zeichenfolge "#2" zu suchen und von "hier" aus die Interpretation fortzuführen. "#2" scheint eine Kennung für den Nachrichtenstart zu sein.

Formatstring: "#2" 8x a \x2c
Die #2 ist tatsächlich mit "" zu umgeben.

Es wird im Puffer des Moduls nach dem ersten Vorkommen von Text #2 gesucht.
Der Interpretationscursor steht dann auf dem Komma hinter der 2.
Jetzt 8 Zeichen überspringen.
Nun alle Zeichen bis zum ersten Komma versuchen als Zahl auszugeben.

Bei der nächsten Datenanforderung wird die neue Antwort an den noch im Puffer befindlichen Text angehängt.
Beim erneuten Interpretieren, wird aber zum nächsten #2 gesprungen und der bis dahin noch uninterpretierte Text wird verworfen/übersprungen.

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Hallo,

 

Danke für die schnelle Hilfe. Das hat mir sehr weitergeholfen. Zwar zeigten die Digitalmessinstrumente zuerst auch weiterhin mit der von Ihnen genannten Methode nichts an, jedoch habe ich es nun heraus gefunden.

Das Problem war, das mein COM-Eingang mit 12 Eingängen belegt ist, die nicht alle denselben ASCII-String zurückgeben. Ich hatte für diesen einen speziellen Fall (siehe Anfrage von Mittwoch 31.08.2016) nun die von Ihnen genannte Zeichensuche ausprobiert. Es wurde weiterhin nichts angezeigt. Eine Erweiterung führte jedoch zum Erfolg.

Als Beispiel:

Kanal 1: Anforderungsstring: #2,1,S; --> Zurückgegebener Wert ist: #2,1,S41,5; Angewendeter Formatstring: "#2,1,S"a\x3B (funktioniert ergibt 41,5)

Kanal 2: Anforderungsstring: #2,1,R; --> Zurückgegebener Wert ist: #2,1,R50,3; Angewendeter Formatstring: "#2,1,R"a\x3B (funktioniert ergibt 50,3)

Kanal 3: ... usw

Kanal 4 Anforderungsstring: #2,1,L(95); --> Zurückgegebener Wert ist: #2,1,L(95)36.1,L(95)35.2,L(95)33.4

Angewendeter Formatstring: "#2,1,L(95)"a\x2c (funktioniert ergibt 36,1,) --> Das eigenartige daran ist, dass der Wert mir nun im Schalbild angezeigt wird, obwohl der Formatstring noch ein Komma hinter der 36,1 erkennt. Also 36,1(Zumindestens im Monitor)  Das kann ich mir noch nicht wirklich erklären, da ich ja beim Komma (Hex 2c) im Formatstring "abbreche" und die restliche Zeichenkette L(95)35.2,L(95)33.4 überspringe. Nun denn.. Man muss nicht alles verstehen :-) Es klappt ja.

Danke nochmal für die schnelle Hilfe!! Echt super!

Gruß Kaschi

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden

×