Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
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: (*Waittostart*)
      IFGVL.xFileSchreibenTHEN
        (*Stringfüllenmit10Zeiten*)
        sFileString :='123, 345';
        uiFileStdState :=1;
      END_IF
    1:(*createanewfile*)
      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
        (*errorhandling*)
        ;
      END_IF
    2:(*writetextinthefile*)
      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
        (*errorhandling*)
        ;
      END_IF
    3: (*DatenSICHERaufFestplatteschreiben*)
      filfl.hFile :=hFile;
      filfl(xExecute:=TRUE);
      IFfilfl.xDoneTHEN
        uiFileStdState:=4;
      END_IF
      IFfilfl.xErrorTHEN
        (*errorhandling*)
        ;
      END_IF   Â
    4:(*closefile -TestFile.txt*)
      filcl.hFile:=hFile;
      filcl(xExecute:=TRUE);
      IFfilcl.xDoneTHEN
        uiFileStdState:=5;
      END_IF
      IFfilcl.xErrorTHEN
        (*errorhandling*)
        ;
      END_IF
   Â
    5: (*WartenaufSignallow*)
    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