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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Kalenderwoche errechnen

  1. #1
    Registriert seit
    04.05.2015
    Beiträge
    29
    Danke
    22
    Erhielt 2 Danke für 2 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hey SPS Forum Team,

    ich stehe gerade vor einer Herausforderung und benötige eure Hilfe

    Wie ermittle ich die Kalenderwoche (KW) mit dem TIA Portal V13 SP1 UPD8.

    Gibt es eine einfache Formel oder eventuell sogar Funktion mit der ich die Kalenderwoche ermitteln kann.

    Es wäre schön, wenn es eine Lösung in KOP gäbe. SCL, AWL hilft mir leider nicht weiter

    siehe Anhang/ Screenshot
    Diese Daten lese ich bereits aus. Leider ist keine KW dabei

    Danke
    Angehängte Grafiken Angehängte Grafiken
    Zitieren Zitieren Gelöst: Kalenderwoche errechnen  

  2. "
    Zitat Zitat von TIA-Portal Beitrag anzeigen
    Kannst du mir das Backup von dem Projekt zu schicken??
    Nein, das ganze Projekt gibt's nicht.

    Aber Dank Volker konnte ich den Baustein nun exportieren.
    Hier also nochmal die komplette Quelle:

    Code:
    FUNCTION "FC CWD EU" : Int
    TITLE = Calendar Week/Day (EU)
    { S7_Optimized_Access := 'TRUE' }
    
    AUTHOR : Hall
    FAMILY : TIME_FCT
    NAME : CWD_EU
    VERSION : 1.1
    //Transmission to S7-1200 by Hucki
    
       VAR_INPUT 
          CPU_Clock : Bool;                                                                                    // Datum der CPU verwenden
          "Date" : Date;                                                                                       // Datum übergeben
       END_VAR
    
       VAR_OUTPUT 
          Week : Int;                                                                                          // KW (EU) des Datums
          Day : Int;                                                                                           // Tag des Jahres
       END_VAR
    
       VAR_TEMP 
          Date_int {OriginalPartName := 'DTL'; LibVersion := '1.0'} : DTL;                                     // zu verwendene Datum
          Date_ref {OriginalPartName := 'DTL'; LibVersion := '1.0'} : DTL;                                     // Referenz-Datum (01.01. oder 31.12.)
          Day_corr : DInt;                                                                                     // Tagesnummer für KW-Berechnung
          WD_Jan1 : Int;                                                                                       // Wochentag des 01.01.
          WD_Dez31 : Int;                                                                                      // Wochentag des 31.12.
          tValue : Int;                                                                                        // Zwischenergebnisse KW-Berechnung
       END_VAR
    
    
    BEGIN
        //Für das Datum, den Eingangsparameter "Date" oder CPU_Clock nutzen. 
        IF #CPU_Clock THEN
            #"FC CWD EU" := RD_LOC_T(OUT => #Date_int);                                                         // Datum aus CPU auslesen
            IF ABS(#"FC CWD EU") > 1  THEN                                                                      // Wenn Fehler beim Auslesen 
                RETURN;                                                                                         // Baustein abbrechen
            END_IF;
            #Date_int := DATE_TO_DTL(DTL_TO_DATE(#Date_int));                                                   // Wochentag korrigieren
        ELSE
            #"FC CWD EU" := 0;
            #Date_int := DATE_TO_DTL(#Date);                                                                    // Datum vom Input übertragen
        END_IF;
        
        // 1.Januar des Jahres
        #Date_ref := #Date_int;                                                                                 // Datum übernehmen
        #Date_ref.DAY := 1;                                                                                     // Erste des Monats einstellen
        #Date_ref.MONTH := 1;                                                                                   // Januar einstellen
        #Date_ref:= DATE_TO_DTL(DTL_TO_DATE(#Date_ref));                                                        // Wochentag korrigieren
        #WD_Jan1 := #Date_ref.WEEKDAY;                                                                          // Wochentag des 01.01.
        
        // Tag des Jahres
        #Day:= DINT_TO_INT(DATE_TO_DINT(DTL_TO_DATE(#Date_int)) - DATE_TO_DINT(DTL_TO_DATE(#Date_ref)) + 1);    // Differenz bestimmen
        
        //Korrektur der Tagesnummer entsprechend dem Wochentag des 1. Januars zur KW-Ermittlung 
        CASE #WD_Jan1 OF                                                                                        // Je nach Wochentag 
            1:  // Sonntag
                #Day_corr := #Day - 2;
            2:  // Montag
                #Day_corr := #Day - 1;
            3:  // Dienstag
                #Day_corr := #Day;
            4:  // Mittwoch
                #Day_corr := #Day + 1;
            5:  // Donnerstag
                #Day_corr := #Day + 2;
            6:  // Freitag
                #Day_corr := #Day - 4;
            7:  // Samstag
                #Day_corr := #Day - 3;
        END_CASE;
        
        // Kalenderwoche
        IF #Day_corr < 0 THEN                                                                                   // Wenn KW zum Vorjahr gehört
            //Bei negativem "Day_corr", letzte KW des letzten Jahres nehmen.  
            #Date_ref.YEAR := MAX(IN1 := #Date_ref.YEAR - 1, IN2 := 0);                                         // Vorjahr einstellen
            #Date_ref := DATE_TO_DTL(DTL_TO_DATE(#Date_ref));                                                   // Wochentag korrigieren
            #WD_Jan1 := #Date_ref.WEEKDAY;                                                                      // Wochentag des 01.01.
            #Date_ref.MONTH := 12;                                                                              // Dezember einstellen
            #Date_ref.DAY := 31;                                                                                // Letzte des Monats einstellen
            #Date_ref := DATE_TO_DTL(DTL_TO_DATE(#Date_ref));                                                   // Wochentag korrigieren
            #WD_Dez31 := #Date_ref.WEEKDAY;                                                                     // Wochentag des 31.12.
            //Nur wenn der 1. Januar oder der 31. Dezember des Vorjahres ein Donnerstag war,
            //ist der aktuelle Tag in der KW53 des Vorjahres,
            //sonst ist er in der KW52 des Vorjahres
            #Week := SEL(G := #WD_Jan1 = 5 OR #WD_Dez31 = 5, IN0 := 52, IN1 := 53);                             // zw. KW52 oder KW53 entscheiden
        ELSE
            //Bei positiven "Day_corr", diesen Wert zur Berechnung der KW benutzen
            #tValue := DINT_TO_INT(#Day_corr / 7 + 1);
            IF (#tValue = 53) THEN                                                                              // Wenn KW schon im nächsten Jahr sein könnte
                //Nur wenn der 1. Januar oder der 31. Dezember des aktuellen Jahres ein Donnerstag war/ist,
                //ist der aktuelle Tag in der KW53 dieses Jahres,
                //sonst ist er in der KW1 des nächsten Jahres
                #Date_ref.MONTH := 12;                                                                          // Dezember einstellen
                #Date_ref.DAY := 31;                                                                            // Letzte des Monats einstellen
                #Date_ref := DATE_TO_DTL(DTL_TO_DATE(#Date_ref));                                               // Wochentag korrigieren
                #WD_Dez31 := #Date_ref.WEEKDAY;                                                                 // Wochentag des 31.12.
                #Week := SEL(G := #WD_Jan1 = 5 OR #WD_Dez31 = 5, IN0 := 1, IN1 := 53);                          // zw. KW1 oder KW53 entscheiden
            ELSE
                #Week := #tValue;                                                                               // KW entspricht dem berechnetem Wert
            END_IF;
        END_IF;
        
    END_FUNCTION
    und auch wieder als Download:"


  3. #2
    Registriert seit
    22.08.2012
    Beiträge
    99
    Danke
    19
    Erhielt 15 Danke für 14 Beiträge

    Standard

    Von Siemens gibt's für die Classic-Welt einen fertigen SCL-Code (siehe Link).

    https://support.industry.siemens.com.../view/31695931

    Schau doch ob den nicht einfach anpassen kannst.
    Eine Rückmeldung ob geklappt hat wäre super.

  4. #3
    Registriert seit
    12.04.2005
    Ort
    Black Forest
    Beiträge
    1.334
    Danke
    27
    Erhielt 129 Danke für 116 Beiträge

    Standard

    Das wäre zB eine Möglichkeit welche ich mal in Excel gemacht habe


    Code:
    Public Function Kalenderwoche(XDatum As Variant, fModus As Boolean) As String
    ' Gibt Ein Datum als "ww\jjjj" String zurück
    ' Wenn eine Wochennummer in ein unterschiedliches Jahr fällt,
    ' so wird dies berücksichtigt
    ' d.h. 31.12.2002 = 01\2003 bzw. 1.1.1999 = 53\1998
        Dim x, y, Z
       
        Kalenderwoche = ""
        If Not IsDate(XDatum) Then Kalenderwoche = "": Exit Function
        XDatum = CDate(XDatum)
        x = Year(XDatum)
        y = Month(XDatum)
        Z = CInt(Format(XDatum, "ww", vbMonday, vbUseSystem))
        If Z > 52 Then
            If Format(XDatum + 7, "ww", vbMonday, vbFirstFourDays) = 2 Then Z = 1
        End If
        If y = 12 And Z < 40 Then x = x + 1
        If y = 1 And Z > 10 Then x = x - 1
        If fModus = True Then
            Kalenderwoche = Right("00" & Z, 2) & "/" & Right("0000" & x, 4)
          Else
            Kalenderwoche = Right("00" & Z, 2)
        End If
    End Function

    „Eine Frage raubt mir den Verstand bin ich verrückt oder sind es die Anderen ?“

    Albert Einstein

  5. #4
    TIAISM ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    04.05.2015
    Beiträge
    29
    Danke
    22
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Ich habe jetzt mal den SCL Code aus dem SIMATIC Projekt eingefügt.
    Allerdings bekomme ich den nicht kompatibel. Habe leider nicht so vie SCL Erfahrung..

    Ich stehe jetzt mit dem SUpport mit Siemens in Kontakt. Ich halte euch auf dem laufenden.

    Danke



    Danke

  6. #5
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    Zitat Zitat von TIA-Portal Beitrag anzeigen
    Ich habe jetzt mal den SCL Code aus dem SIMATIC Projekt eingefügt.
    Allerdings bekomme ich den nicht kompatibel.
    Hatte die KW-Berechnung mal für 'ne S7-1200 vom Siemens-Baustein für Classic auf TIA umgesetzt, weil ich das gleiche Problem hatte.

    Die aktuelle Version gibt's jetzt etwas weiter unten im Post#8.



    PS: Kann mir bitte jemand erklären, wie ich den SCL-Baustein unter TIA exportieren kann?
    Geändert von hucki (24.05.2016 um 16:24 Uhr) Grund: auf Post#8 verwiesen

  7. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    TIAISM (23.05.2016)

  8. #6
    TIAISM ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    04.05.2015
    Beiträge
    29
    Danke
    22
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Kannst du mir das Backup von dem Projekt zu schicken??

    Danke

  9. #7
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.849
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen

    PS: Kann mir bitte jemand erklären, wie ich den SCL-Baustein unter TIA exportieren kann?
    in der projektnavigation rechtsklick auf den scl-baustein und dan 'quelle aus Baustein generieren'
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  10. Folgende 2 Benutzer sagen Danke zu volker für den nützlichen Beitrag:

    hucki (19.05.2016),TIAISM (23.05.2016)

  11. #8
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    Zitat Zitat von TIA-Portal Beitrag anzeigen
    Kannst du mir das Backup von dem Projekt zu schicken??
    Nein, das ganze Projekt gibt's nicht.

    Aber Dank Volker konnte ich den Baustein nun exportieren.
    Hier also nochmal die komplette Quelle:

    Code:
    FUNCTION "FC CWD EU" : Int
    TITLE = Calendar Week/Day (EU)
    { S7_Optimized_Access := 'TRUE' }
    
    AUTHOR : Hall
    FAMILY : TIME_FCT
    NAME : CWD_EU
    VERSION : 1.1
    //Transmission to S7-1200 by Hucki
    
       VAR_INPUT 
          CPU_Clock : Bool;                                                                                    // Datum der CPU verwenden
          "Date" : Date;                                                                                       // Datum übergeben
       END_VAR
    
       VAR_OUTPUT 
          Week : Int;                                                                                          // KW (EU) des Datums
          Day : Int;                                                                                           // Tag des Jahres
       END_VAR
    
       VAR_TEMP 
          Date_int {OriginalPartName := 'DTL'; LibVersion := '1.0'} : DTL;                                     // zu verwendene Datum
          Date_ref {OriginalPartName := 'DTL'; LibVersion := '1.0'} : DTL;                                     // Referenz-Datum (01.01. oder 31.12.)
          Day_corr : DInt;                                                                                     // Tagesnummer für KW-Berechnung
          WD_Jan1 : Int;                                                                                       // Wochentag des 01.01.
          WD_Dez31 : Int;                                                                                      // Wochentag des 31.12.
          tValue : Int;                                                                                        // Zwischenergebnisse KW-Berechnung
       END_VAR
    
    
    BEGIN
        //Für das Datum, den Eingangsparameter "Date" oder CPU_Clock nutzen. 
        IF #CPU_Clock THEN
            #"FC CWD EU" := RD_LOC_T(OUT => #Date_int);                                                         // Datum aus CPU auslesen
            IF ABS(#"FC CWD EU") > 1  THEN                                                                      // Wenn Fehler beim Auslesen 
                RETURN;                                                                                         // Baustein abbrechen
            END_IF;
            #Date_int := DATE_TO_DTL(DTL_TO_DATE(#Date_int));                                                   // Wochentag korrigieren
        ELSE
            #"FC CWD EU" := 0;
            #Date_int := DATE_TO_DTL(#Date);                                                                    // Datum vom Input übertragen
        END_IF;
        
        // 1.Januar des Jahres
        #Date_ref := #Date_int;                                                                                 // Datum übernehmen
        #Date_ref.DAY := 1;                                                                                     // Erste des Monats einstellen
        #Date_ref.MONTH := 1;                                                                                   // Januar einstellen
        #Date_ref:= DATE_TO_DTL(DTL_TO_DATE(#Date_ref));                                                        // Wochentag korrigieren
        #WD_Jan1 := #Date_ref.WEEKDAY;                                                                          // Wochentag des 01.01.
        
        // Tag des Jahres
        #Day:= DINT_TO_INT(DATE_TO_DINT(DTL_TO_DATE(#Date_int)) - DATE_TO_DINT(DTL_TO_DATE(#Date_ref)) + 1);    // Differenz bestimmen
        
        //Korrektur der Tagesnummer entsprechend dem Wochentag des 1. Januars zur KW-Ermittlung 
        CASE #WD_Jan1 OF                                                                                        // Je nach Wochentag 
            1:  // Sonntag
                #Day_corr := #Day - 2;
            2:  // Montag
                #Day_corr := #Day - 1;
            3:  // Dienstag
                #Day_corr := #Day;
            4:  // Mittwoch
                #Day_corr := #Day + 1;
            5:  // Donnerstag
                #Day_corr := #Day + 2;
            6:  // Freitag
                #Day_corr := #Day - 4;
            7:  // Samstag
                #Day_corr := #Day - 3;
        END_CASE;
        
        // Kalenderwoche
        IF #Day_corr < 0 THEN                                                                                   // Wenn KW zum Vorjahr gehört
            //Bei negativem "Day_corr", letzte KW des letzten Jahres nehmen.  
            #Date_ref.YEAR := MAX(IN1 := #Date_ref.YEAR - 1, IN2 := 0);                                         // Vorjahr einstellen
            #Date_ref := DATE_TO_DTL(DTL_TO_DATE(#Date_ref));                                                   // Wochentag korrigieren
            #WD_Jan1 := #Date_ref.WEEKDAY;                                                                      // Wochentag des 01.01.
            #Date_ref.MONTH := 12;                                                                              // Dezember einstellen
            #Date_ref.DAY := 31;                                                                                // Letzte des Monats einstellen
            #Date_ref := DATE_TO_DTL(DTL_TO_DATE(#Date_ref));                                                   // Wochentag korrigieren
            #WD_Dez31 := #Date_ref.WEEKDAY;                                                                     // Wochentag des 31.12.
            //Nur wenn der 1. Januar oder der 31. Dezember des Vorjahres ein Donnerstag war,
            //ist der aktuelle Tag in der KW53 des Vorjahres,
            //sonst ist er in der KW52 des Vorjahres
            #Week := SEL(G := #WD_Jan1 = 5 OR #WD_Dez31 = 5, IN0 := 52, IN1 := 53);                             // zw. KW52 oder KW53 entscheiden
        ELSE
            //Bei positiven "Day_corr", diesen Wert zur Berechnung der KW benutzen
            #tValue := DINT_TO_INT(#Day_corr / 7 + 1);
            IF (#tValue = 53) THEN                                                                              // Wenn KW schon im nächsten Jahr sein könnte
                //Nur wenn der 1. Januar oder der 31. Dezember des aktuellen Jahres ein Donnerstag war/ist,
                //ist der aktuelle Tag in der KW53 dieses Jahres,
                //sonst ist er in der KW1 des nächsten Jahres
                #Date_ref.MONTH := 12;                                                                          // Dezember einstellen
                #Date_ref.DAY := 31;                                                                            // Letzte des Monats einstellen
                #Date_ref := DATE_TO_DTL(DTL_TO_DATE(#Date_ref));                                               // Wochentag korrigieren
                #WD_Dez31 := #Date_ref.WEEKDAY;                                                                 // Wochentag des 31.12.
                #Week := SEL(G := #WD_Jan1 = 5 OR #WD_Dez31 = 5, IN0 := 1, IN1 := 53);                          // zw. KW1 oder KW53 entscheiden
            ELSE
                #Week := #tValue;                                                                               // KW entspricht dem berechnetem Wert
            END_IF;
        END_IF;
        
    END_FUNCTION
    und auch wieder als Download:
    Angehängte Dateien Angehängte Dateien
    Geändert von hucki (24.05.2016 um 22:23 Uhr) Grund: + 1 im Code vergessen, Kommentare noch eingedeutscht, Lord_Anubis Hinweis eingefügt

  12. Folgende 2 Benutzer sagen Danke zu hucki für den nützlichen Beitrag:

    Lord_Anubis (24.05.2016),TIAISM (23.05.2016)

  13. #9
    Registriert seit
    27.07.2012
    Ort
    AUT
    Beiträge
    480
    Danke
    84
    Erhielt 159 Danke für 90 Beiträge

    Standard

    Lieber TE

    Neben der eigentlichen Rechnerei noch ein paar Dinge die du beachten solltest:
    1. ) Bitte kläre vorher genau wie die Kalenderwoche berechnet werden soll. Es gibt da unterschiedliche Ansätze (vgl auch hier ) dafür wann eine Woche überhaupt beginnt (So oder Mo), ob die erste KW immer die ist die den 01.01. enthält oder die erste vollständige Woche ist usw. Daraus ergeben sich auch rechnerisch Probleme dass es mal eine KW53 gibt oder auch nicht. Das ist ein sehr wichtiger Punkt da ein Mißverständnis hier immer nur einmal im Jahr zu Problemen führt und entsprechend nervig ist.
    2.) Ich empfehle abzuklären ob wirklich die Kalenderwoche benötigt wird oder die Wochen des Geschäftsjahres, die sich bei Jahreswechsel auch wiederrum auf ganz ganz kuriose Weisen berechnen lassen. Wenn es um die Geschäftswochen geht würde ich unbedingt einen Buchhalter/Controller des Kunden um die Definition fragen.
    3.) Wenn es um die Zuordnung von Verbauchs- Prozess- oder Chargenwerten geht ist auch noch immer ein Dauerbrenner inwieweit die Daten angefangener Produkte/Chargen noch zur letzten oder nächsten Woche zählen.
    Regards NRNT

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

    TIAISM (23.05.2016)

  15. #10
    TIAISM ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    04.05.2015
    Beiträge
    29
    Danke
    22
    Erhielt 2 Danke für 2 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hey,

    vielen Dank für die Hilfe!
    Ich habe den obigen SCL Code von hucki verwendet.

    Leider wird mir gerade die KW20 ausgegeben. Allerdings befinden wir uns in der KW21.
    Okay, also beim 23.05.2016 wird mir KW20 ausgegeben obwohl KW21 ist.
    Sobald ich das Datum auf den 24.05.2016 ändere wird mir die KW 21 ausgegeben.
    Ich denker da ist was verschoben.. Mir wird auch ausgegeben, dass heute Tag 143 ist. Dabei ist heute Tag 144, oder?

    Was kann ich da noch machen?

    Vielen vielen Dank
    Geändert von TIAISM (23.05.2016 um 11:38 Uhr)

Ähnliche Themen

  1. Kalenderwoche in Wincc
    Von Trocellen im Forum Hochsprachen - OPC
    Antworten: 10
    Letzter Beitrag: 03.01.2011, 22:06
  2. Antworten: 4
    Letzter Beitrag: 18.06.2010, 20:35
  3. Kalenderwoche berechnen
    Von Simatics im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 06.05.2007, 21:59
  4. Problem Kalenderwoche
    Von Kurt im Forum Hochsprachen - OPC
    Antworten: 2
    Letzter Beitrag: 27.09.2005, 20:51
  5. Kalenderwoche
    Von PLC JOE im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 02.07.2004, 00:21

Stichworte

Lesezeichen

Berechtigungen

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