Step 7 Wochentag(1 bis 7) durch Datums ermitteln

dort steht nicht, dass die Werte im DatenTyp DTL nicht im BCD-Format herumstehen. Aufgrund der verwendeten DatenTypen UINT, USINT und UDINT würde ich auch keine BCD-Formate erwarten.
In der "richtigen" TIA-Hilfe steht es, daß die Werte in der DTL-Struktur nicht BCD sondern normal dezimal sind. Das kannst Du ohne TIA allerdings nur in der hunderte MB großen und zigtausende Seiten umfassenden PDF nachlesen (ich hab jetzt am Handy grad keinen Link)
Es musste eine neue nicht kompatible Struktur her, weil heutige Jungprogrammierer gar nicht mehr wissen was BCD (oder HEX ;) ) ist...

Harald
 
Laut TIA Handbuch sollte er da sein. Ich schaue morgen.
Sogar in meiner spärlichen SCL-Doku (S7-SCL V5.3 für S7-300/400 A5E00324646-01) sind die Funktionen
DINT_TO_TIME() und TIME_TO_DINT()
aufgeführt und auch die hier eigentlich benötigten
DINT_TO_DATE() und DATE_TO_DINT().
Letztere Funktion (die ich mich zu verwenden getraut hatte) war der Grund dafür, den LösungsWeg über MOD und 2 Additionen anzuregen.
Nur, wie man ein Datum in eine Variable des DatenTyps DATE hineinbekommt, das nicht vor dem Compilieren als DatumsKonstante in der Form D#2022-11-01 vorliegt, erschliesst sich mir noch nicht ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Morgen früh werden wir es sehen... :cool:
Man kennt ja Siemens. Mich würde es nicht wundern wenn das Handbuch / FAQ nur die halbe Wahrheit sagt und die Bausteine für 1x00er zu finden sind und für die 300/400'er nicht.....
Mal sehen 😉
 
Man kennt ja Siemens. Mich würde es nicht wundern wenn das Handbuch / FAQ nur die halbe Wahrheit sagt und die Bausteine für 1x00er zu finden sind und für die 300/400'er nicht.....
Bis einschließlich TIA V15.1 gibt es das T_CONV zum extrahieren des Wochentags aus einem DT nur in FUP/KOP und nur für S7-300/400, aber nicht für SCL. In SCL kann als Ausgangsdatentyp INT nicht gewählt werden, nur DATE und TOD.

Für die 1500er gibt es das direkte extrahieren des Wochentages aus einem DT auch nicht. Dort muß man DT zu DTL konvertieren und dann den Wochentag aus der DTL-Struktur entnehmen.

Harald
 
Sogar in meiner spärlichen SCL-Doku (S7-SCL V5.3 für S7-300/400 A5E00324646-01)
Zwischen dem schlecht dokumentierten SCL V5.x "classic" für S7-300/400 und dem noch schlechter dokumentierten TIA-SCL bestehen doch große Unterschiede. Hier im Thread reden wir (spätestens seit Beitrag #9) über SCL in TIA.

sind die Funktionen
DINT_TO_TIME() und TIME_TO_DINT()
aufgeführt und auch die hier eigentlich benötigten
DINT_TO_DATE() und DATE_TO_DINT().
Letztere Funktion (die ich mich zu verwenden getraut hatte) war der Grund dafür, den LösungsWeg über MOD und 2 Additionen anzuregen.
Keine Panik, die Funktionen sind auch im TIA-SCL vorhanden und heißen auch noch so. Allerdings sind sie in der Dokumentation zu S7-300/S7-400 sehr versteckt.

In der TIA Taskcard "Anweisungen" gibt es DINT_TO_DATE und DATE_TO_DINT nicht. Schade.

Laut TIA Hilfe "Explizite Konvertierung von DINT (S7-300, S7-400)" soll man für die Konvertierung DINT zu DATE die Anweisung CONVERT verwenden. Zieht man die Anweisung CONVERT in einen SCL-Code, dann kann man weder für Quelltyp noch für Zieltyp DATE wählen... :roll:

Laut TIA Hilfe "Explizite Konvertierung von DATE (S7-300, S7-400)" soll man für die Konvertierung DATE zu DINT die Anweisung DATE_TO_DINT verwenden. Aha!

Läßt man sich nun nicht verwirren, und tippt im SCL-Editor unerschrocken "DINT_TO_" oder "DATE_TO_", dann kann man (oh Wunder!) DINT_TO_DATE und DATE_TO_DINT zusammenklicken! ( Versucht man "DT_TO_" dann wird allerdings nur DT_TO_DATE und DT_TO_TOD angeboten. Nichts was irgendwie für das extrahieren des Wochentags aus DT verwendbar wäre. )

In der TIA Hilfe "Explizite Konvertierung von DT (S7-300, S7-400)" werden nur Konvertierungen zu DATE und TOD erwähnt, wofür man die Anweisungen T_CONV und CONVERT verwenden soll. Von Wochentag steht da nichts.

In der TIA Hilfe "T_CONV: Zeiten umwandeln und extrahieren (S7-300, S7-400)" wird die Extraktion des Wochentags aus dem Format DATE_AND_TIME immerhin erwähnt:
T_CONV_Wochentag.png
Da gibt es aber keinen Hinweis, daß das nur in FUP/KOP geht. Zieht man die Anweisung T_CONV in einen SCL-Code, dann kann man bei Quelltyp DT für Zieltyp nur DATE und TOD wählen, aber nicht INT.


Nur, wie man ein Datum in eine Variable des DatenTyps DATE hineinbekommt, das nicht vor dem Compilieren als DatumsKonstante in der Form D#2022-11-01 vorliegt, erschliesst sich mir noch nicht ...
Man kann z.B. einen DATE-Wert aus einem DT holen mit DT_TO_DATE(). Oder einen Zahlenwert (Anzahl Tage seit 01.01.1990) berechnen und einer DATE-Variable mit dem Typecast DINT_TO_DATE zuweisen.
Beispiele:
Code:
#myDint := DATE_TO_DINT(D#2022-11-01); //ergibt 11992
#myDate := DINT_TO_DATE(#myDint + 1);  //ergibt D#2022-11-02
#myDint := DATE_TO_DINT(#myDate);      //ergibt 11993

#myDint := 11000;
#myDate := DINT_TO_DATE(#myDint + 992); //ergibt D#2022-11-01


In der "richtigen" TIA-Hilfe steht es, daß die Werte in der DTL-Struktur nicht BCD sondern normal dezimal sind. Das kannst Du ohne TIA allerdings nur in der hunderte MB großen und zigtausende Seiten umfassenden PDF nachlesen (ich hab jetzt am Handy grad keinen Link)
Hier noch der Link zum Handbuch:
Systemhandbuch (Ausdruck der Onlinehilfe): SIMATIC STEP 7 Basic/Professional V16 und SIMATIC WinCC V16 (11/2019)
Abschnitt 12 PLC programmieren, Kapitel 3.6.6 DTL (S7-1200, S7-1500) (pdf-Seite 5203)

Man kann das Dokument auch online anschauen, da werden von Siemens freundlicherweise alle nützlichen ablenkenden Kapitelnummern verborgen... :rolleyes:
PLC programmieren > Datentypen > Datum und Uhrzeit > DTL

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
gibst es im S7 eine Funktion, die mir den Wochentag (MO-SON / 1- 7 ) durch das Datum ermitteln kann ?
Die korrekte Formel ist:
Code:
iWeekDay := DINT_TO_INT((dDate + 1) MOD 7) + 1 ; // 1 (sunday) .. 7 (saturday)
Um das gewünschte Ergebnis zu liefern, nämlich 1=Mo ... 7=So, müsste aber in SCL ...
Code:
iWeekDay := DINT_TO_INT((dDate + 0) MOD 7) + 1 ; // 1 (monday) .. 7 (sunday)
... gerechnet werden!?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Delta,
jetzt hast Du Dir so viel Mühe mit den Bildern gemacht, hast aber leider die falsche Funktion herausgesucht.
Wie man in dem Bild in Beitrag #2 sehen kann, soll es eigentlich eine Konvertierfunktion mit T_CONV zu "INT (Wochentag)" geben. Die gibt es in SCL aber nicht (vielleicht nur in FUP/KOP?) (zumindest nicht bis TIA V15.1)
Ich schaue morgen früh mal, eigentlich sollte es die Funktion auch in SCL geben.

Es geht um diese Konvertierfunktion bzw. Extraktion des Wochentags:
In der TIA Hilfe "T_CONV: Zeiten umwandeln und extrahieren (S7-300, S7-400)" wird die Extraktion des Wochentags aus dem Format DATE_AND_TIME immerhin erwähnt:
Anhang anzeigen 64624
Da gibt es aber keinen Hinweis, daß das nur in FUP/KOP geht. Zieht man die Anweisung T_CONV in einen SCL-Code, dann kann man bei Quelltyp DT für Zieltyp nur DATE und TOD wählen, aber nicht INT.

PS: Die Funktion DATE_TO_INT() ermittelt nicht den Wochentag, sondern "wandelt" einfach nur die Anzahl Tage seit 01.01.1990 (was ja der Datentyp DATE ist) in den Datentyp INT, und dürfte für heute D#2022-11-02 den Wert 11993 ergeben - also weit weg von 1..7

Harald
 
Zuletzt bearbeitet:
Man müsste mal prüfen, was der Baustein ausgibt, wenn man DATE_TO_INT ausführt. Aus der Hilfe kann ich das nicht so richtig raus lesen.
PS: Die Funktion DATE_TO_INT() ermittelt nicht den Wochentag, sondern "wandelt" einfach nur die Anzahl Tage seit 01.01.1990 (was ja der Datentyp DATE ist) in den Datentyp INT, und dürfte für heute D#2022-11-02 den Wert 11993 ergeben - also weit weg von 1..7
Bitteschön:
DATE_TO_INT.png
Harald
 
Ja, der Thread war eh schon eingeschlafen wegen nicht stattfindender Kommunikation des Themenerstellers @dachico212

Dann hat sich gestern früh #9 der User @mista mit einem ähnlichen Problem einfach hier mit angehängt, und warf das Thema auf, den Wochentag aus dem DT zu extrahieren, weil die für @dachico212 gepostete Berechnungsformel für das Datum aus einem DATE für ihn falsche Ergebnisse liefert und er die simple Formel anscheinend nicht selber anpassen kann. Dabei kam nun heraus, daß es in TIA SCL keine Funktion für das Extrahieren des Wochentags gibt...

Gut daß wir den @Heinileini haben, der anscheinend als Einziger die Frage des Themenerstellers @dachico212 genau genug gelesen hat und festgestellt hat, daß der eine Sondercodierung der Wochentage "(MO-SON / 1- 7 )" will, anstatt den Standard 1 (Sonntag) bis 7 (Samstag). Oder ist das vielleicht falsch in der Frage? Naja, mit @dachico212 gab es eh keine Kommunikation (außer der Bestätigung daß es bei ihm um eine S7-300 geht).

Ob die beiden Fragesteller mitbekommen haben, daß mittlerweile einfache Lösungen für ihre Fragen hier gepostet wurden?
für @dachico212 siehe #29
Code:
#myDate := DT_TO_DATE(#myDT);
#iWeekDay := DINT_TO_INT(DATE_TO_DINT(#myDate) MOD 7) + 1;        // 1 (monday) .. 7 (sunday)

für @mista siehe #12
Code:
#myDate := DT_TO_DATE(#myDT);
#iWeekDay := DINT_TO_INT( (DATE_TO_DINT(#myDate) + 1) MOD 7) + 1; // 1 (sunday) .. 7 (saturday)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ob die beiden Fragesteller mitbekommen haben, daß mittlerweile einfache Lösungen für ihre Fragen hier gepostet wurden?
Zumindest haben wir NichtFragesteller einiges dazugelernt! Danke!
In TIA sind die SCL-Konvertierfunktionen für Datum und Uhrzeit leider sehr schlecht bis gar nicht dokumentiert.
Ich hoffe, dass auch Siemens zu den MitLesern gehört und dies wenigstens mittel- bis langfristig zu mehr Übersichtlichkeit und Einheitlichkeit unter den diversen Varianten (CPUs und Sprachen) und vielleicht sogar zu einer Verfügbarkeit sinnvoll nutzbarer Funktionen führt.
Ich kann einerseits verstehen, wenn das Kapitel "Datum" ein wenig stiefmütterlich behandelt wird, weil es nicht als "KernKompetenz" einer SPS angesehen wird.
Aber andererseits, wenn doch die Tür in diesen Bereich schon geöffnet wurde durch die Vorgabe entsprechender DatenTypen, dann sollte schon ein wenig mehr GehirnSchmalz investiert und auch in der Doku sichtbar werden.
Eine Umwandlung eines Datums in eine fortlaufende Zählung der Tage und umgekehrt ist doch offensichtlich bereits definiert und realisiert.
Nur scheint zu vielen noch relativ unklar zu sein, wie man davon Gebrauch machen kann - zumindest schliesse ich das aus diesem und ähnlichen Themen in diesem Forum.
Mit dem Datum in Form einer fortlaufenden Zählung lässt sich schon einiges anfangen. Z.B. Berechnung des WochenTages, der KalenderWoche, Abfrage der Anzahl Tage eines Monats (Datum(Jahr-(Monat+1)-01) - Datum(Jahr-Monat-01)), Prüfung auf SchaltJahr (Tag(Datum(Jahr-03-01) - 1) > 28) ...
 
Der Vollständigkeit halber:
Da es in TIA SCL keine Funktion zum Extrahieren des Wochentags aus einem DT (DATE_AND_TIME) gibt, muß man sich die simple Funktion im Bedarfsfall selber programmieren. Eine Lösung hatten wir hier schon:
Code:
FUNCTION "DT_Weekday" : USInt
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT
      "DT" : Date_And_Time;
      DTstruct AT "DT" : Struct
         YEAR   : Byte;
         MONTH  : Byte;
         DAY    : Byte;
         HOUR   : Byte;
         MINUTE : Byte;
         SECOND : Byte;
         MSEC12 : Byte;
         MSEC3WEEKDAY : Byte;
      END_STRUCT;
   END_VAR

BEGIN
  //Wochentag aus DATE_AND_TIME
  #DT_Weekday := #DTstruct.MSEC3WEEKDAY AND 16#0F;

END_FUNCTION

Harald
 
Zurück
Oben