Holiday Array

Begonnen von thomas223, 16. November 2011, 15:41:44

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

mattsches

Reproduzieren kann ich das bei mir nicht, allerdings habe ich TwinCAT 2/CODESYS V2.3 und nicht V3.5. Aber ich gehe davon aus, dass der Code identisch ist.

Frage: Warum beschreibst Du das Array HOLIDAYS im Laufzeitprogramm und nicht einfach bei der Deklaration, wie z. B. in der Doku beschrieben?


HOLIDAY_DE : ARRAY[0..29] OF HOLIDAY_DATA := (name := 'Neujahr', day := 1, month := 1, use := 1),
(name := 'Heilig Drei Könige', day := 6, month := 1, use := 1),
(name := 'Karfreitag', day := -2, month := 0, use := 1),
(name := 'Ostersonntag', day := 0, month := 0, use := 1),
(name := 'Ostermontag', day := 1, month := 0, use := 1),
(name := 'Tag der Arbeit', day := 1, month := 5, use := 1),
(name := 'Christi Himmelfahrt', day := 39, month := 0, use := 1),
(name := 'Pfingstsonntag', day := 49, month := 0, use := 1),
(name := 'Pfingstmontag', day := 50, month := 0, use := 1),
(name := 'Fronleichnam', day := 60, month := 0, use := 1),
(name := 'Augsburger Friedensfest', day := 8, month := 8, use := 0),
(name := 'Maria Himmelfahrt', day := 15, month := 8, use := 1),
(name := 'Tag der Deutschen Einheit', day := 3, month := 10, use := 1),
(name := 'Reformationstag', day := 31, month := 10, use := 0),
(name := 'Allerheiligen', day := 1, month := 11, use := 1),
(name := 'Buss und Bettag', day := 23, month := 11, use := 0),
(name := '1. Weihnachtstag', day := 25, month := 12, use := 1),
(name := '2. Weihnachtstag', day := 26, month := 12, use := 1)


Das muss jetzt nichts mit Deinem Fehler zu tun haben. War nur ein Unterschied, der mir zu meinem Programm aufgefallen ist.

Kannst Du den Deklarationsteil von HOLIDAYS und eine Ansicht mit den Daten des Arrays zur Laufzeit mal posten?

Marvelous

Danke erstmal für deine Mühen.
Ich habe Holidays Global Deklariert und aus Übersichtsgründen im Laufzeitprogramm beschrieben.
Sollte grundsätzlich jedoch keine Rolle spielen oder?


VAR_GLOBAL
DateTime: stDateTime;
PULS : stZeit;
TAKT : stZeit;
Kalendar: OSCAT_BASIC.CALENDAR;
Calc_Kalender : OSCAT_BASIC.CALENDAR_CALC;
plrNight : R_TRIG;
plfNight : F_TRIG;
Holidays : ARRAY[0..29] OF OSCAT_BASIC.HOLIDAY_DATA;

END_VAR


FOR iDay := 0 TO 29 DO
Holidays[iDay].name := '';
Holidays[iDay].DAY := 0;
Holidays[iDay].month := 0;
Holidays[iDay].use := 0;
END_FOR


iDay := 0;
Holidays[iDay].name := 'Neujahr';
Holidays[iDay].DAY := 1;
Holidays[iDay].month := 1;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Heilig Drei Könige';
Holidays[iDay].day := 6;
Holidays[iDay].month := 1;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Karfreitag';
Holidays[iDay].day := -2;
Holidays[iDay].month := 0;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Ostersonntag';
Holidays[iDay].day := 0;
Holidays[iDay].month := 0;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Ostermontag';
Holidays[iDay].day := 1;
Holidays[iDay].month := 0;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Tag der Arbeit';
Holidays[iDay].day := 1;
Holidays[iDay].month := 5;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Christi Himmelfahrt';
Holidays[iDay].day := 39;
Holidays[iDay].month := 0;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Pfingstsonntag';
Holidays[iDay].day := 49;
Holidays[iDay].month := 0;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Pfingstmontag';
Holidays[iDay].day := 50;
Holidays[iDay].month := 0;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Fronleichnam';
Holidays[iDay].day := 60;
Holidays[iDay].month := 0;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Maria Himmelfahrt';
Holidays[iDay].day := 15;
Holidays[iDay].month := 8;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Tag der Deutschen Einheit';
Holidays[iDay].day := 3;
Holidays[iDay].month := 10;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Reformationstag';
Holidays[iDay].day := 31;
Holidays[iDay].month := 10;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Allerheiligen';
Holidays[iDay].day := 1;
Holidays[iDay].month := 11;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := 'Heiligabend';
Holidays[iDay].day := 24;
Holidays[iDay].month := 12;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := '1. Weihnachtstag';
Holidays[iDay].day := 25;
Holidays[iDay].month := 12;
Holidays[iDay].use := 1;
iDay := iDay + 1;
Holidays[iDay].name := '2. Weihnachtstag';
Holidays[iDay].day := 26;
Holidays[iDay].month := 12;
Holidays[iDay].use := 1;


[gelöscht durch Administrator]

mattsches

Ok, das schaut alles in Ordnung aus. Und du hast Recht, das zyklische Befüllen ist kein Problem. Ich mache das nur nicht, um nicht unnötig CPU-Zeit zu verschenken. Aber für dein Problem ist das nicht der Grund, das HOLIDAY-Array ist ja korrekt initialisiert und befüllt.

Hast du mal testweise den HOLIDAY-Baustein separat aufgerufen? EASTER gibt ja das korrekte Datum zurück, wie du schreibst. Aber was macht der HOLIDAY, wenn du ihn zyklisch aufrufst, mit denselben Parametern wie im CALENDAR_CALC?

Marvelous

Ich habe eine Bedingung beim Holiday_Data  damit nicht in jeden Zyklus beschrieben wird.

Habe nun mal test weise Holiday aufgerufen und mit dem fix Datum 30.06.18 beschrieben ansonsten wie in CALENDAR_CALC.
Da kann man auch ganz gut sehen, dass "last_active" und "ostern" verschieden Daten haben..



[gelöscht durch Administrator]

mattsches

Wirklich seltsam. Zumindest laut deinem Screenshot schaut es so aus, als würde die Bedingung in Zeile 30 feuern und der Baustein mit Zeile 33 dann abgebrochen. Mit dem Ergebnis Ostersonntag.


Kannst du mal bResult als BOOL deklarieren und folgenden Aufruf testweise mit einbauen?


bResult := (DATE_ADD(d#2018-04-01, 0, 0, 0, 0) = d#2018-06-30);


Und was sagt der Holidaytest-FB zu DATE_IN := d#2018-04-01?

Marvelous

Ich finde es auch sehr merkwürdig.

bResult ist True.

Und bei d#2018-04-01 wird mir kein Feiertag mehr angezeigt.
last_activ und ostern wird in dem Holiday Baustein aber mit D#2018-04-01 beschrieben.


mattsches

Und was kommt raus, wenn du z. B. dResult als Date deklarierst und


dResult := DATE_ADD(d#2018-04-01, 0, 0, 0, 0);


ausführst?

Kannst Du bitte mal den Code von DATE_ADD posten? Oder einen Export anhängen. Wie gesagt, ich habe hier nur CODESYS V2.3 am Start.

Welche Steuerung setzt du denn ein?

mattsches

Hier mal zum Vergleich der Code von DATE_ADD in der Lib für CODESYS V2.3:


DATE_ADD := UDINT_TO_DATE(DATE_TO_UDINT(IDATE) + INT_TO_UDINT(D + W * 7) * UDINT#86400);
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);


DATE_ADD ist eine Funktion und kann daher nicht beobachtet werden (jedenfalls in V2.3). Ich würde daher den Code mal in einen FB oder ein Programm kopieren, mit dem 01.04.2018 füttern und beobachten, was als Ergebnis rauskommt. Wenn das Ergebnis immer noch d#2018-04-01 ist, würde ich das mal mit d#2018-06-30 vergleichen lassen und checken, ob das Ergebnis True ist.

Alles etwas umständlich. Aber mir fällt keine andere Vorgehensweise ein, als das Schritt für Schritt einzugrenzen. Irgendwo muss der Hase ja im Pfeffer liegen.

Marvelous

#23
Bei
dResult := DATE_ADD(d#2018-04-01, 0, 0, 0, 0);
kommt als Ergebnis
dResult := D#2018-6-30

Bis Zeile 61 in meinem Screenshot müsste alles passen.

DAY_OF_YEAR in Zeile 62 gibt 91 aus.
Sodass bei SET_DATE(2018,4,91) gegeben ist...

[gelöscht durch Administrator]

mattsches

Logisch, das kann nicht gehen, wenn bei SET_DATE der Monat schon passt aber dann der Tag bezogen auf das Jahr noch draufaddiert wird. Offenbar ist der Code von DATE_ADD in der Lib für CODESYS V3.5 ein anderer als in der für V2.3.  Steht am Ende des Bausteins eine Versions- und Datumsangabe? Bei der Version für 2.3 ist das 1.8/22.03.2011.

Am besten änderst du mal in der Lib den DATE_ADD wie folgt:


DATE_ADD := UDINT_TO_DATE(DATE_TO_UDINT(IDATE) + INT_TO_UDINT(D + W * 7) * UDINT#86400);
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);



Das ist die Version, wie sie in der Lib für V2.3 enthalten ist und bei mir problemlos funktioniert. Wenn das dann tut, sollten wir peewit Bescheid geben, damit die Bibliothek korriert wird.

peewit

hallo

die wir keine offizielle oscat bibliothek für codesys 3.x veröffentlichen und aich diese version nicht von uns selber stammt müsst ihr mal schauen woher ihr diese habt.
somit kann ich auch nichts korrigieren solange der referenzcode wie z.b. für codesys 2.x in ordnung ist

vermutlich wurde für die codesys 3.5 portierung igendein ein alter code verwendet !

wie schon erwähnt --> vergleicht am besten die versionsnummern der bausteine

mattsches

Hi peewit,

sorry, jetzt stehe ich auf dem Schlauch - was ist dann das hier?

http://www.oscat.de/component/jdownloads/download/2-oscat-basic/4-oscat-basic-331-codesys3.html

Gruß,
mattsches

peewit

#27
hallo

das gehört eigentlich rausgenommen und entspricht auch nicht der offiziellen vorgangsweise, da es keinen gibt der das pflegt

das ist die einzige version die jemals herausgegeben wurde und die ist nun natürlich alt -> version 3.31

aktuell ist v3.33 , dem entsprechend müssen hier unterschiede bzw. fehler enthalten sein

nachdem es hier eine andere quelle noch gibt empfehle ich das von dort zu nehmen !
siehe codesys store (kostenloser download der oscat für codesys 3.x)



[gelöscht durch Administrator]

Marvelous

Vielen Dank jetzt läuft es korrekt habe DATE_ADD angepasst.
Zitat von: mattsches in 15. August 2018, 20:04:56
Logisch, das kann nicht gehen, wenn bei SET_DATE der Monat schon passt aber dann der Tag bezogen auf das Jahr noch draufaddiert wird. Offenbar ist der Code von DATE_ADD in der Lib für CODESYS V3.5 ein anderer als in der für V2.3.  Steht am Ende des Bausteins eine Versions- und Datumsangabe? Bei der Version für 2.3 ist das 1.8/22.03.2011.

Am besten änderst du mal in der Lib den DATE_ADD wie folgt:


DATE_ADD := UDINT_TO_DATE(DATE_TO_UDINT(IDATE) + INT_TO_UDINT(D + W * 7) * UDINT#86400);
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);



Das ist die Version, wie sie in der Lib für V2.3 enthalten ist und bei mir problemlos funktioniert. Wenn das dann tut, sollten wir peewit Bescheid geben, damit die Bibliothek korriert wird.