Funktionsweise FILE_SERVER

Begonnen von io123, 10. Juli 2012, 10:59:09

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

io123

Hallo,

ich bin gerade daran Daten in eine Datei zu schreiben (neue Datei / anhängen an eine bestehende Datei).
Hierfür nutze ich die Lib von OSCAT.
Ich habe mir auch schon die Beispiele und so angeschaut, auch schon selbst was geschrieben.

Nun bin ich mir über die Funktion / Abarbeitung des Programms nicht ganz klar.

Ich prüfe über die "case of" Methode ob die Datei besteht oder nicht und schreibe dann die Daten entsprechend ab.
Wenn ich nun aber die Größer der Datei ermitteln (FS.FILE_Size) will (wegen dem Offset (siehe Doku 10.5 FILE_SERVER)) wird diese scheinbar nicht sofort ermittelt, sondern erst am Ende (nach den ganzen Case of) wenn der Aufruf des FILE_SERVERs (FILE_SERVER(FSD:= FSD, PT:=PT); gemacht wird.


mfg
michael

peewit

Hallo
Der fileserver ermittelt automatisch die groesse der verwendeten datei
Wenn du am anfang bei der laenge der zu schreibenden oder lesendenden daten eine null vorgibst
Da  wird die aktuelle groesse ermittelt, und sonst passiert nichts weiter
Erst wenn du im datenbuffer eine datenlaenge vorgibst wird aich aktiv etwas gelesen bzw geschrieben

Ich kann dir leider momentan nur wenig helfen, da ich momentan nur mit einem ipad am pool liege
Anfang naechster woche gehts wieder besser

Vielleicht hilft es dir wenn du dir die dlog_store_* bausteine ansiehst
Aber es geht auf jedenfall das du dir nun die dateigroesse geben laesst, und erst spaeter gezielt
Daten schreibst, und der fileoffset wird/kann auch automatisch ans fileende gestellt werden

io123

Hallo peewit,

du hast es ja schön, am Pool ...

ich sitze bin hier auf Arbeit ...

Ich bin meine Case-Abfrage mit einzelschritten durchgegangen und da wurde erst bei der Bearbeitung der "FILE_SERVER(FSD:= FSD, PT:=PT)" die bei der FS.File_Size was abgezeigt.
Da ja diese Zeile am Schluss steht habe ich diese Ergebnisse ja nicht der den verschiedenen Case Of zu verfühung oder verstehe ich da was falsch?

peewit

#3
Hallo

Ja, der fileserver arbeitet asynchron,das heisst es kann mehrere zyklen dauern

Du gibt ueber mode ein komando vor, und erst wenn der fileserver den mode wieder auf wert null umgeschrieben hat, ist der befehl fertig abgearbeitet und es liegen in der datenstruktur die informationen vor
Also immer mit mode ein kommando vorgeben, und dann auf null warten
N
Das beste ist also den fileserver am ende deines bausteins zyklisch auf zurufen
Alles andere wird dir eher probleme bringen

Also in einem schritt ein file server befehl vorgeben, und im naechsten schritt auf das ergebnis warten und verwerten, so gehtves am einfachsten


In alen meinen demoprogrammen mit fileserver ist dies auch imemer so gemacht

io123

Hier mal ein Auszug aus meiner Case Abfrage

CASE step OF

00:   gleich:= STRING_INPUT = STRING_INPUTlast;
   SysStrCpy(STRING_INPUTlast, STRING_INPUT);
   step := 05;

05:   IF gleich = FALSE THEN
      PTs.SIZE := LEN(STRING_INPUT) + 2;
      _STRING_TO_BUFFER(STRING_INPUT,0,ADR(PT.BUFFER), SIZEOF(PT.BUFFER));
      step := 10;
   ELSE
      step:=00;
   END_IF;

10:   FSD.FILENAME := DATEINAME;
   FSD.MODE := 2; (*vorhandene Datei zum schreiben öffnen*)
   (*PT.SIZE :=0;*)
   FSD.AUTO_CLOSE:= T#0s; (*kein Auto-Close verwenden*)
   IF FSD.ERROR = 0 AND FSD.MODE = 0 THEN (*Datei ist vorhanden*)    <---In diese If-Abschrage springt er nicht
         step:=30;
   ELSIF FSD.ERROR > 0 AND FSD.MODE = 0 THEN                                     <---In diese ELSIf-Abschrage springt er auch  nicht
         step := 20; (*step :=20 springe zu Datei anlegen*)

   END_IF;

Obwohl der FSD.Error =1 ist und der FSD.Mode =0
das andere seltsame ist, dass die Datei vorhanden ist und er ja keinen FSD.Error haben dürfte.

Ich bin echt Ratlos.

peewit

#5
 :-*Hallo

Im schritt 10 beschreibst du zyklisch den mode mit den wert 2 somit kann dieser im schritt 10 bei der nachfolgenden if abfrage eben nicht 0 sein, und i er wiedr gibst du den fileserver dasxgleiche kommando

Warum du einen error auch  ich bekomst,  kann ich vom pool aus nicht pruefen :-)

Vergiss nicht die datei am ende wieder zu schliessen
Wenn die datei offen ist und du machst einen sps neustart dann bleibt die datei auch fuer immer belegt
Da hilft dir  ur mehr ein sps neustart

io123

Hallo,

okay soweit habe ich das verstanden.

Dann muss ich den FSD.Mode:=2 mit eine Bedingung nur einmal ausführen?

Bsp:
IF done = False THEN
FSD.MODE := 2;
done;= TRUE;
END_IF;


FSD.AUTO_CLOSE:= T#0s; (*kein Auto-Close verwenden*)
IF FSD.ERROR = 0 AND FSD.MODE = 0 THEN (*Datei ist vorhanden*)    <---In diese If-Abschrage springt er nicht
     done:=FALSE;   
     step:=30;
ELSIF FSD.ERROR > 0 AND FSD.MODE = 0 THEN                                     <---In diese ELSIf-Abschrage springt er auch  nicht
     done:=FALSE;   
     step := 20; (*step :=20 springe zu Datei anlegen*)
END_IF;

in den weiteren Schritten wird dann die Datei wenn nicht vorhanden neu angelegt und die Daten reingeschrieben und die Datei geschlossen.




io123

So ich möchte mich bei der bedanken,

ich habe es soweit hingebracht.

besteht jetzt auch noch die Möglichkeit, dass ich die Daten nicht nur auf dei SD-Karte schreibe, sondern auch noch auf ein Netzlaufwerk in einen Ordner? (bsp.: "\\netzlaufwerk\SPS")

mfg
michael

peewit

Hallo

Das ist nun abhaengig von deiner plattform bzw. Steuerung welche laufwerke etc.. Zur verfuegung stehen
Bezueglich der network bibliothek gibts dies bezueglich nichts dazu
Entweder dein system unterstuetzt das oder du hast pech

Das einzige was indirekt geht wuerde  ist das du eine datei auf einen ftp server ablegen kannst
Aber das ist halt nicht genau das was du machen willst

io123

Hallo,

biste wieder am Pool  ;)

Nun als Steuerung habe ich eine Wago 750-880.
Bei uns ist im Netzwerk ein Ordner Freigeben, nun ist halt die Frage, ob der File_Server / Syslibfile.lib das "\\ort\order" auflösen kann, oder ob man das anderst machen muss.

Das mit dem FTP habe ich auch gesehen, aber das ist wie Du schon gesagt hast nicht genau das was ich möchte, wenn es halt die einzigste Möglichkeit ist muss man halt die dann wählen.

Ist es eigentlich ein Problem, denn ich muss von 4 Quellen, Daten wegspeichern in unterschiedliche Dateien. Macht mir da der Data_Log Baustein / File_Server u.U. ärger bezüglich Laufzeiten?

peewit

Die syslibfile kann nur auf das lokale filesystem der sps zugreifen
Einen ordner freigeben ist ja nur eine optische sache
Dahinter verbirgt sich dann viel mehr
Je nach betriebssystem werden hier verschiedene protokolle verwendet
Also meiner meinung nach hast du hier keine chance an das netzkaufwerk direkt dranzukommen
Der kommunikationsweg waere noch dazu ja ethernet.

Ich glaube nicht.......