[2 gelöst] Drei Fragen zu Gnuplot + Dateimanipulation

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
TuxPeter
Beiträge: 2016
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

[2 gelöst] Drei Fragen zu Gnuplot + Dateimanipulation

Beitrag von TuxPeter » 29.02.2020 12:01:24

Hi Debianfreunde

Gnuplot ist toll!
Ein Arduino liefert mir serielle Daten wie folgt:

Code: Alles auswählen

microcom -s 9600 -p /dev/ttyUSB0 -l test.dat
Ersatzweise auch so:

Code: Alles auswählen

microcom -s 9600 -p /dev/ttyUSB0 > test.dat
abgebrochen wird microcom mit ^\\, geht prima.

Die Ergebnisse sollen in einem Liveplot dargstellt werden, auch das funktioniert.

Da entsteht nun gleich die Frage 1:
Wie bekomme ich es hin, jeweils die letzten n Linien in einer Datei zu speichern? Versucht habe ich so etwas wie in versch. Varianten:

Code: Alles auswählen

microcom -s 9600 -p /dev/ttyUSB0 | tail -n100 > test.dat
Ging aber nicht, die Datei blieb leer.

Frage 2:
Als Alternative für das Dateiabschneiden könnte ich in gnuplot jeweils in ein dynamisch sich verschiebendes Fenster plotten, müsste ja nur den jeweiligen letzten X-Wert abspeichern (es handelt sich um ein einfachen xy-Graph). Gedacht wie folgt:

Code: Alles auswählen

plot   "test.dat" using ($1 / 10 ** 6) : ($2 / 10 ** 4) with lines 
pause 1
set xrange [($1) - 100 : ($1) + 100]
reread
Den Versuch, die Col. außerhalb des plot-Befehls in set xrange zu adressieren, wird aber wie folgt kommentiert:

Code: Alles auswählen

column() called from invalid context
Auch Versuche, innerhalb des plot-Befehls diesen Wert irgendwie auf eine Varialbe abzuspeichern, misslang.
Ansonsten funktioniert der sog. Live-Plot mit "pause n" und "reread" prima.

Frage 3: (die Unwichtigste)
Dieses Plot-Fenster mit dem "reread" ist außerordentlich schwer wieder wegzubringen. Ich starte den microcom ... über xfce-Terminal, das kleines Plot-Script in einem anderen tab, das script wird in einem weiteren Editor-Fenster bearbeitet. Normalerweise kann man alles schön beenden. Wenn der Live-Plot läuft, ist allerdings aus: Gnuplot reißt sofort den Focus an sich und läßt sich nicht mehr beenden, auch wenn die Terminal-Fenster geschlossen werden. Bis jetzt hilft nur der kill-Befehl, und zwar über die "echte" Konsole, aber das kanns doch wohl nicht sein? Habe auch mit einiger Suche mit "gnuplot liveplot break" nur immer wieder die Linebreaks gefunden, aber die kannte ich schon. Kann aber notfalls schon mit der Killerei leben.

Grüße, TuxPeter
Zuletzt geändert von TuxPeter am 29.02.2020 20:18:15, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Drei Fragen zu Gnuplot + Dateimanipulation

Beitrag von Meillo » 29.02.2020 12:48:44

Wenn das geht:
TuxPeter hat geschrieben: ↑ zum Beitrag ↑
29.02.2020 12:01:24

Code: Alles auswählen

microcom -s 9600 -p /dev/ttyUSB0 > test.dat
muss das ebenso gehen:

Code: Alles auswählen

microcom -s 9600 -p /dev/ttyUSB0 | tail -n100 > test.dat
Das Problem koennten nur daran liegen:
abgebrochen wird microcom mit ^\\, geht prima.
Kannst du microcom auch nicht-interaktiv starten?

Wie meinst du das denn mit dem Live-Plot? Was die letzten 100 Zeilen sind, weiss man ja erst wenn microcom beendet ist, zuvor kann `tail' noch keine Ausgabe machen.
Use ed once in a while!

TuxPeter
Beiträge: 2016
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: Drei Fragen zu Gnuplot + Dateimanipulation

Beitrag von TuxPeter » 29.02.2020 13:16:10

Vielen Dank für die Antwort.

Ja, der Befehl mit der tail-pipe geht ja auch, wird zumindest nicht angemeckert - nur bleibt die Zieldatei bleibt komplett leer.

Mein Ziel ist ja, die Werte fortlaufend zu plotten. Wenn das dann ne ganze Zeit läuft, werden immer alle Werte dargestellt und die x-Achse immer mehr gestaucht, obwohl ich nur nur die neueren sehen will. (und irgendwann nix genaues mehr erkennen kann)

Innerhalb des gnuplot-Scrips habe ich also keine Möglichkeit gefunden, den X-Range entsprechend dynamisch zu beeinflussen.

Vielleicht habe ich ja den falschen Ansatz und muss noch ein extra bash-script einsetzen, welches dann immer die letzten n Werte auf eine Datei für den Plot schreibt, die dieser dann komplett darstellen kann.

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Drei Fragen zu Gnuplot + Dateimanipulation

Beitrag von Meillo » 29.02.2020 13:32:48

TuxPeter hat geschrieben: ↑ zum Beitrag ↑
29.02.2020 13:16:10
Mein Ziel ist ja, die Werte fortlaufend zu plotten. Wenn das dann ne ganze Zeit läuft, werden immer alle Werte dargestellt und die x-Achse immer mehr gestaucht, obwohl ich nur nur die neueren sehen will. (und irgendwann nix genaues mehr erkennen kann)

Vielleicht habe ich ja den falschen Ansatz und muss noch ein extra bash-script einsetzen, welches dann immer die letzten n Werte auf eine Datei für den Plot schreibt, die dieser dann komplett darstellen kann.
Ja, so wirst du es machen muessen, denn `tail' funktioniert nicht so wie du es dir wuenschst.
Use ed once in a while!

TuxPeter
Beiträge: 2016
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: Drei Fragen zu Gnuplot + Dateimanipulation

Beitrag von TuxPeter » 29.02.2020 13:45:01

Ja, aber dann müssten das Schreiben der kurzen Datei (aus der langen heraus) und ihre Auslesen durch Gnuplot irgendwie synchronisiert werden. Sehe da Komplikationen. Na mal schauen.

Sah für mich nach erneutem man-Einblick so aus, als könne tail allein das Anwachsen einer Datei überwachen und dann entsprechend schreiben, das Problem ist aber dann, dass die Ausgabedatei NICHT wachsen darf - sonst werden die Daten lediglich auf komplizierte Art und Weise umkopiert. Dann vielleicht doch eine simple bash-loop und mal sehen was passiert - muß mich jetzt erst mal um andere Sachen kümmern.

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Drei Fragen zu Gnuplot + Dateimanipulation

Beitrag von Meillo » 29.02.2020 16:31:05

Tail liest seine Eingabe immer bis zum Ende, dann gibt es die letzten n Zeilen aus. Wenn tail aus einer Pipe liest, dann kann tail erst eine Ausgabe erzeugen, wenn der vordere Teil der Pipe beendet ist.


Was du wohl eher suchst ist sowas als separaten Prozess:

Code: Alles auswählen

while :; do
	tail -n100 in >out
	sleep 20
done


D.h. alle 20 Sekunden werden die letzten 100 Zeilen von `in' nach `out' geschrieben.
Use ed once in a while!

TuxPeter
Beiträge: 2016
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: Drei Fragen zu Gnuplot + Dateimanipulation

Beitrag von TuxPeter » 29.02.2020 17:15:49

Hej, danke, so geht es!

Bin ich gerade vor 3 Min. selber drauf gekommen:

Code: Alles auswählen

while [ -f tstQ.dat ]; do
  tail -n20 tstQ.dat > tst.dat
  sleep 1
 done
Wenn ich genug gesehen habe, lösche ich tstQ.dat und das terminiert auch ordentlich.

Nur den Gnuplot kann ich leider immer noch nicht vernünftig beenden - bisher nur mit kill (meine Frage 3)

Mfg TuxPeter

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Drei Fragen zu Gnuplot + Dateimanipulation

Beitrag von Meillo » 29.02.2020 17:22:02

TuxPeter hat geschrieben: ↑ zum Beitrag ↑
29.02.2020 17:15:49

Code: Alles auswählen

while [ -f tstQ.dat ]; do
  tail -n20 tstQ.dat > tst.dat
  sleep 1
 done
Wenn ich genug gesehen habe, lösche ich tstQ.dat und das terminiert auch ordentlich.
Geloescht wird nichts. Tail liest die letzten 20 Zeilen aus `tstQ.dat' und schreibt diese nach `tst.dat'. Ein etwaig vorhandenes `tst.dat' wird damit ueberschrieben. `tstQ.dat' bleibt unveraendert.

Nur den Gnuplot kann ich leider immer noch nicht vernünftig beenden - bisher nur mit kill (meine Frage 3)
Bei den Fragen 2 und 3 muessen andere ran, die sich besser mit Gnuplot auskennen.
Use ed once in a while!

TuxPeter
Beiträge: 2016
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: Drei Fragen zu Gnuplot + Dateimanipulation

Beitrag von TuxPeter » 29.02.2020 17:39:11

Meillo hat geschrieben: ↑ zum Beitrag ↑
29.02.2020 17:22:02
Geloescht wird nichts.
Jo, na klar, Ich meinte, dass ich nach Beendigung der Messung die Quelldatei löschen kann, das was ich sehen wollte ist dann in tst.dat.
Vielleicht kann ich ja dann irgendein EOF an das File hängen, werde weiter suchen. Oder mit irgendwas in den Gnuplot reinfunken.

Erst mal schönen Dank, das Hauptproblem ist gelöst, so ist die Geschichte schon mal brauchbar.
Ich bin jetzt erst mal weg, vlcht heute Abend nochmal

Mfg, TuxPeter


edit: Ich setze das jetzt mal auf teilweise gelöst und mache evtl. mit der Frage zu Gnuplot-Terminierung einen extra Thread auf

Antworten