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
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.Ich habe jetzt mal den SCL Code aus dem SIMATIC Projekt eingefügt.
Allerdings bekomme ich den nicht kompatibel.
PS: Kann mir bitte jemand erklären, wie ich den SCL-Baustein unter TIA exportieren kann?
Nein, das ganze Projekt gibt's nicht.Kannst du mir das Backup von dem Projekt zu schicken??
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
So, hab' mir gerade noch mal den Original-Code für die S7-300 angesehen und siehe da, da hab' ich doch glatt eine "+ 1" vergessenWenn ich das Datum auf den 24.05.2016 ändere ist meine Kalenderwoche richtig.
KW =21. Es scheint so, als wäre es um ein Tag verschoben.
#Day:= DINT_TO_INT(DATE_TO_DINT(DTL_TO_DATE(#Date_int)) - DATE_TO_DINT(DTL_TO_DATE(#Date_ref)) [B][COLOR=#00FF00]+ 1[/COLOR][/B]); // Differenz bestimmen
in der projektnavigation rechtsklick auf den scl-baustein und dan 'quelle aus Baustein generieren'
Im Projektverzeichnis auf der linken Seite gibt es einen Ordner "Externe Quellen" (über den PLC-Variablen).Klappt es auch irgendwie wieder mit dem Importieren ?
Wie geht man hierzu vor ?
Die Lorbeeren "mein Baustein" gebühren mir nicht. Ich hab' lediglich Halls Baustein auf die S7-1200 übertragen.Hallo hucki,
ich habe mir gerade einmal deinen Baustein angeschaut. Super das du ihn mit uns geteilt hast, ...
[COLOR=#333333]IF ABS ( #"FC CWD EU") > 1 THEN[/COLOR]
#tValue := [B][COLOR=#008000]DINT_TO_INT[/COLOR][/B](#Day_corr / 7 + 1);
Ich würde es dann aber etwas abwandeln:
Lt. Hilfe sollten zwar keine negativen Werte ausgegeben werden, aber wer weß schon, was noch so kommt?Code:[COLOR=#333333]IF ABS ( #"FC CWD EU") > 1 THEN[/COLOR]
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?