Date_Add

Begonnen von lord2k3, 12. August 2013, 12:35:06

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 3 Gäste betrachten dieses Thema.

lord2k3

Hallo erstmal :)

Benutze die "Oscat_basic_333" in PC Worx 6.30.601 und habe vor mir ein Baustein in ST zu bauen welcher das IST-Datum(RTC) mit einem eingestellten SOLL-Datum(Tag addieren mit DATE_ADD) vergleicht und falls das Datum überschritten wurde ein TRUE liefert.
So weit so gut... Womit ich nicht zurecht komme ist das iDate an dem Baustein DATE_ADD

Es muss vom Typ UDINT sein, aber es funktioniert einfach nicht :-\

ST Auszug:

12 Tag_String:=INT_TO_STRING(Tag_Ist,'%02d');
10 Monat_String:=INT_TO_STRING(Monat_Ist,'%02d');
2013 Jahr_String:=INT_TO_STRING(Jahr_Ist,'%04d');

1210 SC1:=CONCAT(Tag_String,Monat_String);
12102013 SC2:=CONCAT(SC1,Jahr_String);

12102013 Datum_UDINT:=STRING_TO_UDINT(SC2);

12528000 End_Datum_UDINT:=DATE_ADD(Datum_UDINT,Dauer,INT#0,INT#0,INT#0);



Eigentlich müsste bei End_Datum_UDINT 17102013 rauskommen(Dauer = INT#5) :)
Verstehe das nicht :-/

peewit

#1
hallo

so funktioniert das überhaupt nicht

du kannst nicht zeitelemente zu einen string machen und dann in eine zahl wandeln
zumindest so nicht

die umrechnung von zeitelemente (jahr,monat,tage usw) ist nicht linear da es schaltjahre gibt
monate mit verschieden vielen tagen usw...

deine rtc zeitelemente kannst du mit dem baustein set_date zu einen datum wandeln
der baustein macht dann sehr wohl eine serielle zahl draus, jedoch nach bestimmten formeln..)

und diese ergebnisse kannst du dann mit date_add verarbeiten

also immer DT,DATe usw.... mittels der fertigen bausteine konvertieren

lord2k3

Hallo,
danke für die schnelle Antwort hab es jetzt hinbekommen.
Führen bekanntlich viele Wege nach Rom :)

ST-Code Auszug

(*Start-/ Enddatum setzen*)
Start_Datum:=Set_Date(Jahr,Monat,Tag);
End_Datum:=Date_Add(Start_Datum,Dauer,INT#0,INT#0,INT#0);

(* Überprüfen ob Datum unterschritten wurde mit Differenz*)
Differenz:=Days_Delta(Start_Datum,End_Datum);

david

Mit negative Täge geht's nicht auf PcWorx, da DATE_ADD UDINT ist (kein DATE datatyp)
Hier meine Lösung:

day := D + W * 7;
IF day >= 0 THEN
    DATE_ADD := IDATE + INT_TO_UDINT(day) * UDINT#86400;
ELSE
    DATE_ADD := IDATE - INT_TO_UDINT(ABS(day)) * UDINT#86400;
END_IF;
yr := Y + YEAR_OF_DATE(DATE_ADD);
mo := M + MONTH_OF_DATE(DATE_ADD);
dm := DAY_OF_MONTH(DATE_ADD);
WHILE mo > 12 DO
   mo := mo - 12;
   yr := yr + 1;
END_WHILE;
WHILE mo < 1 DO
   mo := mo + 12;
   yr := yr - 1;
END_WHILE;
DATE_ADD := SET_DATE(yr, mo, dm);