Mit folgendem Programm schreibe ich jeweils die Datei "Zeiten.txt" auf eine RAMDisk des Raspi:
PROGRAMDateiVAR  xFileStdInit:    BOOL:=FALSE;    uiFileStdState:   UINT:=0;    sFileName:     CAA.FILENAME:='/mnt/RAMDisk/Zeiten.txt';    hFile:       CAA.HANDLE;    sFileString:    STRING;    szFileSize1:    CAA.SIZE:=0;    szFileSize2:    CAA.SIZE:=0;    filop:       File.Open;    filwr:       File.Write;    filfl:        File.Flush;    filcl:       File.Close;    filsp:       File.SetPos;END_VARIFNOTxFileStdInitTHEN  filop(xExecute:=FALSE);  filcl(xExecute:=FALSE);  filwr(xExecute:=FALSE);  filfl(xExecute:=FALSE);  xFileStdInit:=TRUE;  uiFileStdState:=0;ELSE  CASEuiFileStdStateOF    0:(* Wait to start *)      IFGVL.xFileSchreibenTHEN        (* String füllen mit 10 Zeiten *)        sFileString:='123,345';        uiFileStdState:=1;      END_IF    1:(* create a new file *)      filop.sFileName:=sFileName;      filop.eFileMode:=File.MODE.MWRITE;      filop.xExclusive:=TRUE;      filop(xExecute:=TRUE);      IFfilop.xDone THEN        hFile:=filop.hFile;        uiFileStdState:=2;      END_IF      IFfilop.xErrorTHEN        (* error handling*)        ;      END_IF    2:(* write text in the file *)      filwr.hFile:=hFile;      filwr.pBuffer:=ADR(sFileString);      szFileSize1:=SIZEOF(sFileString);      filwr.szSize:=szFileSize1;      filwr.udiTimeOut:=100000;  (* 100ms Timeout *)      filwr(xExecute:=TRUE);      IFfilwr.xDoneTHEN        uiFileStdState:=3;      END_IF      IFfilwr.xErrorTHEN        (* error handling*)        ;      END_IF    3:(* Daten SICHER auf Festplatte schreiben *)      filfl.hFile:=hFile;      filfl(xExecute:=TRUE);      IFfilfl.xDoneTHEN        uiFileStdState:=4;      END_IF      IFfilfl.xErrorTHEN        (* error handling*)        ;      END_IF        4:(* close file - TestFile.txt *)      filcl.hFile:=hFile;      filcl(xExecute:=TRUE);      IFfilcl.xDoneTHEN        uiFileStdState:=5;      END_IF      IFfilcl.xErrorTHEN        (* error handling*)        ;      END_IF        5:(* Warten auf Signal low *)    IFGVL.xFileSchreiben=FALSETHEN      uiFileStdState:=0;    END_IF  END_CASEEND_IFÂ
Das funktioniert jeweils nach Neustart der SPS 1x.
Wenn ich nun die Datei mit root-Rechten lösche im Raspberry und sie erneut schreibe (xFileSchreiben auf FALSE und wieder auf TRUE) wird die Statemachine zwar durchlaufen, aber die Datei nicht erneut geschrieben. Es werden aber alle States ohne Fehler durchlaufen.
Ich habe auch extra die File.Flush eingebaut, um allfälligen Dateisystemfunktionen aus dem Weg zu gehen.
Weiss da jemand Rat?
Merci
Ralf
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hi
Mit folgendem Programm schreibe ich jeweils die Datei "Zeiten.txt" auf eine RAMDisk des Raspi:
Das funktioniert jeweils nach Neustart der SPS 1x.
Wenn ich nun die Datei mit root-Rechten lösche im Raspberry und sie erneut schreibe (xFileSchreiben auf FALSE und wieder auf TRUE) wird die Statemachine zwar durchlaufen, aber die Datei nicht erneut geschrieben. Es werden aber alle States ohne Fehler durchlaufen.
Ich habe auch extra die File.Flush eingebaut, um allfälligen Dateisystemfunktionen aus dem Weg zu gehen.
Weiss da jemand Rat?
Merci
Ralf
Ich habs selbst gefunden:
die
müssen natürlich bei jedem Durchgang neu gesetzt werden, nicht nur nach Neustart...
Cheers
Ralf
Übrigens, was mit noch aufgefallen ist - im Beispiel hats noch einen Fehler drin:
Die Länge des zu schreibenden String sollte nicht mittels
sondern mittels
ermittelt werden. Spätestens wenn z.B. $n$r geschrieben wird, stimmt die Anzahl der Zeichen sonst nicht mehr.
Cherrs Ralf