OSCAT Forum

oscat.lib => oscat.lib fuer CoDeSys 3 => Thema gestartet von: thomas223 am 16. November 2011, 15:41:44

Titel: Holiday Array
Beitrag von: thomas223 am 16. November 2011, 15:41:44
Hallo erstmal!

Ich bin Neeu hier und versuche zurzeit eine Wochenschaltuhr in CoDeSys zu Programmieren!
Dafür ist die Basic Lib sehr hilfreich!
Doch mit der Holliday Funktion habe ich so miene anfänger problemchen, denn ich bekomme es einfach nicht hin den Array zu  Deklarieren!??
Oder ist dieser schon vor deklariert (z.B. als Vareable) zu finden???


Thomas
Titel: Re: Holiday Array
Beitrag von: peewit am 16. November 2011, 17:26:36
das holiday array musst du selber mit daten füllen

schau mal hier !

http://www.oscat.de/community/index.php/topic,1605.msg8386.html#msg8386

beispieldaten findest du in der oscat dokumenation
Titel: Re: Holiday Array
Beitrag von: thomas223 am 16. November 2011, 21:18:18
Ich weiß einfach nicht wie ich. Die Daten in das Array bekomme! Es hört sich so an als wurde man einfach eine Tabelle füllen? Oder muss ich jedes Array Fragment einzeln beschreiben?
Titel: Re: Holiday Array
Beitrag von: peewit am 16. November 2011, 22:26:14
ich empfehle dir den link anzuklicken, und dir das sample.png bild anzusehen
dort sieht man ganz klar bei der variablendeklaration wie das geht....
Titel: Re: Holiday Array
Beitrag von: thomas223 am 17. November 2011, 07:54:25

Zum einen AHA!!!

Aber zum anderen entteuschung!!!

(http://)

[gelöscht durch Administrator]
Titel: Re: Holiday Array
Beitrag von: thomas223 am 17. November 2011, 09:56:14
Habe noch heraus gefunden das die Deklaration in 3.4 in eckigen klammern geschrieben wird!
nun genen zumindest die festen Tage!
Doch leider funktioniert die Oster fonktion bei mir noch nicht! selbst wenn ich ihn Ostersonntag vorgebe gibt er mir diesen nicht als Feiertag aus!
Titel: Re: Holiday Array
Beitrag von: annD am 28. Mai 2015, 16:50:45
Hallo thomas223,
hast du inzwischen herausgefunden, was der Fehler war? Ich als Anfänger habe nämlich dieselben Fehlermeldungen und komme nicht so richtig dahinter.
Schöne Grüße,
annD
Titel: Re: Holiday Array
Beitrag von: annD am 05. Juni 2015, 21:06:02
Hallo zusammen,

bei mir lag es an den Deklarationen, die unter Codesys 3.5 etwas anders lauten müssen als in der Doku. z.B.:

XCAL: OSCAT_BASIC.CALENDAR:=(OFFSET:=60,DST_EN:=TRUE,LANGUAGE:=2,LONGITUDE:=xxx,LATITUDE:=xxx);

und

Feiertage: ARRAY[0..29] OF OSCAT_BASIC.HOLIDAY_DATA :=
      [(name := 'Neujahr', day := 1, month := 1, use := 1)];

Lg annD
Titel: Re: Holiday Array
Beitrag von: multilul am 09. Dezember 2017, 20:53:55
Bei Mir gelingt es nicht dass Holiday Type richtig zu kriegen.
Weiss Jemand was hier Falsch geht?





[gelöscht durch Administrator]
Titel: Re: Holiday Array
Beitrag von: mattsches am 11. Dezember 2017, 12:44:26
Hast Du es schonmal ohne Namensraum probiert? Also

Feiertage: ARRAY [0..29] OF HOLIDAY_DATA (...)
?

Falls das auch nicht geht, wirst Du die Deklaration von XCAL im CALENDAR_CALC ändern müssen auf

XCAL: OSCAT_BASIC.CALENDAR:=(OFFSET:=60,DST_EN:=TRUE,LANGUAGE:=2,LONGITUDE:=xxx,LATITUDE:=xxx);
Siehe Post von annD oben.
Titel: Re: Holiday Array
Beitrag von: multilul am 11. Dezember 2017, 19:48:44
Danke!

XCAL: OSCAT_BASIC.CALENDAR:=(LATITUDE:=52.292809, LONGITUDE:=7.768562, OFFSET:=60);Andert die Variable Name von "Calendar" in "XCAL"?

Leider hat es noch nicht geklappt  ???


[gelöscht durch Administrator]
Titel: Re: Holiday Array
Beitrag von: mattsches am 11. Dezember 2017, 23:00:14
Sorry, war ein Versehen meinerseits. Ich hatte gedacht, annD hätte den Baustein in der Bibliothek modifiziert. Nach allem, was ich lese, müsste es aber auch so gehen.

Ich habe hier gerade keine V3-Installation greifbar. Mal sehen, vielleicht schaffe ich es morgen tagsüber, das Ganze mal nachzustellen.
Titel: Re: Holiday Array
Beitrag von: mattsches am 12. Dezember 2017, 08:29:13
Da scheint was mit deiner Bibliothek nicht zu stimmen. Wo hast du die denn her? Ich habe die 3.3.1 von der OSCAT-Webseite installiert, damit kann ich deinen ursprünglichen Code (fast) ohne Fehler bauen. Denn der Namespace ist standardmäßig "BASIC", bei dir aber "OSCAT_BASIC" (hast du das bewusst geändert?). Ändere ich ihn im Bibliotheksverwalter, habe ich keine Fehler beim Übersetzen. Auch ohne Namensräume funktioniert alles ohne Probleme.

Vorschlag: Wirf die Bibliothek aus dem Repo, lade sie nochmal von der Webseite herunter und installiere sie bei dir. Die ganzen Deklarationen können dann auch ohne Namensraum erfolgen, solange dein Projekt nicht so groß ist, dass dadurch Konflikte entstehen (zweite Bibliothek im Projekt, die z. B. ebenfalls einen Datentyp "HOLIDAY_DATA" enthält).
Titel: Re: Holiday Array
Beitrag von: multilul am 12. Dezember 2017, 17:46:50
Die *.package Files hatte Ich vom CodeSys website.
Die habe Ich entfernt und danach die oscat_basic_331_codesys3.library vom Oscat website installiert.

Jetzt compiliert es ohne Fehler! Vielen Dank!



[gelöscht durch Administrator]
Titel: Re: Holiday Array
Beitrag von: Marvelous am 09. August 2018, 18:32:29
Mahlzeit zusammen,

ich schreibe mal hier in diesem Thema in der Hoffnung, dass mir jemand weiter helfen kann.

Ich habe folgendes Problem, gestern am 08.08.2018 wurde mir der Feiertag Christi Himmelfahrt an meine Steuerung angezeigt.
Da Christi Himmelfahrt 39 Tage nach Ostersonntag ist habe ich test weise den 30.06.18 mal als fixes Datum eingegeben.
Und siehe da... es wird mir der Ostersonntag angezeigt.

Die Funktion Easter zeigt mir jedoch den 1.4.18 an.

Kann mir jemand weiter helfen?

Vielen Dank im Voraus
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;
 

[gelöscht durch Administrator]
Titel: Re: Holiday Array
Beitrag von: mattsches am 10. August 2018, 13:29:54
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?
Titel: Re: Holiday Array
Beitrag von: Marvelous am 11. August 2018, 10:02:51
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]
Titel: Re: Holiday Array
Beitrag von: mattsches am 11. August 2018, 14:02:40
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?
Titel: Re: Holiday Array
Beitrag von: Marvelous am 12. August 2018, 13:24:51
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]
Titel: Re: Holiday Array
Beitrag von: mattsches am 12. August 2018, 19:28:50
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?
Titel: Re: Holiday Array
Beitrag von: Marvelous am 13. August 2018, 17:59:59
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.

Titel: Re: Holiday Array
Beitrag von: mattsches am 13. August 2018, 20:53:09
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?
Titel: Re: Holiday Array
Beitrag von: mattsches am 13. August 2018, 20:59:09
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.
Titel: Re: Holiday Array
Beitrag von: Marvelous am 15. August 2018, 18:06:06
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]
Titel: Re: Holiday Array
Beitrag von: mattsches am 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.
Titel: Re: Holiday Array
Beitrag von: peewit am 15. August 2018, 21:05:19
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
Titel: Re: Holiday Array
Beitrag von: mattsches am 15. August 2018, 23:14:01
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 (http://www.oscat.de/component/jdownloads/download/2-oscat-basic/4-oscat-basic-331-codesys3.html)

Gruß,
mattsches
Titel: Re: Holiday Array
Beitrag von: peewit am 16. August 2018, 07:45:28
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]
Titel: Re: Holiday Array
Beitrag von: Marvelous am 16. August 2018, 18:43:42
Vielen Dank jetzt läuft es korrekt habe DATE_ADD angepasst.
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.