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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: Datei erzeugen und Variablen in Excel

  1. #11
    Registriert seit
    28.09.2008
    Beiträge
    53
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    So stelle ich mir die Tabelle vor und sollte auch jeden Monat in der Grundstruktur angelegt werden. Allerdings ohne Beispiele die jetzt ja noch drin stehen.

    MFG Dennis
    Angehängte Dateien Angehängte Dateien

  2. #12
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Machen wir mal kleine Schritte:

    Code:
    VAR
      CurTimeEx       : CurTimeEx; (*Instanz des FBs um die Systemzeit zu ermittel*)
      TimeDate        : SystemTimeDate; (*Aktuelles Zeit und Datum*)
      SystemTime      : SysTime64; (**)
    
      NewData         : BOOL; (*Neue Daten zum schreiben*)
      NewData_old     : BOOL; (*Hilfsvariable zur Flankenerkunng*)
      FileHandel      : DWORD; (*Handel*)
      FilePath        : STRING := 'C:\text.txt'; (* Ich nutze die CoDeSysRTE und habe daher ein Dateisystem ala Windows *)
      CurrentString   : STRING; (*Temp String zum aufbauen der zu schreibenden Zeile*)
      RetValWritten   : DWORD; (*Rückgabewert der Schreibfunktion*)
    
    
      ClientName      : STRING := 'Heizung'; (*Inhalt Spalte Nr.3*)
      FehlerMeldung   : STRING := 'Temperatur zu hoch'; (*Inhalt Spalte Nr.4*)
    END_VAR
    Code:
    (* Systemzeit ermitteln *)
    CurTimeEx(TimeDate:=TimeDate, SystemTime:=SystemTime);
    
    (* Neue Daten ? *)
    IF NewData AND NOT NewData_old THEN
    
     (* Öffne die Datei um Daten anzufügen *)
      FileHandel:= SysFileOpen(FilePath, 'a');
    
    
      (* --Zeile zusammenbauen-- *)
    
      (* Spalte 1: DATUM *)
      CurrentString:= CONCAT(UINT_TO_STRING(TimeDate.Day), '.');
      CurrentString:= CONCAT(CurrentString, UINT_TO_STRING(TimeDate.Month));
      CurrentString:= CONCAT(CurrentString, '.');
      CurrentString:= CONCAT(CurrentString, UINT_TO_STRING(TimeDate.Year));
      CurrentString:= CONCAT(CurrentString, ';');
    
      (* Spalte 2: UHRZEIT *)
      CurrentString:= CONCAT(CurrentString, UINT_TO_STRING(TimeDate.Hour));
      CurrentString:= CONCAT(CurrentString, ':');
      CurrentString:= CONCAT(CurrentString, UINT_TO_STRING(TimeDate.Minute));
      CurrentString:= CONCAT(CurrentString, ':');
      CurrentString:= CONCAT(CurrentString, UINT_TO_STRING(TimeDate.Second));
      CurrentString:= CONCAT(CurrentString, ';');
    
      (* Spalte 3: NAME *)
      CurrentString:= CONCAT(CurrentString, ClientName);
      CurrentString:= CONCAT(CurrentString, ';');
    
      (* Spalte 4: MELDUNG *)
      CurrentString:= CONCAT(CurrentString, FehlerMeldung);
      CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)
    
      (* Zeile in die Datei schreiben *)
      RetValWritten:= SysFileWrite(FileHandel, ADR(CurrentString), LEN(CurrentString));
    
      (* Datei schließen *)
      SysFileClose(FileHandel);
    END_IF
    
    (* Flankenauswertung *)
    NewData_old := NewData;
    If you open your Mind too much, your Brain will fall out.

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

    dennish23 (06.10.2008)

  4. #13
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Hier noch das Ergebnis des Tests.
    Code:
    29.9.2008;20:33:30;Heizung;Temperatur zu hoch
    29.9.2008;20:33:40;Heizung;Temperatur zu hoch
    29.9.2008;20:33:47;Heizung;Temperatur zu hoch
    PS: Ergänzend zum Code noch: Die CONCAT Verkettung ist nicht notwendig, man kann das ganze mit mehreren SysFileWrite hinterein lösen. Ich bin mir gerade nur nicht sicher was mehr Systemzeit braucht und habe mich jetzt einfach mal für dieses Konstrukt entschieden.
    If you open your Mind too much, your Brain will fall out.

  5. Folgende 2 Benutzer sagen Danke zu zotos für den nützlichen Beitrag:

    dennish23 (06.10.2008)

  6. #14
    Registriert seit
    28.09.2008
    Beiträge
    53
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    CurTimeEx : CurTimeEx; (*Instanz des FBs um die Systemzeit zu ermittel*)
    TimeDate : SystemTimeDate; (*Aktuelles Zeit und Datum*)
    SystemTime : SysTime64; (**)


    Ich bekomme hier bei alles 3 Zeilen ne Fehlermeldung.
    Hängt das damit zusammen das CodesSys bei Klöckner und Möller
    die SysLibRtc benutzt?

    Echtzeit:=SysRtcGetTime(dummy);

    das könnte ich doch ebenfalls benutzen für die ermittlung der
    Systemzeit?

    Mfg Dennis

  7. #15
    Registriert seit
    28.09.2008
    Beiträge
    53
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    PROGRAM PLC_PRG
    VAR
    Echtzeit: DT; (*Systemzeit komplett (z:B. DT#2006-12-06-08:53:50) imFoormat DT*)
    dummy: BOOL:=TRUE;
    Echtzeit_String: STRING;
    Jahr: INT;
    Tag: INT;
    Monat: INT;
    Stunde: INT;
    Minute: INT;
    Sekunde: INT;


    NewData : BOOL; (*Neue Daten zum schreiben*)
    NewData_old : BOOL; (*Hilfsvariable zur Flankenerkunng*)
    FileHandel : DWORD; (*Handel*)
    FilePath : STRING := 'C:\text.txt'; (* Ich nutze die CoDeSysRTE und habe daher ein Dateisystem ala Windows *)
    CurrentString : STRING; (*Temp String zum aufbauen der zu schreibenden Zeile*)
    RetValWritten : DWORD; (*Rückgabewert der Schreibfunktion*)


    ClientName : STRING := 'Heizung'; (*Inhalt Spalte Nr.3*)
    FehlerMeldung : STRING := 'Temperatur zu hoch'; (*Inhalt Spalte Nr.4*)

    END_VAR



    (* Systemzeit ermitteln *)

    Echtzeit:=SysRtcGetTime(dummy); (* Echtzeit lesen*)
    Echtzeit_String:=DT_TO_STRING(Echtzeit); (*Echtzeit umwandeln in String*)
    Jahr:=STRING_TO_INT(MID(Echtzeit_String,4,4));
    Monat:=STRING_TO_INT(MID(Echtzeit_String,2,9));
    Tag:=STRING_TO_INT(MID(Echtzeit_String,2,12));
    Stunde:=STRING_TO_INT(MID(Echtzeit_String,2,15));
    Minute:=STRING_TO_INT(MID(Echtzeit_String,2,1);
    Sekunde:=STRING_TO_INT(MID(Echtzeit_String,2,21));


    (* Neue Daten ? *)
    IF NewData AND NOT NewData_old THEN

    (* Öffne die Datei um Daten anzufügen *)
    FileHandel:= SysFileOpen(FilePath, 'a');


    (* --Zeile zusammenbauen-- *)

    (* Spalte 1: DATUM *)
    CurrentString:= CONCAT(INT_TO_STRING(Tag), '.');
    CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Monat));
    CurrentString:= CONCAT(CurrentString, '.');
    CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Jahr));
    CurrentString:= CONCAT(CurrentString, ';');

    (* Spalte 2: UHRZEIT *)
    CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Stunde));
    CurrentString:= CONCAT(CurrentString, ':');
    CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Minute));
    CurrentString:= CONCAT(CurrentString, ':');
    CurrentString:= CONCAT(CurrentString, INT_TO_STRING(Sekunde));
    CurrentString:= CONCAT(CurrentString, ';');

    (* Spalte 3: NAME *)
    CurrentString:= CONCAT(CurrentString, ClientName);
    CurrentString:= CONCAT(CurrentString, ';');

    (* Spalte 4: MELDUNG *)
    CurrentString:= CONCAT(CurrentString, FehlerMeldung);
    CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)

    (* Zeile in die Datei schreiben *)
    RetValWritten:= SysFileWrite(FileHandel, ADR(CurrentString), LEN(CurrentString));

    (* Datei schließen *)
    SysFileClose(FileHandel);
    END_IF

    (* Flankenauswertung *)
    NewData_old := NewData;



    So habe ich das jetzt geschrieben zwecks Datum/Uhrzeit ermittlung.
    Hoffe das das richtig ist.

    MFG Dennis

  8. #16
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Zitat Zitat von dennish23 Beitrag anzeigen
    ...
    Ich bekomme hier bei alles 3 Zeilen ne Fehlermeldung.
    Hängt das damit zusammen das CodesSys bei Klöckner und Möller
    die SysLibRtc benutzt?
    ...
    Oh ja das könnte sein bzw. das ist so ;o)
    Ich habe nicht nachgeschaut was dieses Target zur Verfügung stellt.
    Dann muss man den Code anpassen. Muss das Datum unbeding TT.MM.JJJJ sein oder kann es auch JJJJ-MM-TT sein? (zweites wäre deutlich einfacher zu realisieren).

    [edit]
    Zitat Zitat von dennish23 Beitrag anzeigen
    ...
    So habe ich das jetzt geschrieben zwecks Datum/Uhrzeit ermittlung.
    Hoffe das das richtig ist.

    MFG Dennis
    Auf den ersten Blick sieht es gut aus.
    [/edit]
    Geändert von zotos (29.09.2008 um 21:17 Uhr)
    If you open your Mind too much, your Brain will fall out.

  9. Folgender Benutzer sagt Danke zu zotos für den nützlichen Beitrag:

    dennish23 (06.10.2008)

  10. #17
    Registriert seit
    28.09.2008
    Beiträge
    53
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Vielen dank für deine Hilfe Zotos.
    Das Programm funktioniert einwandfrei, nachdem ich die änderung mit der Uhrzeit geschichte gemacht habe.

    Nun habe ich noch zwei Fragen.

    Wie kann ich in der Datei einen Header(Überschrift) anlegen der immer nur einmal geschrieben wird (z.Bsp: Datum in der ersten Zelle; Uhrzeit in der zweiten Zelle; Ort in der dritten Zelle; Beschreibung in der vierten Zelle)?

    Und wie muss ich jetzt (wahrscheinlich mit Hilfe der IF Funktion) die Programm verändern damit er monatlich eine neue Datei anlegt mit einem neuen Namen (z.Bsp Fehlermeldedatei September 2008 oder Fehlermeldedatei Oktober 200.

    Wäre sehr dankbar wenn du zu den Problemen noch eine Lösung hättest.

    MFG Dennis

  11. #18
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Ich hätte mir zwar gewünscht das Du erst selbst eine Lösung postest aber hier mal mein Vorschlag:

    Neue Variablen:
    Code:
      MonatString     : ARRAY[1..12] OF STRING(10) := 'Januar', 'Februar', 'Maerz', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember';
      Monat_alt: INT := 0;
    Neue Code stellen sind zwischen (* NEU *) und (* /NEU *) zur Orientierung dienen die zwei alten Codestellen:
    Code:
    (* Neue Daten ? *)
    IF NewData AND NOT NewData_old THEN
    
      (* NEU *)
      IF Monat <> Monat_alt THEN
        FilePath := '\disk_mmc\Fehlermeldedatei_';
        FilePath := CONCAT(FilePath, MonatString[Monat]);
        FilePath := CONCAT(FilePath, '_');
        FilePath := CONCAT(FilePath, INT_TO_STRING(Jahr));
        FilePath := CONCAT(FilePath, '.csv');
        Monat_alt := Monat;
      END_IF
      (* /NEU *)
    
    
      (* Öffne die Datei um Daten anzufügen *)
      FileHandel:= SysFileOpen(FilePath, 'a');
    
      (* NEU *)
      (* Erkennen ob es eine neue Datei ist *)
      IF SysFileGetPos(FileHandel) = 0 THEN
        (* Belibige Gesamtüberschrift *)
        CurrentString:= 'Überschrift Firmennamen oder was auch immer.';
        CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)
        RetValWritten:= SysFileWrite(FileHandel, ADR(CurrentString), LEN(CurrentString));
    
        (* Spaltenüberschrift *)
        CurrentString:= 'Datum;Uhrzeit;Ort;Beschreibung';
        CurrentString:= CONCAT(CurrentString, '$R$N'); (* Zeilenumbruch *)
        RetValWritten:= SysFileWrite(FileHandel, ADR(CurrentString), LEN(CurrentString));
      END_IF
      (* /NEU *)
    If you open your Mind too much, your Brain will fall out.

  12. Folgender Benutzer sagt Danke zu zotos für den nützlichen Beitrag:

    dennish23 (06.10.2008)

  13. #19
    Registriert seit
    28.09.2008
    Beiträge
    53
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke Zotos. Ich habe es versucht mir selbst zu erarbeiten mit Hilfe eines Vordruckes. Nur leider bin ich nach 8 Stunden noch immer zu keinem Ergebnis gekommen. Hier mal mein Versuch.

    Funktionsbaustein

    RisingEdgeWriteData(clk:=xStrobeWriteData);
    IF RisingEdgeWriteData.q THEN
    IF( xFileOpen = FALSE) THEN
    dwFileHandle := SysFileOpen(sFileName, 'a');
    xFileOpen := TRUE;
    END_IF;

    IF xHeader THEN
    SysFileWrite(dwFileHandle, ADR( sHeader), LEN(sHeader));
    END_IF

    SysFileWrite(dwFileHandle, ADR( sDataString), LEN(sDataString));
    udiWriteCounter :=udiWriteCounter+1;
    IF sFileNameOld<>sFileName THEN
    udiWriteCounter :=1;
    END_IF
    sFileNameOld:=sFileName;
    END_IF;




    IF( NOT xKeepFileOpen AND xFileOpen)THEN
    xError:= SysFileClose(dwFileHandle);
    IF xError THEN
    xFileOpen := FALSE;
    xError:=FALSE;
    END_IF;
    END_IF;


    PLC_PRG

    (*Data logging every 5s*)
    Timer(IN:=TRUE , PT:=t#5s );
    xStrobeWriteData:=Timer.q;
    IF Timer.q THEN
    Timer(IN:=FALSE , PT:=t#5s );
    Timer(IN:=TRUE , PT:=t#5s );
    END_IF


    (*Take Header if the file is new*)
    RisingEdgeWriteData(clk:=xStrobeWriteData);
    IF RisingEdgeWriteData.q THEN
    (*Header*)
    sHeader:='Date;Time;Info1;Info2;Data1;Data2;$N';

    (*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:='';
    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,Info1);
    sDataString1:= CONCAT(sDataString1,';');
    sDataString1:= CONCAT(sDataString1,Info2);
    sDataString1:= CONCAT(sDataString1,';');
    sDataString1:= CONCAT(sDataString1,INT_TO_STRING(iData1));
    sDataString1:= CONCAT(sDataString1,';');
    sDataString1:= CONCAT(sDataString1,INT_TO_STRING(iData2));
    sDataString1:= CONCAT(sDataString1,'$N');


    (*Filename for data logging. Every day a new file name*)
    sDataloggingFileName:= '\DISK_MMC\' ;
    (*sDataloggingFileName:= CONCAT(sDataloggingFileName, Directory);
    sDataloggingFileName:= CONCAT(sDataloggingFileName,'\');*)
    sDataloggingFileName:= CONCAT(sDataloggingFileName, 'TestDataloggingFile');
    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



    (*Open, write and close the data logging file*)
    OpenWriteCloseFile_1(
    xStrobeWriteData:=xStrobeWriteData ,
    xHeader:=xHeader,
    sHeader:=sHeader,
    sDataString:=sDataString1,
    sFileName:=sDataloggingFileName,
    xFileOpen=>xFileOpen,
    udiWriteCounter=>udiWriteCounter );

    Aber das kann nicht in ein PLC geschrieben werden und er macht keine zusätzliche Freizeile rein. Das Prog läuft ohne Fehler aber die Datei wird nicht befüllt bei mir.

    Vielleicht findest du ein schreibfehler oder ähnliches.

    MFG Dennis

  14. #20
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von dennish23 Beitrag anzeigen
    Danke Zotos. Ich habe es versucht mir selbst zu erarbeiten mit Hilfe eines Vordruckes. Nur leider bin ich nach 8 Stunden noch immer zu keinem Ergebnis gekommen.
    ...
    Hast Du meinen Code aus Beitrag #18 schon implementiert?
    If you open your Mind too much, your Brain will fall out.

  15. Folgender Benutzer sagt Danke zu zotos für den nützlichen Beitrag:

    dennish23 (06.10.2008)

Ähnliche Themen

  1. EDS-Datei erzeugen
    Von jeanfischer im Forum Feldbusse
    Antworten: 8
    Letzter Beitrag: 24.02.2011, 15:07
  2. CSV Datei erzeugen
    Von Bensen83 im Forum HMI
    Antworten: 5
    Letzter Beitrag: 20.03.2010, 16:11
  3. Antworten: 1
    Letzter Beitrag: 02.03.2009, 13:04
  4. Datenbaustein aus Excel erzeugen
    Von heizer43d185 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 27.06.2008, 21:15
  5. Antworten: 5
    Letzter Beitrag: 17.01.2008, 14:23

Stichworte

Lesezeichen

Berechtigungen

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