File Schreiben und als String lesen

boling
2007-01-24
2007-01-31
  • boling - 2007-01-24

    Hallo,

    mit der SysLibFile kann ich ja strings in ein File schreiben. Will ich aber diese wieder einlesen, kann ich mit SysLibRead die Daten nur als DWORD holen. Habe ich da was falsch verstanden?

    Ich habe mir vorgestellt, dass ich diverse Zahlenwerte mit einem Textzeichen (z.B. *) trenne und dann beim einlesen dieses Zeichen auswerte.

    Alternativ könnte ich beim schreiben eine feste Zeichenlänge wählen und die Zahlen in Strings umwandeln.

    Leider ist der Controller im Einsatz und damit nicht für Pröbeleien verfügbar...

     
  • Ralph Holz - 2007-01-24

    Hallo,

    Ich habe ein kleines Beispiel zum Schreiben einer kommaseparierten CSV datei angehängt.

    Leider hab ich auf die Schnelle nichts zum Lesen gefunden, deshalb hier ein bischen geschreibsel was haoffentlich weiterhilft:

    SysFileRead hat 3 Parameter

    1. File das File-Handle das bei SysFileOpen zurückgeliefert wird

    2. Buffer dahin werden die in 3. angegebene Anzahl der Bytes geschrieben

    3. Size siehe 2.

    Übrigens zum Ausprobieren eignet sich herforagend die in einer Standard CoDeSys enthaltene SoftSPS PlcWinNT die ohne funktionelle Einschränkung als Demo 2 Stunden läuft. Sind die 2 Stunden abgelaufen beendet sie sich und kann aber gleich wider gestartet werden.

    CSV File Append.zip [5.16 KiB]

    CSV Datei einmalig.zip [4.99 KiB]

     
  • Erik Böhm - 2007-01-24

    Hallo

    Ich lese eine Zeile (beendet mit CR,LF (13d,10d)) aus einem File folgendermassen aus:

    Read File to byFileBuffer: array[1..8192] of byte;


    dwFileSize:=SysFileGetSize(FileName:=strFileName);

    IF dwFileSize < 8192 THEN

    dwFileRead:=SysFileOpen(FileName:=strFileName, Mode:='r');
    
    IF dwFileRead = 0 THEN  (*error: file couldn't be opened *)
    
        bError  :=TRUE;
    
        wErrorID    :=1;
    
        RETURN;
    
    ELSE
    
        FOR i:=1 TO 8192 BY 1 DO    (* Erase Filebuffer *)
    
            byFileBuffer[i] := 0;
    
        END_FOR
    
        dwReadSize  := SysFileRead(dwFileRead, Buffer:=ADR(byFileBuffer), Size:=dwFileSize);
    
        SysFileClose(dwFileRead);
    
        dwFileRead  := 0;
    
        iFilePos        := 0;
    
    END_IF
    

    ELSE ( Max. Filesize exceeded )

    bError  :=TRUE;
    
    wErrorID    :=2;
    
    RETURN;
    

    END_IF


    GetLine from byFileBuffer


    strLine := '';

    pstr := ADR(aby[0]);

    WHILE iFilePos < dwFileSize DO

    iFilePos    := iFilePos + 1;
    
    aby[0]  := byFileBuffer[iFilePos];
    
    IF aby[0] = 10 THEN
    
        EXIT;
    
    END_IF
    
    IF aby[0] <> 13 THEN
    
        strLine := CONCAT(strLine,pstr^);
    
    END_IF
    

    END_WHILE

    IF iFilePos > dwFileSize THEN

    bError  := TRUE;
    
    wErrorID    := 3;
    

    END_IF

    IF LEN(strLine)<1 THEN

    bRunning := NOT bDone;
    
    RETURN;
    

    END_IF


    Ich hab das ganze als library ausgeführt, die dann Files im Ini Format, also mit Group und Key Tags schreibt, bzw. liest.

    Wahlweise als BOOL, WORD, LREAL, STRING

    z.B.

    [ACHSPARAMETER] <- GROUP TAG

    Acceleration=1000.0 <- KEY + LREAL Value

    Hoffe das hilft dir.

    Prinzipiell kannst du auch die ganze lib haben, die kann dann noch verschlüsseln, entschlüsseln undwasweissichnochalles.

    Aber da gibts (noch) keine vollständige Doku dazu.

    MfG

    Erik

     
  • boling - 2007-01-31

    Besten Dank für die guten Tips, ich habe inzwischen die für meine Bedürfnisse angepasste Lösung gefunden und es funktioniert.

     

Log in to post a comment.