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 :-/
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
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);
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);