Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Variable in Struct & mehr

DaRi
2008-03-11
2008-03-12
  • DaRi - 2008-03-11

    Hallo zusammen,

    ich möchte mehrere Werte in einer csv-Datei abspeichern. Dies funktioniert soweit auch. Die Werte stehen in einer struct. Einzig hab ich Probleme mit der Ausrichtung. Nach jedem schreiben in die Datei wird eine neue Zeile begonnen. Nun kann es vorkommen, dass innerhalb einer Zeile plötzlich die Daten in die falsche Zelle (eine weiter) geschrieben werden. Woran kann dies denn liegen (evtl. Taskprobleme?)?

    Desweiteren möchte ich natürlich die Strings so klein wie möglich halten. Deshalb lese ich zuerst die Länge des String heraus. Kann ich nun die Länge des Strings in den struct übergeben um dadurch die Länge entsprechend anpassen zu können?

    TYPE tActiveSLTData :

    STRUCT

    nDrehzahl: STRING(15); (mein Wunsch: nDrehzahl: STRING(n); )

    END_STRUCT

    END_TYPE

    dwFileHandle := SysFileOpen(FileName:=strFileNew, Mode:='w');

    (Open/Create File and write datas)

    IF (dwFileHandle <> 0) THEN

        SysFileSetPos(File := dwFileHandle, Pos := diFileSizeNew);
    
    (*write data to file*)
    
        dwWrittenBytes := SysFileWrite(File := dwFileHandle, Buffer := ADR(SLTDataToFile[nActSLTDataRdIdx]), Size := SIZEOF(SLTDataToFile[nActSLTDataRdIdx]));
    
    dwWrittenBytes := SysFileWrite(File := dwFileHandle, Buffer := ADR(wNewLine), Size := SIZEOF(wNewLine)); (*new Line*)
    
    (*close file*)
    
    SysFileClose(File := dwFileHandle);
    
        diFileSizeNew := SysFileGetSize(FileName:=strFileNew);
    

    ...

    Ich hoffe dass mir jemand helfen kann.

     
  • gravieren - 2008-03-11

    Hi

    Nimm doch mal den "append"-Modus.

    Frage die Länge des Strings ab.

    Bei "SysFileWrite" --> Parameter "Size" gibst du diese Länge an.

     
  • Erik Böhm - 2008-03-11

    Mahlzeit

    1. Append mode ist eine spitzen Idee...

    2. Anstatt SIZEOF solltest du vielleicht mal LEN() probieren. Das gibt die tatsächliche Länge des Strings und nicht die maximal mögliche.

    3. Die Deklaration "(mein Wunsch: nDrehzahl: STRING(n);)" geht nicht. Dynamische Deklarationen sind in V2.3 nicht möglich. Nur über eine Konstante, was dir in diesem Fall ja aber auch nichts bringt.

    Gruss

    Erik

     
  • DaRi - 2008-03-12

    Hallo

    und erst mal Danke für die Tips. Das Umstellen des Mode von 'w' auf 'a' bringt leider nichts.

    Wenn ich die Länge des Datenpakets mit LEN ermitteln möchte kommt immer eine Fehlermeldung

    "Unzulässiger Typ für Eingang 'STR' von 'LEN': Kann tActiveSLTData' nicht in 'STRING(255)' konvertieren"

    Das tActiveSLTData ist mein Struct, in der aller Variabeln stehen, die ich in die Datei schreiben möchte.

    Hier ein Auszu aus der Datei:

    Spalte 1; -01-0 Spalte 2; -01-00:00: Spalte 3; -01-00:00: Spalte 4; -01-00:00: Date; 5 -01-0 Time; 1; -01-0

    Spalte 1; -01-0 Spalte 2; -01-00:00: Spalte 3; -01-00:00: Spalte 4; -01-00:00: Date; 5 -01-0 Time; 1; -01-0

    Spalte 1; -01-0 Spalte 2; -01-00:00: Spalte 3; -01-00:00: Spalte 4; -01-00:00: Date; 5 -01-0 Time; 1; -01-0

    Spalte 1; -01-0 Spalte 2; -01-00:00: Spalte 3; -01-00:00: Spalte 4; -01-00:00: Date; 5 -01-0 Time; 1; -01-0

    Es sollte eigentlich immer nur pro Zelle der Name Spalte1 ; Spalte 2; ... stehen. Die Werte dazwischen kommen von...???

    Mit dem Befehl

    SLTDataToFile [iArrayLine].nDieselRpm:=CONCAT('Spalte 1',';');

    füge ich den String und den Separator zusammen.

    dwFileHandle := SysFileOpen(FileName:=strFileNew, Mode:='a');

    (Open/Create File and write datas)

    IF (dwFileHandle <> 0) THEN

        SysFileSetPos(File := dwFileHandle, Pos := diFileSizeNew);
    
    (*write data to file*)
    
        dwWrittenBytes := SysFileWrite(File := dwFileHandle, Buffer := ADR(SLTDataToFile[nActSLTDataRdIdx]), Size := SIZEOF(SLTDataToFile[nActSLTDataRdIdx]));
    
    dwWrittenBytes := SysFileWrite(File := dwFileHandle, Buffer := ADR(wNewLine), Size := SIZEOF(wNewLine)); (*new Line*)
    
    (*close file*)
    
    SysFileClose(File := dwFileHandle);
    
        diFileSizeNew := SysFileGetSize(FileName:=strFileNew);
    
    nActSLTDataRdIdx:=nActSLTDataRdIdx+1;
    

    Gruß,

    Daniel

     
  • Erik Böhm - 2008-03-12

    Moin

    Also dass da 'Blödsinn' zwischendrin steht ist klar, wenn du SIZEOF benutzt. Dann stimmt ja die Länge des Strings nicht.

    Lies mal die Beschreibung von SIZEOF...

    Du musst aber natürlich LEN(SLTDataToFile[nActSLTDataRdIdx].nDrehzahl) schreiben.

    Gruss Erik

     

Log in to post a comment.