Variablen in einer CSV Datei schreiben

LeChercheur

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich möchte meine Variablen in einer csv datei protokollieren. Ich möchte die Protokollierung als Beispiel 5 Sekunden lang Schreiben und 15 Sekunden pausieren.
Dafür habe ich ein Blinkbaustein erstellt und folgendes Programm geschrieben.
Es wird leider nicht in die Datei geschrieben. Vielleicht sieht einer was ich falsch mache oder was ich ändern muss, damit es funktioniert. Hier ist mein Code:

Code:
VAR
    
    bWriteData:BOOL:=FALSE;        
    uiSchritte:UDINT:=0;    
    sFileName: CAA.FILENAME:='\Usbstorage\Test.csv';
    hFile:CAA.HANDLE;

    CRLF:STRING(2):= '$R$N';
    LF:STRING(1):= '$N';

    //------------------------   Daten ----------------------------------
    
    Echtzeit: DT;
    Echtzeit_Start: BOOL;    
    SpeicherText: STRING;
    Fuellstand_Start_Text:STRING;
    Fuellstand_Stop_Text:STRING;
    Fuellstand_Text:STRING;
    
    //------------------------   Ende Daten---------------------------------
    BLK: BLINK;
    bEnable: BOOL;
    bitstate:BOOL;
    //function block for file handling
    
    fopen  : FILE.Open;
      fwrite : file.Write;
      fclose : file.Close;
        
END_VAR


IF Logdatei_Blinkbaustein_Flanke.Q  THEN   // (Blinkbaustein wurde erstellt (5Sekunden Svchreiben und 15Sekunden pausieren zum Beispiel)
        
CASE uiSchritte OF
    
    0:
            uiSchritte:=10;

    10:    
        fopen.sFileName:=sFileName;
        fopen.eFileMode:=File.MODE.MRDWR; //File.MODE.MAPPD;
        fopen.xExclusive:=TRUE;
        fopen( xExecute:=TRUE);
        
        IF fopen.xDone THEN
            hFile:=fopen.hFile;
            
            uiSchritte:=30;
            
        END_IF
            
    
    20:    (* write log data to file *)
    
        fwrite.hFile:=hFile;
        Echtzeit:=SysRtcGetTime (Echtzeit_Start);
        SpeicherText:=DT_TO_STRING(Echtzeit);
        fwrite.pBuffer:=ADR(SpeicherText);
        fwrite.szSize:=LEN(SpeicherText);
        fwrite.pBuffer:=ADR(CRLF);
        fwrite.szSize:=LEN(CRLF);
        //-------------------------------------------------  Fuellstand_Start-----------------------------
        Fuellstand_Start_Text:=DINT_TO_STRING(Fuellstand_Start_analog);
        fwrite.pBuffer:=ADR(Fuellstand_Start_Text);
        fwrite.szSize:=LEN(Fuellstand_Start_Text);
        fwrite.pBuffer:=ADR(CRLF);
        fwrite.szSize:=LEN(CRLF);
        
        //-------------------------------------------------   Fuellstand_Stopp-----------------------------
        Fuellstand_Stop_Text:=DINT_TO_STRING(Fuellstand_Stopp_analog);
        fwrite.pBuffer:=ADR(Fuellstand_Stop_Text);
        fwrite.szSize:=LEN(Fuellstand_Stop_Text);
        fwrite.pBuffer:=ADR(CRLF);
        fwrite.szSize:=LEN(CRLF);
        
        //-------------------------------------------------  Fuellstand-----------------------------
        Fuellstand_Text:=DINT_TO_STRING(Fuellstand);
        fwrite.pBuffer:=ADR(Fuellstand_Text);
        fwrite.szSize:=LEN(Fuellstand_Text);
        fwrite.pBuffer:=ADR(CRLF);
        fwrite.szSize:=LEN(CRLF);
        
        fwrite.udiTimeOut:=100000;    //Timeout
        fwrite( xExecute:=TRUE);
        
        IF fwrite.xDone THEN
            
            fwrite( xExecute:=FALSE);
            uiSchritte:=30;
        
        END_IF
        
    30:  (* close log file *)
        fclose.hFile:=hFile;
        fclose( xExecute:=TRUE);
        
        IF fclose.xDone THEN
            fopen( xExecute:=FALSE);
            fwrite( xExecute:=FALSE);
            fclose( xExecute:=FALSE);
            uiSchritte:=0;
        END_IF
        
        
END_CASE

END_IF
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und gewöhn Dir bitte an FBs die über mehrere Zyklen laufen außerhalb einer CASE-Anweisung oder einer IF-Anweisung aufzurufen und innerhalb nur die Eingänge zu setzen und die Ausgänge auszuwerten. Weil da schleicht sich sonst schnell der Fehler ein, dass man den FB nur für einen Zyklus aufruft.
 
Code:
        fopen.eFileMode:=File.MODE.MRDWR; //File.MODE.MAPPD;
Da die Datei nicht wieder gelöscht wird, werden die weiteren ÖffnungsVersuche lediglich Fehlermeldungen produzieren.
Der im Kommentar angegebene Modus Append dürfte besser passen.

Edit:
Da habe ich mich wohl verguckt. ReadWrite geht vielleicht, ist aber eigentlich für eine sequentielle Datei nicht verfügbar?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Mal abgesehen von dem was Heinileini eben schrieb wird es aus einem anderen Grund wohl nicht gehen und ist vermutlich bedingt ein Beispiel für meinen Hinweis, dass man FB nicht in Abfragen ausführen sollte.
Die Variable der IF-Abfrage heißt ...Flanke.Q, wenn dass tatsächlich ein Flankensignal ist würde es nur für einen Zyklus TRUE sein und somit die CASE-Anweisung nur einmal ausgeführt werden.
 
Hallo Zusammenm und vielen Dank für die Info.
Ich habe folgendes gemacht und ich muss gestehen, dass Oliver Hinweis war richtig. Das Problem ist dass nur der Semikolon wird in die Datei geschrieben ??

Code:
CASE uiSchritte OF
    0:
        IF  Logdatei_Blinkbaustein_Flanke.Q THEN
            uiSchritte:=10;
        END_IF

Wenn ich online gehe, sehe ich, dass der Case bis zum Ende ausgeführt wird. Das Problem ist, es wird nur der "Semikolon" in die Datei geschrieben. Ich benutze ein Semikolon um die Daten zu trennen mit folgendes Befehl:

Deklaration:
Semikolon als String := ';';
Dann
Code:
       fwrite.hFile:=hFile;
        fwrite.pBuffer:=ADR(Semikolon);
        fwrite.szSize:=LEN(Semikolon);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich weiss nicht, ob es so ist, aber vermute, dass z.B. ...
Code:
        fwrite.pBuffer:=ADR(Fuellstand_Text);
        fwrite.szSize:=LEN(Fuellstand_Text);
        fwrite.pBuffer:=ADR(CRLF);
        fwrite.szSize:=LEN(CRLF);
        fwrite.pBuffer:=ADR(Semikolon);
        fwrite.szSize:=LEN(Semikolon);
... den Puffer immer wieder ab Anfang be- bzw. überschreibt.
Wofür ist die LängenAngabe? Müsste da evtl. die Postion ab PufferAnfang angegeben werden?
Ist die Ausgabe von CRLF nötig? Wird das evtl. automatisch bei jedem SchreibBefehl angehängt?
Wegen all meiner Unkenntnis würde ich lieber die "EinzelTeile" in einer StringVariablen zusammenbasteln und dann erst "in einem Rutsch" den ganzen Satz schreiben.

Allerdings gehört das Semikolon vor den CRLF.

Die erste Zeile wird i.A. als Überschrift interpretiert. Wieviele Spalten hast Du geplant?

PS:
Lade doch mal Deinen aktuellen Stand hoch. Wir wissen jetzt nur, dass Du den Stand aus #1 geändert hast, ab nicht wo und wie ...
 
Zuletzt bearbeitet:
Das kann alles so nicht gehen. Du füllst den Puffer immer wieder mit Daten, dadurch wird das Vorhergehende überschrieben. Den FB selber führst Du aber nur am Ende aus, dadurch wird nur das letzte, in Deinem Fall das Semikolon geschrieben.
Du musst jedes mal wenn Du den Puffer gefüllt (z.B. Füllstand start) hast den FB ausführen, warten bis er fertig ist, ihn mit Execute = FALSE ausführen, anschließend den Puffer wieder füllen (Füllstand stopp) und den FB erneut mit Execute = TRUE ausführen. Ansonsten kannst Du mit CONCAT alles zusammenstückeln, allerdings darf der String nicht länger als 255 Zeichen sein.
Und wie Heinileini schon schrieb, warum nutzt Du dauernd CR/LF? Eine CSV Datei soll doch durch Komma getrennt werden, da brauchst Du CR/LF nur am Ende.

Von irgendwas mit Internetzugang gesendet.
 
Zuletzt bearbeitet:
Anbei mein Code:

Code:
VAR
    
    bWriteData:BOOL:=FALSE;        
    uiSchritte:UDINT:=0;    
    sFileName: CAA.FILENAME:='\Usbstorage\Testen.csv';
        hFile:CAA.HANDLE;

    CRLF:STRING(2):= '$R$N';
    LF:STRING(1):= '$N';

    //------------------------   Daten ----------------------------------
    
    Echtzeit: DT;
    Echtzeit_Start: BOOL;    
    SpeicherText: STRING;
    Fuellstand_Start_Text:STRING;
    Fuellstand_Stop_Text:STRING;
    Fuellstand_Text:STRING;
    
    //------------------------   Ende Daten---------------------------------
    BLK: BLINK;
    bEnable: BOOL;
    bitstate:BOOL;
    //function block for file handling
    
    fopen  : FILE.Open;
      fwrite : file.Write;
      fclose : file.Close;
        
END_VAR



        
CASE uiSchritte OF
    
    0:
        
        IF Logdatei_Blinkbaustein_Flanke.Q  THEN           // (Blinkbaustein wurde erstellt (5Sekunden Svchreiben und 15Sekunden pausieren zum Beispiel)
            
        uiSchritte:=10;

        End_IF

    10:    
        fopen.sFileName:=sFileName;
        fopen.eFileMode:=File.MODE.MRDWR;
        fopen.xExclusive:=TRUE;
        fopen( xExecute:=TRUE);
        
        IF fopen.xDone THEN
            hFile:=fopen.hFile;
            
            uiSchritte:=30;
            
        END_IF
            
    
    20:    (* write log data to file *)
    
        fwrite.hFile:=hFile;
    Echtzeit:=SysRtcGetTime (Echtzeit_Start);
    SpeicherText:=DT_TO_STRING(Echtzeit);
        fwrite.pBuffer:=ADR(SpeicherText);
        fwrite.szSize:=LEN(SpeicherText);
    fwrite.pBuffer:=ADR(CRLF);
        fwrite.szSize:=LEN(CRLF);
        
    uiSchritte:30;

    30:
        //-------------------------------------------------  Fuellstand_Start-----------------------------
         fwrite.hFile:=hFile;
        Fuellstand_Start_Text:=DINT_TO_STRING(Fuellstand_Start_analog);
        fwrite.pBuffer:=ADR(Fuellstand_Start_Text);
            fwrite.szSize:=LEN(Fuellstand_Start_Text);
        fwrite.pBuffer:=ADR(CRLF);
            fwrite.szSize:=LEN(CRLF);
        
    IF fwrite.xDone THEN
            
            fwrite( xExecute:=FALSE);
            uiSchritte:=40;
        
        END_IF

    40:
        
        fwrite( xExecute:=TRUE);
        fwrite.hFile:=hFile;
        //-------------------------------------------------   Fuellstand_Stopp-----------------------------

        Fuellstand_Stop_Text:=DINT_TO_STRING(Fuellstand_Stopp_analog);
        fwrite.pBuffer:=ADR(Fuellstand_Stop_Text);
            fwrite.szSize:=LEN(Fuellstand_Stop_Text);
        fwrite.pBuffer:=ADR(CRLF);
            fwrite.szSize:=LEN(CRLF);
    
    IF fwrite.xDone THEN
            
            fwrite( xExecute:=FALSE);
            uiSchritte:=50;
        
        END_IF

    50:
        //-------------------------------------------------  Fuellstand-----------------------------

        fwrite( xExecute:=TRUE);
        fwrite.hFile:=hFile;
        Fuellstand_Text:=DINT_TO_STRING(Fuellstand);
        fwrite.pBuffer:=ADR(Fuellstand_Text);
            fwrite.szSize:=LEN(Fuellstand_Text);
        fwrite.pBuffer:=ADR(CRLF);
            fwrite.szSize:=LEN(CRLF);
        
            fwrite.udiTimeOut:=100000;    //Timeout
            fwrite( xExecute:=TRUE);
        
        IF fwrite.xDone THEN
            
        fwrite( xExecute:=FALSE);
        uiSchritte:=60;
        
        END_IF
        
    60:  (* close log file *)
        fclose.hFile:=hFile;
        fclose( xExecute:=TRUE);
        
        IF fclose.xDone THEN
            fopen( xExecute:=FALSE);
            fwrite( xExecute:=FALSE);
            fclose( xExecute:=FALSE);
            uiSchritte:=0;
        END_IF
        
END_IF    

END_CASE
PS: Ich benutze den Befehl:
Code:
      fwrite.pBuffer:=ADR(CRLF);
        fwrite.szSize:=LEN(CRLF);
weil ich jedes mal eine neue Zeile schreiben möchte.
zum Beispiel: Rice Mehl Mais
1 2 3
4 5 6
7 8 9
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe leider im Moment keine Zeit näher darauf einzugehen, sorry, aber funktioniert genauso wenig wie das Vorher.
Es wird nur etwas in die Datei geschrieben wenn fwrite auch aufgerufen wird, das erfolgt bei Dir jedoch nicht immer, dadurch wird auch nicht das in die Datei geschrieben was Du möchtest. Du verweist bei pBuffer mehrmals auf eine andere Adresse ohne fwrite auszuführen, daher wird dann nur das geschrieben, was an der zuletzt angegebenen Adresse steht.
Wie gesagt, musst Du jede Zeile erstmal in einem String mit CONCAT zusammenstückeln, da dieser und andere Stringbefehle nur bis 255 Zeichen arbeiten darf Deine Zeile nicht länger sein, ansonsten müsstest Du alles nacheinander in ein Array of BYTE kopieren und dann schreiben, oder Du erstellst für jeden Messwert einen String und hängst daran dann das Semikolon und Schreibst das.
Übrigens verwendest Du noch immer zu viele CR/LF. Zwischen den Werten muss ein Semikolon kommen und am Ende der Zeile nach dem letzten Semikolon ein CR/LF, aber nur eins.
 
VAR

bWriteData:BOOL:=FALSE;
uiSchritte:UDINT:=0;
sFileName: CAA.FILENAME:='\Usbstorage\Testen.csv';
hFile:CAA.HANDLE;

CRLF:STRING(2):= '$R$N';
LF:STRING(1):= '$N';

//------------------------ Daten ----------------------------------

Echtzeit: DT;
Echtzeit_Start: BOOL;
SpeicherText: STRING;
Fuellstand_Start_Text:STRING;
Fuellstand_Stop_Text:STRING;
Fuellstand_Text:STRING;

//------------------------ Ende Daten---------------------------------
BLK: BLINK;
bEnable: BOOL;
bitstate:BOOL;
//function block for file handling

fopen : FILE.Open;
fwrite : file.Write;
fclose : file.Close;

END_VAR




CASE uiSchritte OF

0:

IF Logdatei_Blinkbaustein_Flanke.Q THEN // (Blinkbaustein wurde erstellt (5Sekunden Svchreiben und 15Sekunden pausieren zum Beispiel)

uiSchritte:=10;

End_IF

10:
fopen.sFileName:=sFileName;
fopen.eFileMode:=File.MODE.MRDWR;
fopen.xExclusive:=TRUE;
fopen( xExecute:=TRUE);

IF fopen.xDone THEN
hFile:=fopen.hFile;

uiSchritte:=30;

END_IF


20: (* write log data to file *)

fwrite.hFile:=hFile;
Echtzeit:=SysRtcGetTime (Echtzeit_Start);
SpeicherText:=DT_TO_STRING(Echtzeit);
fwrite.pBuffer:=ADR(SpeicherText);
fwrite.szSize:=LEN(SpeicherText);
fwrite.pBuffer:=ADR(CRLF);
fwrite.szSize:=LEN(CRLF);

uiSchritte:30;

30:
//------------------------------------------------- Fuellstand_Start-----------------------------
fwrite.hFile:=hFile;
Fuellstand_Start_Text:=DINT_TO_STRING(Fuellstand_Start_analog);
fwrite.pBuffer:=ADR(Fuellstand_Start_Text);
fwrite.szSize:=LEN(Fuellstand_Start_Text);
fwrite.pBuffer:=ADR(CRLF);
fwrite.szSize:=LEN(CRLF);

IF fwrite.xDone THEN

fwrite( xExecute:=FALSE);
uiSchritte:=40;

END_IF

40:

fwrite( xExecute:=TRUE);
fwrite.hFile:=hFile;
//------------------------------------------------- Fuellstand_Stopp-----------------------------

Fuellstand_Stop_Text:=DINT_TO_STRING(Fuellstand_Stopp_analog);
fwrite.pBuffer:=ADR(Fuellstand_Stop_Text);
fwrite.szSize:=LEN(Fuellstand_Stop_Text);
fwrite.pBuffer:=ADR(CRLF);
fwrite.szSize:=LEN(CRLF);

IF fwrite.xDone THEN

fwrite( xExecute:=FALSE);
uiSchritte:=50;

END_IF

50:
//------------------------------------------------- Fuellstand-----------------------------

fwrite( xExecute:=TRUE);
fwrite.hFile:=hFile;
Fuellstand_Text:=DINT_TO_STRING(Fuellstand);
fwrite.pBuffer:=ADR(Fuellstand_Text);
fwrite.szSize:=LEN(Fuellstand_Text);
fwrite.pBuffer:=ADR(CRLF);
fwrite.szSize:=LEN(CRLF);

fwrite.udiTimeOut:=100000; //Timeout
fwrite( xExecute:=TRUE);

IF fwrite.xDone THEN

fwrite( xExecute:=FALSE);
uiSchritte:=60;

END_IF

60: (* close log file *)
fclose.hFile:=hFile;
fclose( xExecute:=TRUE);

IF fclose.xDone THEN
fopen( xExecute:=FALSE);
fwrite( xExecute:=FALSE);
fclose( xExecute:=FALSE);
uiSchritte:=0;
END_IF

END_IF

END_CASE
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nochmal zu meinem Problem. Ich möchte nicht lange stören aber ich komme die Sache näher bin ich der Meinung.

Code:
CASE uiSchritte OF

    0:
        IF  Logdatei_Blinkbaustein_Flanke.Q THEN
            uiSchritte:=10;
        END_IF
    10:    
        fopen.sFileName:=sFileName;
        fopen.eFileMode:=File.MODE.MRDWR;
        fopen.xExclusive:=TRUE;
        fopen( xExecute:=TRUE);
        IF fopen.xDone THEN
            hFile:=fopen.hFile;
         END_IF
        uiSchritte:=20;
        
    20:
            
        Echtzeit:=SysRtcGetTime (Echtzeit_Start);
        SpeicherText:=DT_TO_STRING(Echtzeit);
        Fuellstand_Start_Text:=DINT_TO_STRING(Fuellstand_Start_analog);
        Fuellstand_Stop_Text:=DINT_TO_STRING(Fuellstand_Stopp_analog);
        Fuellstand_Text:=DINT_TO_STRING(Fuellstand);
        
        uiSchritte:=30;
        
        
    30:    
    
        fwrite.hFile:=hFile;
        fwrite.pBuffer:=ADR(SpeicherText);
        fwrite.szSize:=LEN(SpeicherText);    
        
        
        fwrite.udiTimeOut:=100000;    //Timeout
        fwrite( xExecute:=TRUE);
        IF fwrite.xDone THEN
            
            fwrite( xExecute:=FALSE);
            uiSchritte:=40;
                
        END_IF
        
    40:
    
    fwrite.hFile:=hFile;
        fwrite.pBuffer:=ADR(Fuellstand_Start_Text);
        fwrite.szSize:=LEN(FuellstandStart_Text);
        
        
    fwrite.udiTimeOut:=100000;                //Timeout
        fwrite( xExecute:=TRUE);
        
        IF fwrite.xDone THEN
            
            fwrite( xExecute:=FALSE);
            uiSchritte:=0;
                
        END_IF
        
        END_CASE

Ich kann in die Datei schreiben aber das Programm bleibt bei der Schritt 30 stehen und macht den Schritt zu case 40 nicht.
Fehlt mir da ein Befehl ?
 
Hallo,

versuch mal:
Code:
    10:    
        fopen.sFileName:=sFileName;
        fopen.eFileMode:=File.MODE.MRDWR;
        fopen.xExclusive:=TRUE;
        fopen( xExecute:=TRUE);
        IF fopen.xDone THEN
            hFile:=fopen.hFile;
            uiSchritte:=20;
         END_IF

Gruß
 
Und frage sonst mal die Ausgänge ab: xBusy, xError und eError indem Du sie z.B. in eine temporäre Variable schreibst.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Meine Datei sieht so aus:
DT#2020-06-17-13:16:16DT#2020-06-17-13:16:27DT#2020-06-17-13:16:39DT#2020-06-17-13:16:50DT#2020-06-17-13:17:02

Er sollte aber so aussehen:
'Datum_Und_Uhrzeit' dann 'Fullstand_Start' dann 'Füllstand_Stop' dann Füllstand.

er ignoriert einfaxch den zweiten Wert und schreibt nur das datum
 
Habe mal versucht, Deinen Code aus Beitrag #11 "umzuwurschteln" ab dem CASE.
Den Reis-Mehl-Mais-Wunsch habe ich nicht wirklich verstanden und genauso wenig berücksichtigt.
Ich hab's so aufgebaut (ungetestet!), dass nach Beginn des 5s-Signals
1. die Datei geöffnet wird
2. ein Füllstands-StartSatz (was immer das sein mag) geschrieben wird
3. wiederholt Füllstands-MitOhne-Start/Stopp-Sätze (was immer das sein mag) geschrieben werden, solange das 5s-Signal noch ansteht und
erst nach den Verschwinden des 5s-Signals
4. ein Füllstands-StoppSatz (was immer das sein mag) geschrieben wird und abschliessend
5. die Datei geschlossen wird.
Das ZusammenBasteln der verschiedenen DatenSatzTypen habe ich mangels Fantasie Dir überlassen:
Code:
CASE uiSchritte OF
0:  // Wait For Start
    IF AusgabeSollLaufen THEN // AusgabeSollLaufen: dieser BlinkTakt ist abwechselnd z.B. 5 s True und 15 s False
        uiSchritte := 10 ;
    END_IF ;     
10: // OPEN-Start
    fopen.sFileName := sFileName ;
    fopen.eFileMode := File.MODE.MAPPD ; // ! 
    fopen.xExclusive := TRUE ; // ?
    Exec_open := TRUE ;
    uiSchritte := 15 ;
15: // Wait For OPEN-Done
    IF fopen.xDone THEN // oder wenn Open mit Error beendet!
        hFile := fopen.hFile ;
        Exec_open := FALSE ;
        uiSchritte := 20 ;
    END_IF ;
20: // Header-Start
    SpeicherText :=DINT_TO_STRING(Fuellstand_Start_analog) ;
    // ... hier in SpeicherText kompletten DatenSatz zusammenstellen
    // ... inkl. ';' und ggfs 'CRLF'
    fwrite.pBuffer := ADR(SpeicherText) ;
    fwrite.szSize  := LEN(SpeicherText) ;
    fwrite.hFile := hFile ;
    Exec_write := TRUE ;
    uiSchritte := 25 ;
25: // Wait For Header-Done
    IF fwrite.xDone THEN // oder wenn Write mit Error beendet!
        Exec_write := FALSE ;
        uiSchritte := 30 ;
    END_IF ;
30: // Level-Start
    SpeicherText :=DINT_TO_STRING(Fuellstand) ;
    // ... hier in SpeicherText kompletten DatenSatz zusammenstellen
    // ... inkl. ';' und ggfs 'CRLF'
    fwrite.pBuffer := ADR(SpeicherText) ;
    fwrite.szSize  := LEN(SpeicherText) ;
    fwrite.hFile := hFile ;
    Exec_write := TRUE ;
    uiSchritte := 35 ;
35: // Wait For Level-Done resp. Wait For STOP
    IF fwrite.xDone THEN // oder wenn Write mit Error beendet!
        IF AusgabeSollLaufen THEN
            uiSchritte := 30 ;
        ELSE     
            uiSchritte := 40 ;
        END_IF ;     
        Exec_write := FALSE ;
    END_IF ;
40: // Footer-Start
    SpeicherText :=DINT_TO_STRING(Fuellstand_Stopp_analog) ;
    // ... hier in SpeicherText kompletten DatenSatz zusammenstellen
    // ... inkl. ';' und ggfs 'CRLF'
    fwrite.pBuffer := ADR(SpeicherText) ;
    fwrite.szSize  := LEN(SpeicherText) ;
    fwrite.hFile := hFile ;
    Exec_write := TRUE ;
    uiSchritte := 45 ;
45: // Footer-Done
    IF fwrite.xDone THEN // oder wenn Write mit Error beendet!
        Exec_write := FALSE ;
        uiSchritte := 50 ;
    END_IF ;
50: // CLOSE-Start
    fclose.hFile := hFile ;
    Exec_close := TRUE ;
    uiSchritte := 55 ;
55: // CLOSE-Done
    IF fclose.xDone THEN // oder wenn Close mit Error beendet!
        Exec_close := FALSE ;
        uiSchritte := 0 ;
    END_IF ;
END_CASE ;
fopen( xExecute := Exec_open ) ;
fwrite( xExecute := Exec_write ) ;
fclose( xExecute := Exec_close ) ;
PS:
Für das Starten einer Aktion und für das Warten auf Fertigwerden der Aktion habe ich jeweils einen eigenen Schritt spendiert.
 
Zuletzt bearbeitet:
Hallo,
versuch mal:
Code:
    10:    
        fopen.sFileName:=sFileName;
        fopen.eFileMode:=File.MODE.MRDWR;
        fopen.xExclusive:=TRUE;
        fopen( xExecute:=TRUE);
        IF fopen.xDone THEN
            hFile:=fopen.hFile;
            uiSchritte:=20;
         END_IF
Auf die falsche SchrittNr 30 an der oben gezeigten Stelle aus Beitrag #1 hatte ich schon in Beitrag #2 hingewiesen.
In Beitrag #11: unverändert.
In Beitrag #13: unverändert.
Habe dies so gedeutet, dass der Schritt 20 absichtlich totgelegt ist.
Auf den m.E. falschen Open-Mode (File.MODE.MRDWR) hatte ich in Beitrag #5 hingewiesen.
In den Beiträgen #11 & #13: weiterhin unverändert.
Keine Meinung - vielleicht deute ich die Zeichen einfach falsch.
Auf das wiederholte Be- bzw. Überschreiben des Puffers hatte ich in #9 hingewiesen und habe empfohlen, zuerst den kompletten DatenSatz zusammenzubasteln und ihn dann erst zu schreiben. Oliver hat hierfür das "Werkzeug" CONCAT genannt.
In den Beiträgen #11 & #13: an diesen Stellen wurde zwar im Detail geändert, aber im Wesentlichen wie gehabt.
Angeblich wurde Code um das Einfügen von ';' ergänzt.
In den Beiträgen #11 & #13: nichts davon zu sehen.
Seit #11 Änderung der AufgabenStellung - recht beiläufig erwähnt - mit rätselhafter, vager, aber immerhin zweisprachiger Beschreibung ("Rice, Mehl, Mais").
Zahlreiche gute Hinweise, Tipps usw. von Oliver T. aus B. und diversen anderen ...
Bin gespannt, ob wir hier weiterkommen. ;)
 
Zuletzt bearbeitet:
Zurück
Oben