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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: CSV erstellen

  1. #1
    Registriert seit
    22.06.2015
    Beiträge
    34
    Danke
    23
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Mahlzeit!

    Ich möchte gerne eine csv Datei erstellen für die Protokollierung von Messwerten.
    Gibt es dafür fertige FB´s?
    Ich habe es mit den FB´s von Oscat Network versucht aber, warum auch immer, es wird keine csv angelegt.
    Anbei Screenshots zur Verdeutlichung.

    Kann mir jemand sagen was ich falsch mache? Erstellt Codesys selbst die csv oder muss diese vorher im vorgegebenen Pfad angelegt werden?

    Eckdaten:
    Visuprogramm: Galileo 10 von Eaton
    Codesys 3.5.6
    Steuerung: XV 303
    Lib: Oscat Basic 3.3.3.0 und Network 1.2.1.0
    Angehängte Grafiken Angehängte Grafiken
    Zitieren Zitieren CSV erstellen  

  2. #2
    Registriert seit
    03.12.2013
    Ort
    Bremen
    Beiträge
    165
    Danke
    13
    Erhielt 15 Danke für 15 Beiträge

    Standard

    Hey Messi90,

    du wirst definitiv erst eine Datei anlegen müssen.

    Bei TwinCat gibt es dafür FBs.

    - FB_FileOpen
    - FB_FileWrite
    - FB_FileClose

    Hier kannst du dir das Beispiel ansehen wie es Beckhoff machen. Da alles Codesys ist wird es bei dir genauso oder so ähnlich funktionieren.

    http://infosys.beckhoff.com/index.htm

    ps.: Wichtig wenn du mit Dateien arbeitest musst du die Fehler auffangen und die Datei definiert wieder schliesen.

    MfG
    Hendrik

  3. Folgender Benutzer sagt Danke zu Hendrik für den nützlichen Beitrag:

    Messi90 (21.10.2015)

  4. #3
    Registriert seit
    22.06.2015
    Beiträge
    34
    Danke
    23
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke Hendrik. Nur leider stehe ich jetzt wieder einmal vor dem Problem, dass ich nicht mit Beckhoff arbeite und somit keine libs von TwinCat habe... Und da es mal wieder kaum möglich ist von Eaton eine passende lib zu finden, habe ich OSCAT in Erwägung gezogen. Theoretisch sollte das ja problemlos funktionieren, wenn ich nur wissen würde wo mein Fehler liegt

  5. #4
    Registriert seit
    03.12.2013
    Ort
    Bremen
    Beiträge
    165
    Danke
    13
    Erhielt 15 Danke für 15 Beiträge

    Standard

    Du programmierst aber mit Codesys oder?

  6. #5
    Registriert seit
    22.06.2015
    Beiträge
    34
    Danke
    23
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ja. Codesys 3.5.6, allerdings eben mit der Variante XSoft von Eaton.

  7. #6
    Registriert seit
    03.12.2013
    Ort
    Bremen
    Beiträge
    165
    Danke
    13
    Erhielt 15 Danke für 15 Beiträge

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

    Messi90 (23.10.2015)

  9. #7
    Registriert seit
    22.06.2015
    Beiträge
    34
    Danke
    23
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Um das zu nutzen müsste ich es kaufen und das möchte ich nicht.

    Ich habe es nun durch Hilfe vom Support soweit zum Laufen bekommen, dass ich csv Datein bekomme.
    Dabei ergeben sich neue Probleme:

    1. Im Anhang ist eine Beispiel-CSV wie sie momentan aussieht. Dabei fällt auf, dass sich manche Werte doppelt und in der falschen Reihenfolge erstellen.
    2. Der Wert der Temperatur wird im falschen Format erkannt (Datum)
    3. Die Werte von Druck, Strecke und Geschwindigkeit sind falsch.
    4. Die Datei wird nur einmal am Tag angelegt. Besser wäre es jedoch, wenn sich die Datei bei jedem manuellen Speichern neu anlegt.


    Hat jemand einen Rat für mich?

    Code:
    IF Start_CSV = TRUE THEN
    (*Data logging every 5s*)
    Timer(IN:=NOT Timer.q , PT:=Messintervall2);
    xStrobeWriteData:=Timer.q;
    
    
    
    (*Take Header if the file is new*)
    IF xStrobeWriteData THEN
        uiLoggingCounter:=uiLoggingCounter+1;
        (*Header*)
        sHeader:='Datum;Zeit;Temperatur;Druck;Strecke;Geschwindigkeit;$N';
    (*sHeader:='Datum;Zeit;Temperatur;Druck;Strecke;Geschwindigkeit;$0D$0A';*)
    
        (*Date and Time for file name and data*)
        S40_GetRealTimeClock1(
        Month=>usiMonth ,
        Day=>usiDay ,
        Hour=>usiHour ,
        Minute=>usiMinute ,
        Second=>usiSecond );
        uiYear:=USINT_TO_UINT(S40_GetRealTimeClock1.Year)+2000;
    
        (*Data String*)
    
        sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiDay));
        sDataString1:= CONCAT(sDataString1,'.');
        sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiMonth));
        sDataString1:= CONCAT(sDataString1,'.');
        sDataString1:= CONCAT(sDataString1,UINT_TO_STRING(uiYear));
        sDataString1:= CONCAT(sDataString1,';');
        sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiHour));
        sDataString1:= CONCAT(sDataString1,':');
        sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiMinute));
        sDataString1:= CONCAT(sDataString1,':');
        sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiSecond));
        sDataString1:= CONCAT(sDataString1,';');
        sDataString1:= CONCAT(sDataString1,REAL_TO_STRING(PLC_PRG.Output_Temp));
        sDataString1:= CONCAT(sDataString1,';');
        sDataString1:= CONCAT(sDataString1, REAL_TO_STRING(PLC_PRG.Output_Druck));
        sDataString1:= CONCAT(sDataString1,';');
        sDataString1:= CONCAT(sDataString1,REAL_TO_STRING(PLC_PRG.Strecke_Encoder));
        sDataString1:= CONCAT(sDataString1,';');
        sDataString1:= CONCAT(sDataString1, REAL_TO_STRING(PLC_PRG.Geschwindigkeit_Encoder));
        sDataString1:= CONCAT(sDataString1,'$N');
    (*sDataString1:= CONCAT(sDataString1,'$0D$0A');*)
    
    
    
        (*Filename for data logging. Every day a new file name*)
        IF xSD_card THEN
            sDataloggingFileName:= '\StorageCard\' ;
        ELSE
            sDataloggingFileName:= '\UsbStorage\' ;
        END_IF
        (*sDataloggingFileName:= CONCAT(sDataloggingFileName, 'Directory\');*)
        sDataloggingFileName:= CONCAT(sDataloggingFileName, 'DataloggingFile_F');
        sDataloggingFileName:= CONCAT(sDataloggingFileName,'_');
        sDataloggingFileName:= CONCAT(sDataloggingFileName,USINT_TO_STRING(usiDay));
        sDataloggingFileName:= CONCAT(sDataloggingFileName,'-');
        sDataloggingFileName:= CONCAT(sDataloggingFileName,USINT_TO_STRING(usiMonth));
        sDataloggingFileName:= CONCAT(sDataloggingFileName,'-');
        sDataloggingFileName:= CONCAT(sDataloggingFileName,UINT_TO_STRING(uiYear));
        sDataloggingFileName:= CONCAT(sDataloggingFileName,'.csv');
    
        (*Header or Data*)
        xHeader:=sDataloggingFileNameOld<>sDataloggingFileName;
        sDataloggingFileNameOld:=sDataloggingFileName;
    END_IF
    
    END_IF
    
    
    OpenWriteCloseFileAsync1(
        xStrobeWriteData:=xStrobeWriteData ,
        xHeader:=xHeader ,
        sHeader:=sHeader ,
        sDataString:=sDataString1 ,
        sFileName:=sDataloggingFileName ,
        xFileOpen=> ,
        xDone=> , 
        xBusy=> , 
        xOpen=> , 
        xWriteHeader=> , 
        xWrite=> , 
        xClose=> , 
        udiErrorCounterOpen=> , 
        udiErrorCounterWrite=> , 
        udiErrorCounterClose=> , 
        udiBytesWrittenHeader=> , 
        udiBytesWritten=> , 
        udiWriteCounter=> );
    Code:
    R_Trig_StrobeWriteData(clk:=xStrobeWriteData);
    IF R_Trig_StrobeWriteData.q AND NOT xBusy THEN
        xOpen:=TRUE;
        xDone:=FALSE;
        xBusy:=TRUE;
        xHeaderIntern:=xHeader;
        udiBytesWrittenHeader:=0;
        udiBytesWritten:=0;
        xError:=FALSE;
    END_IF
    
    my_SysFileOpenAsync(bEnable:= xOpen,stFileName:=sFileName ,stMode:= 'a' );
    
    
    IF  NOT my_SysFileOpenAsync.bBusy  AND my_SysFileOpenAsync.bDone AND NOT my_SysFileOpenAsync.bError THEN    (* open OK-->prepare write*)
        xOpen:=FALSE;
        xWrite:=TRUE;
        xWriteHeader:=xHeaderIntern;
        dwhdlFile:=my_SysFileOpenAsync.hFile;
    END_IF
    
    IF  my_SysFileOpenAsync.bDone AND  my_SysFileOpenAsync.bError THEN                (* open  with error--> no write*)
        xWrite:=FALSE;    (* no write with no handle*)
        udiErrorCounterOpen:=udiErrorCounterOpen+1;
        xError:=TRUE;
        xOpen:=FALSE;
        my_SysFileOpenAsync(bEnable:= FALSE,stFileName:=sFileName ,stMode:= 'a' );
    END_IF
    
    
    IF xHeaderIntern THEN
        my_SysFileWriteAsync(bEnable:=xWrite ,hFile:=dwhdlFile ,pBuffer:=ADR(sHeader),dwSize:=LEN(sHeader) ,dwWrite=>udiBytesWritten );
        IF NOT my_SysFileWriteAsync.bBusy AND my_SysFileWriteAsync.bDone AND NOT my_SysFileWriteAsync.bError THEN   (*write OK-->initiate close*)
            xHeaderIntern:=FALSE;
            xWriteHeader:=FALSE;
            my_SysFileWriteAsync(bEnable:=FALSE ,hFile:=dwhdlFile ,pBuffer:=ADR(sHeader),dwSize:=LEN(sHeader) ,dwWrite=>udiBytesWritten );
        END_IF    
        IF  my_SysFileWriteAsync.bDone AND  my_SysFileWriteAsync.bError THEN                    (* write error*)
            udiErrorCounterWrite:=udiErrorCounterWrite+1;
            xError:=TRUE;
            xWrite:=FALSE;
            my_SysFileWriteAsync(bEnable:=FALSE ,hFile:=dwhdlFile ,pBuffer:=ADR(sHeader),dwSize:=LEN(sHeader) ,dwWrite=>udiBytesWritten );
        END_IF
    ELSE
        my_SysFileWriteAsync(bEnable:=xWrite ,hFile:=dwhdlFile ,pBuffer:=ADR(sDataString),dwSize:=LEN(sDataString) ,dwWrite=>udiBytesWritten );
        IF NOT my_SysFileWriteAsync.bBusy AND my_SysFileWriteAsync.bDone AND NOT my_SysFileWriteAsync.bError THEN   (*write OK-->initiate close*)
            xWrite:=FALSE;
            xClose:=TRUE;
        END_IF
        IF  my_SysFileWriteAsync.bDone AND  my_SysFileWriteAsync.bError THEN                    (* write error*)
            udiErrorCounterWrite:=udiErrorCounterWrite+1;
            xError:=TRUE;
            xWrite:=FALSE;
            my_SysFileWriteAsync(bEnable:=FALSE ,hFile:=dwhdlFile ,pBuffer:=ADR(sDataString),dwSize:=LEN(sDataString) ,dwWrite=>udiBytesWritten );
        END_IF
    END_IF
    
    my_SysFileCloseAsync(bEnable:= xClose,hFile:=dwhdlFile );
    
    IF NOT my_SysFileCloseAsync.bBusy AND my_SysFileCloseAsync.bDone AND NOT my_SysFileCloseAsync.bError THEN
        xClose:=FALSE;
        xDone:=TRUE;
        xBusy:=FALSE;
        udiWriteCounter:=udiWriteCounter+1;
    END_IF
    
    IF my_SysFileCloseAsync.bDone AND  my_SysFileCloseAsync.bError THEN
        udiErrorCounterClose:=udiErrorCounterClose+1;
        xError:=TRUE;
        xClose:=FALSE;
        my_SysFileCloseAsync(bEnable:=FALSE,hFile:=dwhdlFile );
    END_IF
    
    IF xError THEN
        xDone:=TRUE;
        xBusy:=FALSE;
    END_IF
    Angehängte Grafiken Angehängte Grafiken

  10. #8
    Registriert seit
    03.12.2013
    Ort
    Bremen
    Beiträge
    165
    Danke
    13
    Erhielt 15 Danke für 15 Beiträge

    Standard

    Hey Punkt zwei kann ich dir erklären =)

    Excel denkt es ist ein Datum in der Datei steht aber das richtige -> einfach mal mit einem Texteditor öffnen.

    Wenn du das umgehen möchtest musst du ein Temperaturformat wählen, welches nicht wie ein Datum ausschaut. Hier vll ohne Kommstelle, aber da musst du wiesen wie genau du das brauchst.

    Zu Punkt 1 und 3 nur eine Idee du löscht glaube ich deinen String den du wegschreibst nicht oder ich habe es noch nicht gefunden.

    einfach bevor du mit dem zusammensetzen anfängst leer machen
    Code:
        (*Data String*)
    sDataString1:= ''; (* leer machen *)
        sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiDay));
        sDataString1:= CONCAT(sDataString1,'.');
        sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiMonth));
        sDataString1:= CONCAT(sDataString1,'.');
        sDataString1:= CONCAT(sDataString1,UINT_TO_STRING(uiYear));
        sDataString1:= CONCAT(sDataString1,';');
        sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiHour));
        sDataString1:= CONCAT(sDataString1,':');
        sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiMinute));
        sDataString1:= CONCAT(sDataString1,':');
        sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiSecond));
        sDataString1:= CONCAT(sDataString1,';');
        sDataString1:= CONCAT(sDataString1,REAL_TO_STRING(PLC_PRG.Output_Temp));
        sDataString1:= CONCAT(sDataString1,';');
        sDataString1:= CONCAT(sDataString1, REAL_TO_STRING(PLC_PRG.Output_Druck));
        sDataString1:= CONCAT(sDataString1,';');
        sDataString1:= CONCAT(sDataString1,REAL_TO_STRING(PLC_PRG.Strecke_Encoder));
        sDataString1:= CONCAT(sDataString1,';');
        sDataString1:= CONCAT(sDataString1, REAL_TO_STRING(PLC_PRG.Geschwindigkeit_Encoder));
        sDataString1:= CONCAT(sDataString1,'$N');
    vll hilft dir das.

    MfG
    Hendrik

  11. Folgender Benutzer sagt Danke zu Hendrik für den nützlichen Beitrag:

    Messi90 (23.10.2015)

  12. #9
    Registriert seit
    22.06.2015
    Beiträge
    34
    Danke
    23
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Wuuaaaa super danke dir Hendrik! Ich Idiot hab genau diese Zeile selber rausgelöscht
    Also wegen der Temperatur hat sich auch geklärt. Wenn der Wert stimmt ist mir das Wurscht wie der in der Excel angezeigt wird. Später wirds eh geplottet.

    So, nun hab ich trotzdem noch die Probleme 3 und 4, dass die Werte Strecke, Druck und Geschw. nicht stimmen und das Abspeichern
    Das Problem 3 kann ja nicht am Real-Typ liegen oder? Wäre jetzt noch mein einziger Gedanke...
    Geändert von Messi90 (23.10.2015 um 11:01 Uhr)

  13. #10
    Registriert seit
    03.12.2013
    Ort
    Bremen
    Beiträge
    165
    Danke
    13
    Erhielt 15 Danke für 15 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wie sollten die Realwerte aussehen?

    Es gibt da ein Problem mit der Formatierung/Umwandlung von Real_to_String ....

    Dafür gibt es separate FBs

    bei Beckhoff heist das ding:
    FUNCTION LREAL_TO_FMTSTR



    http://infosys.beckhoff.com/index.htm

  14. Folgender Benutzer sagt Danke zu Hendrik für den nützlichen Beitrag:

    Messi90 (23.10.2015)

Ähnliche Themen

  1. Step 7 Wincc Flexible CSV Datei erstellen
    Von Junge im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 17.08.2015, 12:40
  2. Scheider csv datei erstellen
    Von phivog im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 06.11.2014, 07:42
  3. CSV Datei mit einer Wago Sps erstellen
    Von Newbie88 im Forum Sonstige Steuerungen
    Antworten: 14
    Letzter Beitrag: 03.11.2012, 23:09
  4. Antworten: 1
    Letzter Beitrag: 22.10.2012, 11:42
  5. CSV Datei erstellen
    Von Wasserman im Forum Sonstige Steuerungen
    Antworten: 0
    Letzter Beitrag: 21.01.2011, 19:50

Stichworte

Lesezeichen

Berechtigungen

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