Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 10 von 10

Thema: Datei zeilenweise einlesen

  1. #1
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo, ich weis dieses Thema gibt es hier schon öfter, aber leider konnte ich nirgends eine Lösung finden und die beschriebenen Bausteine "FileGets" usw. sind in meiner Version einfach nicht auffindbar.

    Kann mir jemand vielleicht mittlerweile trotzdem bei meinem Problem helfen?

    Also ich möchte mir gerne einen XML-Reader / Writer schreiben (Reader hat mehr Priorität).
    Um eine XML einlesen zu können, würde ich allerdings dazu die Datei zeilenweise einlesen und behandeln.
    Wie kann ich dies mit Standard 3S Bibliotheken ermöglichen? Also es gibt ja die SysFile Funktionen, welche aber immer gleich die ganze Datei in einen Buffer schreiben.
    Ich möchte aber verhindern einen riesigen Buffer anlegen zu müssen.
    => Darum gerne zeilenweise einlesen der Daten.

    Hat jemand ne Idee?

    Danke schon mal
    Zitieren Zitieren Datei zeilenweise einlesen  

  2. #2
    SY50 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Da hier nichts kommt, gehe ich davon aus, dass es entweder nicht so einfach, oder komplett easy ist .
    keine ne Idee?

  3. #3
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard

    Nimm die SysfileRead Funktion. Lege einen Puffer an, der eine Zeile auf jedenfall komplett beinhaltet. Also Zeile max 200 Zeichen dann Puffer 1000 Zeichen. Dann den gelesenen Puffer nach 13 und 10 durchsuchen bzw. $R$N. Den String bis zum Zeilenumbruch abspeichern und schon hast du die Zeile. Nun noch merken wo du angefangen hast zu lesen und an welcher Stelle $R$N war. Dann mit SysFileSetPos die Leseposition auf diese Pos setzen und wieder 1000 Bytes auslesen usw....

    Nie die gesamte Datei einlesen und auswerten das ist zu viel je nach Größe.

  4. Folgender Benutzer sagt Danke zu excelite für den nützlichen Beitrag:

    SY50 (14.03.2016)

  5. #4
    SY50 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke, das habe ich gesucht. Hatte die Funktion SysFileSetPos garnicht gesehen.

  6. #5
    SY50 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Würdet Ihr den Buffer als String ausführen, oder als ARRAY OF Byte? Mit einem String Buffer könnte ich natürlich leichter nach Zeichen suchen und die Namen ausgeben.
    Spricht irgendwas dafür / dagegen?
    Geändert von SY50 (15.03.2016 um 09:16 Uhr)

  7. #6
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard

    dagegen: Ist die Zeile länger als 255 Zeichen gibts Probleme und du musst dir die LEN, LEFT, RIGHT, MID, FIND Funktionen für ein Bytearray schreiben

    dafür: bist schneller am Ziel wenn du Zeilen <255 Zeichen hast

  8. #7
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard

    Hier die Funktionen die ich dazu nutze:

    GLOBALE KONSTANTE:
    CC_MAX_BUFFERINDEX: DWORD := 2047; (* maximum size of used string buffers *)

    FIND ==> FindBA
    Code:
    FUNCTION FindBA : INT
    (*
        This Function works like FIND. It can process ByteArrays with CC_MAX_BUFFERINDEX Bytes.
    
    
        string:s:='abcdef';     
        FindBA (ADR(s),'de'); => 4
        FindBA (ADR(s),'xy'); => 0
    *)
    
    
    VAR_INPUT
        pByteArray:POINTER TO ARRAY [0..CC_MAX_BUFFERINDEX] OF BYTE;        (* Byte array that will be searched through *)
        Length:WORD;    (*used length of the byte array*)
        Str1:STRING;    (*Search string*)
    END_VAR
    {library private}
    
    
    VAR
        lengthStr1:INT;
        lengthDiff:INT;
        n1:INT;
        n2:INT;
        found:BOOL;
        pStr1:POINTER TO ARRAY [0..80] OF BYTE;
    END_VAR
    
    FindBA:=0;
    
    
    pStr1:=ADR(Str1);
    
    
    lengthStr1:=LEN(Str1);
    lengthDiff:=Length-lengthStr1;
    
    
    IF lengthdiff<0 THEN
        RETURN;
    END_IF
    
    
    
    
    FOR n1:=0 TO lengthDiff DO
        found:=TRUE;
    
    
        FOR n2:=0 TO lengthStr1-1 DO
            IF (pStr1^[n2] <>pByteArray^[n1+n2]) THEN
                found:=FALSE;
                EXIT;
            END_IF
        END_FOR
    
    
        IF found THEN
            FindBA:=n1+1;
            RETURN;
        END_IF
    
    
    END_FOR
    CONCAT ==> InsertBA
    Code:
    FUNCTION InsertBA : INT
    (*
        This Function works like CONCAT. It can process ByteArrays with CC_MAX_BUFFERINDEX+1 Bytes.
        The return value is the Insert position plus the length of the insert string.
        In case of overflow => return value equals -1
    *)
    
    
    VAR_INPUT
        pByteArray:POINTER TO ARRAY [0..CC_MAX_BUFFERINDEX] OF BYTE; (*Byte array that will be used*)
        Str1:STRING;    (*The string that will be concatenated to the byte array*)
        Pos:INT;    (*Start position where the string sould be concatenated*)
    END_VAR
    {library private}
    
    
    VAR
        i:INT;
        p_str1:POINTER TO ARRAY [0..80] OF BYTE;
    END_VAR
    
    p_str1:=ADR(Str1);
    
    
    IF(Pos + LEN(Str1)) > (CC_MAX_BUFFERINDEX - TELNET_DELIM_LEN_SEND)
    THEN
        InsertBA:= -1;
    ELSE
        FOR i:=0 TO LEN(Str1) DO
            pByteArray^[Pos+i]:=p_str1^[i];
        END_FOR
        InsertBA:=Pos+LEN(Str1);
    END_IF;

    Aus Bytearray ein String machen,... geht natürlich nur bis 255 Zeichen
    Code:
    FUNCTION GetStringBA : STRING(255)
    VAR_INPUT
    	pByteArray		:POINTER TO ARRAY [0..CC_MAX_BUFFERINDEX] OF BYTE;		(* Byte array that will be searched through *)
    	nLength			:WORD;	(*used length of the byte array*)
    	nStart			:INT;	(* Startbyte *)
    	nEnd			:INT; (* Endbyte *)
    END_VAR
    VAR
    	pTemp		: POINTER TO BYTE;
    	pByTemp 	: ARRAY [0..255] OF BYTE;
    	strTemp		: POINTER TO STRING(255) ;
    
    
    	i			: INT := 0;
    END_VAR
    
    
    pTemp := ADR(strTemp);
    
    
    FOR i := nStart TO nEnd-2 DO
    
    
    	pByTemp[i-nStart] := pByteArray^[i];
    END_FOR;
    pByTemp[i] := 0;
    strTemp := ADR(pByTemp);
    
    
    GetStringBA := strTemp^;
    Geändert von excelite (15.03.2016 um 09:36 Uhr)

  9. #8
    Registriert seit
    29.06.2015
    Beiträge
    33
    Danke
    2
    Erhielt 7 Danke für 6 Beiträge

    Standard

    Du hast den Dateiinhalt im laufenden SPS-Betrieb geändert? Wenn du deine Strings nicht leerst bleibt der Inhalt erhalten. Steht in einem String "Hallo" und du schreibst nun "5" hinein, steht im String nicht "5", sondern "5allo".

    Edit: Ich glaub ich hab dich falsch verstanden

  10. #9
    SY50 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Habe jetzt alles mit einem Bytearray erledigt. Funktioniert ganz gut.
    Ich kann auf verschiedene Zeichen reagieren und was dazwischen steht interessiert mich eigentlich nicht wirklich

  11. #10
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    so soll es sein,... gleich alles für Bytearray vorbereiten und später davon profitieren wenn es dann doch mal mehr als 255 bytes sind

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 18.11.2014, 10:17
  2. Suche Beispiel zum Einlesen einer XML-Datei
    Von Malcolm im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 09.04.2014, 19:35
  3. Antworten: 8
    Letzter Beitrag: 03.05.2013, 10:00
  4. Acess2000 Datei.csv einlesen
    Von peter(R) im Forum PC- und Netzwerktechnik
    Antworten: 11
    Letzter Beitrag: 30.03.2009, 13:32
  5. .csv Datei in S7 einlesen
    Von Fanatic im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 04.10.2007, 15:41

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •