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

Ergebnis 1 bis 8 von 8

Thema: TwinCAT 3 FB_FileGets

  1. #1
    Registriert seit
    02.10.2014
    Beiträge
    18
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Beitrag


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    ich möchte aus einer .txt Datei etwas einlesen und in ein Array of String Speichern.
    Das Beispiel von Backhoff "fbFileCopy" klappt wunderbar, nur hier wird Byteweise gelesen und die Datei halt kopiert.
    ( http://infosys.beckhoff.de/index.php...s.htm&id=23774)

    Ich versuche es mit fb_FileGets , habe den Code dementsprechend umgeschrieben, es gibt auch keinen Fehler aber den String der aus sLine kommt kann ich nicht zwischenspeichern.

    Code:
    
    PROGRAM MAIN
    
    VAR
        bSchreiben : BOOL ;
        bLesen: BOOL;
        Lesen : BOOL;
        bLesenBusy,bLesenError : BOOL;
        nLesenErrorID : UDINT ;
        
        DateiLesen : fbRead;
    END_VAR
    
    VAR_INPUT
    END_VAR
    ---------------------
    DateiLesen(
        sSrcNetId:= '', 
        sSrcPathName:= 'C:\Users\10469310\Documents\2.txt', 
        bExecute:= bLesen, 
        tTimeOut:=T#2S , 
        bBusy=>bLesenBusy , 
        bError=> bLesenError, 
        nErrId=> nLesenErrorID);
    umgeschriebener fbFileCopy :
    Code:
    FUNCTION_BLOCK fbRead
    VAR_INPUT
            sSrcNetId                       : T_AmsNetId;(* TwinCAT network address of the source file *)
            sSrcPathName            : T_MaxString;(* Source file path and name *)
          //  sDestNetId              : T_AmsNetId;(* TwinCAT network address of the destination file *)
          //  sDestPathName           : T_MaxString; (* Destination file path and name *)
            bExecute                        : BOOL; (* Rising edge start fb execution *)
            tTimeOut                        : TIME := DEFAULT_ADS_TIMEOUT;(* Max. ADS timeout time *)
    END_VAR
    VAR_OUTPUT
            bBusy                   :BOOL;(* TRUE => File copy execution in progress, FALSE => File copy execution idle *)
     bError                  :BOOL;(* TRUE => Error, FALSE => No error *)
     nErrId                  :UDINT;(* Error code *)
    END_VAR
    VAR
            fbFileOpen              :FB_FileOpen;
            fbFileClose             :FB_FileClose;
            fbFileRead              :FB_FileRead;
            fbFileWrite             :FB_FileWrite;
            fbFileGets                : FB_FileGets;
    
            hSrcFile                        :UINT   := 0;(* File handle of the source file *)
     hDestFile                       :UINT   := 0;(* File handle of the destination file *)
    
            Step                    :DWORD;
            RisingEdge              :R_TRIG;
    
            buffRead                        :ARRAY[1..1000] OF BYTE;(* Buffer *)
     cbReadLength            :UDINT := 0;
     // ab hier
     strBuffer : STRING ;
     bEOF        : BOOL;
      zeile        : ARRAY[0..40] OF STRING;
     
        i: INT;
    END_VAR
    -----------------------------------------------------------
    RisingEdge(CLK:=bExecute);
    
    CASE Step OF
            0:      (* Idle state *)
             IF RisingEdge.Q THEN
                            bBusy := TRUE;
                            bError:= FALSE;
                            nErrId:=0;
                            Step := 1;
                         
                            hSrcFile:=0;
                            i:= 0;
                            
                    END_IF
    
            1:      (* Open source file *)
             fbFileOpen( bExecute := FALSE );
                    fbFileOpen( sNetId := sSrcNetId, sPathName := sSrcPathName,
                            nMode := FOPEN_MODEREAD OR FOPEN_MODETEXT,// Textmodus für FB_FileGets // 
                            ePath := PATH_GENERIC, tTimeout := tTimeOut, bExecute := TRUE );
                    Step := Step + 1;
            2:
                    fbFileOpen( bExecute := FALSE );
                    IF NOT fbFileOpen.bBusy THEN
                            IF fbFileOpen.bError THEN
                                    nErrId := fbFileOpen.nErrId;
                                    bError := TRUE;
                                    Step := 50;
                            ELSE
                                    hSrcFile := fbFileOpen.hFile;
                                    Step := Step + 1;
                                    //
                                    
                            END_IF
                    END_IF
    
          
    
            3:      (* Read data from source file *)
       
                            // Buffer zurücksetzten
                            fbFileGets(bExecute := FALSE);
                            
                            fbFileGets(    sNetId:= sSrcNetId,     hFile:= hSrcFile, 
                                        bExecute:= TRUE, tTimeout:= tTimeOut , 
                                        sLine=> strBuffer, 
                                        bEOF=> bEOF);
                    Step := Step + 1;
            4:
                    fbFileGets( bExecute:= FALSE );
                    IF NOT fbFileGets.bBusy THEN
                            IF fbFileGets.bError THEN
                                    nErrId := fbFileGets.nErrId;
                                    bError := TRUE;
                                    Step := 50;
                            ELSE
                                fbFileGets(sLine => zeile[i]);
                                zeile[i] :=  strBuffer ;
                                    i := i +1 ;
                                    Step := Step + 1;
                            END_IF
                    END_IF
    
            5:
                                    
                    IF fbFileGets.bEOF THEN (* Check if the EOF flag ist set *)
                        Step := 50;    (* Cleanup: close the destination and source files *)
                    ELSE
                        Step := 3; (* Repeat reading/writing *)
                    END_IF
        
       
         
    
            40: (* Close source file *)
             fbFileClose( bExecute := FALSE );
                    fbFileClose( sNetId:=sSrcNetId, hFile:=hSrcFile, bExecute:=TRUE, tTimeout:=tTimeOut );
                    Step := Step + 1;
            41:
                    fbFileClose( bExecute := FALSE );
                    IF NOT fbFileClose.bBusy THEN
                            IF fbFileClose.bError THEN
                                    nErrId := fbFileClose.nErrId;
                                    bError := TRUE;
                            END_IF
                            Step := 50;
                            hSrcFile := 0;
                    END_IF
    
            50: (* Error or ready => Cleanup *)
             IF ( hSrcFile <> 0 ) THEN
                            Step := 40; (* Close the  file*)
          
             ELSE
                            Step := 0;      (* Ready *)
                            bBusy := FALSE;
             END_IF
    
    END_CASE
    Im Anhang ist ein Screenshot, hier sieht man das in sLine der Wert/Stiring "2999 0 str.." steht aber dass dieser nicht in die Variable strBuffer geschrieben wird.
    Was mache ich Falsch ?

    Vielen Dank im Vorraus
    Anhang: Screenshot, Twincat3 Projekt
    Angehängte Grafiken Angehängte Grafiken
    Angehängte Dateien Angehängte Dateien
    Zitieren Zitieren TwinCAT 3 FB_FileGets  

  2. #2
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    755
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard

    Code:
            3:      (* Read data from source file *)
       
                            // Buffer zurücksetzten
                            fbFileGets(bExecute := FALSE);
                            
                            fbFileGets(    sNetId:= sSrcNetId,     hFile:= hSrcFile, 
                                        bExecute:= TRUE, tTimeout:= tTimeOut , 
                                        sLine=> strBuffer, (* MIT DIESEM AUFRUF WIRD DAS LESEN GESTARTET, DA STEHT DER ZU LESENDE STRING NOCH GAR NICHT IN SLINE DRIN *)
                                        bEOF=> bEOF);
                    Step := Step + 1;
            4:
                    fbFileGets( bExecute:= FALSE );
                    IF NOT fbFileGets.bBusy THEN
                            IF fbFileGets.bError THEN
                                    nErrId := fbFileGets.nErrId;
                                    bError := TRUE;
                                    Step := 50;
                            ELSE
    (* ERST HIER KANNST DU SICHER SEIN, DASS SLINE DEN GELESENEN STRING ENTHÄLT *)
                                fbFileGets(sLine => zeile[i]);
    (* STATT FBFILEGETS NOCHMAL AUFZURUFEN, KANNST DU AUCH EINFACH zeile[i]:=fbFileGets.sLine; SCHREIBEN *)
    (* STRBUFFER BRAUCHST DU DANN GAR NICHT MEHR
                                zeile[i] :=  strBuffer ;
    *)                                i := i +1 ;
                                    Step := Step + 1;
                            END_IF
                    END_IF

  3. Folgender Benutzer sagt Danke zu StructuredTrash für den nützlichen Beitrag:

    morris (02.10.2015)

  4. #3
    morris ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.10.2014
    Beiträge
    18
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Super, funktioniert =)
    Herzlichen Dank

  5. #4
    Registriert seit
    14.12.2017
    Beiträge
    2
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,
    bei mir klappt der Zeilenvorschub nicht automatisch.

    Hat jemand eine Ahnung woran es liegen könnte?

    Danke und Gruß


    Code:
    FOR i := 0 TO 4 BY 1 DO    
          
        CASE ListOfAxisFileStates[i] OF
               0:
                NewData := 0;
                OpenFile[i](sNetId := '192.168.178.24.1.1',
                sPathName := ListOfAxisFiles[i], 
                nMode := FOPEN_MODETEXT OR FOPEN_MODEREAD,
                bExecute := TRUE,
                ePath := PATH_GENERIC,
                tTimeout := T#1S);
                IF OpenFile[i].bBusy = NOT TRUE
                    THEN ListOfAxisFileStates[i] := 2; OpenFile[i].bExecute := FALSE;
                END_IF
                ListOfAxisFileLastState[i] := 0;
                
        
            2:
            
                
                GetLine[i](sNetId := '192.168.178.24.1.1',
                hFile := OpenFile[i].hFile, 
                bExecute := TRUE,
                tTimeout := T#1S);
            
                IF GetLine[i].bBusy = NOT TRUE
                    THEN ListOfAxisFileStates[i] := 5; 
                END_IF
                
                ListOfAxisFileLastState[i] := 2; 
    
    
                
            4:
                
        
                CloseFile[i](sNetId := '192.168.178.24.1.1',
                hFile := OpenFile[i].hFile, 
                bExecute := TRUE,
                tTimeout := T#1S);
                
                IF CloseFile[i].bBusy = NOT TRUE
                    THEN ListOfAxisFileStates[i] := ListOfAxisFileStates[i] + 1; CloseFile[i].bExecute := FALSE;
                END_IF
                ListOfAxisFileLastState[i] := 4;
            
            5:
                
    
    
                
            END_CASE
    END_FOR
    
    
    
    
    bFinishedAll := TRUE;
    FOR i := 0 TO 4 BY 1 DO
        
        IF    ListOfAxisFileStates[i] <> 5 
            THEN bFinishedAll := FALSE;
        
        END_IF
        
    END_FOR
        
    IF bFinishedAll
        THEN
        FOR i := 0 TO 4 BY 1 DO
        ListOfPositions[i] := STRING_TO_LREAL (GetLine[i].sLine);
        GetLine[i].bExecute := FALSE;
        ListOfAxisFileStates[i] := 2;
        NewData := 1;
        END_FOR
        
    END_IF

  6. #5
    Registriert seit
    13.12.2011
    Beiträge
    1.486
    Danke
    159
    Erhielt 177 Danke für 162 Beiträge

    Standard

    Schau Dir die Datei mal mit einem Hex-Editor oder so an, enthält sie am Zeilenende auch das Line Feed Zeichen (0x0A) oder steht da vielleicht nur ein Carriage Return (0x0D)?
    Geändert von oliver.tonn (15.12.2017 um 07:50 Uhr) Grund: Nachtrag gelöscht, Code missverstanden

  7. #6
    Registriert seit
    11.07.2017
    Beiträge
    138
    Danke
    1
    Erhielt 21 Danke für 17 Beiträge

    Standard

    Unabhängig davon, warum es gerade nicht funktioniert, hier mal ein paar Dinge, die ich für schlechten Stil halte
    Zitat Zitat von Bambustraeger Beitrag anzeigen
    Code:
    CASE ListOfAxisFileStates[i] OF
               0: // <-- Benutz hier lieber ein ENUM statt "magischer Zahlen"
    ...
                OpenFile[i](sNetId := '192.168.178.24.1.1',
                sPathName := ListOfAxisFiles[i], // <-- hier würde ich eine Zusätzliche einrückung machen, bis zur passenden ')'
                nMode := FOPEN_MODETEXT OR FOPEN_MODEREAD,
                bExecute := TRUE,
                ePath := PATH_GENERIC,
                tTimeout := T#1S);
                IF OpenFile[i].bBusy = NOT TRUE // <-- Vergleiche mit TRUE oder FALSE sind unnötig, lieber direkt "IF NOT bBusy"
                    THEN ListOfAxisFileStates[i] := 2; OpenFile[i].bExecute := FALSE; // <-- THEN auf die Zeile von dem IF packen, und die beiden Statements in verschiedene Zeilen.
                END_IF
    
    ...
    
                    THEN ListOfAxisFileStates[i] := ListOfAxisFileStates[i] + 1; CloseFile[i].bExecute := FALSE; // <-- Wozu diese komische Addition?
    
    ...
    
    IF bFinishedAll
        THEN
        FOR i := 0 TO 4 BY 1 DO
        ListOfPositions[i] := STRING_TO_LREAL (GetLine[i].sLine); // <-- hier fehlt eine Einrückung
        GetLine[i].bExecute := FALSE;
        ListOfAxisFileStates[i] := 2;
        NewData := 1;
        END_FOR
        
    END_IF

  8. Folgender Benutzer sagt Danke zu _Eddi_ für den nützlichen Beitrag:

    Bambustraeger (15.12.2017)

  9. #7
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    755
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard

    Mal abgesehen von der grauseligen Formatierung und der nochmaligen Steigerung von "= FALSE" nach "=NOT TRUE" ist es mir ein Rätsel, warum da überhaupt irgendwas funktioniert, es sei denn Beckhoff hätte zwischenzeitlich gravierende Änderungen an seinen File-FBs vorgenommen.
    Ich kenne es so, dass nach Abschluss einer Dateioperation (NOT bBusy) es nicht ausreicht, DateiFB.bExecute:=false zu setzen, sondern man den FB auch mit diesem bExecute-Wert aufrufen muss, um ihn für die nächste Operation vorzubereiten.
    Ach ja, und bError nicht abzufragen, ist schon mehr als schlechter Stil.

  10. Folgender Benutzer sagt Danke zu StructuredTrash für den nützlichen Beitrag:

    Bambustraeger (15.12.2017)

  11. #8
    Registriert seit
    14.12.2017
    Beiträge
    2
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,

    ja ich habe vergessen den FB mit bExecude := FALSE erneut aufzurufen, das war mein Problem.
    Danke für die Hinweise zum Stil, darüber muss ich wohl mal nachdenken.

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 28.11.2014, 10:59
  2. TwinCAT 2 und TwinCAT 3 auf einem Rechner
    Von DerDron im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 17.11.2014, 16:07
  3. Twincat 3.1 C++ Module im UserMode TwinCAT UM(x86)
    Von Schaun_wir_mal im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 05.11.2013, 22:13
  4. TwinCAT stürzt ab sobald TwinCAT System gestartet wird
    Von HK09 im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 23.09.2010, 10:02
  5. Antworten: 4
    Letzter Beitrag: 03.11.2009, 14:05

Stichworte

Lesezeichen

Berechtigungen

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