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

Results 1 to 10 of 10

Thread: Array of Struct in CSV Datei schreiben

  1. #1
    Join Date
    09.11.2007
    Posts
    359
    Danke
    60
    Erhielt 5 Danke für 5 Beiträge

    Default


    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
    Reply With Quote Reply With Quote Array of Struct in CSV Datei schreiben  

  2. #2
    Join Date
    11.09.2012
    Location
    obostenoderwestendaheimistesambesten
    Posts
    140
    Danke
    1
    Erhielt 18 Danke für 13 Beiträge

    Default

    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.



    Last edited by wollvieh; 02.01.2019 at 19:54.

  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 is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    09.11.2007
    Posts
    359
    Danke
    60
    Erhielt 5 Danke für 5 Beiträge

    Default

    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
    Join Date
    25.06.2017
    Location
    Oerlinghausen
    Posts
    1,472
    Danke
    129
    Erhielt 262 Danke für 211 Beiträge

    Default

    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
    Join Date
    25.03.2011
    Posts
    76
    Danke
    0
    Erhielt 9 Danke für 9 Beiträge

    Default

    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 is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    09.11.2007
    Posts
    359
    Danke
    60
    Erhielt 5 Danke für 5 Beiträge

    Default

    Hallo,

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

    Quote Originally Posted by wollvieh View Post
    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
    Join Date
    11.09.2012
    Location
    obostenoderwestendaheimistesambesten
    Posts
    140
    Danke
    1
    Erhielt 18 Danke für 13 Beiträge

    Default

    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=> );
    Last edited by wollvieh; 12.01.2019 at 07:53.

  11. #8
    Join Date
    24.01.2019
    Posts
    11
    Danke
    0
    Erhielt 2 Danke für 2 Beiträge

    Default

    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
    Join Date
    16.12.2009
    Posts
    85
    Danke
    7
    Erhielt 5 Danke für 5 Beiträge

    Default

    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 is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    09.11.2007
    Posts
    359
    Danke
    60
    Erhielt 5 Danke für 5 Beiträge

    Default


    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

Similar Threads

  1. TIA Struct in Array schreiben
    By Credofire in forum Simatic
    Replies: 6
    Last Post: 17.11.2016, 08:13
  2. Prozessvariable in .csv Datei schreiben
    By realload in forum Sonstige Steuerungen
    Replies: 7
    Last Post: 09.09.2015, 12:16
  3. 2d-Array in CSV-Datei schreiben
    By van_Burn in forum CODESYS und IEC61131
    Replies: 1
    Last Post: 18.01.2013, 10:49
  4. Replies: 11
    Last Post: 01.09.2011, 19:24
  5. STRUCT in eine Datei schreiben (ST)
    By demon2000 in forum CODESYS und IEC61131
    Replies: 4
    Last Post: 23.03.2011, 17:27

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •