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

Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte
Ergebnis 31 bis 40 von 44

Thema: FB_FileWrite Writeerror

  1. #31
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich vermute dass er deine Zahlen als ASCII interpretiert.

    Ich selber schreibe immer Strings in meine Dateien. Du könntest dein Array in einen String umwandeln ala
    Code:
    LogString := DINT_TO_STRING(BuffRead[0]);
    LogString := CONCAT(LogString, ' ');
    LogString := CONCAT(LogString, DINT_TO_STRING(BuffRead[1])); 
    LogString := CONCAT(LogString, ' ');
    LogString := CONCAT(LogString, DINT_TO_STRING(BuffRead[2])); 
    LogString := CONCAT(LogString, ' ');
    LogString := CONCAT(LogString, DINT_TO_STRING(BuffRead[3])); 
    LogString := CONCAT(LogString, ' ');
    LogString := CONCAT(LogString, DINT_TO_STRING(BuffRead[4])); 
    LogString := CONCAT(LogString, ' ');
    LogString := CONCAT(LogString, DINT_TO_STRING(BuffRead[5]));
    und diesen String dann wegschreiben.
    A programmer is just a tool which converts caffeine into code.

  2. Folgender Benutzer sagt Danke zu Cerberus für den nützlichen Beitrag:

    sps-neuling1234 (20.04.2011)

  3. #32
    Registriert seit
    18.04.2011
    Beiträge
    16
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Also bis ich herausgefunden hätte, dass ich das machen muss und wie das geht, wären wohl einige Monde vergangen
    Also es klappt nun schon sehr gut und ich bin auch wirklich begeistert
    nur habe ich nun noch das Problem, dass er immer wieder in den Step31 springt am ende, da muss es doch sowas wie ein
    break;
    geben um aus der case anweisung zu springen oder?

  4. #33
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard

    Also ich mach das bei mir immer so, dass ich eine boolsche Variable und zwei Flankentrigger
    Code:
    bLogOn: BOOL := FALSE;
    fbRTrig: R_TRIG;
    fbFTrig: F_TRIG;
    hab und während die Variable true ist, wird geloggt.
    Ganz am Anfang von meinem Programm aktualisiere ich meine Flankentrigger
    Code:
    fbRTrig(CLK:= bLogOn);
    fbFTrig(CLK:= bLogOn);
    Um den File-Open-Code (bei dir Schritt 1) machst du dann
    Code:
    fbRTrig();
    IF fbRTrig.Q OR bLogOn THEN
        (* Hier kommt der Code zum File öffnen *)
    END_IF
    und um den File-Write-Code (bei dir Schritt 3) kommt
    Code:
    fbFTrig();
    IF NOT fbFTrig.Q THEN
        (* Hier kommt der Code zum File beschreiben *)
    ELSE
        (* File schließen *)
        Step := 30;
    END_IF
    Den mittleren If-Zweig im Step 50 kannst du dir dann sparen.
    A programmer is just a tool which converts caffeine into code.

  5. #34
    Registriert seit
    18.04.2011
    Beiträge
    16
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich verstehe nicht so richtig wo ich nun was einfügen müsste,
    gibt es denn kein "richtiges" switch-case Konstrukt bei dem man ein break nutzen kann?

    Also was ich eigentlich machen will ist, dass er bei Knopfdruck einfach 6 Werte in eine datei schreibt. Am besten sollten die Werte untereinander stehen

  6. #35
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard

    Dann machs doch einfach so:
    Code:
    fbRTrig(CLK:=bLogOn);
     
    sLogDaten := DINT_TO_STRING(BuffRead[0]);
    sLogDaten := CONCAT(LogString, '$n');
    sLogDaten := CONCAT(LogString, DINT_TO_STRING(BuffRead[1])); 
    sLogDaten := CONCAT(LogString, '$n');
    sLogDaten := CONCAT(LogString, DINT_TO_STRING(BuffRead[2])); 
    sLogDaten := CONCAT(LogString, '$n');
    sLogDaten := CONCAT(LogString, DINT_TO_STRING(BuffRead[3])); 
    sLogDaten := CONCAT(LogString, '$n');
    sLogDaten := CONCAT(LogString, DINT_TO_STRING(BuffRead[4])); 
    sLogDaten := CONCAT(LogString, '$n');
    sLogDaten := CONCAT(LogString, DINT_TO_STRING(BuffRead[5]));
     
    CASE Step OF
        1:    (* File oeffnen *)
            fbRTrig();
            IF fbRTrig.Q THEN
                fbFileOpen(sNetId:= '',
                    sPathName:= 'C:/Dokumente und Einstellungen/Cerberus/Desktop/test.txt,
                    nMode:= FOPEN_MODEWRITE OR FOPEN_MODETEXT,
                    ePath:= PATH_GENERIC,
                    bExecute:= TRUE,
                    tTimeout:= t#3s);
                Step := 2;
            END_IF
        2:
            fbFileOpen();
            IF NOT fbFileOpen.bBusy THEN
                IF fbFileOpen.bError THEN
                    nErrId := fbFileOpen.nErrId;
                    bError1 := TRUE;
                    Step := 50;
                ELSE
                    hFileDatei := fbFileOpen.hFile;
                    Step := 3;
                END_IF
                fbFileOpen(bExecute:= FALSE);
            END_IF
        3:    (* File schreiben *)
            fbFileWrite(sNetId:= '',
                hFile:= hFileDatei,
                pWriteBuff:= ADR(sLogDaten),
                cbWriteLen:= LEN(sLogDaten),
                bExecute:= TRUE,
                tTimeout:= t#3s);
            Step := 4;
        4:
            fbFileWrite();
            IF NOT fbFileWrite.bBusy THEN
                IF fbFileWrite.bError THEN
                    nErrID := fbFileWrite.nErrId;
                    bError2 := TRUE;
                    Step := 50;
                ELSE
                    Step := 5;
                END_IF
                fbFileWrite(bExecute:= FALSE);
            END_IF
        5:    (* File schliessen *)
            fbFileClose(sNetId:= '',
                hFile:=hFileDatei,
                bExecute:= TRUE,
                tTimeout:= t#3s);
            Step := 6;
        6:
            fbFileClose();
            IF NOT fbFileClose.bBusy THEN
                IF fbFileClose.bError THEN
                    nErrId := fbFileClose.nErrId;
                    bError3 := TRUE;
                    Step := 50;
                ELSE
                    Step := 1;
                END_IF
                fbFileClose(bExecute:= FALSE);
            END_IF
    END_CASE
    A programmer is just a tool which converts caffeine into code.

  7. Folgender Benutzer sagt Danke zu Cerberus für den nützlichen Beitrag:

    sps-neuling1234 (20.04.2011)

  8. #36
    Registriert seit
    18.04.2011
    Beiträge
    16
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke.
    Dies entspricht, abgesehen von dem R_TRIG ja vom prinzip meinem Programm. Hier habe ich doch aber wieder das problem, dass wenn ich bspw dies als Function machen möchte und es aus meinem main Programm auffrufe, dann doch aber wieder ganze Zeit in dieser case anweisung gefangen bin oder wann würde er hier das case denn verlassen?
    Wenn man bedenkt, dass case50 nun so aufgebaut ist
    50:
    (*Fehler beim öffnen oder schreiben aufgetreten, von vorne anfangen*)
    IF (bError1=TRUE OR bError2=TRUE) THEN
    bError1:=FALSE;
    bError2:=FALSE;
    Step := 1;
    (*Fehler beim schließen der Datei aufgetreten, von vorne anfangen*)
    ELSIF (bError3=TRUE) THEN
    bError3:=FALSE;
    Step:=1;


    END_IF

  9. #37
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard

    Das RTrig srogt dafür, dass der Log-Prozess auf eine Variable reagiert. Diese kannst du dann im Knopfdruck setzen.

    Das Problem an der Funktion bzw. FB ist, dass beide das CASE einmal durchlaufen, dann verlassen und auch den FB bzw. Funktion verlassen. Deshalb würd ich so ne File-Write-Geschichte auch immer im Programm laufen lassen.
    A programmer is just a tool which converts caffeine into code.

  10. #38
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard

    Zitat Zitat von Cerberus Beitrag anzeigen
    Das Problem an der Funktion bzw. FB ist, dass beide das CASE einmal durchlaufen, dann verlassen und auch den FB bzw. Funktion verlassen.
    Um Missverständnissen vorzubeugen:
    In deinem Fall würde in ner Funktion das CASE mit Step = 1 durchgeführt und danach wieder verlassen. Es würde also nur die Datei geöffnet, nichts geschrieben und so.
    A programmer is just a tool which converts caffeine into code.

  11. #39
    Registriert seit
    18.04.2011
    Beiträge
    16
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ja genau! Aber gerade das soll ja nicht passieren daher wundert es mich ja so stark, dass es keinen switch befehl gibt! Dieser würde ja genau dieses verhalten verhindern.
    In deinem Fall würde in ner Funktion das CASE mit Step = 1 durchgeführt und danach wieder verlassen. Es würde also nur die Datei geöffnet, nichts geschrieben und so.
    d.h. mein Konstrukt mit dem case ist in diesem fall alles andere als sinnvoll, hast du eine Idee wie ich es ansonsten machen könnte? Wenn ich kein richtiges switch-case Konstrukt habe, dann kann ich doch nie wirklich auf meine Errors eingehen oder?

    Ich könnte natürlich einfach fileopen-filewrite-fileclose hintereinander ausführen lassen und in meinem fall einfach case 50 komplett weglassen. Und wenn es dann halt mal einen Error gibt, dann funktioniert die Funktion halt einmal nicht oder ist eine SPS so schnell, das es egal ist wenn er beim ersten durchlaufen nur case1 macht und wenn dann das ganze SPS-Programm wieder von vorne läuft, dann würde er ja case2 bearbeiten...eine SPS arbeitet schon wie in so ner endlosschleife, arbeitet also immer wieder die MAIN ab oder?=)
    Geändert von sps-neuling1234 (21.04.2011 um 09:18 Uhr)

  12. #40
    Registriert seit
    06.07.2007
    Beiträge
    2.811
    Danke
    174
    Erhielt 274 Danke für 253 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von sps-neuling1234 Beitrag anzeigen
    daher wundert es mich ja so stark, dass es keinen switch befehl gibt! Dieser würde ja genau dieses verhalten verhindern.
    d.h. mein Konstrukt mit dem case ist in diesem fall alles andere als sinnvoll, hast du eine Idee wie ich es ansonsten machen könnte? Wenn ich kein richtiges switch-case Konstrukt habe, dann kann ich doch nie wirklich auf meine Errors eingehen oder?
    Das Case ist ein ganz normales switch-case!!


    Zitat Zitat von sps-neuling1234 Beitrag anzeigen
    Ich könnte natürlich einfach fileopen-filewrite-fileclose hintereinander ausführen lassen und in meinem fall einfach case 50 komplett weglassen. Und wenn es dann halt mal einen Error gibt, dann funktioniert die Funktion halt einmal nicht oder ist eine SPS so schnell, das es egal ist wenn er beim ersten durchlaufen nur case1 macht und wenn dann das ganze SPS-Programm wieder von vorne läuft, dann würde er ja case2 bearbeiten...eine SPS arbeitet schon wie in so ner endlosschleife, arbeitet also immer wieder die MAIN ab oder?=)
    Also wenn du das ganze in ner Funktion laufen lassen würdest, dann würde er bei jeder Durchführung immer nur den case 1 durchlaufen. Das liegt daran, dass bei jedem Aufruf der Funktion die internen Variablen Default-Werte erhalten.
    Ob es in nem FB funzt, kann ich dir nicht sagen.

    Was du natürlich machen könntest, ist, dass du deine Variable Step als In-Out-Variable im FB deklarierst. Dann würdest du den FB mit Step = 1 aufrufen und er würde dir nach der Bearbeitung Step = 2 zurückgeben. Im nächsten Schritt musst du dann halt den FB mit Step = 2 aufrufen.
    A programmer is just a tool which converts caffeine into code.

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 12.10.2011, 09:48
  2. Fehler bei Benutzung FB_FileWrite ID:1802 :Out of Memory
    Von ysh032 im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 22.09.2011, 12:02
  3. FB_FileWrite Probleme mit Array schreiben
    Von FredlFesl im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 20.06.2011, 08:20

Lesezeichen

Berechtigungen

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