Quantcast
Channel: SPS-Forum - Automatisierung und Elektrotechnik
Viewing all articles
Browse latest Browse all 46422

Problem bei Schreiben in CSV-Datei

$
0
0
Hallo liebe Community


ich stehe vor einem Problem und hoffe ihr könnt mir weiterhelfen.
Ich möchte mit meiner CX5130 - SPS Daten einer Messklemme auslesen und in eine CSV-Datei schreiben (Soweit nicht kompliziert :)).
Die Klemme liefert alle 100µs (EL3356-0010) neue Werte, wobei ich im 5ms Takt die Werte in die CSV-Datei schreiben möchte.


Folglich mein Code für die Datenspeicherung:

Code:

CASE step OF
    0:    (* Wait for rising edge at bWrite variable *)
    IF bWrite THEN
        bWrite        := FALSE;
        bBusy        := TRUE;
        bError        := FALSE;
        nErrId        := 0;
        hFile        := 0;
        nRow        := 0;
        nColumn        := 0;
        step        := 1;
    END_IF

    1:    (* Open source file *)
        fbFileOpen(bExecute := FALSE);
        fbFileOpen(sNetId        := sNetId,
                        sPathName    := sFileName,
                        nMode        := FOPEN_MODEWRITE OR FOPEN_MODEBINARY,                    // Open file in BINARY mode! - Write
                        ePath        := PATH_GENERIC,
                        bExecute    := TRUE);
                 
        step := 2;

    2 (* Wait until open not busy *)
      fbFileOpen(bExecute := FALSE,
                      bError    => bError,
                      nErrID    => nErrID,
                      hFile    => hFile);
                 
        IF NOT fbFileOpen.bBusy THEN
            IF NOT fbFileOpen.bError THEN
                  step := 3;
            ELSE                                                                        // Error: file not found? *)
                  step := 100;
            END_IF
        END_IF

    3 (* Convert one PLC record to CSV format *)
    cbRecord := 0;
    fbWriter.eCmd := eEnumCmd_First;                                                // Write first field value
    IF nRow <= GVL_Measurement.MAX_CSV_ROWS THEN
        FOR nColumn := 0 TO GVL_Measurement.MAX_CSV_COLUMNS BY 1 DO
               
        cbField := 0;
        CASE nColumn OF
        0:
            cbField := ARG_TO_CSVFIELD(F_ULINT(database[nRow].uliTimestamp), TRUE, ADR(aBuffer), SIZEOF(aBuffer));
        1:
            cbField := ARG_TO_CSVFIELD(F_DINT(database[nRow].diValue), TRUE, ADR(aBuffer), SIZEOF(aBuffer));
        ELSE
        ;
        END_CASE
               
        IF cbField > 0 THEN
        (* Add new field to the record buffer *)
              fbWriter(pBuffer := ADR(record),
                          cbBuffer := SIZEOF(record),
                          putValue :='', 
                          pValue := ADR(aBuffer),
                          cbValue := cbField,
                          bCRLF := (nColumn = GVL_Measurement.MAX_CSV_COLUMNS));(* bCRLF == TRUE => Write CRLF after the last field value *)
                           
            IF fbWriter.bOk THEN
                fbWriter.eCmd    := eEnumCmd_Next;(* Write next field value *)
                cbRecord        := cbRecord + fbWriter.cbWrite;(* Calculate the new record size *)
            ELSE(* Error *)
                step := 100;
                RETURN;
            END_IF
      END_IF
  END_FOR

  nRow := nRow + 1;                                                            // Increment number of created records (rows)
  step := 4;                                                                    // Write record to the file
        ELSE                                                                            // All rows written => Close file
    step := 10;
        END_IF

    4:
    fbFileWrite(sNetId:= sNetId,
                    hFile:= hFile,
                    pWriteBuff:= ADR(record),
                    cbWriteLen:= cbRecord,
                    bExecute:= TRUE);   
         
    step := 5;
       
    5:   
    fbFileWrite(bExecute := FALSE,
                      bError        => bError,
                      nErrId        => nErrId);
                   
      IF NOT fbFileWrite.bBusy THEN
            IF NOT fbFileWrite.bError THEN
                  step := 3;                                                                // Write next record
            ELSE                                                                        // Error
                  step := 100;
            END_IF
      END_IF

    10:    (* Close source file *)
      fbFileClose(bExecute := FALSE);
      fbFileClose(sNetId        := sNetId,
                      hFile        := hFile,
                      bExecute    := TRUE);
                   
      step := 11;

    11 (* Wait until close not busy *)
      fbFileClose(bExecute    := FALSE,
                      bError        => bError,
                      nErrID        => nErrID);
                   
      IF (NOT fbFileClose.bBusy) THEN
          hFile    := 0;
          step    := 100;
      END_IF

    100: (* Error or ready step => cleanup *)
        IF ( hFile <> 0 ) THEN
            step    := 10;                                                                // Close the source file
        ELSE
          bBusy    := FALSE;
          step    := 0;                                                                // Ready
        END_IF
END_CASE


Die Daten (uliTimestamp-> ULINT und diValue -> DINT) werden in ein Array gespeichert welches dem Baustein "FB_WriteDataIntoCSVFile" übergeben wird (database : ARRAY[0..GVL_Measurement.MAX_CSV_ROWS] OF ST_Csv_Record;)
soweit funktioniert die Datenumwandlung.... Jedoch steht in meiner CSV-Datei (zwar in der richtigen Zeile/Spalte) nur Unsinn in From von irgendwelchen Buchstaben oder Sonderzeichen...



Was mache ich flasch? oder was kann ich ändern damit es funktioniert?


Vielen Dank im voraus!


Viele Grüße

Viewing all articles
Browse latest Browse all 46422


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>