Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Ich habe einen String, in den während einer Messung immer wieder neue Daten geschrieben werden. Dabei benutze ich eine vertikale Bildlaufleiste. Nun soll der String immer den untersten Bereich seines Inhalts anzeigen. Aber irgendwie finde ich nicht wie das geht. Auch bei den Eigenschaftsknoten finde ich nichts. Weis da jemand weiter? Danke schon mal.
Anzeige
23.06.2010, 09:07 (Dieser Beitrag wurde zuletzt bearbeitet: 23.06.2010 09:08 von GerdW.)
Hi!
Ich habe ein ähnliches Problem, komme aber mit der oben stehenden Antwort nicht weiter.
Ich habe einen String, der endlos von einem Router abgegeben wird und verschiedene Messwerte der Form "MesswertA:0123" enthält.
Ich möchte nun stets die vorletzte Zeile dieses Strings (ist die frischeste Zeile, und dabei KOMPLETT - die letzte Zeile kann häufig unvollständig sein) weiterverarbeiten und auf den ":" durchsuchen.
Nun: Wie bekomme ich die Vorletzte Zeile eines nach jedem While-Durchgang längeren Strings?????
Danke euch!
Fabian
27.07.2012, 21:21 (Dieser Beitrag wurde zuletzt bearbeitet: 27.07.2012 21:22 von GerdW.)
die bekommt man, indem man sich merkt, wie weit man den String schon verarbeitet hat und erst ab dieser Stelle nach neuen Werten sucht. Wobei das Konzept eines stetig anwachsenden Strings vielleicht nochmal überdacht werden sollte...
Außerdem hat deine Frage wenig mit der Originalfrage zu tun, anzeigen und verarbeiten ist halt nicht das Gleiche!
Hi!
Jo, das mit dem andauernd laufenden String geht leider schlecht anders.
Mir gehts aber erst mal nicht um die Verarbeitung, sondern ich brauche wirklich nur die Vorletzte Zeile des Strings in einer Variablen, welche ich dann weiterverarbeiten kann...
Ich will auch nicht von "oben nach unten" verarbeiten (Zeile für Zeile), sondern nur die neueste, noch ganze Zeile. Denn wenn ich, wie Du meintest, nur die letzte, noch nicht verarbeitete Zeile verwende, kann es möglich sein, dass dieser Wert ja schon wieder veraltet ist - was für meinen Programmablauf dann natürlich nicht gut wäre.
Alternativ kann ich auch das gesamte, zuletzt empfangene Paket verarbeiten, ehe ich ein neues hole.
Dieses kann dann aber so aussehen:
"enA:209543
DatenB:4923
DatenC:44532
DatenE:5432
DatenF:325256
Date"
Auch hier ist das Problem: erste und letzte Zeile sind unvollständig...
Was tun?
27.07.2012, 21:57 (Dieser Beitrag wurde zuletzt bearbeitet: 27.07.2012 21:59 von GerdW.)
Zitat:Jo, das mit dem andauernd laufenden String geht leider schlecht anders.
Das bezweifel ich doch sehr stark: das gute alte Konzept eines Ringbuffers könnte dir weiterhelfen. Neue empfangene Daten am Ende des Strings anfügen, vom Anfang des Strings jeweils ganze Zeilen entfernen und verarbeiten. Wenn man schneller auswertet als neues empfängt, hat man immer die bis dahin letzte vollständige Zeile verarbeitet...
Zitat:Denn wenn ich, wie Du meintest, nur die letzte, noch nicht verarbeitete Zeile verwende
Hmm... Das hilft mir leider nur bedingt weiter...
Ich habs versucht, aber es scheinen zu viele Daten zu kommen. Ich schaffe es mittlerweile wenigstens, mir die zwei Einträge "DatenA" und "01234" gesondert voneinander anzeigen zu lassen.
Allerdings scheinen die Daten so häufig zu kommen, dass ich nie alle Messwerte bearbeite, sondern nur immer einen aus einem Datenblock. Daher muss ich vielleicht doch Zeile für Zeile abarbeiten, aber schneller, als die neuen Daten kommen.
Aber ich komme einfach nicht dahinter, wie ich mir den gesamten Block (siehe mein letzter Beitrag) nehme und ihn Zeile für Zeile abarbeite!
Dafür muss ich die Zeilenlänge wissen, aber die weiß man ja nie!
28.07.2012, 08:33 (Dieser Beitrag wurde zuletzt bearbeitet: 28.07.2012 08:35 von GerdW.)
nur eine Idee:
Dieser "Receiver" wäre die Producer-Schleife in einem Producer-Consumer-Schema. Das Schieberegister sammelt die empfangenen Strings, mit dem MatchPattern wird jeweils eine Zeile abgetrennt und zur weiteren Verarbeitung in die Queue gepackt. Du musst selbst noch ein bisschen Fehlerbehandlung einfügen, z.B. für den Fall, das gerade keine ganze Zeile im Buffer zur Verfügung steht. Evtl. musst du auch das Zeilenende-Zeichen, nach dem gesucht wird, anpassen...
Zitat:Allerdings scheinen die Daten so häufig zu kommen, dass ich nie alle Messwerte bearbeite, sondern nur immer einen aus einem Datenblock. Daher muss ich vielleicht doch Zeile für Zeile abarbeiten, aber schneller, als die neuen Daten kommen.
Du schreibst ja nicht, wo die Daten herkommen. Du sagst nicht, wie du die Daten empfängst. Du zeigst nicht, wie du die Daten verarbeitest. Du sammelst Daten in einem stetig anwachsenden String, wodurch dein VI auch stetig langsamer werden wird. Aber du willst nicht auf mich hören:
Zitat:Jo, das mit dem andauernd laufenden String geht leider schlecht anders.
Tipp: Falls die neuen Daten wirklich so schnell kommen, wie du beschreibst, dass du mit der Bearbeitung nicht hinterherkommst, kann man die Queue in der Länge begrenzen und "Lossy" verwenden oder einen Notifier verwenden, der immer nur den aktuellsten Werte speichert...
(27.07.2012 21:45 )fabqu schrieb: Alternativ kann ich auch das gesamte, zuletzt empfangene Paket verarbeiten, ehe ich ein neues hole.
Dieses kann dann aber so aussehen:
"enA:209543
DatenB:4923
DatenC:44532
DatenE:5432
DatenF:325256
Date"
Auch hier ist das Problem: erste und letzte Zeile sind unvollständig...
Was tun?
Das ist Flickschusterei, wenn das Problem der unvollständigen Zeilen im Nachinein über Datenauswertung gelöst wird. Die saubere Löung ist eine bessere Konfiguration beim Datenempfang. Einfach in der seriellen Konfiguration "Abschlusszeichen aktivieren". Dann wartet VisaRead so lange, bis eine Zeile vollständig im Buffer ist, und es werden unvollständige Zeilen überhaupt nicht erst empfangen.
Die Unvollständigkeit der ersten Zeile ist allerdings etwas anderes. Das passiert, wenn zuerst der Sender, und dann erst der Empfänger eingeschalten wird. Es kann dabei sogar passieren, dass es anfänglich zu Frame-Error kommt, weil mitten in ein Byte hineingehört wurde. Hiergegen hilft Abfangen der Fehler, bis sich der Empfang synchronisiert hat. (Mit anderen Worten: Diese verstümmelte erste Zeile darf gar nicht erst in den Empfangsstring gelangen)
NB: Ich kenne diese dämliche VISA-Konfigurationen aus tausend falschen Forumsbeispielen. Abchlusszeichen ist ja standardmäßig aktiviert und wird auch so gelassen - soweit OK. Dann aber wird vor ViseRead überflüssigerweise "Bytes on Board" gesetzt und damit das zeilenweise Lesen außer Kraft gesetzt. Die Lösung ist: "Bytes on Board" weglassen und an VisaRead eine feste Bytezahl anschließen, die größer ist als die größte Länge einer empfangenen Zeile.