Alternative zu FileExists?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Der Proband
Beiträge: 7
Registriert: Di 24. Mai 2016, 09:47

Alternative zu FileExists?

Beitrag von Der Proband »

Hallo,
ich habe ein kleines Programm geschrieben, daß auf einem Raspberry Pi diverse Meßwerte auswertet und aufbereitet. Die Sensoren werden auf dem RPi per Shellscript ausgelesen und die Ergebnisse in eine Datei geschrieben. Nach dem letzten Sensor wird die Datei umbenannt. Das FPC Programm prüft nun zyklisch per FileExists auf das Vorhandensein dieser Datei, wertet diese dann aus und löscht sie anschließend usw.. Ohne eine Verzögerung zwischen den Abfragen steigt die Prozessorlast enorm, also mache ich dazwischen eine Pause von 0,5 Sekunden:

repeat
delay(500);
until FileExists(Parameterdatei);

bzw.

while not FileExists(Parameterdatei)
do delay(500);

Ich halte das nicht für besonders elegant und frage mich schon länger, ob das nicht besser geht, also ohne Verzögerung und trotzdem mit geringer Prozessorlast. Ist das möglich und wenn ja, wie? Das Programm jeweils neu zu starten ist keine Alternative, da dieses dauerhaft Werte zwischenspeichert, die dann verloren gingen. Diese jeweils extern zwischen zu speichern ist mir zu aufwändig.


Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Re: Alternative zu FileExists?

Beitrag von Requion »

Hallo,

ich habe leider keine Antwort auf deine konkrete Frage. Ich frage mich aber wieso du das so löst. Ist das auslesen der Messwerte über das Skript so vorgegeben oder machst du das von dir aus? Wenn du da etwas ändern kannst dann würde ich empfehlen die Sensoren direkt mit Lazarus auszulesen. Da kannst du weiterhin die Auswertung und Aufbereitung durchführen und die Daten zum Beispiel in einer Stringlist zwischenspeichern. Dadurch kannst du die Daten dann wenn nötig ganz leicht mit

Code: Alles auswählen

Stringlist.SaveToFile(Dateiname);
speichern.

Und zum auslesen kannst du ja mit einem Timer in regelmäßigen Abständen die Sensoren abfragen. Das sollte nicht zu umständlich werden.
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

Der Proband
Beiträge: 7
Registriert: Di 24. Mai 2016, 09:47

Re: Alternative zu FileExists?

Beitrag von Der Proband »

Requion hat geschrieben:Hallo,

ich habe leider keine Antwort auf deine konkrete Frage. Ich frage mich aber wieso du das so löst. Ist das auslesen der Messwerte über das Skript so vorgegeben oder machst du das von dir aus? Wenn du da etwas ändern kannst dann würde ich empfehlen die Sensoren direkt mit Lazarus auszulesen.


Das habe ich natürlich auch schon überlegt und vielleicht versuche ich es auch irgendwann mal. Ich lese aktuell den Wetterlogger einer ELV Wetterstation (socat) und einen BME280 (I2C Bus) lokal aus, hinzu kommt noch ein weiterer BME280 und ein Regensensor YL-38 per A/D Wandler an einem anderen RPi, der seine Daten im Netzwerk bereitstellt. Vorher hatte ich auch noch einen DHT22 und eine BMP085. Weitere Sensoren können noch folgen. Das ist ein bunter Zoo an Schnittstellen und verteilten Daten. Man findet relativ leicht die Lösungen, wie man die Sensoren anspricht und sie ihre Werte in Dateien schreiben und kommt schnell zu einer Lösung was nach meiner Einschätzung beim direkten Ansprechen sicher aufwändiger ist. Es ist mir auch klar, daß manche bei diesem Lösungsansatz die Hände über dem Kopf zusammenschlagen, aber es funktioniert.
Immerhin weiß ich jetzt, daß es wohl auf Anhieb keine bessere Möglichkeit als die von mit bereits gewählte gibt, die inotify Lösung von theo werde ich bei Gelegenheit mal versuchen zu testen.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Alternative zu FileExists?

Beitrag von Mathias »

Wen du dich nicht direkt mit den Sensoren mit Lazarus rumschlagen willst, wegen fehlenden Bibliotheken, könnte ich dir auch einen Arduino als Zwischenelement empfehlen.
Bei dem gibt es für die meisten Sensoren fertige Bibliotheken. Die Kommunikation mit dem Arduino kannst du dann sehr einfach mit Lazarus lösen.

Somit hast du noch ein Vorteil, da kannst dein Lazarus-Programm zuerst auf einem schnellen PC entwickeln, bevor du es endgültig auf den Raspi tust.
Egal ob Win oder Linux-PC, die Kommunikation ist gleich, bis auf die COM-Port-Namen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Alternative zu FileExists?

Beitrag von pluto »

Ich habe zum Beispiel eine Umgebung geschrieben bzw. schreibe die gerade neu, die das so umsetzt in etwa:
Ich habe verschiedene Sensoren auf verschiedenen Platinen, zu den Platinen kommt ein LCD und ein paar Button.

Die ganzen Platinen werden alle einzeln in Config-Dateien beschrieben.
In der Neuen Version habe ich ein Seriellen Client geschrieben, der greif auf alle angeschlossen Arduino Nano zurück und fragt sie alle 5 Minuten ab.

Ein Arduino Client wiederum wertet die Daten aus und soll später die LCD ansprechen(in der alten Version klappte das schon).

Dieses Prinzip kann man sehr gut erweitern um weitere Clients. Z.B. ein Banana PI Info Client, ein MPD Client und soweiter. Als nächstest möchte ich ein W-Lan Sensor hinzufügen.
MFG
Michael Springwald

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Alternative zu FileExists?

Beitrag von BeniBela »

Vielleicht kann man die Daten in eine Pipe oder sowas schreiben

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Alternative zu FileExists?

Beitrag von pluto »

Vielleicht kann man die Daten in eine Pipe oder sowas schreiben

Hier gibt es ein gutes Beispiel dazu:
http://wiki.lazarus.freepascal.org/Exec ... rograms/de

Du könntest die Daten auch an einem TCP Port Senden von einem Lazarus Programm per Konsole z.b. mit netcat oder so ähnlich.
MFG
Michael Springwald

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Alternative zu FileExists?

Beitrag von Mathias »

Die aller sauberste Lösung, alle Sensoren mit Port-Expandern, an den I²C hängen.
Auf den I²C, kann man unter Linux sehr einfach mit Lazarus zugreifen.
Mit dieser Lösung kann auch sehr einfach auf dem schnellen PC entwickelt werden, vorausgesetzt man hat al OS Linux. (Den I²C der Graka nehmen).

Alles andere mit Pipe und FileExits ist in meinen Augen ein Murks.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

jc99
Beiträge: 29
Registriert: Fr 19. Mai 2017, 18:04
OS, Lazarus, FPC: Win10x64, L 1.8rc3, FPC3.0.2
CPU-Target: 64
Wohnort: Nord-Baden
Kontaktdaten:

Re: Alternative zu FileExists?

Beitrag von jc99 »

Mathias hat geschrieben:Die aller sauberste Lösung, alle Sensoren mit Port-Expandern, an den I²C hängen.
Auf den I²C, kann man unter Linux sehr einfach mit Lazarus zugreifen.
Mit dieser Lösung kann auch sehr einfach auf dem schnellen PC entwickelt werden, vorausgesetzt man hat al OS Linux. (Den I²C der Graka nehmen).

Alles andere mit Pipe und FileExits ist in meinen Augen ein Murks.

Das wiederum erfordert einen ganz anderen Lösungsansatz.
Es ging ja nur darum eine elegantere Lösung zu finden als alle paar Millisekunden zu prüfen ob die Datei existiert.
Unter Win/Delphi gab es eine Komponente wie den ShellChangeNotifyer (oder so ähnlich) der ein Verzeichniss auf Änderung überwacht und dann entsprechend ein Ereigniss auslöst. Etwas ähnliches könnte man probieren in dem man das Datum des Verzeichniss abfragt und nur dann das Verzeichniss durchsucht.
bei einer einzelnen Datei bedeutet das aber den gleichen Aufwand, außer daß man diese Methode in eine Koponente kapseln könnte. Kann man aber mit der Fileexists-Methode ebenso.
Bei der Filetransfer-Methode gibt es aber noch ein weiteres Problem. Wie schreibt der Mess-Prozess diese Dateien. Gut wäre er würde die Datei erst mit anderem Namen erstellen (z.B: mit der Endung .new) und dann am Schluß in den eigentlichen Dateinamen umbenennen.
Der Lese-prozess macht es nun umgekehrt, er benennt die Datei erst um (oder versucht es) und liest dann aus der umbenannten Datei die Daten. Nach erolgreichem Lesen kann er dann die Datei löschen oder nochmals umbenennen, damit könnte der Sender ermitteln ob die Datei abgeholt wurde und sie dann löschen.
Über den Dateinamen hat man somit zumindest ein Minimalprotokoll mit Rückmeldung implementiert. Und gleichzeitig sichergestellt daß die Datei nicht schon abgeholt wird während sie noch geschrieben wird, oder gelöscht während Sie noch gelesen/übertragen. Das funktioniert dann auch über langsame Verbindungen z.B: per FTP oder Seriell.
OS: ...-Win10 x64
Laz: ...-1.8rc1
https://github.com/joecare99/public
'~| . . /'' . .
,_|oe \_,are

Antworten