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

Ergebnis 1 bis 10 von 10

Thema: Array of Struct in CSV Datei schreiben

  1. #1
    Registriert seit
    09.11.2007
    Beiträge
    358
    Danke
    60
    Erhielt 5 Danke für 5 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich beschäftige mich gerade mit der Erstellung einer CSV Datei auf einem WAGO PFC200 und Codesys 2.3. (syslibfile.lib)
    Die CSV Datei hat 30 Zeilen zu je 6 Werte pro Zeile.
    Habe meine Werte in einem Struct zusammengefasst und möchte die nun in eine csv schreiben.

    Habe schon verschiedene Strings mit CONCAT zusammengefügt und in eine CSV geschrieben, allerdings bin ich hier auf 255 Zeichen begrenzt.
    Nun habe ich hier einige Zeichen mehr. Jemand ne Idee wie ich das lösen könnte?

    Wie gehe ich da am besten vor.

    VG
    NSN
    Zitieren Zitieren Array of Struct in CSV Datei schreiben  

  2. #2
    Registriert seit
    11.09.2012
    Ort
    obostenoderwestendaheimistesambesten
    Beiträge
    107
    Danke
    1
    Erhielt 14 Danke für 9 Beiträge

    Standard

    Hallo,

    ich mache das so :
    1) ich lege mir ein bytearray an ( resultdata_csv : ARRAY[1..4000000] OF BYTE; )
    2) dann definiere ich mir die trennzeichender csv Werte ( szSeperator : STRING(1):= ';' ;)
    sowie Carriage return und linefeed ( CRLF : STRING(2) := '$R$N';
    LF : STRING(1) := '$N'; )
    3) Dann 2 Pointer definiert, einer aufs bytearray und einer auf den einzfügenden string, und dann immer lustig ins Bytearray geschrieben.

    das ergebnis sieht dann so aus :


    csv.PNG
    P.S: Am Schluss die Datei nur mit der Länge schreiben, wie der Pointer aufs bytearray durch die Einträge angewachsen ist,
    sonst würde die Datei unnötig gross.
    ( Ich habe das bei mir so gross gewählt, da ich max.100 Werte in den Spalten haben kann, und das mal 3600 Zeilen mal 6 ASCII Zeichen,
    das ergibt theoretisch so 3.600.000 byte , falls alle CSV Datensätze ausgenutzt werden).

    Gruß, Wollvieh.



    Geändert von wollvieh (02.01.2019 um 20:54 Uhr)

  3. Folgende 2 Benutzer sagen Danke zu wollvieh für den nützlichen Beitrag:

    NeuerSIMATICNutzer (11.01.2019),TiI (11.01.2019)

  4. #3
    NeuerSIMATICNutzer ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.11.2007
    Beiträge
    358
    Danke
    60
    Erhielt 5 Danke für 5 Beiträge

    Standard

    Hallo wollvieh,

    danke für deinen Beitrag.
    Jetzt wird es schwierig für mich. Habe schon in anderen Threads gesehen das sowas mit Pointern gelöst wurde,
    allerdings habe ich damit noch nichts zu tun. Werde mich wohl Intensiv damit befassen müssen.


    VG
    NSN

  5. #4
    Registriert seit
    25.06.2017
    Ort
    Oerlinghausen
    Beiträge
    1.298
    Danke
    118
    Erhielt 228 Danke für 184 Beiträge

    Standard

    Die Indizes von Arrays werden auch schon mal als Pointer bezeichnet. Muss also nicht ein Pointer im Sinne von S7 sein, zumal wir uns hier bei CodeSys & IEC61131 tummeln?

  6. Folgender Benutzer sagt Danke zu Heinileini für den nützlichen Beitrag:

    NeuerSIMATICNutzer (11.01.2019)

  7. #5
    Registriert seit
    25.03.2011
    Beiträge
    72
    Danke
    0
    Erhielt 7 Danke für 7 Beiträge

    Standard

    Pointer funktionieren laut IEC aber auch mit einem Index.

    z.b. ptr^[i]

    Das geht jetzt sogar bei Siemens!

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

    NeuerSIMATICNutzer (11.01.2019)

  9. #6
    NeuerSIMATICNutzer ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.11.2007
    Beiträge
    358
    Danke
    60
    Erhielt 5 Danke für 5 Beiträge

    Standard

    Hallo,

    danke für Eure Hilfe. Mit den Pointern funktioniert es super.

    Zitat Zitat von wollvieh Beitrag anzeigen
    P.S: Am Schluss die Datei nur mit der Länge schreiben, wie der Pointer aufs bytearray durch die Einträge angewachsen ist,
    sonst würde die Datei unnötig gross.
    Wie begrenzt du die Datei? Mit SIZEOF?

    Vg
    NSN

  10. #7
    Registriert seit
    11.09.2012
    Ort
    obostenoderwestendaheimistesambesten
    Beiträge
    107
    Danke
    1
    Erhielt 14 Danke für 9 Beiträge

    Standard

    Mit Adressarithmetik. Einen Pointer referenziere ich mit der Basisadresse des Bytearrays. Ein zweiter Pointer wird mit jedem neuen Zeichen incrementiert. Am Ende die Differenz der beiden Pointer gebildet, das gibt dann die Grösse der Datei. (pEnd-pBase).
    Wollvieh.

    Beispiel :
    resultdata_csv : ARRAY[1..4000000] OF BYTE;
    pEnd : POINTER TO STRING;


    fwrite(
    sNetId:= sNetId,
    hFile:= handleFile,
    pWriteBuff:= ADR(resultdata_csv),
    cbWriteLen:= pEnd - ADR(resultdata_csv),
    bExecute:= ,
    tTimeout:= ,
    bBusy=> ,
    bError=> ,
    nErrId=> ,
    cbWrite=> );
    Geändert von wollvieh (12.01.2019 um 08:53 Uhr)

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

    Standard

    Eine alternative könnte es evtl. sein, deine CSV einfach Zeilenweise zu schreiben,
    weniger effektiv wie ein einzelner Schreibvorgang ja, aber bei einer Steuerung mit
    einem Cortex A8 bei 1GHz welche eigentlich für V3 ausgelegt ist und bei nur 30 Zeilen weniger tragisch.

    Kommt jetzt aber auch natürlich drauf an wie Zeitkritisch das ganze ist.

    Gibt einem ein wenig den komfort mit z.B. SysFileWrite(FileHandle,ADR(st_csvRow),LEN(st_csvRow));
    ohne Pointer und Index die Zeile zu schreiben.
    Falls die Zeile selbst die 255 Zeichen überschreitet, dann wirst den Weg eines ByteArrays
    wie oben schon beschriebengehen müssen.

  12. #9
    Registriert seit
    16.12.2009
    Beiträge
    85
    Danke
    7
    Erhielt 5 Danke für 5 Beiträge

    Standard

    Hallo,
    ich baue eine "zu lange Zeile" einfach aus mehreren Teilen zusammen:
    Code:
     
      Text_Puffer_1   :=   'hier kommen die ersten maximal 255 Zeichen rein, oder auch weniger' ;
      Text_Puffer_2   :=   'hier kommen die zweiten maximal 255 Zeichen rein, oder auch weniger' ;
      Text_Puffer_3   :=   'hier kommen die dritten maximal 255 Zeichen rein, oder auch weniger und am Ende einfach ein $L' ;
      fileWriteOK     :=   SysFileWrite ( File := fileHandle , Buffer := ADR ( Text_Puffer_1 ) , Size := LEN ( Text_Puffer_1 ) );
      fileWriteOK     :=   SysFileWrite ( File := fileHandle , Buffer := ADR ( Text_Puffer_2 ) , Size := LEN ( Text_Puffer_2 ) );
      fileWriteOK     :=   SysFileWrite ( File := fileHandle , Buffer := ADR ( Text_Puffer_3 ) , Size := LEN ( Text_Puffer_3 ) );
    funktioniert auf einer WAGO 750-880 super...

    Grüße
    tom

  13. #10
    NeuerSIMATICNutzer ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.11.2007
    Beiträge
    358
    Danke
    60
    Erhielt 5 Danke für 5 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke für eure Beiträge und unterschiedliche Möglichkeiten zum erstellen der CSV Datei.
    Habe mich dann für die Variante mit der Schleife entschieden. Sieht sehr vielversprechend aus..

    VG
    NSN

Ähnliche Themen

  1. TIA Struct in Array schreiben
    Von Credofire im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 17.11.2016, 09:13
  2. Prozessvariable in .csv Datei schreiben
    Von realload im Forum Sonstige Steuerungen
    Antworten: 7
    Letzter Beitrag: 09.09.2015, 13:16
  3. 2d-Array in CSV-Datei schreiben
    Von van_Burn im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 18.01.2013, 11:49
  4. Antworten: 11
    Letzter Beitrag: 01.09.2011, 20:24
  5. STRUCT in eine Datei schreiben (ST)
    Von demon2000 im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 23.03.2011, 18:27

Lesezeichen

Berechtigungen

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